import * as env from 'env';

  var bufferView;

  var scratchBuffer = new ArrayBuffer(16);
  var i32ScratchView = new Int32Array(scratchBuffer);
  var f32ScratchView = new Float32Array(scratchBuffer);
  var f64ScratchView = new Float64Array(scratchBuffer);
  
  function wasm2js_scratch_load_i32(index) {
    return i32ScratchView[index];
  }
      
  function wasm2js_scratch_store_i32(index, value) {
    i32ScratchView[index] = value;
  }
      
  function wasm2js_scratch_load_f64() {
    return f64ScratchView[0];
  }
      
  function wasm2js_scratch_store_f64(value) {
    f64ScratchView[0] = value;
  }
      
  function wasm2js_scratch_load_f32() {
    return f32ScratchView[2];
  }
      
function asmFunc(imports) {
 var buffer = new ArrayBuffer(65536);
 var HEAP8 = new Int8Array(buffer);
 var HEAP16 = new Int16Array(buffer);
 var HEAP32 = new Int32Array(buffer);
 var HEAPU8 = new Uint8Array(buffer);
 var HEAPU16 = new Uint16Array(buffer);
 var HEAPU32 = new Uint32Array(buffer);
 var HEAPF32 = new Float32Array(buffer);
 var HEAPF64 = new Float64Array(buffer);
 var Math_imul = Math.imul;
 var Math_fround = Math.fround;
 var Math_abs = Math.abs;
 var Math_clz32 = Math.clz32;
 var Math_min = Math.min;
 var Math_max = Math.max;
 var Math_floor = Math.floor;
 var Math_ceil = Math.ceil;
 var Math_trunc = Math.trunc;
 var Math_sqrt = Math.sqrt;
 var nan = NaN;
 var infinity = Infinity;
 var env = imports.env;
 var setTempRet0 = env.setTempRet0;
 var i64toi32_i32$HIGH_BITS = 0;
 function $0() {
  return HEAPU8[0] | HEAPU8[1] << 8 | (HEAPU8[2] << 16 | HEAPU8[3] << 24);
 }
 
 function $2() {
  return Math_fround((wasm2js_scratch_store_i32(2, HEAPU8[0] | HEAPU8[1] << 8 | (HEAPU8[2] << 16 | HEAPU8[3] << 24)), wasm2js_scratch_load_f32()));
 }
 
 function $3() {
  var $0_1 = 0;
  $0_1 = HEAPU8[4] | HEAPU8[5] << 8 | (HEAPU8[6] << 16 | HEAPU8[7] << 24);
  wasm2js_scratch_store_i32(0, HEAPU8[0] | HEAPU8[1] << 8 | (HEAPU8[2] << 16 | HEAPU8[3] << 24));
  wasm2js_scratch_store_i32(1, $0_1 | 0);
  return +wasm2js_scratch_load_f64();
 }
 
 function $4() {
  HEAP8[0] = 0;
  HEAP8[1] = 0;
  HEAP8[2] = 0;
  HEAP8[3] = 0;
 }
 
 function $5() {
  HEAP8[0] = 0;
  HEAP8[1] = 0;
  HEAP8[2] = 0;
  HEAP8[3] = 0;
  HEAP8[4] = 0;
  HEAP8[5] = 0;
  HEAP8[6] = 0;
  HEAP8[7] = 0;
 }
 
 function $7() {
  var $0_1 = 0, $1 = 0;
  wasm2js_scratch_store_f64(0.0);
  $0_1 = wasm2js_scratch_load_i32(1) | 0;
  $1 = wasm2js_scratch_load_i32(0) | 0;
  HEAP8[0] = $1;
  HEAP8[1] = $1 >>> 8;
  HEAP8[2] = $1 >>> 16;
  HEAP8[3] = $1 >>> 24;
  HEAP8[4] = $0_1;
  HEAP8[5] = $0_1 >>> 8;
  HEAP8[6] = $0_1 >>> 16;
  HEAP8[7] = $0_1 >>> 24;
 }
 
 function legalstub$1() {
  var $0_1 = 0;
  i64toi32_i32$HIGH_BITS = HEAPU8[4] | HEAPU8[5] << 8 | (HEAPU8[6] << 16 | HEAPU8[7] << 24);
  $0_1 = HEAPU8[0] | HEAPU8[1] << 8 | (HEAPU8[2] << 16 | HEAPU8[3] << 24);
  setTempRet0(i64toi32_i32$HIGH_BITS | 0);
  return $0_1;
 }
 
 bufferView = HEAPU8;
 function __wasm_memory_size() {
  return buffer.byteLength / 65536 | 0;
 }
 
 return {
  "i32_load": $0, 
  "i64_load": legalstub$1, 
  "f32_load": $2, 
  "f64_load": $3, 
  "i32_store": $4, 
  "i64_store": $5, 
  "f32_store": $4, 
  "f64_store": $7
 };
}

var retasmFunc = asmFunc({
  "env": env,
});
export var i32_load = retasmFunc.i32_load;
export var i64_load = retasmFunc.i64_load;
export var f32_load = retasmFunc.f32_load;
export var f64_load = retasmFunc.f64_load;
export var i32_store = retasmFunc.i32_store;
export var i64_store = retasmFunc.i64_store;
export var f32_store = retasmFunc.f32_store;
export var f64_store = retasmFunc.f64_store;
