@odoo/o-spreadsheet 16.0.71 → 16.0.73

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.
@@ -3938,19 +3938,26 @@ class FilterMenu extends owl.Component {
3938
3938
  .filter(({ row }) => !this.env.model.getters.isRowHidden(sheetId, row))
3939
3939
  .map(({ col, row }) => { var _a; return (_a = this.env.model.getters.getCell(sheetId, col, row)) === null || _a === void 0 ? void 0 : _a.formattedValue; });
3940
3940
  const filterValues = this.env.model.getters.getFilterValues(sheetId, position.col, position.row);
3941
- const strValues = [...cellValues, ...filterValues];
3942
- const normalizedFilteredValues = filterValues.map(toLowerCase);
3943
- // Set with lowercase values to avoid duplicates
3944
- const normalizedValues = [...new Set(strValues.map(toLowerCase))];
3945
- const sortedValues = normalizedValues.sort((val1, val2) => val1.localeCompare(val2, undefined, { numeric: true, sensitivity: "base" }));
3946
- return sortedValues.map((normalizedValue) => {
3947
- const checked = normalizedFilteredValues.findIndex((filteredValue) => filteredValue === normalizedValue) ===
3948
- -1;
3949
- return {
3950
- checked,
3951
- string: strValues.find((val) => toLowerCase(val) === normalizedValue) || "",
3952
- };
3953
- });
3941
+ const normalizedFilteredValues = new Set(filterValues.map(toLowerCase));
3942
+ const set = new Set();
3943
+ const values = [];
3944
+ const addValue = (value) => {
3945
+ const normalizedValue = toLowerCase(value);
3946
+ if (!set.has(normalizedValue)) {
3947
+ values.push({
3948
+ string: value || "",
3949
+ checked: !normalizedFilteredValues.has(normalizedValue),
3950
+ normalizedValue,
3951
+ });
3952
+ set.add(normalizedValue);
3953
+ }
3954
+ };
3955
+ cellValues.forEach(addValue);
3956
+ filterValues.forEach(addValue);
3957
+ return values.sort((val1, val2) => val1.normalizedValue.localeCompare(val2.normalizedValue, undefined, {
3958
+ numeric: true,
3959
+ sensitivity: "base",
3960
+ }));
3954
3961
  }
3955
3962
  checkValue(value) {
3956
3963
  var _a;
@@ -5320,6 +5327,10 @@ const REMOVE_ROWS_ACTION = (env) => {
5320
5327
  });
5321
5328
  };
5322
5329
  const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
5330
+ if ((dimension === "COL" && env.model.getters.getActiveRows().size > 0) ||
5331
+ (dimension === "ROW" && env.model.getters.getActiveCols().size > 0)) {
5332
+ return false;
5333
+ }
5323
5334
  const sheetId = env.model.getters.getActiveSheetId();
5324
5335
  const selectedElements = env.model.getters.getElementsFromSelection(dimension);
5325
5336
  const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
@@ -6668,11 +6679,11 @@ class OTRegistry extends Registry {
6668
6679
  * transformation function given
6669
6680
  */
6670
6681
  addTransformation(executed, toTransforms, fn) {
6671
- for (let toTransform of toTransforms) {
6672
- if (!this.content[toTransform]) {
6673
- this.content[toTransform] = new Map();
6674
- }
6675
- this.content[toTransform].set(executed, fn);
6682
+ if (!this.content[executed]) {
6683
+ this.content[executed] = new Map();
6684
+ }
6685
+ for (const toTransform of toTransforms) {
6686
+ this.content[executed].set(toTransform, fn);
6676
6687
  }
6677
6688
  return this;
6678
6689
  }
@@ -6681,7 +6692,7 @@ class OTRegistry extends Registry {
6681
6692
  * that the executed command happened.
6682
6693
  */
6683
6694
  getTransformation(toTransform, executed) {
6684
- return this.content[toTransform] && this.content[toTransform].get(executed);
6695
+ return this.content[executed] && this.content[executed].get(toTransform);
6685
6696
  }
6686
6697
  }
6687
6698
  const otRegistry = new OTRegistry();
@@ -26069,7 +26080,7 @@ class XlsxBaseExtractor {
26069
26080
  */
26070
26081
  handleMissingValue(parentElement, missingElementName, optionalArgs) {
26071
26082
  if (optionalArgs === null || optionalArgs === void 0 ? void 0 : optionalArgs.required) {
26072
- if (optionalArgs === null || optionalArgs === void 0 ? void 0 : optionalArgs.default) {
26083
+ if ((optionalArgs === null || optionalArgs === void 0 ? void 0 : optionalArgs.default) !== undefined) {
26073
26084
  this.warningManager.addParsingWarning(`Missing required ${missingElementName} in element <${parentElement.tagName}> of ${this.currentFile}, replacing it by the default value ${optionalArgs.default}`);
26074
26085
  }
26075
26086
  else {
@@ -34034,9 +34045,10 @@ class FilterEvaluationPlugin extends UIPlugin {
34034
34045
  const filteredValues = (_b = (_a = this.filterValues[sheetId]) === null || _a === void 0 ? void 0 : _a[filter.id]) === null || _b === void 0 ? void 0 : _b.map(toLowerCase);
34035
34046
  if (!filteredValues || !filter.filteredZone)
34036
34047
  continue;
34048
+ const filteredValuesSet = new Set(filteredValues);
34037
34049
  for (let row = filter.filteredZone.top; row <= filter.filteredZone.bottom; row++) {
34038
34050
  const value = this.getCellValueAsString(sheetId, filter.col, row);
34039
- if (filteredValues.includes(value)) {
34051
+ if (filteredValuesSet.has(value)) {
34040
34052
  hiddenRows.add(row);
34041
34053
  }
34042
34054
  }
@@ -36380,10 +36392,20 @@ function transform(toTransform, executed) {
36380
36392
  */
36381
36393
  function transformAll(toTransform, executed) {
36382
36394
  let transformedCommands = [...toTransform];
36395
+ const possibleTransformations = new Set(otRegistry.getKeys());
36383
36396
  for (const executedCommand of executed) {
36384
- transformedCommands = transformedCommands
36385
- .map((cmd) => transform(cmd, executedCommand))
36386
- .filter(isDefined$1);
36397
+ // If the executed command is not in the registry, we skip it
36398
+ // because we know there won't be any transformation impacting the
36399
+ // commands to transform.
36400
+ if (possibleTransformations.has(executedCommand.type)) {
36401
+ transformedCommands = transformedCommands.reduce((acc, cmd) => {
36402
+ const transformed = transform(cmd, executedCommand);
36403
+ if (transformed) {
36404
+ acc.push(transformed);
36405
+ }
36406
+ return acc;
36407
+ }, []);
36408
+ }
36387
36409
  }
36388
36410
  return transformedCommands;
36389
36411
  }
@@ -36843,7 +36865,6 @@ class Session extends EventBus {
36843
36865
  if (this.waitingAck) {
36844
36866
  return;
36845
36867
  }
36846
- this.waitingAck = true;
36847
36868
  this.sendPendingMessage();
36848
36869
  }
36849
36870
  /**
@@ -36873,6 +36894,7 @@ class Session extends EventBus {
36873
36894
  throw new Error(`Trying to send a new revision while replaying initial revision. This can lead to endless dispatches every time the spreadsheet is open.
36874
36895
  ${JSON.stringify(message)}`);
36875
36896
  }
36897
+ this.waitingAck = true;
36876
36898
  this.transportService.sendMessage({
36877
36899
  ...message,
36878
36900
  serverRevisionId: this.serverRevisionId,
@@ -43858,6 +43880,6 @@ exports.setTranslationMethod = setTranslationMethod;
43858
43880
  exports.tokenize = tokenize;
43859
43881
 
43860
43882
 
43861
- __info__.version = '16.0.71';
43862
- __info__.date = '2025-05-13T17:48:09.400Z';
43863
- __info__.hash = '2ff9f1a';
43883
+ __info__.version = '16.0.73';
43884
+ __info__.date = '2025-06-19T18:25:17.838Z';
43885
+ __info__.hash = '8bc0a8a';
@@ -3934,19 +3934,26 @@ class FilterMenu extends Component {
3934
3934
  .filter(({ row }) => !this.env.model.getters.isRowHidden(sheetId, row))
3935
3935
  .map(({ col, row }) => { var _a; return (_a = this.env.model.getters.getCell(sheetId, col, row)) === null || _a === void 0 ? void 0 : _a.formattedValue; });
3936
3936
  const filterValues = this.env.model.getters.getFilterValues(sheetId, position.col, position.row);
3937
- const strValues = [...cellValues, ...filterValues];
3938
- const normalizedFilteredValues = filterValues.map(toLowerCase);
3939
- // Set with lowercase values to avoid duplicates
3940
- const normalizedValues = [...new Set(strValues.map(toLowerCase))];
3941
- const sortedValues = normalizedValues.sort((val1, val2) => val1.localeCompare(val2, undefined, { numeric: true, sensitivity: "base" }));
3942
- return sortedValues.map((normalizedValue) => {
3943
- const checked = normalizedFilteredValues.findIndex((filteredValue) => filteredValue === normalizedValue) ===
3944
- -1;
3945
- return {
3946
- checked,
3947
- string: strValues.find((val) => toLowerCase(val) === normalizedValue) || "",
3948
- };
3949
- });
3937
+ const normalizedFilteredValues = new Set(filterValues.map(toLowerCase));
3938
+ const set = new Set();
3939
+ const values = [];
3940
+ const addValue = (value) => {
3941
+ const normalizedValue = toLowerCase(value);
3942
+ if (!set.has(normalizedValue)) {
3943
+ values.push({
3944
+ string: value || "",
3945
+ checked: !normalizedFilteredValues.has(normalizedValue),
3946
+ normalizedValue,
3947
+ });
3948
+ set.add(normalizedValue);
3949
+ }
3950
+ };
3951
+ cellValues.forEach(addValue);
3952
+ filterValues.forEach(addValue);
3953
+ return values.sort((val1, val2) => val1.normalizedValue.localeCompare(val2.normalizedValue, undefined, {
3954
+ numeric: true,
3955
+ sensitivity: "base",
3956
+ }));
3950
3957
  }
3951
3958
  checkValue(value) {
3952
3959
  var _a;
@@ -5316,6 +5323,10 @@ const REMOVE_ROWS_ACTION = (env) => {
5316
5323
  });
5317
5324
  };
5318
5325
  const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
5326
+ if ((dimension === "COL" && env.model.getters.getActiveRows().size > 0) ||
5327
+ (dimension === "ROW" && env.model.getters.getActiveCols().size > 0)) {
5328
+ return false;
5329
+ }
5319
5330
  const sheetId = env.model.getters.getActiveSheetId();
5320
5331
  const selectedElements = env.model.getters.getElementsFromSelection(dimension);
5321
5332
  const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
@@ -6664,11 +6675,11 @@ class OTRegistry extends Registry {
6664
6675
  * transformation function given
6665
6676
  */
6666
6677
  addTransformation(executed, toTransforms, fn) {
6667
- for (let toTransform of toTransforms) {
6668
- if (!this.content[toTransform]) {
6669
- this.content[toTransform] = new Map();
6670
- }
6671
- this.content[toTransform].set(executed, fn);
6678
+ if (!this.content[executed]) {
6679
+ this.content[executed] = new Map();
6680
+ }
6681
+ for (const toTransform of toTransforms) {
6682
+ this.content[executed].set(toTransform, fn);
6672
6683
  }
6673
6684
  return this;
6674
6685
  }
@@ -6677,7 +6688,7 @@ class OTRegistry extends Registry {
6677
6688
  * that the executed command happened.
6678
6689
  */
6679
6690
  getTransformation(toTransform, executed) {
6680
- return this.content[toTransform] && this.content[toTransform].get(executed);
6691
+ return this.content[executed] && this.content[executed].get(toTransform);
6681
6692
  }
6682
6693
  }
6683
6694
  const otRegistry = new OTRegistry();
@@ -26065,7 +26076,7 @@ class XlsxBaseExtractor {
26065
26076
  */
26066
26077
  handleMissingValue(parentElement, missingElementName, optionalArgs) {
26067
26078
  if (optionalArgs === null || optionalArgs === void 0 ? void 0 : optionalArgs.required) {
26068
- if (optionalArgs === null || optionalArgs === void 0 ? void 0 : optionalArgs.default) {
26079
+ if ((optionalArgs === null || optionalArgs === void 0 ? void 0 : optionalArgs.default) !== undefined) {
26069
26080
  this.warningManager.addParsingWarning(`Missing required ${missingElementName} in element <${parentElement.tagName}> of ${this.currentFile}, replacing it by the default value ${optionalArgs.default}`);
26070
26081
  }
26071
26082
  else {
@@ -34030,9 +34041,10 @@ class FilterEvaluationPlugin extends UIPlugin {
34030
34041
  const filteredValues = (_b = (_a = this.filterValues[sheetId]) === null || _a === void 0 ? void 0 : _a[filter.id]) === null || _b === void 0 ? void 0 : _b.map(toLowerCase);
34031
34042
  if (!filteredValues || !filter.filteredZone)
34032
34043
  continue;
34044
+ const filteredValuesSet = new Set(filteredValues);
34033
34045
  for (let row = filter.filteredZone.top; row <= filter.filteredZone.bottom; row++) {
34034
34046
  const value = this.getCellValueAsString(sheetId, filter.col, row);
34035
- if (filteredValues.includes(value)) {
34047
+ if (filteredValuesSet.has(value)) {
34036
34048
  hiddenRows.add(row);
34037
34049
  }
34038
34050
  }
@@ -36376,10 +36388,20 @@ function transform(toTransform, executed) {
36376
36388
  */
36377
36389
  function transformAll(toTransform, executed) {
36378
36390
  let transformedCommands = [...toTransform];
36391
+ const possibleTransformations = new Set(otRegistry.getKeys());
36379
36392
  for (const executedCommand of executed) {
36380
- transformedCommands = transformedCommands
36381
- .map((cmd) => transform(cmd, executedCommand))
36382
- .filter(isDefined$1);
36393
+ // If the executed command is not in the registry, we skip it
36394
+ // because we know there won't be any transformation impacting the
36395
+ // commands to transform.
36396
+ if (possibleTransformations.has(executedCommand.type)) {
36397
+ transformedCommands = transformedCommands.reduce((acc, cmd) => {
36398
+ const transformed = transform(cmd, executedCommand);
36399
+ if (transformed) {
36400
+ acc.push(transformed);
36401
+ }
36402
+ return acc;
36403
+ }, []);
36404
+ }
36383
36405
  }
36384
36406
  return transformedCommands;
36385
36407
  }
@@ -36839,7 +36861,6 @@ class Session extends EventBus {
36839
36861
  if (this.waitingAck) {
36840
36862
  return;
36841
36863
  }
36842
- this.waitingAck = true;
36843
36864
  this.sendPendingMessage();
36844
36865
  }
36845
36866
  /**
@@ -36869,6 +36890,7 @@ class Session extends EventBus {
36869
36890
  throw new Error(`Trying to send a new revision while replaying initial revision. This can lead to endless dispatches every time the spreadsheet is open.
36870
36891
  ${JSON.stringify(message)}`);
36871
36892
  }
36893
+ this.waitingAck = true;
36872
36894
  this.transportService.sendMessage({
36873
36895
  ...message,
36874
36896
  serverRevisionId: this.serverRevisionId,
@@ -43826,6 +43848,6 @@ function addFunction(functionName, functionDescription) {
43826
43848
  export { AbstractChart, CommandResult, CorePlugin, DATETIME_FORMAT, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, cellTypes, compile, components, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateEvaluationCommands, load, parse, readonlyAllowedCommands, registries, setTranslationMethod, tokenize };
43827
43849
 
43828
43850
 
43829
- __info__.version = '16.0.71';
43830
- __info__.date = '2025-05-13T17:48:09.400Z';
43831
- __info__.hash = '2ff9f1a';
43851
+ __info__.version = '16.0.73';
43852
+ __info__.date = '2025-06-19T18:25:17.838Z';
43853
+ __info__.hash = '8bc0a8a';
@@ -3935,19 +3935,26 @@
3935
3935
  .filter(({ row }) => !this.env.model.getters.isRowHidden(sheetId, row))
3936
3936
  .map(({ col, row }) => { var _a; return (_a = this.env.model.getters.getCell(sheetId, col, row)) === null || _a === void 0 ? void 0 : _a.formattedValue; });
3937
3937
  const filterValues = this.env.model.getters.getFilterValues(sheetId, position.col, position.row);
3938
- const strValues = [...cellValues, ...filterValues];
3939
- const normalizedFilteredValues = filterValues.map(toLowerCase);
3940
- // Set with lowercase values to avoid duplicates
3941
- const normalizedValues = [...new Set(strValues.map(toLowerCase))];
3942
- const sortedValues = normalizedValues.sort((val1, val2) => val1.localeCompare(val2, undefined, { numeric: true, sensitivity: "base" }));
3943
- return sortedValues.map((normalizedValue) => {
3944
- const checked = normalizedFilteredValues.findIndex((filteredValue) => filteredValue === normalizedValue) ===
3945
- -1;
3946
- return {
3947
- checked,
3948
- string: strValues.find((val) => toLowerCase(val) === normalizedValue) || "",
3949
- };
3950
- });
3938
+ const normalizedFilteredValues = new Set(filterValues.map(toLowerCase));
3939
+ const set = new Set();
3940
+ const values = [];
3941
+ const addValue = (value) => {
3942
+ const normalizedValue = toLowerCase(value);
3943
+ if (!set.has(normalizedValue)) {
3944
+ values.push({
3945
+ string: value || "",
3946
+ checked: !normalizedFilteredValues.has(normalizedValue),
3947
+ normalizedValue,
3948
+ });
3949
+ set.add(normalizedValue);
3950
+ }
3951
+ };
3952
+ cellValues.forEach(addValue);
3953
+ filterValues.forEach(addValue);
3954
+ return values.sort((val1, val2) => val1.normalizedValue.localeCompare(val2.normalizedValue, undefined, {
3955
+ numeric: true,
3956
+ sensitivity: "base",
3957
+ }));
3951
3958
  }
3952
3959
  checkValue(value) {
3953
3960
  var _a;
@@ -5317,6 +5324,10 @@
5317
5324
  });
5318
5325
  };
5319
5326
  const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
5327
+ if ((dimension === "COL" && env.model.getters.getActiveRows().size > 0) ||
5328
+ (dimension === "ROW" && env.model.getters.getActiveCols().size > 0)) {
5329
+ return false;
5330
+ }
5320
5331
  const sheetId = env.model.getters.getActiveSheetId();
5321
5332
  const selectedElements = env.model.getters.getElementsFromSelection(dimension);
5322
5333
  const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
@@ -6665,11 +6676,11 @@
6665
6676
  * transformation function given
6666
6677
  */
6667
6678
  addTransformation(executed, toTransforms, fn) {
6668
- for (let toTransform of toTransforms) {
6669
- if (!this.content[toTransform]) {
6670
- this.content[toTransform] = new Map();
6671
- }
6672
- this.content[toTransform].set(executed, fn);
6679
+ if (!this.content[executed]) {
6680
+ this.content[executed] = new Map();
6681
+ }
6682
+ for (const toTransform of toTransforms) {
6683
+ this.content[executed].set(toTransform, fn);
6673
6684
  }
6674
6685
  return this;
6675
6686
  }
@@ -6678,7 +6689,7 @@
6678
6689
  * that the executed command happened.
6679
6690
  */
6680
6691
  getTransformation(toTransform, executed) {
6681
- return this.content[toTransform] && this.content[toTransform].get(executed);
6692
+ return this.content[executed] && this.content[executed].get(toTransform);
6682
6693
  }
6683
6694
  }
6684
6695
  const otRegistry = new OTRegistry();
@@ -26066,7 +26077,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
26066
26077
  */
26067
26078
  handleMissingValue(parentElement, missingElementName, optionalArgs) {
26068
26079
  if (optionalArgs === null || optionalArgs === void 0 ? void 0 : optionalArgs.required) {
26069
- if (optionalArgs === null || optionalArgs === void 0 ? void 0 : optionalArgs.default) {
26080
+ if ((optionalArgs === null || optionalArgs === void 0 ? void 0 : optionalArgs.default) !== undefined) {
26070
26081
  this.warningManager.addParsingWarning(`Missing required ${missingElementName} in element <${parentElement.tagName}> of ${this.currentFile}, replacing it by the default value ${optionalArgs.default}`);
26071
26082
  }
26072
26083
  else {
@@ -34031,9 +34042,10 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
34031
34042
  const filteredValues = (_b = (_a = this.filterValues[sheetId]) === null || _a === void 0 ? void 0 : _a[filter.id]) === null || _b === void 0 ? void 0 : _b.map(toLowerCase);
34032
34043
  if (!filteredValues || !filter.filteredZone)
34033
34044
  continue;
34045
+ const filteredValuesSet = new Set(filteredValues);
34034
34046
  for (let row = filter.filteredZone.top; row <= filter.filteredZone.bottom; row++) {
34035
34047
  const value = this.getCellValueAsString(sheetId, filter.col, row);
34036
- if (filteredValues.includes(value)) {
34048
+ if (filteredValuesSet.has(value)) {
34037
34049
  hiddenRows.add(row);
34038
34050
  }
34039
34051
  }
@@ -36377,10 +36389,20 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
36377
36389
  */
36378
36390
  function transformAll(toTransform, executed) {
36379
36391
  let transformedCommands = [...toTransform];
36392
+ const possibleTransformations = new Set(otRegistry.getKeys());
36380
36393
  for (const executedCommand of executed) {
36381
- transformedCommands = transformedCommands
36382
- .map((cmd) => transform(cmd, executedCommand))
36383
- .filter(isDefined$1);
36394
+ // If the executed command is not in the registry, we skip it
36395
+ // because we know there won't be any transformation impacting the
36396
+ // commands to transform.
36397
+ if (possibleTransformations.has(executedCommand.type)) {
36398
+ transformedCommands = transformedCommands.reduce((acc, cmd) => {
36399
+ const transformed = transform(cmd, executedCommand);
36400
+ if (transformed) {
36401
+ acc.push(transformed);
36402
+ }
36403
+ return acc;
36404
+ }, []);
36405
+ }
36384
36406
  }
36385
36407
  return transformedCommands;
36386
36408
  }
@@ -36840,7 +36862,6 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
36840
36862
  if (this.waitingAck) {
36841
36863
  return;
36842
36864
  }
36843
- this.waitingAck = true;
36844
36865
  this.sendPendingMessage();
36845
36866
  }
36846
36867
  /**
@@ -36870,6 +36891,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
36870
36891
  throw new Error(`Trying to send a new revision while replaying initial revision. This can lead to endless dispatches every time the spreadsheet is open.
36871
36892
  ${JSON.stringify(message)}`);
36872
36893
  }
36894
+ this.waitingAck = true;
36873
36895
  this.transportService.sendMessage({
36874
36896
  ...message,
36875
36897
  serverRevisionId: this.serverRevisionId,
@@ -43857,9 +43879,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
43857
43879
  Object.defineProperty(exports, '__esModule', { value: true });
43858
43880
 
43859
43881
 
43860
- __info__.version = '16.0.71';
43861
- __info__.date = '2025-05-13T17:48:09.400Z';
43862
- __info__.hash = '2ff9f1a';
43882
+ __info__.version = '16.0.73';
43883
+ __info__.date = '2025-06-19T18:25:17.838Z';
43884
+ __info__.hash = '8bc0a8a';
43863
43885
 
43864
43886
 
43865
43887
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);