industrial-model 0.12.0 → 0.12.2

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.
@@ -33,8 +33,9 @@ var CogniteSdkAdapter = class {
33
33
  };
34
34
  }
35
35
  async searchInstances(request) {
36
- const search = this.client.instances.search;
37
- const response = await search(request);
36
+ const response = await this.client.instances.search(
37
+ request
38
+ );
38
39
  return {
39
40
  items: response.items
40
41
  };
@@ -48,11 +49,24 @@ var CogniteSdkAdapter = class {
48
49
  };
49
50
  }
50
51
  async applyInstances(request) {
51
- const apply = this.client.instances.apply;
52
- const response = await apply(request);
53
- return {
54
- items: response.items
55
- };
52
+ const { items, delete: deleteItems = [], replace } = request;
53
+ const results = [];
54
+ if (deleteItems.length > 0) {
55
+ const deleteResponse = await this.client.instances.delete(
56
+ deleteItems
57
+ );
58
+ results.push(
59
+ ...deleteResponse.items ?? []
60
+ );
61
+ }
62
+ if (items.length > 0) {
63
+ const response = await this.client.instances.upsert({
64
+ items,
65
+ ...replace === true ? { replace: true } : {}
66
+ });
67
+ results.push(...response.items);
68
+ }
69
+ return { items: results };
56
70
  }
57
71
  async retrieveDatapoints(options) {
58
72
  const { items, ...rest } = options;
@@ -141,7 +155,17 @@ function mapDatapointResult(item) {
141
155
  };
142
156
  }
143
157
 
158
+ // src/utils/array.ts
159
+ function chunks(items, size) {
160
+ const result = [];
161
+ for (let index = 0; index < items.length; index += size) {
162
+ result.push(items.slice(index, index + size));
163
+ }
164
+ return result;
165
+ }
166
+
144
167
  // src/calculator/datapoints-retrieval.ts
168
+ var MAX_ITEMS_PER_REQUEST = 100;
145
169
  var DatapointsRetriever = class {
146
170
  constructor(cognite) {
147
171
  this.cognite = cognite;
@@ -152,11 +176,16 @@ var DatapointsRetriever = class {
152
176
  if (requests.length === 0) {
153
177
  return parameters.map(() => []);
154
178
  }
155
- const options = { items: requests, start, end };
156
- const raw = await this.cognite.retrieveDatapoints(options);
179
+ const responses = await Promise.all(
180
+ chunks(requests, MAX_ITEMS_PER_REQUEST).map((items2) => {
181
+ const options = { items: items2, start, end };
182
+ return this.cognite.retrieveDatapoints(options);
183
+ })
184
+ );
185
+ const items = responses.flatMap((response) => response.items);
157
186
  return parameters.map((parameter, index) => {
158
187
  const requestIndex = indexMapping[index];
159
- const item = raw.items[requestIndex];
188
+ const item = items[requestIndex];
160
189
  if (item === void 0) {
161
190
  throw new Error(`missing datapoints response for parameter '${parameter.alias}'`);
162
191
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cognite/adapter.ts","../../src/calculator/datapoints-retrieval.ts","../../src/calculator/formula-expression/ast.ts","../../src/calculator/formula-expression/exceptions.ts","../../src/calculator/formula-expression/compiler.ts","../../src/calculator/formula-expression/evaluator.ts","../../src/calculator/formula-expression/runtime.ts","../../src/calculator/formula-expression/core.ts","../../src/calculator/calculator.ts"],"names":["requestIndex","COMPARE_OPS"],"mappings":";;;AAyBO,SAAS,qBAAqB,MAAA,EAAoC;AACvE,EAAA,OAAO,IAAI,kBAAkB,MAAM,CAAA;AACrC;AAEA,IAAM,oBAAN,MAA+C;AAAA,EAC7C,YAA6B,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA,EAAxB,MAAA;AAAA,EAE7B,MAAM,kBAAA,CAAmB,GAAA,EAAoB,OAAA,EAAoC;AAC/E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,UAAA,CAAW,QAAA,CAAS,KAAK,OAAO,CAAA;AACnE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACnC,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,KAAA,EAAQ,IAAA,CAAK,KAAA,IAAS;AAAC,OACzB,CAAE;AAAA,KACJ;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,GAAA,EACsC;AACtC,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,OAAA,EAAQ,MAAO,EAAE,KAAA,EAAO,UAAA,EAAY,SAAQ,CAAE,CAAA;AAC7F,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,SAAS,QAAQ,CAAA;AAC1D,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,EAA0B;AAAA,EACrD;AAAA,EAEA,MAAM,eAAe,OAAA,EAAiE;AACpF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,KAAA;AAAA,MAC3C;AAAA,KACF;AACA,IAAA,OAAO;AAAA,MACL,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,OAAA,EAAmE;AACvF,IAAA,MAAM,MAAA,GACJ,IAAA,CAAK,MAAA,CAAO,SAAA,CAGZ,MAAA;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,OAAO,CAAA;AACrC,IAAA,OAAO;AAAA,MACL,OAAO,QAAA,CAAS;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,OAAA,EACqC;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,SAAA;AAAA,MAC3C;AAAA,KACF;AACA,IAAA,OAAO;AAAA,MACL,OAAO,QAAA,CAAS;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,OAAA,EAAiE;AACpF,IAAA,MAAM,KAAA,GACJ,IAAA,CAAK,MAAA,CAAO,SAAA,CAGZ,KAAA;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAO,CAAA;AACpC,IAAA,OAAO;AAAA,MACL,OAAO,QAAA,CAAS;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,OAAA,EACkD;AAClD,IAAA,MAAM,EAAE,KAAA,EAAO,GAAG,IAAA,EAAK,GAAI,OAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,GAAG,QAAA,EAAS,MAAO;AAAA,MAClE,GAAG,QAAA;AAAA,MACH,UAAA,EAAY,EAAE,KAAA,EAAO,UAAA;AAAW,KAClC,CAAE,CAAA;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,WAAW,QAAA,CAAS;AAAA,MACrD,GAAG,IAAA;AAAA,MACH,KAAA,EAAO;AAAA,KACiD,CAAA;AAC1D,IAAA,OAAO,EAAE,KAAA,EAAQ,QAAA,CAAmD,GAAA,CAAI,kBAAkB,CAAA,EAAE;AAAA,EAC9F;AAAA,EAEA,MAAM,wBAAA,CACJ,KAAA,EACA,OAAA,EACkD;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,QAAO,MAAO;AAAA,MAC7D,UAAA,EAAY,EAAE,KAAA,EAAO,UAAA,EAAW;AAAA,MAChC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW;AAAC,KAC3C,CAAE,CAAA;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,cAAA;AAAA,MAC5C,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,EAAE,KAAA,EAAQ,QAAA,CAAmD,GAAA,CAAI,kBAAkB,CAAA,EAAE;AAAA,EAC9F;AAAA,EAEA,MAAM,iBAAiB,KAAA,EAAoD;AACzE,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,YAAW,MAAO;AAAA,MACjE,UAAA,EAAY,EAAE,KAAA,EAAO,UAAA,EAAW;AAAA,MAChC;AAAA,KACF,CAAE,CAAA;AACF,IAAA,MAAM,IAAA,CAAK,OAAO,UAAA,CAAW,MAAA;AAAA,MAC3B;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,KAAA,EAAoD;AACzE,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,cAAA,EAAgB,YAAA,EAAa,MAAO;AAAA,MACnF,UAAA,EAAY,EAAE,KAAA,EAAO,UAAA,EAAW;AAAA,MAChC,cAAA;AAAA,MACA,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,KAAiB;AAAC,KACvD,CAAE,CAAA;AACF,IAAA,MAAM,IAAA,CAAK,OAAO,UAAA,CAAW,MAAA;AAAA,MAC3B;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CACJ,QAAA,EACA,OAAA,EACkC;AAClC,IAAA,MAAM,EAAE,UAAA,EAAY,GAAG,IAAA,EAAK,GAAI,QAAA;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA;AAAA,MACvC,EAAE,GAAG,IAAA,EAAM,UAAA,EAAW;AAAA,MACtB,OAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA,KAAY;AAAA,KACd;AACA,IAAA,OAAO,cAAc,QAAuB,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,oBACJ,GAAA,EACmC;AACnC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,eAAA;AAAA,MACvC;AAAA,KACF;AACA,IAAA,OACE,QAAA,CAIA,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACf,GAAI,KAAK,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW,GAAI,EAAC;AAAA,MACvE,aAAa,IAAA,CAAK;AAAA,KACpB,CAAE,CAAA;AAAA,EACJ;AACF,CAAA;AAeA,SAAS,cAAc,IAAA,EAA4C;AACjE,EAAA,OAAO;AAAA,IACL,GAAI,KAAK,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW,GAAI,EAAC;AAAA,IACvE,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,iBAAiB,IAAA,CAAK,eAAA;AAAA,IACtB,GAAI,KAAK,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,EAAc,IAAA,CAAK,YAAA,EAAa,GAAI,EAAC;AAAA,IAC7E,GAAI,KAAK,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS,GAAI,EAAC;AAAA,IACjE,GAAI,KAAK,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU,GAAI,EAAC;AAAA,IACpE,GAAI,KAAK,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,EAAC;AAAA,IAC3D,GAAI,KAAK,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU,GAAI;AAAC,GACtE;AACF;AAEA,SAAS,mBAAmB,IAAA,EAA4D;AACtF,EAAA,OAAO;AAAA,IACL,GAAI,IAAA,CAAK,UAAA,EAAY,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM,GAAI,EAAC;AAAA,IAC/E,GAAI,IAAA,CAAK,UAAA,EAAY,UAAA,KAAe,MAAA,GAChC,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,UAAA,EAAW,GACzC,EAAC;AAAA,IACL,QAAA,EAAU,KAAK,QAAA,IAAY,KAAA;AAAA,IAC3B,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,IACrD,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,EAAC;AAAA,IAChC,GAAI,KAAK,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW,GAAI;AAAC,GACzE;AACF;;;AClMO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,OAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAuB;AAAA,EAAvB,OAAA;AAAA,EAE7B,MAAM,kBAAA,CACJ,UAAA,EACA,KAAA,EACA,GAAA,EACwB;AACxB,IAAA,MAAM,EAAE,QAAA,EAAU,YAAA,EAAa,GAAI,IAAA,CAAK,cAAc,UAAU,CAAA;AAEhE,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,IAChC;AAEA,IAAA,MAAM,OAAA,GAA2C,EAAE,KAAA,EAAO,QAAA,EAAU,OAAO,GAAA,EAAI;AAC/E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,mBAAmB,OAAO,CAAA;AAEzD,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,EAAW,KAAA,KAAU;AAC1C,MAAA,MAAM,YAAA,GAAe,aAAa,KAAK,CAAA;AACvC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,YAAY,CAAA;AACnC,MAAA,IAAI,SAAS,MAAA,EAAW;AACtB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,SAAA,CAAU,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MAClF;AACA,MAAA,OAAO,eAAA,CAAgB,MAAM,SAAS,CAAA;AAAA,IACxC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,cAAc,UAAA,EAAkD;AACtE,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAoB;AAChD,IAAA,MAAM,qBAAA,uBAA4B,GAAA,EAAoB;AACtD,IAAA,MAAM,WAA2C,EAAC;AAClD,IAAA,MAAM,YAAA,GAAyB,IAAI,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AAE1D,IAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAA,KAAU;AACvC,MAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI,SAAA,CAAU,UAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAEpC,MAAA,IAAI,SAAA,CAAU,kBAAkB,MAAA,EAAW;AACzC,QAAA,IAAIA,aAAAA,GAAe,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA;AAC5C,QAAA,IAAIA,kBAAiB,MAAA,EAAW;AAC9B,UAAAA,gBAAe,QAAA,CAAS,MAAA;AACxB,UAAA,eAAA,CAAgB,GAAA,CAAI,OAAOA,aAAY,CAAA;AACvC,UAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,QACrC;AACA,QAAA,YAAA,CAAa,KAAK,CAAA,GAAIA,aAAAA;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,CAAU,gBAAgB,MAAA,EAAW;AACvC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,yBAAA,EAA4B,SAAA,CAAU,KAAK,CAAA,kBAAA,EAAqB,UAAU,aAAa,CAAA,CAAA;AAAA,SACzF;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,UAAU,WAAW,CAAA,CAAA;AACtD,MAAA,IAAI,YAAA,GAAe,qBAAA,CAAsB,GAAA,CAAI,YAAY,CAAA;AACzD,MAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,QAAA,YAAA,GAAe,QAAA,CAAS,MAAA;AACxB,QAAA,qBAAA,CAAsB,GAAA,CAAI,cAAc,YAAY,CAAA;AACpD,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,KAAA;AAAA,UACA,UAAA;AAAA,UACA,UAAA,EAAY,CAAC,SAAA,CAAU,aAAa,CAAA;AAAA,UACpC,aAAa,SAAA,CAAU;AAAA,SACxB,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,GAAQ,SAAS,YAAY,CAAA;AACnC,QAAA,MAAM,aAAa,KAAA,CAAM,UAAA;AACzB,QAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,SAAA,CAAU,aAAa,CAAA,EAAG;AACjD,UAAA,UAAA,CAAW,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA,QACzC;AAAA,MACF;AACA,MAAA,YAAA,CAAa,KAAK,CAAA,GAAI,YAAA;AAAA,IACxB,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,UAAU,YAAA,EAAa;AAAA,EAClC;AACF,CAAA;AAEA,SAAS,eAAA,CACP,MACA,SAAA,EACa;AACb,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,SAAA,EAAW,SAAA,CAAU,aAAa,CAAA;AAC1D,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAK,EAAE,SAAA,EAAW,SAAA,CAAU,SAAA,EAAW,OAAO,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,SAAA,CACP,WACA,aAAA,EACoB;AACpB,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,OAAQ,SAAA,CAAiC,KAAA;AAAA,EAC3C;AACA,EAAA,OAAQ,UAAwC,aAAa,CAAA;AAC/D;;;ACzEO,SAAS,kBAAkB,IAAA,EAAyC;AACzE,EAAA,OAAO,KAAK,IAAA,KAAS,SAAA,IAAa,KAAK,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,KAAS,OAAA;AAC5E;;;AC9CO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAGO,IAAM,mBAAA,GAAN,cAAkC,YAAA,CAAa;AAAA,EACpD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAGO,IAAM,qBAAA,GAAN,cAAoC,YAAA,CAAa;AAAA,EAC7C,OAAA;AAAA,EAET,YAAY,OAAA,EAAmB;AAC7B,IAAA,KAAA,CAAM,CAAA,8BAAA,EAAiC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC3D,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,CAAC,GAAG,OAAO,CAAA;AAAA,EAC5B;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,EAC/C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAGO,IAAM,oBAAA,GAAN,cAAmC,cAAA,CAAe;AAAA,EAC9C,OAAA;AAAA,EAET,YAAY,OAAA,EAAiC;AAC3C,IAAA,MAAM,SAAS,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAClC,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM,IAAI,IAAI,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAA,CACjD,KAAK,IAAI,CAAA;AACZ,IAAA,KAAA,CAAM,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAE,CAAA;AAC5C,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,OAAA,EAAQ;AAAA,EAC9B;AACF;AAMO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAGO,IAAM,iBAAA,GAAN,cAAgC,eAAA,CAAgB;AAAA,EACrD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAGO,IAAM,aAAA,GAAN,cAA4B,eAAA,CAAgB;AAAA,EACjD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;;;ACjFA,IAAM,cAAA,GAAiB,+BAAA;AACvB,IAAM,mBAAA,GAAsB,MAAA;AAC5B,IAAM,gBAAA,GAAmB,6BAAA;AACzB,IAAM,cAAA,GAAiB,IAAA;AAkBvB,IAAM,KAAA,uBAAY,GAAA,EAA6B;AASxC,SAAS,eAAe,OAAA,EAAkC;AAC/D,EAAA,MAAM,UAAA,GAAa,qBAAqB,OAAO,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AACnC,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,kBAAkB,UAAU,CAAA;AAE7C,EAAA,IAAI,KAAA,CAAM,QAAQ,cAAA,EAAgB;AAChC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACnC,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,KAAA,CAAM,GAAA,CAAI,YAAY,QAAQ,CAAA;AAC9B,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,UAAA,GAAmB;AACjC,EAAA,KAAA,CAAM,KAAA,EAAM;AACd;AAEA,SAAS,qBAAqB,OAAA,EAAyB;AACrD,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,MAAM,IAAI,UAAU,0BAA0B,CAAA;AAAA,EAChD;AACA,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,CAAE,KAAK,GAAG,CAAA;AACtC;AAEA,SAAS,kBAAkB,GAAA,EAA8B;AACvD,EAAA,IAAI,QAAQ,EAAA,EAAI;AACd,IAAA,MAAM,IAAI,oBAAoB,2BAA2B,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,GAAA,EAAK,SAAA,EAAW,OAAO,CAAA;AAE9D,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,oBAAoB,+CAA+C,CAAA;AAAA,EAC/E;AAEA,EAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,UAAU,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,oBAAoB,6CAA6C,CAAA;AAAA,EAC7E;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,UAAU,CAAA;AAC7B,EAAA,YAAA,CAAa,MAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAC5C,EAAA,MAAM,cAAA,GAAiB,mBAAmB,IAAI,CAAA;AAE9C,EAAA,OAAO,EAAE,GAAA,EAAK,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,SAAS,cAAA,EAAe;AACrE;AAEA,SAAS,mBAAA,CACP,OAAA,EACA,SAAA,EACA,OAAA,EACQ;AACR,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,CAAC,QAAQ,IAAA,KAAiB;AAC/D,IAAA,IAAI,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC3B,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,IAAA,GAAO,CAAA,EAAG,gBAAgB,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,CAAA;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAI,CAAA;AACtB,MAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEA,SAAS,YAAA,CAAa,MAAgB,YAAA,EAAyC;AAC7E,EAAA,IAAA,CAAK,IAAA,EAAM,CAAC,IAAA,KAAS;AACnB,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,IAAU,CAAC,aAAa,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,4BAAA,EAA+B,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AAAA,IACxE;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,mBAAmB,IAAA,EAAyB;AACnD,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,IAAA,CAAK,IAAA,EAAM,CAAC,IAAA,KAAS;AACnB,IAAA,IAAI,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC3B,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,IAAA,CAAK,MAAgB,KAAA,EAAuC;AACnE,EAAA,KAAA,CAAM,IAAI,CAAA;AACV,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,OAAA;AACH,MAAA,IAAA,CAAK,IAAA,CAAK,MAAM,KAAK,CAAA;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAK,CAAA;AACtB,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AACxB,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,IAAA,CAAK,IAAA,CAAK,MAAM,KAAK,CAAA;AACrB,MAAA,KAAA,MAAW,UAAA,IAAc,KAAK,WAAA,EAAa;AACzC,QAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MACxB;AACA,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,QAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MACnB;AACA,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,IAAA,CAAK,IAAA,CAAK,MAAM,KAAK,CAAA;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,MAAM,KAAK,CAAA;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,KAAK,CAAA;AACvB,MAAA;AAEA;AAEN;AASA,IAAM,SAAA,GAAY,uCAAA;AAClB,IAAM,QAAA,GAAW,yBAAA;AACjB,IAAM,YAAA,uBAAmB,GAAA,CAAI,CAAC,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAC3D,IAAM,YAAA,mBAAe,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAE1E,SAAS,SAAS,UAAA,EAA6B;AAC7C,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,OAAO,KAAA,GAAQ,WAAW,MAAA,EAAQ;AAChC,IAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAE7B,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,KAAA,IAAS,CAAA;AACT,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,IAAI,CAAA,IAAM,IAAA,KAAS,GAAA,IAAO,QAAQ,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAI;AACrE,MAAA,SAAA,CAAU,SAAA,GAAY,KAAA;AACtB,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AACvC,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,MAAM,IAAI,oBAAoB,0CAA0C,CAAA;AAAA,MAC1E;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,OAAO,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,CAAA;AACvD,MAAA,KAAA,GAAQ,SAAA,CAAU,SAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG;AACtB,MAAA,QAAA,CAAS,SAAA,GAAY,KAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AAEtC,MAAA,MAAM,KAAA,GAAS,MAA0B,CAAC,CAAA;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AACnC,MAAA,KAAA,GAAQ,QAAA,CAAS,SAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAC,CAAA;AACjD,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAC1C,MAAA,KAAA,IAAS,CAAA;AACT,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAChD,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACvC,MAAA,KAAA,IAAS,CAAA;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,8CAAA,EAAiD,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACxF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,QAAQ,IAAA,EAAmC;AAClD,EAAA,OAAO,IAAA,KAAS,MAAA,IAAa,IAAA,IAAQ,GAAA,IAAO,IAAA,IAAQ,GAAA;AACtD;AAEA,SAAS,aAAa,IAAA,EAAmC;AACvD,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,KAAS,OAAQ,IAAA,IAAQ,GAAA,IAAO,QAAQ,GAAA,IAAS,IAAA,IAAQ,OAAO,IAAA,IAAQ,GAAA;AACjF;AAIA,IAAM,QAAA,uBAAe,GAAA,CAAI,CAAC,OAAO,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AACpD,IAAM,oCAAoB,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAC,CAAA;AAE3D,IAAM,WAAA,GAAyC;AAAA,EAC7C,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,GAAA,EAAK,IAAA;AAAA,EACL,IAAA,EAAM,IAAA;AAAA,EACN,GAAA,EAAK,IAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAGA,SAAS,MAAM,UAAA,EAA8B;AAC3C,EAAA,MAAM,MAAA,GAAS,SAAS,UAAU,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,MAAM,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,OAAO,eAAA,EAAgB;AACpC,EAAA,MAAA,CAAO,SAAA,EAAU;AACjB,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,SAAN,MAAa;AAAA,EAGX,YAA6B,MAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA2B;AAAA,EAA3B,MAAA;AAAA,EAFrB,QAAA,GAAW,CAAA;AAAA,EAInB,eAAA,GAA4B;AAC1B,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAI,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACtC,MAAA,MAAM,IAAI,oBAAoB,oDAAoD,CAAA;AAAA,IACpF;AAAA,EACF;AAAA,EAEQ,gBAAA,GAA6B;AACnC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,cAAc,MAAM,CAAA;AACzB,MAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,EAAiB;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAM,MAAA,EAAO;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,OAAA,GAAoB;AAC1B,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,CAAK,QAAA,EAAU,CAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,MAAA,CAAO,MAAA,KAAW,CAAA,GAAK,MAAA,CAAO,CAAC,CAAA,GAAiB,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAAA,EAC5F;AAAA,EAEQ,QAAA,GAAqB;AAC3B,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,CAAK,eAAA,EAAiB,CAAA;AACtC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,EAAG;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,CAAA;AAAA,IACpC;AACA,IAAA,MAAM,EAAA,GAAiB,KAAA;AACvB,IAAA,OAAO,MAAA,CAAO,MAAA,KAAW,CAAA,GAAK,MAAA,CAAO,CAAC,IAAiB,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,MAAA,EAAO;AAAA,EACtF;AAAA,EAEQ,eAAA,GAA4B;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAc;AAChC,IAAA,MAAM,MAAmB,EAAC;AAC1B,IAAA,MAAM,cAA0B,EAAC;AACjC,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAA,GAAK,KAAK,aAAA,EAAc;AAC9B,MAAA,IAAI,OAAO,MAAA,EAAW;AACpB,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,GAAA,CAAI,WAAW,CAAA,GAAI,IAAA,GAAO,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,GAAA,EAAK,WAAA,EAAY;AAAA,EAC7E;AAAA,EAEQ,aAAA,GAA0B;AAChC,IAAA,IAAI,IAAA,GAAO,KAAK,mBAAA,EAAoB;AACpC,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAA,GAAK,KAAK,MAAA,EAAO;AACvB,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK;AAC5B,QAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,QAAA,MAAM,KAAA,GAAQ,KAAK,mBAAA,EAAoB;AACvC,QAAA,IAAA,GAAO,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,EAAA,KAAO,MAAM,KAAA,GAAQ,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAA,EAAM;AAC1E,QAAA;AAAA,MACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,GAAgC;AACtC,IAAA,IAAI,IAAA,GAAO,KAAK,UAAA,EAAW;AAC3B,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAA,GAAK,KAAK,MAAA,EAAO;AACvB,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,IAAO,OAAO,GAAA,EAAK;AAC1C,QAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,QAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,EAAW;AAC9B,QAAA,MAAM,OAAiB,EAAA,KAAO,GAAA,GAAM,KAAA,GAAQ,EAAA,KAAO,MAAM,KAAA,GAAQ,KAAA;AACjE,QAAA,IAAA,GAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAI,IAAA,EAAM,IAAA,EAAM,MAAM,KAAA,EAAM;AACpD,QAAA;AAAA,MACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,UAAA,GAAuB;AAC7B,IAAA,MAAM,EAAA,GAAK,KAAK,MAAA,EAAO;AACvB,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK;AAC5B,MAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,MAAA,MAAM,IAAA,GAAgB,EAAA,KAAO,GAAA,GAAM,KAAA,GAAQ,KAAA;AAC3C,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,MAAM,OAAA,EAAQ;AAAA,IAC9C;AACA,IAAA,OAAO,KAAK,UAAA,EAAW;AAAA,EACzB;AAAA,EAEQ,UAAA,GAAuB;AAC7B,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,EAAU;AAC5B,IAAA,IAAI,IAAA,CAAK,MAAA,EAAO,KAAM,IAAA,EAAM;AAC1B,MAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AAGjB,MAAA,MAAM,QAAA,GAAW,KAAK,UAAA,EAAW;AACjC,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,EAAA,EAAI,OAAO,IAAA,EAAM,IAAA,EAAM,OAAO,QAAA,EAAS;AAAA,IACjE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACvC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,oBAAoB,sDAAsD,CAAA;AAAA,IACtF;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,MAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,IAChD;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,MAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,EAAG;AACtC,QAAA,MAAM,IAAI,oBAAoB,sCAAsC,CAAA;AAAA,MACtE;AACA,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,mBAAA;AAAA,UACR,CAAA,4CAAA,EAA+C,MAAM,KAAK,CAAA,CAAA;AAAA,SAC5D;AAAA,MACF;AACA,MAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,MAAM,KAAA,EAAM;AAAA,IACzC;AAEA,IAAA,IAAI,KAAA,CAAM,UAAU,GAAA,EAAK;AACvB,MAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,MAAA,MAAM,KAAA,GAAQ,KAAK,eAAA,EAAgB;AACnC,MAAA,IAAA,CAAK,SAAS,GAAG,CAAA;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,0CAAA,EAA6C,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3F;AAAA,EAEQ,MAAA,GAA6B;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACvC,IAAA,OAAO,UAAU,MAAA,IAAa,KAAA,CAAM,IAAA,KAAS,IAAA,GAAO,MAAM,KAAA,GAAQ,MAAA;AAAA,EACpE;AAAA,EAEQ,aAAA,GAAuC;AAC7C,IAAA,MAAM,EAAA,GAAK,KAAK,MAAA,EAAO;AACvB,IAAA,OAAO,EAAA,KAAO,MAAA,GAAY,WAAA,CAAY,EAAE,CAAA,GAAI,MAAA;AAAA,EAC9C;AAAA,EAEQ,aAAa,OAAA,EAA0B;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACvC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,CAAM,SAAS,MAAA,IAAU,KAAA,CAAM,UAAU,OAAA,EAAS;AAC3E,MAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,cAAc,OAAA,EAAuB;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,kCAAA,EAAqC,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/E;AAAA,EACF;AAAA,EAEQ,SAAS,EAAA,EAAkB;AACjC,IAAA,IAAI,IAAA,CAAK,MAAA,EAAO,KAAM,EAAA,EAAI;AACxB,MAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,kCAAA,EAAqC,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1E;AACA,IAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AAAA,EACnB;AACF,CAAA;;;ACraA,IAAM,SAAA,GAAwD;AAAA,EAC5D,GAAA,EAAK,CAAC,KAAA,KAAU,KAAA;AAAA,EAChB,GAAA,EAAK,CAAC,KAAA,KAAU,CAAC;AACnB,CAAA;AAEA,IAAM,UAAA,GAAwE;AAAA,EAC5E,GAAA,EAAK,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,GAAO,KAAA;AAAA,EAC7B,GAAA,EAAK,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,GAAO,KAAA;AAAA,EAC7B,GAAA,EAAK,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,GAAO,KAAA;AAAA,EAC7B,GAAA,EAAK,CAAC,IAAA,EAAM,KAAA,KAAU;AACpB,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,MAAM,IAAI,kBAAkB,wBAAwB,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,IAAA,GAAO,KAAA;AAAA,EAChB,CAAA;AAAA,EACA,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AAEA,IAAMC,YAAAA,GAA2E;AAAA,EAC/E,EAAA,EAAI,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,KAAS,KAAA;AAAA,EAC9B,EAAA,EAAI,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,KAAS,KAAA;AAAA,EAC9B,EAAA,EAAI,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,GAAO,KAAA;AAAA,EAC5B,EAAA,EAAI,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,IAAQ,KAAA;AAAA,EAC7B,EAAA,EAAI,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,GAAO,KAAA;AAAA,EAC5B,EAAA,EAAI,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,IAAQ;AAC/B,CAAA;AAGA,SAAS,SAAA,CAAU,MAAc,KAAA,EAAuB;AACtD,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,MAAM,IAAI,kBAAkB,cAAc,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,CAAA,GAAI,KAAA;AAC3C;AAOA,SAAS,OAAA,CAAQ,MAAc,QAAA,EAA0B;AACvD,EAAA,IAAI,IAAA,KAAS,CAAA,IAAK,QAAA,GAAW,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,kBAAkB,0CAA0C,CAAA;AAAA,EACxE;AACA,EAAA,MAAM,SAAS,IAAA,IAAQ,QAAA;AACvB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClF,IAAA,MAAM,IAAI,cAAc,uCAAuC,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,OAAO,KAAA,KAAU,CAAA;AACnB;AAEO,SAAS,YAAA,CACd,IAAA,EACA,WAAA,EACA,MAAA,EACA,cAAA,EACU;AACV,EAAA,IAAI,cAAA,EAAgB;AAGlB,IAAA,MAAM,MAAA,GAAmB,IAAI,KAAA,CAAM,MAAM,CAAA;AACzC,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,EAAQ,SAAS,CAAA,EAAG;AAC9C,MAAA,MAAA,CAAO,KAAK,CAAA,GAAI,cAAA,CAAe,IAAA,EAAM,aAAa,KAAK,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,WAAW,CAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,IAAI,KAAA,CAAM,MAAM,CAAA,CAAE,KAAK,KAAe,CAAA;AAC/C;AAEA,SAAS,YAAA,CAAa,MAAgB,WAAA,EAAiC;AACrE,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA;AAElC,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,IACA,KAAK,UAAA;AACH,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,WAAW,CAAA;AAClD,MAAA,OAAO,YAAY,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,EAAG,MAAM,KAAK,CAAA;AAAA,IACrD;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AACtD,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAC5B,MAAA,OAAO,KAAA,CAAM,QAAQ,OAAO,CAAA,GAAI,QAAQ,GAAA,CAAI,EAAE,CAAA,GAAI,EAAA,CAAG,OAAiB,CAAA;AAAA,IACxE;AAAA,IACA;AAEE,MAAA,MAAM,IAAI,SAAA,CAAU,CAAA,6BAAA,EAAgC,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA;AAErE;AAEA,SAAS,WAAA,CACP,EAAA,EACA,IAAA,EACA,KAAA,EACO;AACP,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,MAAM,MAAA,GAAmB,IAAI,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAC9C,MAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,KAAK,IAAI,EAAA,CAAG,IAAA,CAAK,KAAK,CAAA,EAAa,KAAA,CAAM,KAAK,CAAW,CAAA;AAAA,MAClE;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAS,KAAA;AACf,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,UAAU,EAAA,CAAG,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,UAAA,GAAa,IAAA;AACnB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,UAAU,EAAA,CAAG,UAAA,EAAY,KAAK,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,EAAA,CAAG,YAAY,KAAe,CAAA;AACvC;AAEA,SAAS,cAAA,CAAe,IAAA,EAAgB,WAAA,EAA0B,KAAA,EAAuB;AACvF,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA;AAClC,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAAA,IACA,KAAK,UAAA;AACH,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,aAAa,KAAK,CAAA;AACzD,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,KAAA,EAAO,aAAa,KAAK,CAAA;AAC3D,MAAA,OAAO,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,CAAE,MAAM,KAAK,CAAA;AAAA,IACxC;AAAA,IACA,KAAK,SAAA;AACH,MAAA,OAAO,SAAA,CAAU,KAAK,EAAE,CAAA,CAAE,eAAe,IAAA,CAAK,OAAA,EAAS,WAAA,EAAa,KAAK,CAAC,CAAA;AAAA,IAC5E,KAAK,SAAA,EAAW;AACd,MAAA,IAAI,IAAA,GAAO,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,aAAa,KAAK,CAAA;AACvD,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAK,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC3C,QAAA,MAAM,QAAQ,cAAA,CAAe,IAAA,CAAK,YAAY,CAAC,CAAA,EAAe,aAAa,KAAK,CAAA;AAChF,QAAA,IAAI,CAACA,aAAY,IAAA,CAAK,GAAA,CAAI,CAAC,CAAc,CAAA,CAAE,IAAA,EAAM,KAAK,CAAA,EAAG;AACvD,UAAA,OAAO,CAAA;AAAA,QACT;AACA,QAAA,IAAA,GAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,UAAA,IAAI,CAAC,QAAA,CAAS,cAAA,CAAe,OAAO,WAAA,EAAa,KAAK,CAAC,CAAA,EAAG;AACxD,YAAA,OAAO,CAAA;AAAA,UACT;AAAA,QACF;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,QAAA,IAAI,SAAS,cAAA,CAAe,KAAA,EAAO,WAAA,EAAa,KAAK,CAAC,CAAA,EAAG;AACvD,UAAA,OAAO,CAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,aAAa,KAAK,CAAA;AACzD,MAAA,MAAM,SAAS,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,CAAK,OAAO,IAAA,CAAK,MAAA;AACjD,MAAA,OAAO,cAAA,CAAe,MAAA,EAAQ,WAAA,EAAa,KAAK,CAAA;AAAA,IAClD;AAAA,IACA;AACE,MAAA,MAAM,IAAI,UAAU,6BAA6B,CAAA;AAAA;AAEvD;;;AC5LO,SAAS,gBAAA,CACd,SACA,UAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,IAAI,CAAC,CAAA;AACnF,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,sBAAsB,OAAO,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,cAA2B,EAAC;AAClC,EAAA,MAAM,gBAAwC,EAAC;AAC/C,EAAA,KAAA,MAAW,CAAC,YAAA,EAAc,QAAQ,CAAA,IAAK,QAAQ,OAAA,EAAS;AACtD,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,YAAA,EAAc,UAAA,CAAW,YAAY,CAAC,CAAA;AACxE,IAAA,WAAA,CAAY,QAAQ,CAAA,GAAI,MAAA;AACxB,IAAA,aAAA,CAAc,YAAY,IAAI,MAAA,CAAO,MAAA;AAAA,EACvC;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA;AAC3C,EAAA,IAAI,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,qBAAqB,aAAa,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,EAAA,IAAI,WAAW,CAAA,EAAG;AAGhB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,aAAa,OAAA,CAAQ,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,QAAQ,cAAc,CAAA;AAC/E;AAEA,SAAS,kBAAA,CAAmB,MAAc,KAAA,EAA0B;AAClE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,WAAA,EAAc,IAAI,CAAA,4BAAA,CAA8B,CAAA;AAAA,EAC3E;AAEA,EAAA,MAAM,UAAA,GAAuB,IAAI,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AACnD,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,WAAA,EAAc,IAAI,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAC3E;AACA,IAAA,UAAA,CAAW,KAAK,CAAA,GAAI,IAAA;AAAA,EACtB;AACA,EAAA,OAAO,UAAA;AACT;;;ACnBO,SAAS,QAAA,CAAS,OAAA,EAAiB,UAAA,GAAyB,EAAC,EAAqB;AACvF,EAAA,OAAO,gBAAA,CAAiB,cAAA,CAAe,OAAO,CAAA,EAAG,UAAU,CAAA;AAC7D;;;ACrBO,IAAM,aAAN,MAAiB;AAAA,EACL,SAAA;AAAA,EAEjB,YAAY,OAAA,EAAsC;AAChD,IAAA,MAAM,OAAO,aAAA,CAAc,OAAO,CAAA,GAAI,OAAA,GAAU,qBAAqB,OAAO,CAAA;AAC5E,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,mBAAA,CAAoB,IAAI,CAAA;AAAA,EAC/C;AAAA;AAAA,EAGA,MAAM,SAAA,CAAU,KAAA,EAAwB,KAAA,EAAa,GAAA,EAAuC;AAC1F,IAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,mBAAmB,CAAC,KAAK,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAElE,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAA,CACJ,OAAA,EACA,KAAA,EACA,GAAA,EAC8B;AAC9B,IAAA,MAAM,aAAa,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAU,MAAM,UAAU,CAAA;AAC9D,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,UAAU,kBAAA,CAAmB,UAAA,EAAY,OAAO,GAAG,CAAA;AAEjF,IAAA,MAAM,UAA+B,EAAC;AACtC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAQ,UAAA,CAAW,KAAA,CAAM,QAAQ,MAAA,GAAS,KAAA,CAAM,WAAW,MAAM,CAAA;AACvE,MAAA,MAAA,IAAU,MAAM,UAAA,CAAW,MAAA;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAEA,SAAS,SAAA,CAAU,OAAwB,UAAA,EAA8C;AACvF,EAAA,MAAM,YAAsC,EAAC;AAC7C,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAyB;AACnD,EAAA,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAA,KAAU;AAC7C,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAK,CAAA,IAAK,EAAC;AACrC,IAAA,SAAA,CAAU,SAAA,CAAU,KAAK,CAAA,GAAI,MAAA,CAAO,IAAI,CAAC,KAAA,KAAU,MAAM,KAAK,CAAA;AAC9D,IAAA,aAAA,CAAc,GAAA,CAAI,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EAC3C,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,SAAS,CAAA;AAMhD,EAAA,MAAM,CAAC,aAAa,CAAA,GAAI,cAAA,CAAe,KAAA,CAAM,OAAO,CAAA,CAAE,SAAA;AACtD,EAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,GAAA,CAAI,aAAuB,KAAK,EAAC;AAEvE,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,eAAA,CAAgB,GAAA,CAAI,CAAC,OAAO,KAAA,MAAW;AAAA,MACjD,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,KAAA,EAAO,OAAO,KAAK;AAAA,KACrB,CAAE;AAAA,GACJ;AACF;AAEA,SAAS,cAAc,KAAA,EAA0D;AAC/E,EAAA,OAAO,OAAQ,MAAsB,kBAAA,KAAuB,UAAA;AAC9D","file":"index.cjs","sourcesContent":["import type { CogniteClient } from \"@cognite/sdk\";\nimport type { CognitePort } from \"./port\";\nimport type {\n CogniteDatapointDeleteItem,\n CogniteDatapointInsertItem,\n CogniteDatapointLatestItem,\n CogniteDatapointResponse,\n CogniteDatapointResultItem,\n CogniteDatapointRetrieveOptions,\n CogniteFileDownloadUrl,\n CogniteFileUploadInfo,\n CogniteFileUploadResult,\n DataModelId,\n DataModelRetrieveOptions,\n InstancesAggregateRequest,\n InstancesAggregateResponse,\n InstancesApplyRequest,\n InstancesApplyResponse,\n InstancesQueryRequest,\n InstancesQueryResponse,\n InstancesSearchRequest,\n InstancesSearchResponse,\n ViewDefinition,\n} from \"./types\";\n\nexport function createCogniteAdapter(client: CogniteClient): CognitePort {\n return new CogniteSdkAdapter(client);\n}\n\nclass CogniteSdkAdapter implements CognitePort {\n constructor(private readonly client: CogniteClient) {}\n\n async retrieveDataModels(ids: DataModelId[], options?: DataModelRetrieveOptions) {\n const response = await this.client.dataModels.retrieve(ids, options);\n return {\n items: response.items.map((item) => ({\n createdTime: item.createdTime,\n views: (item.views ?? []) as ViewDefinition[],\n })),\n };\n }\n\n async retrieveViews(\n ids: Array<{ space: string; externalId: string; version: string }>,\n ): Promise<{ items: ViewDefinition[] }> {\n const cleanIds = ids.map(({ space, externalId, version }) => ({ space, externalId, version }));\n const response = await this.client.views.retrieve(cleanIds);\n return { items: response.items as ViewDefinition[] };\n }\n\n async queryInstances(request: InstancesQueryRequest): Promise<InstancesQueryResponse> {\n const response = await this.client.instances.query(\n request as Parameters<CogniteClient[\"instances\"][\"query\"]>[0],\n );\n return {\n items: response.items as unknown as InstancesQueryResponse[\"items\"],\n nextCursor: response.nextCursor,\n };\n }\n\n async searchInstances(request: InstancesSearchRequest): Promise<InstancesSearchResponse> {\n const search = (\n this.client.instances as unknown as {\n search: (request: InstancesSearchRequest) => Promise<{ items: unknown[] }>;\n }\n ).search;\n const response = await search(request);\n return {\n items: response.items as unknown as InstancesSearchResponse[\"items\"],\n };\n }\n\n async aggregateInstances(\n request: InstancesAggregateRequest,\n ): Promise<InstancesAggregateResponse> {\n const response = await this.client.instances.aggregate(\n request as Parameters<CogniteClient[\"instances\"][\"aggregate\"]>[0],\n );\n return {\n items: response.items as unknown as InstancesAggregateResponse[\"items\"],\n };\n }\n\n async applyInstances(request: InstancesApplyRequest): Promise<InstancesApplyResponse> {\n const apply = (\n this.client.instances as unknown as {\n apply: (request: InstancesApplyRequest) => Promise<{ items: unknown[] }>;\n }\n ).apply;\n const response = await apply(request);\n return {\n items: response.items as unknown as InstancesApplyResponse[\"items\"],\n };\n }\n\n async retrieveDatapoints(\n options: CogniteDatapointRetrieveOptions,\n ): Promise<{ items: CogniteDatapointResultItem[] }> {\n const { items, ...rest } = options;\n const sdkItems = items.map(({ space, externalId, ...itemRest }) => ({\n ...itemRest,\n instanceId: { space, externalId },\n }));\n const response = await this.client.datapoints.retrieve({\n ...rest,\n items: sdkItems,\n } as Parameters<typeof this.client.datapoints.retrieve>[0]);\n return { items: (response as unknown as CogniteDatapointResponse[]).map(mapDatapointResult) };\n }\n\n async retrieveLatestDatapoints(\n items: CogniteDatapointLatestItem[],\n options?: { ignoreUnknownIds?: boolean },\n ): Promise<{ items: CogniteDatapointResultItem[] }> {\n const sdkItems = items.map(({ space, externalId, before }) => ({\n instanceId: { space, externalId },\n ...(before !== undefined ? { before } : {}),\n }));\n const response = await this.client.datapoints.retrieveLatest(\n sdkItems as Parameters<typeof this.client.datapoints.retrieveLatest>[0],\n options,\n );\n return { items: (response as unknown as CogniteDatapointResponse[]).map(mapDatapointResult) };\n }\n\n async insertDatapoints(items: CogniteDatapointInsertItem[]): Promise<void> {\n const sdkItems = items.map(({ space, externalId, datapoints }) => ({\n instanceId: { space, externalId },\n datapoints,\n }));\n await this.client.datapoints.insert(\n sdkItems as Parameters<typeof this.client.datapoints.insert>[0],\n );\n }\n\n async deleteDatapoints(items: CogniteDatapointDeleteItem[]): Promise<void> {\n const sdkItems = items.map(({ space, externalId, inclusiveBegin, exclusiveEnd }) => ({\n instanceId: { space, externalId },\n inclusiveBegin,\n ...(exclusiveEnd !== undefined ? { exclusiveEnd } : {}),\n }));\n await this.client.datapoints.delete(\n sdkItems as Parameters<typeof this.client.datapoints.delete>[0],\n );\n }\n\n async uploadFile(\n fileInfo: CogniteFileUploadInfo,\n content?: unknown,\n ): Promise<CogniteFileUploadResult> {\n const { instanceId, ...rest } = fileInfo;\n const response = await this.client.files.upload(\n { ...rest, instanceId } as Parameters<typeof this.client.files.upload>[0],\n content as Parameters<typeof this.client.files.upload>[1],\n false,\n content !== undefined,\n );\n return mapFileResult(response as SdkFileInfo);\n }\n\n async getFileDownloadUrls(\n ids: Array<{ instanceId: { space: string; externalId: string } }>,\n ): Promise<CogniteFileDownloadUrl[]> {\n const response = await this.client.files.getDownloadUrls(\n ids as Parameters<typeof this.client.files.getDownloadUrls>[0],\n );\n return (\n response as Array<{\n instanceId?: { space?: string; externalId?: string };\n downloadUrl: string;\n }>\n ).map((item) => ({\n ...(item.instanceId !== undefined ? { instanceId: item.instanceId } : {}),\n downloadUrl: item.downloadUrl,\n }));\n }\n}\n\ntype SdkFileInfo = {\n instanceId?: { space?: string; externalId?: string };\n name: string;\n uploaded: boolean;\n uploadedTime?: Date;\n createdTime: Date;\n lastUpdatedTime: Date;\n mimeType?: string;\n directory?: string;\n source?: string;\n uploadUrl?: string;\n};\n\nfunction mapFileResult(item: SdkFileInfo): CogniteFileUploadResult {\n return {\n ...(item.instanceId !== undefined ? { instanceId: item.instanceId } : {}),\n name: item.name,\n uploaded: item.uploaded,\n createdTime: item.createdTime,\n lastUpdatedTime: item.lastUpdatedTime,\n ...(item.uploadedTime !== undefined ? { uploadedTime: item.uploadedTime } : {}),\n ...(item.mimeType !== undefined ? { mimeType: item.mimeType } : {}),\n ...(item.directory !== undefined ? { directory: item.directory } : {}),\n ...(item.source !== undefined ? { source: item.source } : {}),\n ...(item.uploadUrl !== undefined ? { uploadUrl: item.uploadUrl } : {}),\n };\n}\n\nfunction mapDatapointResult(item: CogniteDatapointResponse): CogniteDatapointResultItem {\n return {\n ...(item.instanceId?.space !== undefined ? { space: item.instanceId.space } : {}),\n ...(item.instanceId?.externalId !== undefined\n ? { externalId: item.instanceId.externalId }\n : {}),\n isString: item.isString ?? false,\n ...(item.unit !== undefined ? { unit: item.unit } : {}),\n datapoints: item.datapoints ?? [],\n ...(item.nextCursor !== undefined ? { nextCursor: item.nextCursor } : {}),\n };\n}\n","import type {\n CogniteAggregateDatapoint,\n CogniteDatapointResultItem,\n CogniteDatapointRetrieveItem,\n CogniteDatapointRetrieveOptions,\n CogniteNumericDatapoint,\n CognitePort,\n} from \"../cognite\";\nimport type { DatapointAggregate } from \"../types\";\nimport type { CalculatorParameter, DataPoint } from \"./models\";\n\ntype BuiltRequests = {\n requests: CogniteDatapointRetrieveItem[];\n /** For each parameter (by index), the index of the request that serves it. */\n indexMapping: number[];\n};\n\n/**\n * Retrieves and de-duplicates the datapoints needed by a set of calculator\n * parameters. Parameters that share a time series (and granularity, for\n * aggregates) are folded into a single Cognite request; aggregate requests\n * accumulate every aggregate their parameters ask for.\n */\nexport class DatapointsRetriever {\n constructor(private readonly cognite: CognitePort) {}\n\n async retrieveDatapoints(\n parameters: CalculatorParameter[],\n start: Date,\n end: Date,\n ): Promise<DataPoint[][]> {\n const { requests, indexMapping } = this.buildRequests(parameters);\n\n if (requests.length === 0) {\n return parameters.map(() => []);\n }\n\n const options: CogniteDatapointRetrieveOptions = { items: requests, start, end };\n const raw = await this.cognite.retrieveDatapoints(options);\n\n return parameters.map((parameter, index) => {\n const requestIndex = indexMapping[index] as number;\n const item = raw.items[requestIndex];\n if (item === undefined) {\n throw new Error(`missing datapoints response for parameter '${parameter.alias}'`);\n }\n return parseDatapoints(item, parameter);\n });\n }\n\n private buildRequests(parameters: CalculatorParameter[]): BuiltRequests {\n const rawRequestIndex = new Map<string, number>();\n const aggregateRequestIndex = new Map<string, number>();\n const requests: CogniteDatapointRetrieveItem[] = [];\n const indexMapping: number[] = new Array(parameters.length);\n\n parameters.forEach((parameter, index) => {\n const { space, externalId } = parameter.timeSeries;\n const tsKey = `${space}:${externalId}`;\n\n if (parameter.aggregateType === undefined) {\n let requestIndex = rawRequestIndex.get(tsKey);\n if (requestIndex === undefined) {\n requestIndex = requests.length;\n rawRequestIndex.set(tsKey, requestIndex);\n requests.push({ space, externalId });\n }\n indexMapping[index] = requestIndex;\n return;\n }\n\n if (parameter.granularity === undefined) {\n throw new Error(\n `Missing granularity for '${parameter.alias}' with aggregate '${parameter.aggregateType}'`,\n );\n }\n\n const aggregateKey = `${tsKey}|${parameter.granularity}`;\n let requestIndex = aggregateRequestIndex.get(aggregateKey);\n if (requestIndex === undefined) {\n requestIndex = requests.length;\n aggregateRequestIndex.set(aggregateKey, requestIndex);\n requests.push({\n space,\n externalId,\n aggregates: [parameter.aggregateType],\n granularity: parameter.granularity,\n });\n } else {\n const entry = requests[requestIndex] as CogniteDatapointRetrieveItem;\n const aggregates = entry.aggregates as DatapointAggregate[];\n if (!aggregates.includes(parameter.aggregateType)) {\n aggregates.push(parameter.aggregateType);\n }\n }\n indexMapping[index] = requestIndex;\n });\n\n return { requests, indexMapping };\n }\n}\n\nfunction parseDatapoints(\n item: CogniteDatapointResultItem,\n parameter: CalculatorParameter,\n): DataPoint[] {\n if (item.isString) {\n throw new Error(\"expected numeric datapoints, got string\");\n }\n\n const result: DataPoint[] = [];\n for (const datapoint of item.datapoints) {\n const value = readValue(datapoint, parameter.aggregateType);\n if (value === undefined || value === null) {\n continue;\n }\n result.push({ timestamp: datapoint.timestamp, value });\n }\n return result;\n}\n\nfunction readValue(\n datapoint: CogniteNumericDatapoint,\n aggregateType: DatapointAggregate | undefined,\n): number | undefined {\n if (aggregateType === undefined) {\n return (datapoint as { value?: number }).value;\n }\n return (datapoint as CogniteAggregateDatapoint)[aggregateType];\n}\n","/** Binary arithmetic operators supported by the formula grammar. */\nexport type BinaryOp = \"add\" | \"sub\" | \"mul\" | \"div\" | \"pow\" | \"mod\";\n\n/** Unary arithmetic operators supported by the formula grammar. */\nexport type UnaryOp = \"pos\" | \"neg\";\n\n/** Comparison operators supported by the formula grammar. */\nexport type CompareOp = \"eq\" | \"ne\" | \"lt\" | \"le\" | \"gt\" | \"ge\";\n\n/** Boolean operators supported by the formula grammar. */\nexport type BoolOpKind = \"and\" | \"or\";\n\nexport type NameNode = { readonly kind: \"name\"; readonly id: string };\nexport type ConstantNode = { readonly kind: \"constant\"; readonly value: number };\nexport type BinOpNode = {\n readonly kind: \"binop\";\n readonly op: BinaryOp;\n readonly left: ExprNode;\n readonly right: ExprNode;\n};\nexport type UnaryOpNode = {\n readonly kind: \"unaryop\";\n readonly op: UnaryOp;\n readonly operand: ExprNode;\n};\nexport type CompareNode = {\n readonly kind: \"compare\";\n readonly left: ExprNode;\n readonly ops: readonly CompareOp[];\n readonly comparators: readonly ExprNode[];\n};\nexport type BoolOpNode = {\n readonly kind: \"boolop\";\n readonly op: BoolOpKind;\n readonly values: readonly ExprNode[];\n};\nexport type IfExpNode = {\n readonly kind: \"ifexp\";\n readonly test: ExprNode;\n readonly body: ExprNode;\n readonly orelse: ExprNode;\n};\n\n/** Any node of a compiled formula expression tree. */\nexport type ExprNode =\n | NameNode\n | ConstantNode\n | BinOpNode\n | UnaryOpNode\n | CompareNode\n | BoolOpNode\n | IfExpNode;\n\n/** Nodes that make an expression require element-by-element evaluation. */\nexport type ConditionalNode = CompareNode | BoolOpNode | IfExpNode;\n\nexport function isConditionalNode(node: ExprNode): node is ConditionalNode {\n return node.kind === \"compare\" || node.kind === \"boolop\" || node.kind === \"ifexp\";\n}\n","/**\n * Structural formula problems (bad syntax, unknown identifiers, missing\n * parameters, mismatched lengths, non-numeric values) are reported as a\n * subclass of {@link FormulaError}.\n *\n * Value-dependent arithmetic failures (division/modulo by zero, overflowing\n * exponentiation) are intentionally *not* {@link FormulaError}s: they mirror\n * the native errors raised by the Python implementation and extend\n * {@link ArithmeticError} instead.\n */\n\n/** Base error for every structural formula problem. */\nexport class FormulaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FormulaError\";\n }\n}\n\n/** Raised when formula syntax or operations are not supported. */\nexport class InvalidFormulaError extends FormulaError {\n constructor(message: string) {\n super(message);\n this.name = \"InvalidFormulaError\";\n }\n}\n\n/** Raised when a formula references parameters that were not provided. */\nexport class MissingParameterError extends FormulaError {\n readonly missing: readonly string[];\n\n constructor(missing: string[]) {\n super(`missing formula parameter(s): ${missing.join(\", \")}`);\n this.name = \"MissingParameterError\";\n this.missing = [...missing];\n }\n}\n\n/** Raised when a parameter value is not a valid numeric sequence. */\nexport class ParameterError extends FormulaError {\n constructor(message: string) {\n super(message);\n this.name = \"ParameterError\";\n }\n}\n\n/** Raised when referenced parameters do not all share the same length. */\nexport class ParameterLengthError extends ParameterError {\n readonly lengths: Readonly<Record<string, number>>;\n\n constructor(lengths: Record<string, number>) {\n const detail = Object.entries(lengths)\n .map(([name, length]) => `'${name}' has ${length}`)\n .join(\", \");\n super(`parameter length mismatch: ${detail}`);\n this.name = \"ParameterLengthError\";\n this.lengths = { ...lengths };\n }\n}\n\n/**\n * Base for value-dependent arithmetic failures. Mirrors Python's built-in\n * ``ArithmeticError`` and is deliberately separate from {@link FormulaError}.\n */\nexport class ArithmeticError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ArithmeticError\";\n }\n}\n\n/** Raised when a division or modulo has a zero divisor. */\nexport class ZeroDivisionError extends ArithmeticError {\n constructor(message: string) {\n super(message);\n this.name = \"ZeroDivisionError\";\n }\n}\n\n/** Raised when an exponentiation overflows the floating-point range. */\nexport class OverflowError extends ArithmeticError {\n constructor(message: string) {\n super(message);\n this.name = \"OverflowError\";\n }\n}\n","import type { BinaryOp, BoolOpKind, CompareOp, ExprNode, UnaryOp } from \"./ast\";\nimport { isConditionalNode } from \"./ast\";\nimport { InvalidFormulaError } from \"./exceptions\";\n\nconst PLACEHOLDER_RE = /\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\nconst UNRESOLVED_BRACE_RE = /[{}]/;\nconst SAFE_NAME_PREFIX = \"__formula_expression_param_\";\nconst CACHE_MAX_SIZE = 1024;\n\n/** A parsed, validated formula ready to be evaluated over parameter series. */\nexport type CompiledFormula = {\n /** The whitespace-normalized formula text. */\n readonly raw: string;\n /** The formula text after placeholders were replaced with safe identifiers. */\n readonly expression: string;\n /** The validated expression tree. */\n readonly tree: ExprNode;\n /** Original parameter names in first-appearance order. */\n readonly variables: readonly string[];\n /** Mapping of original parameter name to its safe identifier. */\n readonly nameMap: ReadonlyMap<string, string>;\n /** Whether the formula needs element-by-element (short-circuiting) evaluation. */\n readonly hasConditional: boolean;\n};\n\nconst cache = new Map<string, CompiledFormula>();\n\n/**\n * Normalize the formula text, then compile it (memoized by normalized text).\n *\n * The public entry point mirrors the Python ``compile_formula`` helper: it\n * exposes {@link clearCache} so callers can inspect or reset the compilation\n * cache.\n */\nexport function compileFormula(formula: string): CompiledFormula {\n const normalized = normalizeFormulaText(formula);\n\n const cached = cache.get(normalized);\n if (cached !== undefined) {\n return cached;\n }\n\n const compiled = compileNormalized(normalized);\n\n if (cache.size >= CACHE_MAX_SIZE) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) {\n cache.delete(oldest);\n }\n }\n cache.set(normalized, compiled);\n return compiled;\n}\n\n/** Clear the memoized formula compilation cache. */\nexport function clearCache(): void {\n cache.clear();\n}\n\nfunction normalizeFormulaText(formula: string): string {\n if (typeof formula !== \"string\") {\n throw new TypeError(\"formula must be a string\");\n }\n const trimmed = formula.trim();\n if (trimmed === \"\") {\n return \"\";\n }\n return trimmed.split(/\\s+/).join(\" \");\n}\n\nfunction compileNormalized(raw: string): CompiledFormula {\n if (raw === \"\") {\n throw new InvalidFormulaError(\"formula must not be empty\");\n }\n\n const variables: string[] = [];\n const nameMap = new Map<string, string>();\n const expression = replacePlaceholders(raw, variables, nameMap);\n\n if (variables.length === 0) {\n throw new InvalidFormulaError(\"formula must reference at least one parameter\");\n }\n\n if (UNRESOLVED_BRACE_RE.test(expression)) {\n throw new InvalidFormulaError(\"formula contains invalid placeholder syntax\");\n }\n\n const tree = parse(expression);\n validateTree(tree, new Set(nameMap.values()));\n const hasConditional = treeHasConditional(tree);\n\n return { raw, expression, tree, variables, nameMap, hasConditional };\n}\n\nfunction replacePlaceholders(\n formula: string,\n variables: string[],\n nameMap: Map<string, string>,\n): string {\n return formula.replace(PLACEHOLDER_RE, (_match, name: string) => {\n let safe = nameMap.get(name);\n if (safe === undefined) {\n safe = `${SAFE_NAME_PREFIX}${nameMap.size}`;\n nameMap.set(name, safe);\n variables.push(name);\n }\n return safe;\n });\n}\n\nfunction validateTree(tree: ExprNode, allowedNames: ReadonlySet<string>): void {\n walk(tree, (node) => {\n if (node.kind === \"name\" && !allowedNames.has(node.id)) {\n throw new InvalidFormulaError(`unknown formula identifier: ${node.id}`);\n }\n });\n}\n\nfunction treeHasConditional(tree: ExprNode): boolean {\n let found = false;\n walk(tree, (node) => {\n if (isConditionalNode(node)) {\n found = true;\n }\n });\n return found;\n}\n\nfunction walk(node: ExprNode, visit: (node: ExprNode) => void): void {\n visit(node);\n switch (node.kind) {\n case \"binop\":\n walk(node.left, visit);\n walk(node.right, visit);\n break;\n case \"unaryop\":\n walk(node.operand, visit);\n break;\n case \"compare\":\n walk(node.left, visit);\n for (const comparator of node.comparators) {\n walk(comparator, visit);\n }\n break;\n case \"boolop\":\n for (const value of node.values) {\n walk(value, visit);\n }\n break;\n case \"ifexp\":\n walk(node.test, visit);\n walk(node.body, visit);\n walk(node.orelse, visit);\n break;\n default:\n break;\n }\n}\n\n// ─── Tokenizer ─────────────────────────────────────────────────────────────\n\ntype Token =\n | { readonly type: \"number\"; readonly value: number }\n | { readonly type: \"name\"; readonly value: string }\n | { readonly type: \"op\"; readonly value: string };\n\nconst NUMBER_RE = /(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?/y;\nconst IDENT_RE = /[A-Za-z_][A-Za-z0-9_]*/y;\nconst TWO_CHAR_OPS = new Set([\"**\", \"==\", \"!=\", \"<=\", \">=\"]);\nconst ONE_CHAR_OPS = new Set([\"+\", \"-\", \"*\", \"/\", \"%\", \"(\", \")\", \"<\", \">\"]);\n\nfunction tokenize(expression: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n\n while (index < expression.length) {\n const char = expression[index];\n\n if (char === \" \") {\n index += 1;\n continue;\n }\n\n if (isDigit(char) || (char === \".\" && isDigit(expression[index + 1]))) {\n NUMBER_RE.lastIndex = index;\n const match = NUMBER_RE.exec(expression);\n if (match === null) {\n throw new InvalidFormulaError(\"invalid formula syntax: malformed number\");\n }\n tokens.push({ type: \"number\", value: Number(match[0]) });\n index = NUMBER_RE.lastIndex;\n continue;\n }\n\n if (isIdentStart(char)) {\n IDENT_RE.lastIndex = index;\n const match = IDENT_RE.exec(expression);\n // isIdentStart guarantees a match here.\n const value = (match as RegExpExecArray)[0];\n tokens.push({ type: \"name\", value });\n index = IDENT_RE.lastIndex;\n continue;\n }\n\n const twoChar = expression.slice(index, index + 2);\n if (TWO_CHAR_OPS.has(twoChar)) {\n tokens.push({ type: \"op\", value: twoChar });\n index += 2;\n continue;\n }\n\n if (char !== undefined && ONE_CHAR_OPS.has(char)) {\n tokens.push({ type: \"op\", value: char });\n index += 1;\n continue;\n }\n\n throw new InvalidFormulaError(`invalid formula syntax: unexpected character '${char}'`);\n }\n\n return tokens;\n}\n\nfunction isDigit(char: string | undefined): boolean {\n return char !== undefined && char >= \"0\" && char <= \"9\";\n}\n\nfunction isIdentStart(char: string | undefined): boolean {\n if (char === undefined) {\n return false;\n }\n return char === \"_\" || (char >= \"a\" && char <= \"z\") || (char >= \"A\" && char <= \"Z\");\n}\n\n// ─── Parser ────────────────────────────────────────────────────────────────\n\nconst KEYWORDS = new Set([\"and\", \"or\", \"if\", \"else\"]);\nconst CONSTANT_KEYWORDS = new Set([\"True\", \"False\", \"None\"]);\n\nconst COMPARE_OPS: Record<string, CompareOp> = {\n \"==\": \"eq\",\n \"!=\": \"ne\",\n \"<\": \"lt\",\n \"<=\": \"le\",\n \">\": \"gt\",\n \">=\": \"ge\",\n};\n\n/** Parse a placeholder-substituted expression into a validated tree. */\nfunction parse(expression: string): ExprNode {\n const tokens = tokenize(expression);\n const parser = new Parser(tokens);\n const tree = parser.parseExpression();\n parser.expectEnd();\n return tree;\n}\n\nclass Parser {\n private position = 0;\n\n constructor(private readonly tokens: readonly Token[]) {}\n\n parseExpression(): ExprNode {\n return this.parseConditional();\n }\n\n expectEnd(): void {\n if (this.position < this.tokens.length) {\n throw new InvalidFormulaError(\"invalid formula syntax: unexpected trailing tokens\");\n }\n }\n\n private parseConditional(): ExprNode {\n const body = this.parseOr();\n if (this.matchKeyword(\"if\")) {\n const test = this.parseOr();\n this.expectKeyword(\"else\");\n const orelse = this.parseConditional();\n return { kind: \"ifexp\", test, body, orelse };\n }\n return body;\n }\n\n private parseOr(): ExprNode {\n const values = [this.parseAnd()];\n while (this.matchKeyword(\"or\")) {\n values.push(this.parseAnd());\n }\n return values.length === 1 ? (values[0] as ExprNode) : { kind: \"boolop\", op: \"or\", values };\n }\n\n private parseAnd(): ExprNode {\n const values = [this.parseComparison()];\n while (this.matchKeyword(\"and\")) {\n values.push(this.parseComparison());\n }\n const op: BoolOpKind = \"and\";\n return values.length === 1 ? (values[0] as ExprNode) : { kind: \"boolop\", op, values };\n }\n\n private parseComparison(): ExprNode {\n const left = this.parseAdditive();\n const ops: CompareOp[] = [];\n const comparators: ExprNode[] = [];\n while (true) {\n const op = this.peekCompareOp();\n if (op === undefined) {\n break;\n }\n this.position += 1;\n ops.push(op);\n comparators.push(this.parseAdditive());\n }\n return ops.length === 0 ? left : { kind: \"compare\", left, ops, comparators };\n }\n\n private parseAdditive(): ExprNode {\n let node = this.parseMultiplicative();\n while (true) {\n const op = this.peekOp();\n if (op === \"+\" || op === \"-\") {\n this.position += 1;\n const right = this.parseMultiplicative();\n node = { kind: \"binop\", op: op === \"+\" ? \"add\" : \"sub\", left: node, right };\n continue;\n }\n break;\n }\n return node;\n }\n\n private parseMultiplicative(): ExprNode {\n let node = this.parseUnary();\n while (true) {\n const op = this.peekOp();\n if (op === \"*\" || op === \"/\" || op === \"%\") {\n this.position += 1;\n const right = this.parseUnary();\n const kind: BinaryOp = op === \"*\" ? \"mul\" : op === \"/\" ? \"div\" : \"mod\";\n node = { kind: \"binop\", op: kind, left: node, right };\n continue;\n }\n break;\n }\n return node;\n }\n\n private parseUnary(): ExprNode {\n const op = this.peekOp();\n if (op === \"+\" || op === \"-\") {\n this.position += 1;\n const operand = this.parseUnary();\n const kind: UnaryOp = op === \"+\" ? \"pos\" : \"neg\";\n return { kind: \"unaryop\", op: kind, operand };\n }\n return this.parsePower();\n }\n\n private parsePower(): ExprNode {\n const base = this.parseAtom();\n if (this.peekOp() === \"**\") {\n this.position += 1;\n // Right operand is a unary expression so ``2 ** -1`` is accepted and\n // ``**`` remains right-associative.\n const exponent = this.parseUnary();\n return { kind: \"binop\", op: \"pow\", left: base, right: exponent };\n }\n return base;\n }\n\n private parseAtom(): ExprNode {\n const token = this.tokens[this.position];\n if (token === undefined) {\n throw new InvalidFormulaError(\"invalid formula syntax: unexpected end of expression\");\n }\n\n if (token.type === \"number\") {\n this.position += 1;\n return { kind: \"constant\", value: token.value };\n }\n\n if (token.type === \"name\") {\n if (CONSTANT_KEYWORDS.has(token.value)) {\n throw new InvalidFormulaError(\"only numeric constants are supported\");\n }\n if (KEYWORDS.has(token.value)) {\n throw new InvalidFormulaError(\n `invalid formula syntax: unexpected keyword '${token.value}'`,\n );\n }\n this.position += 1;\n return { kind: \"name\", id: token.value };\n }\n\n if (token.value === \"(\") {\n this.position += 1;\n const inner = this.parseExpression();\n this.expectOp(\")\");\n return inner;\n }\n\n throw new InvalidFormulaError(`invalid formula syntax: unexpected token '${token.value}'`);\n }\n\n private peekOp(): string | undefined {\n const token = this.tokens[this.position];\n return token !== undefined && token.type === \"op\" ? token.value : undefined;\n }\n\n private peekCompareOp(): CompareOp | undefined {\n const op = this.peekOp();\n return op !== undefined ? COMPARE_OPS[op] : undefined;\n }\n\n private matchKeyword(keyword: string): boolean {\n const token = this.tokens[this.position];\n if (token !== undefined && token.type === \"name\" && token.value === keyword) {\n this.position += 1;\n return true;\n }\n return false;\n }\n\n private expectKeyword(keyword: string): void {\n if (!this.matchKeyword(keyword)) {\n throw new InvalidFormulaError(`invalid formula syntax: expected '${keyword}'`);\n }\n }\n\n private expectOp(op: string): void {\n if (this.peekOp() !== op) {\n throw new InvalidFormulaError(`invalid formula syntax: expected '${op}'`);\n }\n this.position += 1;\n }\n}\n","import type { BinaryOp, CompareOp, ExprNode, UnaryOp } from \"./ast\";\nimport { OverflowError, ZeroDivisionError } from \"./exceptions\";\n\n/** Environment mapping safe identifiers to their aligned numeric series. */\nexport type Environment = Record<string, readonly number[]>;\n\n/**\n * A value is either a scalar (broadcast across the whole series) or an\n * already-materialized per-element sequence. Keeping constants as scalars\n * avoids allocating length-N arrays for them and skips the element-wise zip\n * whenever one side of an operation is constant.\n */\ntype Value = number | readonly number[];\n\nconst UNARY_OPS: Record<UnaryOp, (value: number) => number> = {\n pos: (value) => value,\n neg: (value) => -value,\n};\n\nconst BINARY_OPS: Record<BinaryOp, (left: number, right: number) => number> = {\n add: (left, right) => left + right,\n sub: (left, right) => left - right,\n mul: (left, right) => left * right,\n div: (left, right) => {\n if (right === 0) {\n throw new ZeroDivisionError(\"float division by zero\");\n }\n return left / right;\n },\n mod: pythonMod,\n pow: safePow,\n};\n\nconst COMPARE_OPS: Record<CompareOp, (left: number, right: number) => boolean> = {\n eq: (left, right) => left === right,\n ne: (left, right) => left !== right,\n lt: (left, right) => left < right,\n le: (left, right) => left <= right,\n gt: (left, right) => left > right,\n ge: (left, right) => left >= right,\n};\n\n/** Python's ``%`` follows the sign of the divisor, unlike JavaScript's ``%``. */\nfunction pythonMod(left: number, right: number): number {\n if (right === 0) {\n throw new ZeroDivisionError(\"float modulo\");\n }\n return left - Math.floor(left / right) * right;\n}\n\n/**\n * Exponentiate in float space. Mirrors the Python implementation's error\n * semantics: raising ``0`` to a negative power and overflowing results are\n * surfaced as arithmetic errors rather than silently producing infinities.\n */\nfunction safePow(base: number, exponent: number): number {\n if (base === 0 && exponent < 0) {\n throw new ZeroDivisionError(\"0.0 cannot be raised to a negative power\");\n }\n const result = base ** exponent;\n if (!Number.isFinite(result) && Number.isFinite(base) && Number.isFinite(exponent)) {\n throw new OverflowError(\"(34, 'Numerical result out of range')\");\n }\n return result;\n}\n\n/** Python truthiness for floats: only exactly ``0`` is falsy (``NaN`` is truthy). */\nfunction isTruthy(value: number): boolean {\n return value !== 0;\n}\n\nexport function evaluateTree(\n tree: ExprNode,\n environment: Environment,\n length: number,\n hasConditional: boolean,\n): number[] {\n if (hasConditional) {\n // ``if``/``else`` branches (and their guards) must only run for the\n // elements that select them, so evaluate index-by-index.\n const result: number[] = new Array(length);\n for (let index = 0; index < length; index += 1) {\n result[index] = evaluateNodeAt(tree, environment, index);\n }\n return result;\n }\n\n const value = evaluateNode(tree, environment);\n if (Array.isArray(value)) {\n return value as number[];\n }\n // The compiler guarantees at least one parameter, so a scalar result only\n // happens for degenerate trees; broadcast it to the series length.\n return new Array(length).fill(value as number);\n}\n\nfunction evaluateNode(node: ExprNode, environment: Environment): Value {\n switch (node.kind) {\n case \"name\": {\n const series = environment[node.id];\n // The runtime guarantees every referenced name is present.\n return series as readonly number[];\n }\n case \"constant\":\n return node.value;\n case \"binop\": {\n const left = evaluateNode(node.left, environment);\n const right = evaluateNode(node.right, environment);\n return applyBinary(BINARY_OPS[node.op], left, right);\n }\n case \"unaryop\": {\n const operand = evaluateNode(node.operand, environment);\n const op = UNARY_OPS[node.op];\n return Array.isArray(operand) ? operand.map(op) : op(operand as number);\n }\n default:\n // Conditional nodes never reach the vectorized path.\n throw new TypeError(`unsupported formula element: ${node.kind}`);\n }\n}\n\nfunction applyBinary(\n op: (left: number, right: number) => number,\n left: Value,\n right: Value,\n): Value {\n if (Array.isArray(left)) {\n if (Array.isArray(right)) {\n const result: number[] = new Array(left.length);\n for (let index = 0; index < left.length; index += 1) {\n result[index] = op(left[index] as number, right[index] as number);\n }\n return result;\n }\n const scalar = right as number;\n return left.map((value) => op(value, scalar));\n }\n const scalarLeft = left as number;\n if (Array.isArray(right)) {\n return right.map((value) => op(scalarLeft, value));\n }\n return op(scalarLeft, right as number);\n}\n\nfunction evaluateNodeAt(node: ExprNode, environment: Environment, index: number): number {\n switch (node.kind) {\n case \"name\": {\n const series = environment[node.id] as readonly number[];\n return series[index] as number;\n }\n case \"constant\":\n return node.value;\n case \"binop\": {\n const left = evaluateNodeAt(node.left, environment, index);\n const right = evaluateNodeAt(node.right, environment, index);\n return BINARY_OPS[node.op](left, right);\n }\n case \"unaryop\":\n return UNARY_OPS[node.op](evaluateNodeAt(node.operand, environment, index));\n case \"compare\": {\n let left = evaluateNodeAt(node.left, environment, index);\n for (let i = 0; i < node.ops.length; i += 1) {\n const right = evaluateNodeAt(node.comparators[i] as ExprNode, environment, index);\n if (!COMPARE_OPS[node.ops[i] as CompareOp](left, right)) {\n return 0;\n }\n left = right;\n }\n return 1;\n }\n case \"boolop\": {\n if (node.op === \"and\") {\n for (const value of node.values) {\n if (!isTruthy(evaluateNodeAt(value, environment, index))) {\n return 0;\n }\n }\n return 1;\n }\n for (const value of node.values) {\n if (isTruthy(evaluateNodeAt(value, environment, index))) {\n return 1;\n }\n }\n return 0;\n }\n case \"ifexp\": {\n const test = evaluateNodeAt(node.test, environment, index);\n const branch = isTruthy(test) ? node.body : node.orelse;\n return evaluateNodeAt(branch, environment, index);\n }\n default:\n throw new TypeError(\"unsupported formula element\");\n }\n}\n","import type { CompiledFormula } from \"./compiler\";\nimport type { Environment } from \"./evaluator\";\nimport { evaluateTree } from \"./evaluator\";\nimport { MissingParameterError, ParameterError, ParameterLengthError } from \"./exceptions\";\nimport type { EvaluationResult, Parameters } from \"./types\";\n\nexport function evaluateCompiled(\n formula: CompiledFormula,\n parameters: Parameters,\n): EvaluationResult {\n const missing = formula.variables.filter((name) => !Object.hasOwn(parameters, name));\n if (missing.length > 0) {\n throw new MissingParameterError(missing);\n }\n\n const environment: Environment = {};\n const lengthsByName: Record<string, number> = {};\n for (const [originalName, safeName] of formula.nameMap) {\n const series = normalizeParameter(originalName, parameters[originalName]);\n environment[safeName] = series;\n lengthsByName[originalName] = series.length;\n }\n\n const lengths = Object.values(lengthsByName);\n if (new Set(lengths).size !== 1) {\n throw new ParameterLengthError(lengthsByName);\n }\n\n const length = lengths[0] as number;\n if (length === 0) {\n // Every referenced parameter resolved to an empty series, so there is\n // nothing to compute over: return an empty result rather than erroring.\n return [];\n }\n\n return evaluateTree(formula.tree, environment, length, formula.hasConditional);\n}\n\nfunction normalizeParameter(name: string, value: unknown): number[] {\n if (!Array.isArray(value)) {\n throw new ParameterError(`parameter '${name}' must be a numeric sequence`);\n }\n\n const normalized: number[] = new Array(value.length);\n for (let index = 0; index < value.length; index += 1) {\n const item = value[index];\n if (typeof item !== \"number\") {\n throw new ParameterError(`parameter '${name}' must be a numeric sequence`);\n }\n normalized[index] = item;\n }\n return normalized;\n}\n","import { compileFormula } from \"./compiler\";\nimport { evaluateCompiled } from \"./runtime\";\nimport type { EvaluationResult, Parameters } from \"./types\";\n\n/**\n * Evaluate a formula over aligned numeric parameter sequences.\n *\n * Placeholders are written as ``{name}`` and each resolves to the matching\n * entry in `parameters`. The following operators are supported:\n *\n * - arithmetic: ``+`` ``-`` ``*`` ``/`` ``**`` ``%`` (binary) and ``+`` ``-`` (unary)\n * - comparisons: ``==`` ``!=`` ``<`` ``<=`` ``>`` ``>=``\n * - boolean: ``and`` ``or``\n * - conditional: ``{A} / {B} if {B} != 0 else 0``\n *\n * Structural problems (bad syntax, unknown identifiers, missing parameters,\n * mismatched lengths, non-numeric values) throw a subclass of `FormulaError`.\n *\n * When every referenced parameter is an empty sequence the result is an empty\n * array — there is nothing to compute over, so this is treated as a valid\n * (empty) result rather than an error. A *mix* of empty and non-empty\n * parameters is still a length mismatch and throws `ParameterLengthError`.\n *\n * Arithmetic failures that depend on the parameter *values* are surfaced as\n * arithmetic errors (subclasses of `ArithmeticError`) rather than\n * `FormulaError`: dividing or taking a modulo by zero throws\n * `ZeroDivisionError` and an overflowing exponentiation throws `OverflowError`.\n *\n * Conditional expressions, comparisons and boolean operators are evaluated\n * element-by-element: for each series element only the selected branch is\n * evaluated, so a division-by-zero (or other value-dependent failure) in the\n * branch that is *not* selected for a given element never throws.\n */\nexport function evaluate(formula: string, parameters: Parameters = {}): EvaluationResult {\n return evaluateCompiled(compileFormula(formula), parameters);\n}\n","import type { CogniteClient } from \"@cognite/sdk\";\nimport { type CognitePort, createCogniteAdapter } from \"../cognite\";\nimport { DatapointsRetriever } from \"./datapoints-retrieval\";\nimport { compileFormula, evaluate } from \"./formula-expression\";\nimport type { CalculationResult, CalculatorQuery, DataPoint } from \"./models\";\n\n/**\n * Evaluates formula-based calculations over Cognite time series datapoints.\n *\n * Each {@link CalculatorQuery} pairs a formula with the parameters its\n * placeholders resolve to. The calculator fetches the required datapoints\n * (de-duplicating shared time series), aligns them by position and evaluates\n * the formula element-by-element.\n */\nexport class Calculator {\n private readonly retriever: DatapointsRetriever;\n\n constructor(cognite: CogniteClient | CognitePort) {\n const port = isCognitePort(cognite) ? cognite : createCogniteAdapter(cognite);\n this.retriever = new DatapointsRetriever(port);\n }\n\n /** Evaluate a single query over the given time range. */\n async calculate(query: CalculatorQuery, start: Date, end: Date): Promise<CalculationResult> {\n const [result] = await this.calculateMultiples([query], start, end);\n // calculateMultiples returns one result per query, so this is always set.\n return result as CalculationResult;\n }\n\n /**\n * Evaluate several queries over the given time range, retrieving every\n * parameter's datapoints in a single de-duplicated round trip.\n */\n async calculateMultiples(\n queries: CalculatorQuery[],\n start: Date,\n end: Date,\n ): Promise<CalculationResult[]> {\n const parameters = queries.flatMap((query) => query.parameters);\n const datapoints = await this.retriever.retrieveDatapoints(parameters, start, end);\n\n const results: CalculationResult[] = [];\n let offset = 0;\n for (const query of queries) {\n const slice = datapoints.slice(offset, offset + query.parameters.length);\n offset += query.parameters.length;\n results.push(calculate(query, slice));\n }\n return results;\n }\n}\n\nfunction calculate(query: CalculatorQuery, datapoints: DataPoint[][]): CalculationResult {\n const valuesMap: Record<string, number[]> = {};\n const seriesByAlias = new Map<string, DataPoint[]>();\n query.parameters.forEach((parameter, index) => {\n const series = datapoints[index] ?? [];\n valuesMap[parameter.alias] = series.map((point) => point.value);\n seriesByAlias.set(parameter.alias, series);\n });\n\n const values = evaluate(query.formula, valuesMap);\n\n // Timestamps must come from a parameter the formula actually references:\n // `evaluate` only guarantees equal lengths across referenced parameters, so\n // an unreferenced parameter's series (e.g. a different granularity or one\n // with data gaps) can have a different length and would misalign results.\n const [firstVariable] = compileFormula(query.formula).variables;\n const timestampSeries = seriesByAlias.get(firstVariable as string) ?? [];\n\n return {\n query,\n datapoints: timestampSeries.map((point, index) => ({\n timestamp: point.timestamp,\n value: values[index] as number,\n })),\n };\n}\n\nfunction isCognitePort(value: CogniteClient | CognitePort): value is CognitePort {\n return typeof (value as CognitePort).retrieveDatapoints === \"function\";\n}\n"]}
1
+ {"version":3,"sources":["../../src/cognite/adapter.ts","../../src/utils/array.ts","../../src/calculator/datapoints-retrieval.ts","../../src/calculator/formula-expression/ast.ts","../../src/calculator/formula-expression/exceptions.ts","../../src/calculator/formula-expression/compiler.ts","../../src/calculator/formula-expression/evaluator.ts","../../src/calculator/formula-expression/runtime.ts","../../src/calculator/formula-expression/core.ts","../../src/calculator/calculator.ts"],"names":["items","requestIndex","COMPARE_OPS"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CogniteClient } from \"@cognite/sdk\";\nimport type { CognitePort } from \"./port\";\nimport type {\n CogniteDatapointDeleteItem,\n CogniteDatapointInsertItem,\n CogniteDatapointLatestItem,\n CogniteDatapointResponse,\n CogniteDatapointResultItem,\n CogniteDatapointRetrieveOptions,\n CogniteFileDownloadUrl,\n CogniteFileUploadInfo,\n CogniteFileUploadResult,\n DataModelId,\n DataModelRetrieveOptions,\n InstancesAggregateRequest,\n InstancesAggregateResponse,\n InstancesApplyRequest,\n InstancesApplyResponse,\n InstancesQueryRequest,\n InstancesQueryResponse,\n InstancesSearchRequest,\n InstancesSearchResponse,\n ViewDefinition,\n} from \"./types\";\n\nexport function createCogniteAdapter(client: CogniteClient): CognitePort {\n return new CogniteSdkAdapter(client);\n}\n\nclass CogniteSdkAdapter implements CognitePort {\n constructor(private readonly client: CogniteClient) {}\n\n async retrieveDataModels(ids: DataModelId[], options?: DataModelRetrieveOptions) {\n const response = await this.client.dataModels.retrieve(ids, options);\n return {\n items: response.items.map((item) => ({\n createdTime: item.createdTime,\n views: (item.views ?? []) as ViewDefinition[],\n })),\n };\n }\n\n async retrieveViews(\n ids: Array<{ space: string; externalId: string; version: string }>,\n ): Promise<{ items: ViewDefinition[] }> {\n const cleanIds = ids.map(({ space, externalId, version }) => ({ space, externalId, version }));\n const response = await this.client.views.retrieve(cleanIds);\n return { items: response.items as ViewDefinition[] };\n }\n\n async queryInstances(request: InstancesQueryRequest): Promise<InstancesQueryResponse> {\n const response = await this.client.instances.query(\n request as Parameters<CogniteClient[\"instances\"][\"query\"]>[0],\n );\n return {\n items: response.items as unknown as InstancesQueryResponse[\"items\"],\n nextCursor: response.nextCursor,\n };\n }\n\n async searchInstances(request: InstancesSearchRequest): Promise<InstancesSearchResponse> {\n const response = await this.client.instances.search(\n request as Parameters<CogniteClient[\"instances\"][\"search\"]>[0],\n );\n return {\n items: response.items as unknown as InstancesSearchResponse[\"items\"],\n };\n }\n\n async aggregateInstances(\n request: InstancesAggregateRequest,\n ): Promise<InstancesAggregateResponse> {\n const response = await this.client.instances.aggregate(\n request as Parameters<CogniteClient[\"instances\"][\"aggregate\"]>[0],\n );\n return {\n items: response.items as unknown as InstancesAggregateResponse[\"items\"],\n };\n }\n\n async applyInstances(request: InstancesApplyRequest): Promise<InstancesApplyResponse> {\n // The Cognite SDK has no combined upsert+delete endpoint: `instances.upsert` writes\n // items and `instances.delete` removes them, as two separate API calls.\n const { items, delete: deleteItems = [], replace } = request;\n const results: InstancesApplyResponse[\"items\"] = [];\n\n if (deleteItems.length > 0) {\n const deleteResponse = await this.client.instances.delete(\n deleteItems as Parameters<CogniteClient[\"instances\"][\"delete\"]>[0],\n );\n results.push(\n ...((deleteResponse as unknown as { items?: InstancesApplyResponse[\"items\"] }).items ?? []),\n );\n }\n\n if (items.length > 0) {\n const response = await this.client.instances.upsert({\n items,\n ...(replace === true ? { replace: true } : {}),\n } as Parameters<CogniteClient[\"instances\"][\"upsert\"]>[0]);\n results.push(...(response.items as unknown as InstancesApplyResponse[\"items\"]));\n }\n\n return { items: results };\n }\n\n async retrieveDatapoints(\n options: CogniteDatapointRetrieveOptions,\n ): Promise<{ items: CogniteDatapointResultItem[] }> {\n const { items, ...rest } = options;\n const sdkItems = items.map(({ space, externalId, ...itemRest }) => ({\n ...itemRest,\n instanceId: { space, externalId },\n }));\n const response = await this.client.datapoints.retrieve({\n ...rest,\n items: sdkItems,\n } as Parameters<typeof this.client.datapoints.retrieve>[0]);\n return { items: (response as unknown as CogniteDatapointResponse[]).map(mapDatapointResult) };\n }\n\n async retrieveLatestDatapoints(\n items: CogniteDatapointLatestItem[],\n options?: { ignoreUnknownIds?: boolean },\n ): Promise<{ items: CogniteDatapointResultItem[] }> {\n const sdkItems = items.map(({ space, externalId, before }) => ({\n instanceId: { space, externalId },\n ...(before !== undefined ? { before } : {}),\n }));\n const response = await this.client.datapoints.retrieveLatest(\n sdkItems as Parameters<typeof this.client.datapoints.retrieveLatest>[0],\n options,\n );\n return { items: (response as unknown as CogniteDatapointResponse[]).map(mapDatapointResult) };\n }\n\n async insertDatapoints(items: CogniteDatapointInsertItem[]): Promise<void> {\n const sdkItems = items.map(({ space, externalId, datapoints }) => ({\n instanceId: { space, externalId },\n datapoints,\n }));\n await this.client.datapoints.insert(\n sdkItems as Parameters<typeof this.client.datapoints.insert>[0],\n );\n }\n\n async deleteDatapoints(items: CogniteDatapointDeleteItem[]): Promise<void> {\n const sdkItems = items.map(({ space, externalId, inclusiveBegin, exclusiveEnd }) => ({\n instanceId: { space, externalId },\n inclusiveBegin,\n ...(exclusiveEnd !== undefined ? { exclusiveEnd } : {}),\n }));\n await this.client.datapoints.delete(\n sdkItems as Parameters<typeof this.client.datapoints.delete>[0],\n );\n }\n\n async uploadFile(\n fileInfo: CogniteFileUploadInfo,\n content?: unknown,\n ): Promise<CogniteFileUploadResult> {\n const { instanceId, ...rest } = fileInfo;\n const response = await this.client.files.upload(\n { ...rest, instanceId } as Parameters<typeof this.client.files.upload>[0],\n content as Parameters<typeof this.client.files.upload>[1],\n false,\n content !== undefined,\n );\n return mapFileResult(response as SdkFileInfo);\n }\n\n async getFileDownloadUrls(\n ids: Array<{ instanceId: { space: string; externalId: string } }>,\n ): Promise<CogniteFileDownloadUrl[]> {\n const response = await this.client.files.getDownloadUrls(\n ids as Parameters<typeof this.client.files.getDownloadUrls>[0],\n );\n return (\n response as Array<{\n instanceId?: { space?: string; externalId?: string };\n downloadUrl: string;\n }>\n ).map((item) => ({\n ...(item.instanceId !== undefined ? { instanceId: item.instanceId } : {}),\n downloadUrl: item.downloadUrl,\n }));\n }\n}\n\ntype SdkFileInfo = {\n instanceId?: { space?: string; externalId?: string };\n name: string;\n uploaded: boolean;\n uploadedTime?: Date;\n createdTime: Date;\n lastUpdatedTime: Date;\n mimeType?: string;\n directory?: string;\n source?: string;\n uploadUrl?: string;\n};\n\nfunction mapFileResult(item: SdkFileInfo): CogniteFileUploadResult {\n return {\n ...(item.instanceId !== undefined ? { instanceId: item.instanceId } : {}),\n name: item.name,\n uploaded: item.uploaded,\n createdTime: item.createdTime,\n lastUpdatedTime: item.lastUpdatedTime,\n ...(item.uploadedTime !== undefined ? { uploadedTime: item.uploadedTime } : {}),\n ...(item.mimeType !== undefined ? { mimeType: item.mimeType } : {}),\n ...(item.directory !== undefined ? { directory: item.directory } : {}),\n ...(item.source !== undefined ? { source: item.source } : {}),\n ...(item.uploadUrl !== undefined ? { uploadUrl: item.uploadUrl } : {}),\n };\n}\n\nfunction mapDatapointResult(item: CogniteDatapointResponse): CogniteDatapointResultItem {\n return {\n ...(item.instanceId?.space !== undefined ? { space: item.instanceId.space } : {}),\n ...(item.instanceId?.externalId !== undefined\n ? { externalId: item.instanceId.externalId }\n : {}),\n isString: item.isString ?? false,\n ...(item.unit !== undefined ? { unit: item.unit } : {}),\n datapoints: item.datapoints ?? [],\n ...(item.nextCursor !== undefined ? { nextCursor: item.nextCursor } : {}),\n };\n}\n","export function chunks<TItem>(items: TItem[], size: number): TItem[][] {\n const result: TItem[][] = [];\n for (let index = 0; index < items.length; index += size) {\n result.push(items.slice(index, index + size));\n }\n return result;\n}\n","import type {\n CogniteAggregateDatapoint,\n CogniteDatapointResultItem,\n CogniteDatapointRetrieveItem,\n CogniteDatapointRetrieveOptions,\n CogniteNumericDatapoint,\n CognitePort,\n} from \"../cognite\";\nimport type { DatapointAggregate } from \"../types\";\nimport { chunks } from \"../utils/array\";\nimport type { CalculatorParameter, DataPoint } from \"./models\";\n\n// Cognite's datapoints retrieve endpoint accepts at most 100 items per request.\nconst MAX_ITEMS_PER_REQUEST = 100;\n\ntype BuiltRequests = {\n requests: CogniteDatapointRetrieveItem[];\n /** For each parameter (by index), the index of the request that serves it. */\n indexMapping: number[];\n};\n\n/**\n * Retrieves and de-duplicates the datapoints needed by a set of calculator\n * parameters. Parameters that share a time series (and granularity, for\n * aggregates) are folded into a single Cognite request; aggregate requests\n * accumulate every aggregate their parameters ask for.\n */\nexport class DatapointsRetriever {\n constructor(private readonly cognite: CognitePort) {}\n\n async retrieveDatapoints(\n parameters: CalculatorParameter[],\n start: Date,\n end: Date,\n ): Promise<DataPoint[][]> {\n const { requests, indexMapping } = this.buildRequests(parameters);\n\n if (requests.length === 0) {\n return parameters.map(() => []);\n }\n\n const responses = await Promise.all(\n chunks(requests, MAX_ITEMS_PER_REQUEST).map((items) => {\n const options: CogniteDatapointRetrieveOptions = { items, start, end };\n return this.cognite.retrieveDatapoints(options);\n }),\n );\n const items = responses.flatMap((response) => response.items);\n\n return parameters.map((parameter, index) => {\n const requestIndex = indexMapping[index] as number;\n const item = items[requestIndex];\n if (item === undefined) {\n throw new Error(`missing datapoints response for parameter '${parameter.alias}'`);\n }\n return parseDatapoints(item, parameter);\n });\n }\n\n private buildRequests(parameters: CalculatorParameter[]): BuiltRequests {\n const rawRequestIndex = new Map<string, number>();\n const aggregateRequestIndex = new Map<string, number>();\n const requests: CogniteDatapointRetrieveItem[] = [];\n const indexMapping: number[] = new Array(parameters.length);\n\n parameters.forEach((parameter, index) => {\n const { space, externalId } = parameter.timeSeries;\n const tsKey = `${space}:${externalId}`;\n\n if (parameter.aggregateType === undefined) {\n let requestIndex = rawRequestIndex.get(tsKey);\n if (requestIndex === undefined) {\n requestIndex = requests.length;\n rawRequestIndex.set(tsKey, requestIndex);\n requests.push({ space, externalId });\n }\n indexMapping[index] = requestIndex;\n return;\n }\n\n if (parameter.granularity === undefined) {\n throw new Error(\n `Missing granularity for '${parameter.alias}' with aggregate '${parameter.aggregateType}'`,\n );\n }\n\n const aggregateKey = `${tsKey}|${parameter.granularity}`;\n let requestIndex = aggregateRequestIndex.get(aggregateKey);\n if (requestIndex === undefined) {\n requestIndex = requests.length;\n aggregateRequestIndex.set(aggregateKey, requestIndex);\n requests.push({\n space,\n externalId,\n aggregates: [parameter.aggregateType],\n granularity: parameter.granularity,\n });\n } else {\n const entry = requests[requestIndex] as CogniteDatapointRetrieveItem;\n const aggregates = entry.aggregates as DatapointAggregate[];\n if (!aggregates.includes(parameter.aggregateType)) {\n aggregates.push(parameter.aggregateType);\n }\n }\n indexMapping[index] = requestIndex;\n });\n\n return { requests, indexMapping };\n }\n}\n\nfunction parseDatapoints(\n item: CogniteDatapointResultItem,\n parameter: CalculatorParameter,\n): DataPoint[] {\n if (item.isString) {\n throw new Error(\"expected numeric datapoints, got string\");\n }\n\n const result: DataPoint[] = [];\n for (const datapoint of item.datapoints) {\n const value = readValue(datapoint, parameter.aggregateType);\n if (value === undefined || value === null) {\n continue;\n }\n result.push({ timestamp: datapoint.timestamp, value });\n }\n return result;\n}\n\nfunction readValue(\n datapoint: CogniteNumericDatapoint,\n aggregateType: DatapointAggregate | undefined,\n): number | undefined {\n if (aggregateType === undefined) {\n return (datapoint as { value?: number }).value;\n }\n return (datapoint as CogniteAggregateDatapoint)[aggregateType];\n}\n","/** Binary arithmetic operators supported by the formula grammar. */\nexport type BinaryOp = \"add\" | \"sub\" | \"mul\" | \"div\" | \"pow\" | \"mod\";\n\n/** Unary arithmetic operators supported by the formula grammar. */\nexport type UnaryOp = \"pos\" | \"neg\";\n\n/** Comparison operators supported by the formula grammar. */\nexport type CompareOp = \"eq\" | \"ne\" | \"lt\" | \"le\" | \"gt\" | \"ge\";\n\n/** Boolean operators supported by the formula grammar. */\nexport type BoolOpKind = \"and\" | \"or\";\n\nexport type NameNode = { readonly kind: \"name\"; readonly id: string };\nexport type ConstantNode = { readonly kind: \"constant\"; readonly value: number };\nexport type BinOpNode = {\n readonly kind: \"binop\";\n readonly op: BinaryOp;\n readonly left: ExprNode;\n readonly right: ExprNode;\n};\nexport type UnaryOpNode = {\n readonly kind: \"unaryop\";\n readonly op: UnaryOp;\n readonly operand: ExprNode;\n};\nexport type CompareNode = {\n readonly kind: \"compare\";\n readonly left: ExprNode;\n readonly ops: readonly CompareOp[];\n readonly comparators: readonly ExprNode[];\n};\nexport type BoolOpNode = {\n readonly kind: \"boolop\";\n readonly op: BoolOpKind;\n readonly values: readonly ExprNode[];\n};\nexport type IfExpNode = {\n readonly kind: \"ifexp\";\n readonly test: ExprNode;\n readonly body: ExprNode;\n readonly orelse: ExprNode;\n};\n\n/** Any node of a compiled formula expression tree. */\nexport type ExprNode =\n | NameNode\n | ConstantNode\n | BinOpNode\n | UnaryOpNode\n | CompareNode\n | BoolOpNode\n | IfExpNode;\n\n/** Nodes that make an expression require element-by-element evaluation. */\nexport type ConditionalNode = CompareNode | BoolOpNode | IfExpNode;\n\nexport function isConditionalNode(node: ExprNode): node is ConditionalNode {\n return node.kind === \"compare\" || node.kind === \"boolop\" || node.kind === \"ifexp\";\n}\n","/**\n * Structural formula problems (bad syntax, unknown identifiers, missing\n * parameters, mismatched lengths, non-numeric values) are reported as a\n * subclass of {@link FormulaError}.\n *\n * Value-dependent arithmetic failures (division/modulo by zero, overflowing\n * exponentiation) are intentionally *not* {@link FormulaError}s: they mirror\n * the native errors raised by the Python implementation and extend\n * {@link ArithmeticError} instead.\n */\n\n/** Base error for every structural formula problem. */\nexport class FormulaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FormulaError\";\n }\n}\n\n/** Raised when formula syntax or operations are not supported. */\nexport class InvalidFormulaError extends FormulaError {\n constructor(message: string) {\n super(message);\n this.name = \"InvalidFormulaError\";\n }\n}\n\n/** Raised when a formula references parameters that were not provided. */\nexport class MissingParameterError extends FormulaError {\n readonly missing: readonly string[];\n\n constructor(missing: string[]) {\n super(`missing formula parameter(s): ${missing.join(\", \")}`);\n this.name = \"MissingParameterError\";\n this.missing = [...missing];\n }\n}\n\n/** Raised when a parameter value is not a valid numeric sequence. */\nexport class ParameterError extends FormulaError {\n constructor(message: string) {\n super(message);\n this.name = \"ParameterError\";\n }\n}\n\n/** Raised when referenced parameters do not all share the same length. */\nexport class ParameterLengthError extends ParameterError {\n readonly lengths: Readonly<Record<string, number>>;\n\n constructor(lengths: Record<string, number>) {\n const detail = Object.entries(lengths)\n .map(([name, length]) => `'${name}' has ${length}`)\n .join(\", \");\n super(`parameter length mismatch: ${detail}`);\n this.name = \"ParameterLengthError\";\n this.lengths = { ...lengths };\n }\n}\n\n/**\n * Base for value-dependent arithmetic failures. Mirrors Python's built-in\n * ``ArithmeticError`` and is deliberately separate from {@link FormulaError}.\n */\nexport class ArithmeticError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ArithmeticError\";\n }\n}\n\n/** Raised when a division or modulo has a zero divisor. */\nexport class ZeroDivisionError extends ArithmeticError {\n constructor(message: string) {\n super(message);\n this.name = \"ZeroDivisionError\";\n }\n}\n\n/** Raised when an exponentiation overflows the floating-point range. */\nexport class OverflowError extends ArithmeticError {\n constructor(message: string) {\n super(message);\n this.name = \"OverflowError\";\n }\n}\n","import type { BinaryOp, BoolOpKind, CompareOp, ExprNode, UnaryOp } from \"./ast\";\nimport { isConditionalNode } from \"./ast\";\nimport { InvalidFormulaError } from \"./exceptions\";\n\nconst PLACEHOLDER_RE = /\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\nconst UNRESOLVED_BRACE_RE = /[{}]/;\nconst SAFE_NAME_PREFIX = \"__formula_expression_param_\";\nconst CACHE_MAX_SIZE = 1024;\n\n/** A parsed, validated formula ready to be evaluated over parameter series. */\nexport type CompiledFormula = {\n /** The whitespace-normalized formula text. */\n readonly raw: string;\n /** The formula text after placeholders were replaced with safe identifiers. */\n readonly expression: string;\n /** The validated expression tree. */\n readonly tree: ExprNode;\n /** Original parameter names in first-appearance order. */\n readonly variables: readonly string[];\n /** Mapping of original parameter name to its safe identifier. */\n readonly nameMap: ReadonlyMap<string, string>;\n /** Whether the formula needs element-by-element (short-circuiting) evaluation. */\n readonly hasConditional: boolean;\n};\n\nconst cache = new Map<string, CompiledFormula>();\n\n/**\n * Normalize the formula text, then compile it (memoized by normalized text).\n *\n * The public entry point mirrors the Python ``compile_formula`` helper: it\n * exposes {@link clearCache} so callers can inspect or reset the compilation\n * cache.\n */\nexport function compileFormula(formula: string): CompiledFormula {\n const normalized = normalizeFormulaText(formula);\n\n const cached = cache.get(normalized);\n if (cached !== undefined) {\n return cached;\n }\n\n const compiled = compileNormalized(normalized);\n\n if (cache.size >= CACHE_MAX_SIZE) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) {\n cache.delete(oldest);\n }\n }\n cache.set(normalized, compiled);\n return compiled;\n}\n\n/** Clear the memoized formula compilation cache. */\nexport function clearCache(): void {\n cache.clear();\n}\n\nfunction normalizeFormulaText(formula: string): string {\n if (typeof formula !== \"string\") {\n throw new TypeError(\"formula must be a string\");\n }\n const trimmed = formula.trim();\n if (trimmed === \"\") {\n return \"\";\n }\n return trimmed.split(/\\s+/).join(\" \");\n}\n\nfunction compileNormalized(raw: string): CompiledFormula {\n if (raw === \"\") {\n throw new InvalidFormulaError(\"formula must not be empty\");\n }\n\n const variables: string[] = [];\n const nameMap = new Map<string, string>();\n const expression = replacePlaceholders(raw, variables, nameMap);\n\n if (variables.length === 0) {\n throw new InvalidFormulaError(\"formula must reference at least one parameter\");\n }\n\n if (UNRESOLVED_BRACE_RE.test(expression)) {\n throw new InvalidFormulaError(\"formula contains invalid placeholder syntax\");\n }\n\n const tree = parse(expression);\n validateTree(tree, new Set(nameMap.values()));\n const hasConditional = treeHasConditional(tree);\n\n return { raw, expression, tree, variables, nameMap, hasConditional };\n}\n\nfunction replacePlaceholders(\n formula: string,\n variables: string[],\n nameMap: Map<string, string>,\n): string {\n return formula.replace(PLACEHOLDER_RE, (_match, name: string) => {\n let safe = nameMap.get(name);\n if (safe === undefined) {\n safe = `${SAFE_NAME_PREFIX}${nameMap.size}`;\n nameMap.set(name, safe);\n variables.push(name);\n }\n return safe;\n });\n}\n\nfunction validateTree(tree: ExprNode, allowedNames: ReadonlySet<string>): void {\n walk(tree, (node) => {\n if (node.kind === \"name\" && !allowedNames.has(node.id)) {\n throw new InvalidFormulaError(`unknown formula identifier: ${node.id}`);\n }\n });\n}\n\nfunction treeHasConditional(tree: ExprNode): boolean {\n let found = false;\n walk(tree, (node) => {\n if (isConditionalNode(node)) {\n found = true;\n }\n });\n return found;\n}\n\nfunction walk(node: ExprNode, visit: (node: ExprNode) => void): void {\n visit(node);\n switch (node.kind) {\n case \"binop\":\n walk(node.left, visit);\n walk(node.right, visit);\n break;\n case \"unaryop\":\n walk(node.operand, visit);\n break;\n case \"compare\":\n walk(node.left, visit);\n for (const comparator of node.comparators) {\n walk(comparator, visit);\n }\n break;\n case \"boolop\":\n for (const value of node.values) {\n walk(value, visit);\n }\n break;\n case \"ifexp\":\n walk(node.test, visit);\n walk(node.body, visit);\n walk(node.orelse, visit);\n break;\n default:\n break;\n }\n}\n\n// ─── Tokenizer ─────────────────────────────────────────────────────────────\n\ntype Token =\n | { readonly type: \"number\"; readonly value: number }\n | { readonly type: \"name\"; readonly value: string }\n | { readonly type: \"op\"; readonly value: string };\n\nconst NUMBER_RE = /(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?/y;\nconst IDENT_RE = /[A-Za-z_][A-Za-z0-9_]*/y;\nconst TWO_CHAR_OPS = new Set([\"**\", \"==\", \"!=\", \"<=\", \">=\"]);\nconst ONE_CHAR_OPS = new Set([\"+\", \"-\", \"*\", \"/\", \"%\", \"(\", \")\", \"<\", \">\"]);\n\nfunction tokenize(expression: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n\n while (index < expression.length) {\n const char = expression[index];\n\n if (char === \" \") {\n index += 1;\n continue;\n }\n\n if (isDigit(char) || (char === \".\" && isDigit(expression[index + 1]))) {\n NUMBER_RE.lastIndex = index;\n const match = NUMBER_RE.exec(expression);\n if (match === null) {\n throw new InvalidFormulaError(\"invalid formula syntax: malformed number\");\n }\n tokens.push({ type: \"number\", value: Number(match[0]) });\n index = NUMBER_RE.lastIndex;\n continue;\n }\n\n if (isIdentStart(char)) {\n IDENT_RE.lastIndex = index;\n const match = IDENT_RE.exec(expression);\n // isIdentStart guarantees a match here.\n const value = (match as RegExpExecArray)[0];\n tokens.push({ type: \"name\", value });\n index = IDENT_RE.lastIndex;\n continue;\n }\n\n const twoChar = expression.slice(index, index + 2);\n if (TWO_CHAR_OPS.has(twoChar)) {\n tokens.push({ type: \"op\", value: twoChar });\n index += 2;\n continue;\n }\n\n if (char !== undefined && ONE_CHAR_OPS.has(char)) {\n tokens.push({ type: \"op\", value: char });\n index += 1;\n continue;\n }\n\n throw new InvalidFormulaError(`invalid formula syntax: unexpected character '${char}'`);\n }\n\n return tokens;\n}\n\nfunction isDigit(char: string | undefined): boolean {\n return char !== undefined && char >= \"0\" && char <= \"9\";\n}\n\nfunction isIdentStart(char: string | undefined): boolean {\n if (char === undefined) {\n return false;\n }\n return char === \"_\" || (char >= \"a\" && char <= \"z\") || (char >= \"A\" && char <= \"Z\");\n}\n\n// ─── Parser ────────────────────────────────────────────────────────────────\n\nconst KEYWORDS = new Set([\"and\", \"or\", \"if\", \"else\"]);\nconst CONSTANT_KEYWORDS = new Set([\"True\", \"False\", \"None\"]);\n\nconst COMPARE_OPS: Record<string, CompareOp> = {\n \"==\": \"eq\",\n \"!=\": \"ne\",\n \"<\": \"lt\",\n \"<=\": \"le\",\n \">\": \"gt\",\n \">=\": \"ge\",\n};\n\n/** Parse a placeholder-substituted expression into a validated tree. */\nfunction parse(expression: string): ExprNode {\n const tokens = tokenize(expression);\n const parser = new Parser(tokens);\n const tree = parser.parseExpression();\n parser.expectEnd();\n return tree;\n}\n\nclass Parser {\n private position = 0;\n\n constructor(private readonly tokens: readonly Token[]) {}\n\n parseExpression(): ExprNode {\n return this.parseConditional();\n }\n\n expectEnd(): void {\n if (this.position < this.tokens.length) {\n throw new InvalidFormulaError(\"invalid formula syntax: unexpected trailing tokens\");\n }\n }\n\n private parseConditional(): ExprNode {\n const body = this.parseOr();\n if (this.matchKeyword(\"if\")) {\n const test = this.parseOr();\n this.expectKeyword(\"else\");\n const orelse = this.parseConditional();\n return { kind: \"ifexp\", test, body, orelse };\n }\n return body;\n }\n\n private parseOr(): ExprNode {\n const values = [this.parseAnd()];\n while (this.matchKeyword(\"or\")) {\n values.push(this.parseAnd());\n }\n return values.length === 1 ? (values[0] as ExprNode) : { kind: \"boolop\", op: \"or\", values };\n }\n\n private parseAnd(): ExprNode {\n const values = [this.parseComparison()];\n while (this.matchKeyword(\"and\")) {\n values.push(this.parseComparison());\n }\n const op: BoolOpKind = \"and\";\n return values.length === 1 ? (values[0] as ExprNode) : { kind: \"boolop\", op, values };\n }\n\n private parseComparison(): ExprNode {\n const left = this.parseAdditive();\n const ops: CompareOp[] = [];\n const comparators: ExprNode[] = [];\n while (true) {\n const op = this.peekCompareOp();\n if (op === undefined) {\n break;\n }\n this.position += 1;\n ops.push(op);\n comparators.push(this.parseAdditive());\n }\n return ops.length === 0 ? left : { kind: \"compare\", left, ops, comparators };\n }\n\n private parseAdditive(): ExprNode {\n let node = this.parseMultiplicative();\n while (true) {\n const op = this.peekOp();\n if (op === \"+\" || op === \"-\") {\n this.position += 1;\n const right = this.parseMultiplicative();\n node = { kind: \"binop\", op: op === \"+\" ? \"add\" : \"sub\", left: node, right };\n continue;\n }\n break;\n }\n return node;\n }\n\n private parseMultiplicative(): ExprNode {\n let node = this.parseUnary();\n while (true) {\n const op = this.peekOp();\n if (op === \"*\" || op === \"/\" || op === \"%\") {\n this.position += 1;\n const right = this.parseUnary();\n const kind: BinaryOp = op === \"*\" ? \"mul\" : op === \"/\" ? \"div\" : \"mod\";\n node = { kind: \"binop\", op: kind, left: node, right };\n continue;\n }\n break;\n }\n return node;\n }\n\n private parseUnary(): ExprNode {\n const op = this.peekOp();\n if (op === \"+\" || op === \"-\") {\n this.position += 1;\n const operand = this.parseUnary();\n const kind: UnaryOp = op === \"+\" ? \"pos\" : \"neg\";\n return { kind: \"unaryop\", op: kind, operand };\n }\n return this.parsePower();\n }\n\n private parsePower(): ExprNode {\n const base = this.parseAtom();\n if (this.peekOp() === \"**\") {\n this.position += 1;\n // Right operand is a unary expression so ``2 ** -1`` is accepted and\n // ``**`` remains right-associative.\n const exponent = this.parseUnary();\n return { kind: \"binop\", op: \"pow\", left: base, right: exponent };\n }\n return base;\n }\n\n private parseAtom(): ExprNode {\n const token = this.tokens[this.position];\n if (token === undefined) {\n throw new InvalidFormulaError(\"invalid formula syntax: unexpected end of expression\");\n }\n\n if (token.type === \"number\") {\n this.position += 1;\n return { kind: \"constant\", value: token.value };\n }\n\n if (token.type === \"name\") {\n if (CONSTANT_KEYWORDS.has(token.value)) {\n throw new InvalidFormulaError(\"only numeric constants are supported\");\n }\n if (KEYWORDS.has(token.value)) {\n throw new InvalidFormulaError(\n `invalid formula syntax: unexpected keyword '${token.value}'`,\n );\n }\n this.position += 1;\n return { kind: \"name\", id: token.value };\n }\n\n if (token.value === \"(\") {\n this.position += 1;\n const inner = this.parseExpression();\n this.expectOp(\")\");\n return inner;\n }\n\n throw new InvalidFormulaError(`invalid formula syntax: unexpected token '${token.value}'`);\n }\n\n private peekOp(): string | undefined {\n const token = this.tokens[this.position];\n return token !== undefined && token.type === \"op\" ? token.value : undefined;\n }\n\n private peekCompareOp(): CompareOp | undefined {\n const op = this.peekOp();\n return op !== undefined ? COMPARE_OPS[op] : undefined;\n }\n\n private matchKeyword(keyword: string): boolean {\n const token = this.tokens[this.position];\n if (token !== undefined && token.type === \"name\" && token.value === keyword) {\n this.position += 1;\n return true;\n }\n return false;\n }\n\n private expectKeyword(keyword: string): void {\n if (!this.matchKeyword(keyword)) {\n throw new InvalidFormulaError(`invalid formula syntax: expected '${keyword}'`);\n }\n }\n\n private expectOp(op: string): void {\n if (this.peekOp() !== op) {\n throw new InvalidFormulaError(`invalid formula syntax: expected '${op}'`);\n }\n this.position += 1;\n }\n}\n","import type { BinaryOp, CompareOp, ExprNode, UnaryOp } from \"./ast\";\nimport { OverflowError, ZeroDivisionError } from \"./exceptions\";\n\n/** Environment mapping safe identifiers to their aligned numeric series. */\nexport type Environment = Record<string, readonly number[]>;\n\n/**\n * A value is either a scalar (broadcast across the whole series) or an\n * already-materialized per-element sequence. Keeping constants as scalars\n * avoids allocating length-N arrays for them and skips the element-wise zip\n * whenever one side of an operation is constant.\n */\ntype Value = number | readonly number[];\n\nconst UNARY_OPS: Record<UnaryOp, (value: number) => number> = {\n pos: (value) => value,\n neg: (value) => -value,\n};\n\nconst BINARY_OPS: Record<BinaryOp, (left: number, right: number) => number> = {\n add: (left, right) => left + right,\n sub: (left, right) => left - right,\n mul: (left, right) => left * right,\n div: (left, right) => {\n if (right === 0) {\n throw new ZeroDivisionError(\"float division by zero\");\n }\n return left / right;\n },\n mod: pythonMod,\n pow: safePow,\n};\n\nconst COMPARE_OPS: Record<CompareOp, (left: number, right: number) => boolean> = {\n eq: (left, right) => left === right,\n ne: (left, right) => left !== right,\n lt: (left, right) => left < right,\n le: (left, right) => left <= right,\n gt: (left, right) => left > right,\n ge: (left, right) => left >= right,\n};\n\n/** Python's ``%`` follows the sign of the divisor, unlike JavaScript's ``%``. */\nfunction pythonMod(left: number, right: number): number {\n if (right === 0) {\n throw new ZeroDivisionError(\"float modulo\");\n }\n return left - Math.floor(left / right) * right;\n}\n\n/**\n * Exponentiate in float space. Mirrors the Python implementation's error\n * semantics: raising ``0`` to a negative power and overflowing results are\n * surfaced as arithmetic errors rather than silently producing infinities.\n */\nfunction safePow(base: number, exponent: number): number {\n if (base === 0 && exponent < 0) {\n throw new ZeroDivisionError(\"0.0 cannot be raised to a negative power\");\n }\n const result = base ** exponent;\n if (!Number.isFinite(result) && Number.isFinite(base) && Number.isFinite(exponent)) {\n throw new OverflowError(\"(34, 'Numerical result out of range')\");\n }\n return result;\n}\n\n/** Python truthiness for floats: only exactly ``0`` is falsy (``NaN`` is truthy). */\nfunction isTruthy(value: number): boolean {\n return value !== 0;\n}\n\nexport function evaluateTree(\n tree: ExprNode,\n environment: Environment,\n length: number,\n hasConditional: boolean,\n): number[] {\n if (hasConditional) {\n // ``if``/``else`` branches (and their guards) must only run for the\n // elements that select them, so evaluate index-by-index.\n const result: number[] = new Array(length);\n for (let index = 0; index < length; index += 1) {\n result[index] = evaluateNodeAt(tree, environment, index);\n }\n return result;\n }\n\n const value = evaluateNode(tree, environment);\n if (Array.isArray(value)) {\n return value as number[];\n }\n // The compiler guarantees at least one parameter, so a scalar result only\n // happens for degenerate trees; broadcast it to the series length.\n return new Array(length).fill(value as number);\n}\n\nfunction evaluateNode(node: ExprNode, environment: Environment): Value {\n switch (node.kind) {\n case \"name\": {\n const series = environment[node.id];\n // The runtime guarantees every referenced name is present.\n return series as readonly number[];\n }\n case \"constant\":\n return node.value;\n case \"binop\": {\n const left = evaluateNode(node.left, environment);\n const right = evaluateNode(node.right, environment);\n return applyBinary(BINARY_OPS[node.op], left, right);\n }\n case \"unaryop\": {\n const operand = evaluateNode(node.operand, environment);\n const op = UNARY_OPS[node.op];\n return Array.isArray(operand) ? operand.map(op) : op(operand as number);\n }\n default:\n // Conditional nodes never reach the vectorized path.\n throw new TypeError(`unsupported formula element: ${node.kind}`);\n }\n}\n\nfunction applyBinary(\n op: (left: number, right: number) => number,\n left: Value,\n right: Value,\n): Value {\n if (Array.isArray(left)) {\n if (Array.isArray(right)) {\n const result: number[] = new Array(left.length);\n for (let index = 0; index < left.length; index += 1) {\n result[index] = op(left[index] as number, right[index] as number);\n }\n return result;\n }\n const scalar = right as number;\n return left.map((value) => op(value, scalar));\n }\n const scalarLeft = left as number;\n if (Array.isArray(right)) {\n return right.map((value) => op(scalarLeft, value));\n }\n return op(scalarLeft, right as number);\n}\n\nfunction evaluateNodeAt(node: ExprNode, environment: Environment, index: number): number {\n switch (node.kind) {\n case \"name\": {\n const series = environment[node.id] as readonly number[];\n return series[index] as number;\n }\n case \"constant\":\n return node.value;\n case \"binop\": {\n const left = evaluateNodeAt(node.left, environment, index);\n const right = evaluateNodeAt(node.right, environment, index);\n return BINARY_OPS[node.op](left, right);\n }\n case \"unaryop\":\n return UNARY_OPS[node.op](evaluateNodeAt(node.operand, environment, index));\n case \"compare\": {\n let left = evaluateNodeAt(node.left, environment, index);\n for (let i = 0; i < node.ops.length; i += 1) {\n const right = evaluateNodeAt(node.comparators[i] as ExprNode, environment, index);\n if (!COMPARE_OPS[node.ops[i] as CompareOp](left, right)) {\n return 0;\n }\n left = right;\n }\n return 1;\n }\n case \"boolop\": {\n if (node.op === \"and\") {\n for (const value of node.values) {\n if (!isTruthy(evaluateNodeAt(value, environment, index))) {\n return 0;\n }\n }\n return 1;\n }\n for (const value of node.values) {\n if (isTruthy(evaluateNodeAt(value, environment, index))) {\n return 1;\n }\n }\n return 0;\n }\n case \"ifexp\": {\n const test = evaluateNodeAt(node.test, environment, index);\n const branch = isTruthy(test) ? node.body : node.orelse;\n return evaluateNodeAt(branch, environment, index);\n }\n default:\n throw new TypeError(\"unsupported formula element\");\n }\n}\n","import type { CompiledFormula } from \"./compiler\";\nimport type { Environment } from \"./evaluator\";\nimport { evaluateTree } from \"./evaluator\";\nimport { MissingParameterError, ParameterError, ParameterLengthError } from \"./exceptions\";\nimport type { EvaluationResult, Parameters } from \"./types\";\n\nexport function evaluateCompiled(\n formula: CompiledFormula,\n parameters: Parameters,\n): EvaluationResult {\n const missing = formula.variables.filter((name) => !Object.hasOwn(parameters, name));\n if (missing.length > 0) {\n throw new MissingParameterError(missing);\n }\n\n const environment: Environment = {};\n const lengthsByName: Record<string, number> = {};\n for (const [originalName, safeName] of formula.nameMap) {\n const series = normalizeParameter(originalName, parameters[originalName]);\n environment[safeName] = series;\n lengthsByName[originalName] = series.length;\n }\n\n const lengths = Object.values(lengthsByName);\n if (new Set(lengths).size !== 1) {\n throw new ParameterLengthError(lengthsByName);\n }\n\n const length = lengths[0] as number;\n if (length === 0) {\n // Every referenced parameter resolved to an empty series, so there is\n // nothing to compute over: return an empty result rather than erroring.\n return [];\n }\n\n return evaluateTree(formula.tree, environment, length, formula.hasConditional);\n}\n\nfunction normalizeParameter(name: string, value: unknown): number[] {\n if (!Array.isArray(value)) {\n throw new ParameterError(`parameter '${name}' must be a numeric sequence`);\n }\n\n const normalized: number[] = new Array(value.length);\n for (let index = 0; index < value.length; index += 1) {\n const item = value[index];\n if (typeof item !== \"number\") {\n throw new ParameterError(`parameter '${name}' must be a numeric sequence`);\n }\n normalized[index] = item;\n }\n return normalized;\n}\n","import { compileFormula } from \"./compiler\";\nimport { evaluateCompiled } from \"./runtime\";\nimport type { EvaluationResult, Parameters } from \"./types\";\n\n/**\n * Evaluate a formula over aligned numeric parameter sequences.\n *\n * Placeholders are written as ``{name}`` and each resolves to the matching\n * entry in `parameters`. The following operators are supported:\n *\n * - arithmetic: ``+`` ``-`` ``*`` ``/`` ``**`` ``%`` (binary) and ``+`` ``-`` (unary)\n * - comparisons: ``==`` ``!=`` ``<`` ``<=`` ``>`` ``>=``\n * - boolean: ``and`` ``or``\n * - conditional: ``{A} / {B} if {B} != 0 else 0``\n *\n * Structural problems (bad syntax, unknown identifiers, missing parameters,\n * mismatched lengths, non-numeric values) throw a subclass of `FormulaError`.\n *\n * When every referenced parameter is an empty sequence the result is an empty\n * array — there is nothing to compute over, so this is treated as a valid\n * (empty) result rather than an error. A *mix* of empty and non-empty\n * parameters is still a length mismatch and throws `ParameterLengthError`.\n *\n * Arithmetic failures that depend on the parameter *values* are surfaced as\n * arithmetic errors (subclasses of `ArithmeticError`) rather than\n * `FormulaError`: dividing or taking a modulo by zero throws\n * `ZeroDivisionError` and an overflowing exponentiation throws `OverflowError`.\n *\n * Conditional expressions, comparisons and boolean operators are evaluated\n * element-by-element: for each series element only the selected branch is\n * evaluated, so a division-by-zero (or other value-dependent failure) in the\n * branch that is *not* selected for a given element never throws.\n */\nexport function evaluate(formula: string, parameters: Parameters = {}): EvaluationResult {\n return evaluateCompiled(compileFormula(formula), parameters);\n}\n","import type { CogniteClient } from \"@cognite/sdk\";\nimport { type CognitePort, createCogniteAdapter } from \"../cognite\";\nimport { DatapointsRetriever } from \"./datapoints-retrieval\";\nimport { compileFormula, evaluate } from \"./formula-expression\";\nimport type { CalculationResult, CalculatorQuery, DataPoint } from \"./models\";\n\n/**\n * Evaluates formula-based calculations over Cognite time series datapoints.\n *\n * Each {@link CalculatorQuery} pairs a formula with the parameters its\n * placeholders resolve to. The calculator fetches the required datapoints\n * (de-duplicating shared time series), aligns them by position and evaluates\n * the formula element-by-element.\n */\nexport class Calculator {\n private readonly retriever: DatapointsRetriever;\n\n constructor(cognite: CogniteClient | CognitePort) {\n const port = isCognitePort(cognite) ? cognite : createCogniteAdapter(cognite);\n this.retriever = new DatapointsRetriever(port);\n }\n\n /** Evaluate a single query over the given time range. */\n async calculate(query: CalculatorQuery, start: Date, end: Date): Promise<CalculationResult> {\n const [result] = await this.calculateMultiples([query], start, end);\n // calculateMultiples returns one result per query, so this is always set.\n return result as CalculationResult;\n }\n\n /**\n * Evaluate several queries over the given time range, retrieving every\n * parameter's datapoints in a single de-duplicated round trip.\n */\n async calculateMultiples(\n queries: CalculatorQuery[],\n start: Date,\n end: Date,\n ): Promise<CalculationResult[]> {\n const parameters = queries.flatMap((query) => query.parameters);\n const datapoints = await this.retriever.retrieveDatapoints(parameters, start, end);\n\n const results: CalculationResult[] = [];\n let offset = 0;\n for (const query of queries) {\n const slice = datapoints.slice(offset, offset + query.parameters.length);\n offset += query.parameters.length;\n results.push(calculate(query, slice));\n }\n return results;\n }\n}\n\nfunction calculate(query: CalculatorQuery, datapoints: DataPoint[][]): CalculationResult {\n const valuesMap: Record<string, number[]> = {};\n const seriesByAlias = new Map<string, DataPoint[]>();\n query.parameters.forEach((parameter, index) => {\n const series = datapoints[index] ?? [];\n valuesMap[parameter.alias] = series.map((point) => point.value);\n seriesByAlias.set(parameter.alias, series);\n });\n\n const values = evaluate(query.formula, valuesMap);\n\n // Timestamps must come from a parameter the formula actually references:\n // `evaluate` only guarantees equal lengths across referenced parameters, so\n // an unreferenced parameter's series (e.g. a different granularity or one\n // with data gaps) can have a different length and would misalign results.\n const [firstVariable] = compileFormula(query.formula).variables;\n const timestampSeries = seriesByAlias.get(firstVariable as string) ?? [];\n\n return {\n query,\n datapoints: timestampSeries.map((point, index) => ({\n timestamp: point.timestamp,\n value: values[index] as number,\n })),\n };\n}\n\nfunction isCognitePort(value: CogniteClient | CognitePort): value is CognitePort {\n return typeof (value as CognitePort).retrieveDatapoints === \"function\";\n}\n"]}
@@ -31,8 +31,9 @@ var CogniteSdkAdapter = class {
31
31
  };
32
32
  }
33
33
  async searchInstances(request) {
34
- const search = this.client.instances.search;
35
- const response = await search(request);
34
+ const response = await this.client.instances.search(
35
+ request
36
+ );
36
37
  return {
37
38
  items: response.items
38
39
  };
@@ -46,11 +47,24 @@ var CogniteSdkAdapter = class {
46
47
  };
47
48
  }
48
49
  async applyInstances(request) {
49
- const apply = this.client.instances.apply;
50
- const response = await apply(request);
51
- return {
52
- items: response.items
53
- };
50
+ const { items, delete: deleteItems = [], replace } = request;
51
+ const results = [];
52
+ if (deleteItems.length > 0) {
53
+ const deleteResponse = await this.client.instances.delete(
54
+ deleteItems
55
+ );
56
+ results.push(
57
+ ...deleteResponse.items ?? []
58
+ );
59
+ }
60
+ if (items.length > 0) {
61
+ const response = await this.client.instances.upsert({
62
+ items,
63
+ ...replace === true ? { replace: true } : {}
64
+ });
65
+ results.push(...response.items);
66
+ }
67
+ return { items: results };
54
68
  }
55
69
  async retrieveDatapoints(options) {
56
70
  const { items, ...rest } = options;
@@ -139,7 +153,17 @@ function mapDatapointResult(item) {
139
153
  };
140
154
  }
141
155
 
156
+ // src/utils/array.ts
157
+ function chunks(items, size) {
158
+ const result = [];
159
+ for (let index = 0; index < items.length; index += size) {
160
+ result.push(items.slice(index, index + size));
161
+ }
162
+ return result;
163
+ }
164
+
142
165
  // src/calculator/datapoints-retrieval.ts
166
+ var MAX_ITEMS_PER_REQUEST = 100;
143
167
  var DatapointsRetriever = class {
144
168
  constructor(cognite) {
145
169
  this.cognite = cognite;
@@ -150,11 +174,16 @@ var DatapointsRetriever = class {
150
174
  if (requests.length === 0) {
151
175
  return parameters.map(() => []);
152
176
  }
153
- const options = { items: requests, start, end };
154
- const raw = await this.cognite.retrieveDatapoints(options);
177
+ const responses = await Promise.all(
178
+ chunks(requests, MAX_ITEMS_PER_REQUEST).map((items2) => {
179
+ const options = { items: items2, start, end };
180
+ return this.cognite.retrieveDatapoints(options);
181
+ })
182
+ );
183
+ const items = responses.flatMap((response) => response.items);
155
184
  return parameters.map((parameter, index) => {
156
185
  const requestIndex = indexMapping[index];
157
- const item = raw.items[requestIndex];
186
+ const item = items[requestIndex];
158
187
  if (item === void 0) {
159
188
  throw new Error(`missing datapoints response for parameter '${parameter.alias}'`);
160
189
  }