fastlowess-wasm 3.2.1 → 4.0.0

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.
@@ -21,35 +21,97 @@ export interface SmoothOptions {
21
21
  scaling_method?: string;
22
22
  /** Auto-convergence tolerance. Disabled when absent. */
23
23
  auto_converge?: number;
24
- /** Include residuals in result. Default: false. */
24
+ /** Include residuals in result. Ignored by OnlineLowess (`residual` is always included regardless). Default: false. */
25
25
  return_residuals?: boolean;
26
26
  /** Include robustness weights in result. Default: false. */
27
27
  return_robustness_weights?: boolean;
28
- /** Compute diagnostics (RMSE, MAE, R2, etc.). Default: false. */
28
+ /** Compute diagnostics (RMSE, MAE, R2, etc.). Ignored by OnlineLowess (it has no diagnostics field). Default: false. */
29
29
  return_diagnostics?: boolean;
30
- /** Include standard errors in result. Default: false. */
30
+ /** Include standard errors in result. Batch (Lowess) only; ignored by StreamingLowess/OnlineLowess. Default: false. */
31
31
  return_se?: boolean;
32
- /** Confidence interval level (e.g. 0.95). Disabled when absent. */
32
+ /** Return results sorted ascending by x instead of in original input order. Batch (Lowess) only; ignored by StreamingLowess/OnlineLowess. Default: false. */
33
+ return_sorted?: boolean;
34
+ /** Confidence interval level (e.g. 0.95). Batch (Lowess) only; ignored by StreamingLowess/OnlineLowess. Disabled when absent. */
33
35
  confidence_intervals?: number;
34
- /** Prediction interval level (e.g. 0.95). Disabled when absent. */
36
+ /** Prediction interval level (e.g. 0.95). Batch (Lowess) only; ignored by StreamingLowess/OnlineLowess. Disabled when absent. */
35
37
  prediction_intervals?: number;
36
- /** Enable parallel execution. Default: true. */
38
+ /** Enable parallel execution. Ignored by OnlineLowess (it processes one point at a time). Default: true. */
37
39
  parallel?: boolean;
38
- /** Fractions to test for cross-validation. CV disabled when absent. */
40
+ /** Fractions to test for cross-validation. Batch (Lowess) only; ignored by StreamingLowess/OnlineLowess. CV disabled when absent. */
39
41
  cv_fractions?: number[];
40
- /** CV method ("kfold" or "loocv"). Default: "kfold". */
42
+ /** CV method ("kfold" or "loocv"). Batch (Lowess) only; ignored by StreamingLowess/OnlineLowess. Default: "kfold". */
41
43
  cv_method?: string;
42
- /** Number of folds for k-fold CV. Default: 5. */
44
+ /** Number of folds for k-fold CV. Batch (Lowess) only; ignored by StreamingLowess/OnlineLowess. Default: 5. */
43
45
  cv_k?: number;
44
- /** Random seed for CV fold assignment. */
46
+ /** Random seed for CV fold assignment. Batch (Lowess) only; ignored by StreamingLowess/OnlineLowess. */
45
47
  cv_seed?: number;
48
+ /** Policy for non-finite (NaN/Inf) values in input data ("error", "drop"). Default: "error". */
49
+ missing?: string;
50
+ }
51
+
52
+ /** Configuration options for streaming LOWESS smoothing. A subset of `SmoothOptions`: confidence/prediction intervals, standard errors, cross-validation, and `return_sorted` have no equivalent here. */
53
+ export interface StreamingSmoothOptions {
54
+ /** Smoothing fraction (0 < fraction <= 1). Default: 0.67. */
55
+ fraction?: number;
56
+ /** Number of robustness iterations. Default: 3. */
57
+ iterations?: number;
58
+ /** Delta for interpolation speedup. Default: auto. Set to 0 to disable. */
59
+ delta?: number;
60
+ /** Kernel function ("tricube", "epanechnikov", "gaussian", "uniform", "biweight", "triangle", "cosine"). Default: "tricube". */
61
+ weight_function?: string;
62
+ /** Robustness method ("bisquare", "huber", "talwar"). Default: "bisquare". */
63
+ robustness_method?: string;
64
+ /** Fallback when all weights are zero ("use_local_mean", "return_original", "return_none"). Default: "use_local_mean". */
65
+ zero_weight_fallback?: string;
66
+ /** Boundary handling ("extend", "reflect", "zero", "noboundary"). Default: "extend". */
67
+ boundary_policy?: string;
68
+ /** Scaling method ("mad", "mar", "mean"). Default: "mad". */
69
+ scaling_method?: string;
70
+ /** Auto-convergence tolerance. Disabled when absent. */
71
+ auto_converge?: number;
72
+ /** Include residuals in result. Default: false. */
73
+ return_residuals?: boolean;
74
+ /** Include robustness weights in result. Default: false. */
75
+ return_robustness_weights?: boolean;
76
+ /** Compute diagnostics (RMSE, MAE, R2, etc.). Default: false. */
77
+ return_diagnostics?: boolean;
78
+ /** Enable parallel execution. Default: true. */
79
+ parallel?: boolean;
80
+ /** Policy for non-finite (NaN/Inf) values in each chunk ("error", "drop"). Default: "error". */
81
+ missing?: string;
82
+ }
83
+
84
+ /** Configuration options for online LOWESS smoothing. A subset of `SmoothOptions`: diagnostics, residuals, parallel execution, confidence/prediction intervals, standard errors, cross-validation, and `return_sorted` have no equivalent here. */
85
+ export interface OnlineSmoothOptions {
86
+ /** Smoothing fraction (0 < fraction <= 1). Default: 0.67. */
87
+ fraction?: number;
88
+ /** Number of robustness iterations. Default: 3. */
89
+ iterations?: number;
90
+ /** Delta for interpolation speedup. Default: auto. Set to 0 to disable. */
91
+ delta?: number;
92
+ /** Kernel function ("tricube", "epanechnikov", "gaussian", "uniform", "biweight", "triangle", "cosine"). Default: "tricube". */
93
+ weight_function?: string;
94
+ /** Robustness method ("bisquare", "huber", "talwar"). Default: "bisquare". */
95
+ robustness_method?: string;
96
+ /** Fallback when all weights are zero ("use_local_mean", "return_original", "return_none"). Default: "use_local_mean". */
97
+ zero_weight_fallback?: string;
98
+ /** Boundary handling ("extend", "reflect", "zero", "noboundary"). Default: "extend". */
99
+ boundary_policy?: string;
100
+ /** Scaling method ("mad", "mar", "mean"). Default: "mad". */
101
+ scaling_method?: string;
102
+ /** Auto-convergence tolerance. Disabled when absent. */
103
+ auto_converge?: number;
104
+ /** Include robustness weights in result. Default: false. */
105
+ return_robustness_weights?: boolean;
106
+ /** Policy for non-finite (NaN/Inf) `x`/`y` values passed to `add_point` ("error", "drop"). Default: "error". */
107
+ missing?: string;
46
108
  }
47
109
 
48
110
  /** Configuration options for streaming LOWESS. */
49
111
  export interface StreamingOptions {
50
112
  /** Size of each processing chunk. Default: 5000. */
51
113
  chunk_size?: number;
52
- /** Overlap between adjacent chunks. Default: 500. */
114
+ /** Overlap between adjacent chunks. Default: chunk_size / 10, min. 1. */
53
115
  overlap?: number;
54
116
  /** Strategy for merging chunks (\"average\", \"weighted_average\", \"take_first\", \"take_last\"). Default: \"weighted_average\". */
55
117
  merge_strategy?: string;
@@ -57,11 +119,11 @@ export interface StreamingOptions {
57
119
 
58
120
  /** Configuration options for online LOWESS. */
59
121
  export interface OnlineOptions {
60
- /** Maximum number of points to retain in the sliding window. Default: 100. */
122
+ /** Maximum number of points to retain in the sliding window. Default: 1000. */
61
123
  window_capacity?: number;
62
124
  /** Minimum points required before smoothing starts. Default: 2. */
63
125
  min_points?: number;
64
- /** Update strategy ("full" or "incremental"). Default: "full". */
126
+ /** Update strategy ("full" or "incremental"). Default: "incremental". */
65
127
  update_mode?: string;
66
128
  }
67
129
 
@@ -76,7 +138,7 @@ export class Lowess {
76
138
  /** Streaming LOWESS smoother for large datasets. */
77
139
  export class StreamingLowess {
78
140
  free(): void;
79
- constructor(options?: SmoothOptions, streamingOpts?: StreamingOptions);
141
+ constructor(options?: StreamingSmoothOptions, streamingOpts?: StreamingOptions);
80
142
  /** Process a chunk of data. */
81
143
  process_chunk(x: Float64Array, y: Float64Array): LowessResult;
82
144
  /** Finalize the stream and return remaining data. */
@@ -86,7 +148,7 @@ export class StreamingLowess {
86
148
  /** Online LOWESS smoother for real-time data. */
87
149
  export class OnlineLowess {
88
150
  free(): void;
89
- constructor(options?: SmoothOptions, onlineOpts?: OnlineOptions);
151
+ constructor(options?: OnlineSmoothOptions, onlineOpts?: OnlineOptions);
90
152
  /** Add a single point and get the smoothed output (or null if not enough points yet). */
91
153
  add_point(x: number, y: number): OnlineOutput | null;
92
154
  }
@@ -175,7 +237,9 @@ export interface InitOutput {
175
237
  readonly __wbg_set_diagnostics_residual_sd: (a: number, b: number) => void;
176
238
  readonly __wbg_set_diagnostics_rmse: (a: number, b: number) => void;
177
239
  readonly __wbg_streaminglowess_free: (a: number, b: number) => void;
240
+ readonly init_panic_hook: () => void;
178
241
  readonly lowess_fit: (a: number, b: any, c: any, d: number, e: number) => [number, number, number];
242
+ readonly lowess_new: (a: any) => number;
179
243
  readonly lowessresult_confidence_lower: (a: number) => any;
180
244
  readonly lowessresult_confidence_upper: (a: number) => any;
181
245
  readonly lowessresult_cv_scores: (a: number) => any;
@@ -199,8 +263,6 @@ export interface InitOutput {
199
263
  readonly streaminglowess_finalize: (a: number) => [number, number, number];
200
264
  readonly streaminglowess_new: (a: any, b: any) => [number, number, number];
201
265
  readonly streaminglowess_process_chunk: (a: number, b: any, c: any) => [number, number, number];
202
- readonly init_panic_hook: () => void;
203
- readonly lowess_new: (a: any) => number;
204
266
  readonly __wbindgen_malloc: (a: number, b: number) => number;
205
267
  readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
206
268
  readonly __wbindgen_exn_store: (a: number) => void;
@@ -411,72 +411,72 @@ export function init_panic_hook() {
411
411
  function __wbg_get_imports() {
412
412
  const import0 = {
413
413
  __proto__: null,
414
- __wbg_Error_408e67f47ca7b58b: function(arg0, arg1) {
414
+ __wbg_Error_67e7344beaa85059: function(arg0, arg1) {
415
415
  const ret = Error(getStringFromWasm0(arg0, arg1));
416
416
  return ret;
417
417
  },
418
- __wbg_Number_3890faa6d3ff057d: function(arg0) {
418
+ __wbg_Number_c54e7112a3fa7e3e: function(arg0) {
419
419
  const ret = Number(arg0);
420
420
  return ret;
421
421
  },
422
- __wbg___wbindgen_bigint_get_as_i64_c4ecf48528083721: function(arg0, arg1) {
422
+ __wbg___wbindgen_bigint_get_as_i64_b482365c149396c8: function(arg0, arg1) {
423
423
  const v = arg1;
424
424
  const ret = typeof(v) === 'bigint' ? v : undefined;
425
425
  getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true);
426
426
  getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);
427
427
  },
428
- __wbg___wbindgen_boolean_get_c9c83ebd41b34df3: function(arg0) {
428
+ __wbg___wbindgen_boolean_get_7a12af2b3f899c5a: function(arg0) {
429
429
  const v = arg0;
430
430
  const ret = typeof(v) === 'boolean' ? v : undefined;
431
431
  return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;
432
432
  },
433
- __wbg___wbindgen_debug_string_a57024b9c6e4a48b: function(arg0, arg1) {
433
+ __wbg___wbindgen_debug_string_0e68cf47c9cbd9b0: function(arg0, arg1) {
434
434
  const ret = debugString(arg1);
435
435
  const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
436
436
  const len1 = WASM_VECTOR_LEN;
437
437
  getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
438
438
  getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
439
439
  },
440
- __wbg___wbindgen_in_ac983077f137f2e6: function(arg0, arg1) {
440
+ __wbg___wbindgen_in_50072d4d6e45c193: function(arg0, arg1) {
441
441
  const ret = arg0 in arg1;
442
442
  return ret;
443
443
  },
444
- __wbg___wbindgen_is_bigint_8ffbbef442139384: function(arg0) {
444
+ __wbg___wbindgen_is_bigint_60fc0336cb14f5d7: function(arg0) {
445
445
  const ret = typeof(arg0) === 'bigint';
446
446
  return ret;
447
447
  },
448
- __wbg___wbindgen_is_function_5e4570eb24ffa122: function(arg0) {
448
+ __wbg___wbindgen_is_function_fcda5e3902d732fe: function(arg0) {
449
449
  const ret = typeof(arg0) === 'function';
450
450
  return ret;
451
451
  },
452
- __wbg___wbindgen_is_null_7d13f41e1a2d5140: function(arg0) {
452
+ __wbg___wbindgen_is_null_5160b3e381865372: function(arg0) {
453
453
  const ret = arg0 === null;
454
454
  return ret;
455
455
  },
456
- __wbg___wbindgen_is_object_a2790eb24c211ea0: function(arg0) {
456
+ __wbg___wbindgen_is_object_edb6b15aa3afe12e: function(arg0) {
457
457
  const val = arg0;
458
458
  const ret = typeof(val) === 'object' && val !== null;
459
459
  return ret;
460
460
  },
461
- __wbg___wbindgen_is_undefined_6cff064c44e0d823: function(arg0) {
461
+ __wbg___wbindgen_is_undefined_8c687d0b90d5b524: function(arg0) {
462
462
  const ret = arg0 === undefined;
463
463
  return ret;
464
464
  },
465
- __wbg___wbindgen_jsval_eq_0a18949a61670320: function(arg0, arg1) {
465
+ __wbg___wbindgen_jsval_eq_9fdcd3c0a860dd3b: function(arg0, arg1) {
466
466
  const ret = arg0 === arg1;
467
467
  return ret;
468
468
  },
469
- __wbg___wbindgen_jsval_loose_eq_acf2776254a8d832: function(arg0, arg1) {
469
+ __wbg___wbindgen_jsval_loose_eq_3c30021c243b64cd: function(arg0, arg1) {
470
470
  const ret = arg0 == arg1;
471
471
  return ret;
472
472
  },
473
- __wbg___wbindgen_number_get_136b9679cab35cfb: function(arg0, arg1) {
473
+ __wbg___wbindgen_number_get_1dc732b810cb937c: function(arg0, arg1) {
474
474
  const obj = arg1;
475
475
  const ret = typeof(obj) === 'number' ? obj : undefined;
476
476
  getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);
477
477
  getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);
478
478
  },
479
- __wbg___wbindgen_string_get_d154f1e671052120: function(arg0, arg1) {
479
+ __wbg___wbindgen_string_get_92ab86bb19cbc12f: function(arg0, arg1) {
480
480
  const obj = arg1;
481
481
  const ret = typeof(obj) === 'string' ? obj : undefined;
482
482
  var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
@@ -484,14 +484,14 @@ function __wbg_get_imports() {
484
484
  getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
485
485
  getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
486
486
  },
487
- __wbg___wbindgen_throw_bb96b2010945f0bc: function(arg0, arg1) {
487
+ __wbg___wbindgen_throw_5d9e815e6fdf150f: function(arg0, arg1) {
488
488
  throw new Error(getStringFromWasm0(arg0, arg1));
489
489
  },
490
- __wbg_call_1c5886ab9c57d1c7: function() { return handleError(function (arg0, arg1) {
490
+ __wbg_call_269c5566fbede3eb: function() { return handleError(function (arg0, arg1) {
491
491
  const ret = arg0.call(arg1);
492
492
  return ret;
493
493
  }, arguments); },
494
- __wbg_done_669171204c3dcae2: function(arg0) {
494
+ __wbg_done_cffed884d87aa22e: function(arg0) {
495
495
  const ret = arg0.done;
496
496
  return ret;
497
497
  },
@@ -506,11 +506,11 @@ function __wbg_get_imports() {
506
506
  wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);
507
507
  }
508
508
  },
509
- __wbg_get_d173c0308df22d37: function() { return handleError(function (arg0, arg1) {
509
+ __wbg_get_6cf5a4d4d8ad3c5a: function() { return handleError(function (arg0, arg1) {
510
510
  const ret = Reflect.get(arg0, arg1);
511
511
  return ret;
512
512
  }, arguments); },
513
- __wbg_get_unchecked_e20b893aeafc3fca: function(arg0, arg1) {
513
+ __wbg_get_unchecked_363572bdd397d473: function(arg0, arg1) {
514
514
  const ret = arg0[arg1 >>> 0];
515
515
  return ret;
516
516
  },
@@ -518,7 +518,7 @@ function __wbg_get_imports() {
518
518
  const ret = arg0[arg1];
519
519
  return ret;
520
520
  },
521
- __wbg_instanceof_ArrayBuffer_993d02d2d254cad1: function(arg0) {
521
+ __wbg_instanceof_ArrayBuffer_d4ff01f8247925ae: function(arg0) {
522
522
  let result;
523
523
  try {
524
524
  result = arg0 instanceof ArrayBuffer;
@@ -528,7 +528,7 @@ function __wbg_get_imports() {
528
528
  const ret = result;
529
529
  return ret;
530
530
  },
531
- __wbg_instanceof_Uint8Array_f935dbb0aa7cdeed: function(arg0) {
531
+ __wbg_instanceof_Uint8Array_598adc0fef426aa8: function(arg0) {
532
532
  let result;
533
533
  try {
534
534
  result = arg0 instanceof Uint8Array;
@@ -538,54 +538,54 @@ function __wbg_get_imports() {
538
538
  const ret = result;
539
539
  return ret;
540
540
  },
541
- __wbg_isArray_6339f732981044bf: function(arg0) {
541
+ __wbg_isArray_5674713bb7b79043: function(arg0) {
542
542
  const ret = Array.isArray(arg0);
543
543
  return ret;
544
544
  },
545
- __wbg_isSafeInteger_f3d6cd19ccfe4512: function(arg0) {
545
+ __wbg_isSafeInteger_8f51c743827d1ec5: function(arg0) {
546
546
  const ret = Number.isSafeInteger(arg0);
547
547
  return ret;
548
548
  },
549
- __wbg_iterator_5cebbb86e33c6dd6: function() {
549
+ __wbg_iterator_22ddeb808cf55a6f: function() {
550
550
  const ret = Symbol.iterator;
551
551
  return ret;
552
552
  },
553
- __wbg_length_36bd29c6848c2144: function(arg0) {
553
+ __wbg_length_31bdaf014f5fbde2: function(arg0) {
554
554
  const ret = arg0.length;
555
555
  return ret;
556
556
  },
557
- __wbg_length_46f80504ebb6ebb4: function(arg0) {
557
+ __wbg_length_4e1adc0d42e23620: function(arg0) {
558
558
  const ret = arg0.length;
559
559
  return ret;
560
560
  },
561
- __wbg_length_ecfa2c63d3d0d82c: function(arg0) {
561
+ __wbg_length_598aff98d0c65a59: function(arg0) {
562
562
  const ret = arg0.length;
563
563
  return ret;
564
564
  },
565
+ __wbg_new_1da3429bc3c4541c: function(arg0) {
566
+ const ret = new Uint8Array(arg0);
567
+ return ret;
568
+ },
565
569
  __wbg_new_227d7c05414eb861: function() {
566
570
  const ret = new Error();
567
571
  return ret;
568
572
  },
569
- __wbg_new_77cc4f4f472aeb81: function(arg0) {
570
- const ret = new Uint8Array(arg0);
573
+ __wbg_next_95053e306b1c3aed: function(arg0) {
574
+ const ret = arg0.next;
571
575
  return ret;
572
576
  },
573
- __wbg_next_42cf16ee0dafc9e2: function() { return handleError(function (arg0) {
577
+ __wbg_next_f31ecb8646d2c605: function() { return handleError(function (arg0) {
574
578
  const ret = arg0.next();
575
579
  return ret;
576
580
  }, arguments); },
577
- __wbg_next_8f26b64fa5e9f64b: function(arg0) {
578
- const ret = arg0.next;
579
- return ret;
580
- },
581
581
  __wbg_onlineoutput_new: function(arg0) {
582
582
  const ret = OnlineOutput.__wrap(arg0);
583
583
  return ret;
584
584
  },
585
- __wbg_prototypesetcall_35505001a41def4c: function(arg0, arg1, arg2) {
585
+ __wbg_prototypesetcall_5c62be9626638df9: function(arg0, arg1, arg2) {
586
586
  Float64Array.prototype.set.call(getArrayF64FromWasm0(arg0, arg1), arg2);
587
587
  },
588
- __wbg_prototypesetcall_de8e0d9553586985: function(arg0, arg1, arg2) {
588
+ __wbg_prototypesetcall_ae9f5e7459250748: function(arg0, arg1, arg2) {
589
589
  Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);
590
590
  },
591
591
  __wbg_stack_3b0d974bbf31e44f: function(arg0, arg1) {
@@ -595,21 +595,21 @@ function __wbg_get_imports() {
595
595
  getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
596
596
  getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
597
597
  },
598
- __wbg_value_1e2369fab29b420e: function(arg0) {
598
+ __wbg_value_c227f843d21da141: function(arg0) {
599
599
  const ret = arg0.value;
600
600
  return ret;
601
601
  },
602
- __wbindgen_cast_0000000000000001: function(arg0, arg1) {
602
+ __wbindgen_generic_0000000000000001: function(arg0, arg1) {
603
603
  // Cast intrinsic for `Ref(Slice(F64)) -> NamedExternref("Float64Array")`.
604
604
  const ret = getArrayF64FromWasm0(arg0, arg1);
605
605
  return ret;
606
606
  },
607
- __wbindgen_cast_0000000000000002: function(arg0, arg1) {
607
+ __wbindgen_generic_0000000000000002: function(arg0, arg1) {
608
608
  // Cast intrinsic for `Ref(String) -> Externref`.
609
609
  const ret = getStringFromWasm0(arg0, arg1);
610
610
  return ret;
611
611
  },
612
- __wbindgen_cast_0000000000000003: function(arg0) {
612
+ __wbindgen_generic_0000000000000003: function(arg0) {
613
613
  // Cast intrinsic for `U64 -> Externref`.
614
614
  const ret = BigInt.asUintN(64, arg0);
615
615
  return ret;
Binary file
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "Amir Valizadeh <thisisamirv@gmail.com>"
6
6
  ],
7
7
  "description": "High-performance LOWESS (Locally Weighted Scatterplot Smoothing)",
8
- "version": "3.2.1",
8
+ "version": "4.0.0",
9
9
  "license": "MIT OR Apache-2.0",
10
10
  "repository": {
11
11
  "type": "git",