jqtree 1.8.7 → 1.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jqTree",
3
- "version": "1.8.7",
3
+ "version": "1.8.8",
4
4
  "main": [
5
5
  "jqtree.css",
6
6
  "jqtree-circle.png",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jqtree",
3
- "version": "1.8.7",
3
+ "version": "1.8.8",
4
4
  "description": "Tree widget for jQuery",
5
5
  "keywords": [
6
6
  "jquery-plugin",
@@ -35,51 +35,50 @@
35
35
  "jquery": "^3"
36
36
  },
37
37
  "devDependencies": {
38
- "@babel/cli": "^7.25.7",
39
- "@babel/core": "^7.25.7",
40
- "@babel/preset-env": "^7.25.7",
41
- "@babel/preset-typescript": "^7.25.7",
42
- "@playwright/test": "^1.47.2",
38
+ "@babel/cli": "^7.25.9",
39
+ "@babel/core": "^7.26.0",
40
+ "@babel/preset-env": "^7.26.0",
41
+ "@babel/preset-typescript": "^7.26.0",
42
+ "@playwright/test": "^1.48.2",
43
43
  "@rollup/plugin-babel": "^6.0.4",
44
44
  "@rollup/plugin-node-resolve": "^15.3.0",
45
45
  "@rollup/plugin-terser": "^0.4.4",
46
46
  "@testing-library/dom": "^10.4.0",
47
- "@testing-library/jest-dom": "^6.6.2",
47
+ "@testing-library/jest-dom": "^6.6.3",
48
48
  "@testing-library/user-event": "^14.5.2",
49
49
  "@types/debug": "^4.1.12",
50
- "@types/jest": "^29.5.13",
50
+ "@types/jest": "^29.5.14",
51
51
  "@types/jest-axe": "^3.5.9",
52
- "@types/jquery": "^3.5.31",
53
- "@types/node": "^22.7.4",
52
+ "@types/jquery": "^3.5.32",
53
+ "@types/node": "^22.9.0",
54
54
  "autoprefixer": "^10.4.20",
55
55
  "babel-jest": "^29.7.0",
56
56
  "babel-plugin-istanbul": "^7.0.0",
57
- "eslint": "^9",
57
+ "eslint": "^9.14.0",
58
58
  "eslint-plugin-import": "^2.31.0",
59
- "eslint-plugin-jest": "^28.8.3",
59
+ "eslint-plugin-jest": "^28.9.0",
60
60
  "eslint-plugin-jest-dom": "^5.4.0",
61
- "eslint-plugin-perfectionist": "^3.8.0",
62
- "eslint-plugin-playwright": "^1.6.2",
61
+ "eslint-plugin-perfectionist": "^3.9.1",
62
+ "eslint-plugin-playwright": "^2.0.1",
63
63
  "givens": "^1.3.9",
64
64
  "graphql": "^16.9.0",
65
65
  "jest": "^29.7.0",
66
66
  "jest-axe": "^9.0.0",
67
67
  "jest-extended": "^4.0.2",
68
- "jest-fixed-jsdom": "^0.0.4",
68
+ "jest-fixed-jsdom": "^0.0.8",
69
69
  "jsonfile": "^6.1.0",
70
70
  "lodash": "^4.17.21",
71
- "msw": "^2.4.9",
71
+ "msw": "^2.6.2",
72
72
  "postcss": "^8.4.47",
73
73
  "postcss-cli": "^11.0.0",
74
74
  "postcss-import": "^16.1.0",
75
75
  "postcss-load-config": "^6.0.1",
76
- "postcss-nested": "^6.2.0",
76
+ "postcss-nested": "^7.0.2",
77
77
  "prettier": "^3.3.3",
78
- "rollup": "^4.24.0",
78
+ "rollup": "^4.24.4",
79
79
  "rollup-plugin-serve": "^3.0.0",
80
- "tslib": "^2.7.0",
81
- "typescript": "^5.6.2",
82
- "typescript-eslint": "^8.8.0",
83
- "undici": "^5.28.4"
80
+ "tslib": "^2.8.1",
81
+ "typescript": "^5.6.3",
82
+ "typescript-eslint": "^8.13.0"
84
83
  }
85
84
  }
package/src/keyHandler.ts CHANGED
@@ -7,8 +7,6 @@ import {
7
7
  } from "./jqtreeMethodTypes";
8
8
  import { Node } from "./node";
9
9
 
10
- type KeyboardEventHandler = (event: KeyboardEvent) => boolean;
11
-
12
10
  interface KeyHandlerParams {
13
11
  closeNode: CloseNode;
14
12
  getSelectedNode: GetSelectedNode;
@@ -36,16 +34,16 @@ export default class KeyHandler {
36
34
  isKeyHandled = this.moveDown(selectedNode);
37
35
  break;
38
36
 
39
- case "ArrowUp":
40
- isKeyHandled = this.moveUp(selectedNode);
37
+ case "ArrowLeft":
38
+ isKeyHandled = this.moveLeft(selectedNode);
41
39
  break;
42
40
 
43
41
  case "ArrowRight":
44
42
  isKeyHandled = this.moveRight(selectedNode);
45
43
  break;
46
44
 
47
- case "ArrowLeft":
48
- isKeyHandled = this.moveLeft(selectedNode);
45
+ case "ArrowUp":
46
+ isKeyHandled = this.moveUp(selectedNode);
49
47
  break;
50
48
  }
51
49
  }
@@ -55,7 +53,6 @@ export default class KeyHandler {
55
53
  }
56
54
  };
57
55
 
58
- private handleKeyDownHandler?: KeyboardEventHandler;
59
56
  private isFocusOnTree: IsFocusOnTree;
60
57
  private keyboardSupport: boolean;
61
58
  private openNode: OpenNode;
@@ -127,8 +124,8 @@ export default class KeyHandler {
127
124
  }
128
125
 
129
126
  public deinit(): void {
130
- if (this.handleKeyDownHandler) {
131
- document.removeEventListener("keydown", this.handleKeyDownHandler);
127
+ if (this.keyboardSupport) {
128
+ document.removeEventListener("keydown", this.handleKeyDown);
132
129
  }
133
130
  }
134
131
 
@@ -14,19 +14,19 @@ class FolderElement extends NodeElement {
14
14
  private triggerEvent: TriggerEvent;
15
15
 
16
16
  constructor({
17
- $treeElement,
18
17
  closedIconElement,
19
18
  getScrollLeft,
20
19
  node,
21
20
  openedIconElement,
22
21
  tabIndex,
22
+ treeElement,
23
23
  triggerEvent,
24
24
  }: FolderElementParams) {
25
25
  super({
26
- $treeElement,
27
26
  getScrollLeft,
28
27
  node,
29
28
  tabIndex,
29
+ treeElement,
30
30
  });
31
31
 
32
32
  this.closedIconElement = closedIconElement;
@@ -44,10 +44,7 @@ class FolderElement extends NodeElement {
44
44
  ) as HTMLLinkElement;
45
45
  }
46
46
 
47
- public close(
48
- slide = true,
49
- animationSpeed: JQuery.Duration | undefined = "fast",
50
- ): void {
47
+ public close(slide: boolean, animationSpeed: JQuery.Duration): void {
51
48
  if (!this.node.is_open) {
52
49
  return;
53
50
  }
@@ -86,8 +83,8 @@ class FolderElement extends NodeElement {
86
83
 
87
84
  public open(
88
85
  onFinished: OnFinishOpenNode | undefined,
89
- slide = true,
90
- animationSpeed: JQuery.Duration = "fast",
86
+ slide: boolean,
87
+ animationSpeed: JQuery.Duration,
91
88
  ): void {
92
89
  if (this.node.is_open) {
93
90
  return;
@@ -6,28 +6,28 @@ import BorderDropHint from "./borderDropHint";
6
6
  import GhostDropHint from "./ghostDropHint";
7
7
 
8
8
  export interface NodeElementParams {
9
- $treeElement: JQuery;
10
9
  getScrollLeft: GetScrollLeft;
11
10
  node: Node;
12
11
  tabIndex?: number;
12
+ treeElement: HTMLElement;
13
13
  }
14
14
 
15
15
  class NodeElement {
16
- private $treeElement: JQuery;
17
16
  private getScrollLeft: GetScrollLeft;
18
17
  private tabIndex?: number;
18
+ private treeElement: HTMLElement;
19
19
  public element: HTMLElement;
20
20
  public node: Node;
21
21
 
22
22
  constructor({
23
- $treeElement,
24
23
  getScrollLeft,
25
24
  node,
26
25
  tabIndex,
26
+ treeElement,
27
27
  }: NodeElementParams) {
28
28
  this.getScrollLeft = getScrollLeft;
29
29
  this.tabIndex = tabIndex;
30
- this.$treeElement = $treeElement;
30
+ this.treeElement = treeElement;
31
31
 
32
32
  this.init(node);
33
33
  }
@@ -68,16 +68,10 @@ class NodeElement {
68
68
  this.node = node;
69
69
 
70
70
  if (!node.element) {
71
- const element = this.$treeElement.get(0);
72
-
73
- if (element) {
74
- node.element = element;
75
- }
71
+ node.element = this.treeElement;
76
72
  }
77
73
 
78
- if (node.element) {
79
- this.element = node.element;
80
- }
74
+ this.element = node.element;
81
75
  }
82
76
 
83
77
  public select(mustSetFocus: boolean): void {
@@ -30,7 +30,6 @@ interface SaveStateHandlerParams {
30
30
  }
31
31
 
32
32
  export default class SaveStateHandler {
33
- private _supportsLocalStorage: boolean | null;
34
33
  private addToSelection: AddToSelection;
35
34
  private getNodeById: GetNodeById;
36
35
  private getSelectedNodes: GetSelectedNodes;
@@ -77,10 +76,8 @@ export default class SaveStateHandler {
77
76
  private loadFromStorage(): null | string {
78
77
  if (this.onGetStateFromStorage) {
79
78
  return this.onGetStateFromStorage();
80
- } else if (this.supportsLocalStorage()) {
81
- return localStorage.getItem(this.getKeyName());
82
79
  } else {
83
- return null;
80
+ return localStorage.getItem(this.getKeyName());
84
81
  }
85
82
  }
86
83
 
@@ -138,27 +135,6 @@ export default class SaveStateHandler {
138
135
  return selectCount !== 0;
139
136
  }
140
137
 
141
- private supportsLocalStorage(): boolean {
142
- const testSupport = (): boolean => {
143
- // Check if it's possible to store an item. Safari does not allow this in private browsing mode.
144
- try {
145
- const key = "_storage_test";
146
- sessionStorage.setItem(key, "value");
147
- sessionStorage.removeItem(key);
148
- } catch {
149
- return false;
150
- }
151
-
152
- return true;
153
- };
154
-
155
- if (this._supportsLocalStorage == null) {
156
- this._supportsLocalStorage = testSupport();
157
- }
158
-
159
- return this._supportsLocalStorage;
160
- }
161
-
162
138
  public getNodeIdToBeSelected(): NodeId | null {
163
139
  const state = this.getStateFromStorage();
164
140
 
@@ -216,7 +192,7 @@ export default class SaveStateHandler {
216
192
 
217
193
  if (this.onSetStateFromStorage) {
218
194
  this.onSetStateFromStorage(state);
219
- } else if (this.supportsLocalStorage()) {
195
+ } else {
220
196
  localStorage.setItem(this.getKeyName(), state);
221
197
  }
222
198
  }
@@ -225,7 +201,7 @@ export default class SaveStateHandler {
225
201
  Set initial state
226
202
  Don't handle nodes that are loaded on demand
227
203
 
228
- result: must load on demand
204
+ result: must load on demand (boolean)
229
205
  */
230
206
  public setInitialState(state: SavedState): boolean {
231
207
  let mustLoadOnDemand = false;
@@ -64,18 +64,14 @@ export default class SelectNodeHandler {
64
64
  return [];
65
65
  }
66
66
  } else {
67
- const selectedNodes = [];
68
-
69
- for (const id in this.selectedNodes) {
70
- if (
71
- Object.prototype.hasOwnProperty.call(this.selectedNodes, id)
72
- ) {
73
- const node = this.getNodeById(id);
74
- if (node && parent.isParentOf(node)) {
75
- selectedNodes.push(node);
76
- }
67
+ const selectedNodes: Node[] = [];
68
+
69
+ this.selectedNodes.forEach((id) => {
70
+ const node = this.getNodeById(id);
71
+ if (node && parent.isParentOf(node)) {
72
+ selectedNodes.push(node);
77
73
  }
78
- }
74
+ });
79
75
 
80
76
  return selectedNodes;
81
77
  }
@@ -250,16 +250,16 @@ export class JqTreeWidget extends SimpleWidget<JQTreeOptions> {
250
250
  );
251
251
  const openedIconElement = this.renderer.openedIconElement;
252
252
  const tabIndex = this.options.tabIndex;
253
- const $treeElement = this.element;
253
+ const treeElement = this.element.get(0) as HTMLElement;
254
254
  const triggerEvent = this.triggerEvent.bind(this);
255
255
 
256
256
  return new FolderElement({
257
- $treeElement,
258
257
  closedIconElement,
259
258
  getScrollLeft,
260
259
  node,
261
260
  openedIconElement,
262
261
  tabIndex,
262
+ treeElement,
263
263
  triggerEvent,
264
264
  });
265
265
  }
@@ -269,13 +269,13 @@ export class JqTreeWidget extends SimpleWidget<JQTreeOptions> {
269
269
  this.scrollHandler,
270
270
  );
271
271
  const tabIndex = this.options.tabIndex;
272
- const $treeElement = this.element;
272
+ const treeElement = this.element.get(0) as HTMLElement;
273
273
 
274
274
  return new NodeElement({
275
- $treeElement,
276
275
  getScrollLeft,
277
276
  node,
278
277
  tabIndex,
278
+ treeElement,
279
279
  });
280
280
  }
281
281
 
@@ -626,6 +626,10 @@ export class JqTreeWidget extends SimpleWidget<JQTreeOptions> {
626
626
  _slide: boolean,
627
627
  _onFinished?: OnFinishOpenNode,
628
628
  ): void => {
629
+ if (!node.children.length) {
630
+ return;
631
+ }
632
+
629
633
  const folderElement = this.createFolderElement(_node);
630
634
  folderElement.open(
631
635
  _onFinished,
package/src/version.ts CHANGED
@@ -1,3 +1,3 @@
1
- const version = "1.8.7";
1
+ const version = "1.8.8";
2
2
 
3
3
  export default version;
@@ -1,5 +1,5 @@
1
1
  /*
2
- JqTree 1.8.7
2
+ JqTree 1.8.8
3
3
 
4
4
  Copyright 2024 Marco Braak
5
5
 
@@ -902,14 +902,14 @@ var jqtree = (function (exports) {
902
902
  case "ArrowDown":
903
903
  isKeyHandled = this.moveDown(selectedNode);
904
904
  break;
905
- case "ArrowUp":
906
- isKeyHandled = this.moveUp(selectedNode);
905
+ case "ArrowLeft":
906
+ isKeyHandled = this.moveLeft(selectedNode);
907
907
  break;
908
908
  case "ArrowRight":
909
909
  isKeyHandled = this.moveRight(selectedNode);
910
910
  break;
911
- case "ArrowLeft":
912
- isKeyHandled = this.moveLeft(selectedNode);
911
+ case "ArrowUp":
912
+ isKeyHandled = this.moveUp(selectedNode);
913
913
  break;
914
914
  }
915
915
  }
@@ -978,8 +978,8 @@ var jqtree = (function (exports) {
978
978
  }
979
979
  }
980
980
  deinit() {
981
- if (this.handleKeyDownHandler) {
982
- document.removeEventListener("keydown", this.handleKeyDownHandler);
981
+ if (this.keyboardSupport) {
982
+ document.removeEventListener("keydown", this.handleKeyDown);
983
983
  }
984
984
  }
985
985
  moveDown(selectedNode) {
@@ -1863,14 +1863,14 @@ var jqtree = (function (exports) {
1863
1863
  class NodeElement {
1864
1864
  constructor(_ref) {
1865
1865
  let {
1866
- $treeElement,
1867
1866
  getScrollLeft,
1868
1867
  node,
1869
- tabIndex
1868
+ tabIndex,
1869
+ treeElement
1870
1870
  } = _ref;
1871
1871
  this.getScrollLeft = getScrollLeft;
1872
1872
  this.tabIndex = tabIndex;
1873
- this.$treeElement = $treeElement;
1873
+ this.treeElement = treeElement;
1874
1874
  this.init(node);
1875
1875
  }
1876
1876
  getTitleSpan() {
@@ -1899,14 +1899,9 @@ var jqtree = (function (exports) {
1899
1899
  init(node) {
1900
1900
  this.node = node;
1901
1901
  if (!node.element) {
1902
- const element = this.$treeElement.get(0);
1903
- if (element) {
1904
- node.element = element;
1905
- }
1906
- }
1907
- if (node.element) {
1908
- this.element = node.element;
1902
+ node.element = this.treeElement;
1909
1903
  }
1904
+ this.element = node.element;
1910
1905
  }
1911
1906
  select(mustSetFocus) {
1912
1907
  this.element.classList.add("jqtree-selected");
@@ -1927,19 +1922,19 @@ var jqtree = (function (exports) {
1927
1922
  class FolderElement extends NodeElement {
1928
1923
  constructor(_ref) {
1929
1924
  let {
1930
- $treeElement,
1931
1925
  closedIconElement,
1932
1926
  getScrollLeft,
1933
1927
  node,
1934
1928
  openedIconElement,
1935
1929
  tabIndex,
1930
+ treeElement,
1936
1931
  triggerEvent
1937
1932
  } = _ref;
1938
1933
  super({
1939
- $treeElement,
1940
1934
  getScrollLeft,
1941
1935
  node,
1942
- tabIndex
1936
+ tabIndex,
1937
+ treeElement
1943
1938
  });
1944
1939
  this.closedIconElement = closedIconElement;
1945
1940
  this.openedIconElement = openedIconElement;
@@ -1951,9 +1946,7 @@ var jqtree = (function (exports) {
1951
1946
  getButton() {
1952
1947
  return this.element.querySelector(":scope > .jqtree-element > a.jqtree-toggler");
1953
1948
  }
1954
- close() {
1955
- let slide = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
1956
- let animationSpeed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fast";
1949
+ close(slide, animationSpeed) {
1957
1950
  if (!this.node.is_open) {
1958
1951
  return;
1959
1952
  }
@@ -1981,9 +1974,7 @@ var jqtree = (function (exports) {
1981
1974
  doClose();
1982
1975
  }
1983
1976
  }
1984
- open(onFinished) {
1985
- let slide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1986
- let animationSpeed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "fast";
1977
+ open(onFinished, slide, animationSpeed) {
1987
1978
  if (this.node.is_open) {
1988
1979
  return;
1989
1980
  }
@@ -2051,10 +2042,8 @@ var jqtree = (function (exports) {
2051
2042
  loadFromStorage() {
2052
2043
  if (this.onGetStateFromStorage) {
2053
2044
  return this.onGetStateFromStorage();
2054
- } else if (this.supportsLocalStorage()) {
2055
- return localStorage.getItem(this.getKeyName());
2056
2045
  } else {
2057
- return null;
2046
+ return localStorage.getItem(this.getKeyName());
2058
2047
  }
2059
2048
  }
2060
2049
  openInitialNodes(nodeIds) {
@@ -2098,23 +2087,6 @@ var jqtree = (function (exports) {
2098
2087
  }
2099
2088
  return selectCount !== 0;
2100
2089
  }
2101
- supportsLocalStorage() {
2102
- const testSupport = () => {
2103
- // Check if it's possible to store an item. Safari does not allow this in private browsing mode.
2104
- try {
2105
- const key = "_storage_test";
2106
- sessionStorage.setItem(key, "value");
2107
- sessionStorage.removeItem(key);
2108
- } catch {
2109
- return false;
2110
- }
2111
- return true;
2112
- };
2113
- if (this._supportsLocalStorage == null) {
2114
- this._supportsLocalStorage = testSupport();
2115
- }
2116
- return this._supportsLocalStorage;
2117
- }
2118
2090
  getNodeIdToBeSelected() {
2119
2091
  const state = this.getStateFromStorage();
2120
2092
  if (state?.selected_node) {
@@ -2160,7 +2132,7 @@ var jqtree = (function (exports) {
2160
2132
  const state = JSON.stringify(this.getState());
2161
2133
  if (this.onSetStateFromStorage) {
2162
2134
  this.onSetStateFromStorage(state);
2163
- } else if (this.supportsLocalStorage()) {
2135
+ } else {
2164
2136
  localStorage.setItem(this.getKeyName(), state);
2165
2137
  }
2166
2138
  }
@@ -2168,7 +2140,7 @@ var jqtree = (function (exports) {
2168
2140
  /*
2169
2141
  Set initial state
2170
2142
  Don't handle nodes that are loaded on demand
2171
- result: must load on demand
2143
+ result: must load on demand (boolean)
2172
2144
  */
2173
2145
  setInitialState(state) {
2174
2146
  let mustLoadOnDemand = false;
@@ -2575,14 +2547,12 @@ var jqtree = (function (exports) {
2575
2547
  }
2576
2548
  } else {
2577
2549
  const selectedNodes = [];
2578
- for (const id in this.selectedNodes) {
2579
- if (Object.prototype.hasOwnProperty.call(this.selectedNodes, id)) {
2580
- const node = this.getNodeById(id);
2581
- if (node && parent.isParentOf(node)) {
2582
- selectedNodes.push(node);
2583
- }
2550
+ this.selectedNodes.forEach(id => {
2551
+ const node = this.getNodeById(id);
2552
+ if (node && parent.isParentOf(node)) {
2553
+ selectedNodes.push(node);
2584
2554
  }
2585
- }
2555
+ });
2586
2556
  return selectedNodes;
2587
2557
  }
2588
2558
  }
@@ -2718,7 +2688,7 @@ var jqtree = (function (exports) {
2718
2688
  }
2719
2689
  }
2720
2690
 
2721
- const version = "1.8.7";
2691
+ const version = "1.8.8";
2722
2692
 
2723
2693
  const NODE_PARAM_IS_EMPTY = "Node parameter is empty";
2724
2694
  const PARAM_IS_EMPTY = "Parameter is empty: ";
@@ -2919,27 +2889,27 @@ var jqtree = (function (exports) {
2919
2889
  const getScrollLeft = this.scrollHandler.getScrollLeft.bind(this.scrollHandler);
2920
2890
  const openedIconElement = this.renderer.openedIconElement;
2921
2891
  const tabIndex = this.options.tabIndex;
2922
- const $treeElement = this.element;
2892
+ const treeElement = this.element.get(0);
2923
2893
  const triggerEvent = this.triggerEvent.bind(this);
2924
2894
  return new FolderElement({
2925
- $treeElement,
2926
2895
  closedIconElement,
2927
2896
  getScrollLeft,
2928
2897
  node,
2929
2898
  openedIconElement,
2930
2899
  tabIndex,
2900
+ treeElement,
2931
2901
  triggerEvent
2932
2902
  });
2933
2903
  }
2934
2904
  createNodeElement(node) {
2935
2905
  const getScrollLeft = this.scrollHandler.getScrollLeft.bind(this.scrollHandler);
2936
2906
  const tabIndex = this.options.tabIndex;
2937
- const $treeElement = this.element;
2907
+ const treeElement = this.element.get(0);
2938
2908
  return new NodeElement({
2939
- $treeElement,
2940
2909
  getScrollLeft,
2941
2910
  node,
2942
- tabIndex
2911
+ tabIndex,
2912
+ treeElement
2943
2913
  });
2944
2914
  }
2945
2915
  deselectCurrentNode() {
@@ -3217,6 +3187,9 @@ var jqtree = (function (exports) {
3217
3187
  let slide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
3218
3188
  let onFinished = arguments.length > 2 ? arguments[2] : undefined;
3219
3189
  const doOpenNode = (_node, _slide, _onFinished) => {
3190
+ if (!node.children.length) {
3191
+ return;
3192
+ }
3220
3193
  const folderElement = this.createFolderElement(_node);
3221
3194
  folderElement.open(_onFinished, _slide, this.options.animationSpeed);
3222
3195
  };