{"ScriptPreparationCode":"\u0027use strict\u0027;\r\n\r\n// do not edit .js files directly - edit src/index.jst\r\n\r\n\r\n var envHasBigInt64Array = typeof BigInt64Array !== \u0027undefined\u0027;\r\n\r\n\r\nwindow.fdeq = function equal(a, b) {\r\n if (a === b) return true;\r\n\r\n if (a \u0026\u0026 b \u0026\u0026 typeof a == \u0027object\u0027 \u0026\u0026 typeof b == \u0027object\u0027) {\r\n if (a.constructor !== b.constructor) return false;\r\n\r\n var length, i, keys;\r\n if (Array.isArray(a)) {\r\n length = a.length;\r\n if (length != b.length) return false;\r\n for (i = length; i-- !== 0;)\r\n if (!equal(a[i], b[i])) return false;\r\n return true;\r\n }\r\n\r\n\r\n if ((a instanceof Map) \u0026\u0026 (b instanceof Map)) {\r\n if (a.size !== b.size) return false;\r\n for (i of a.entries())\r\n if (!b.has(i[0])) return false;\r\n for (i of a.entries())\r\n if (!equal(i[1], b.get(i[0]))) return false;\r\n return true;\r\n }\r\n\r\n if ((a instanceof Set) \u0026\u0026 (b instanceof Set)) {\r\n if (a.size !== b.size) return false;\r\n for (i of a.entries())\r\n if (!b.has(i[0])) return false;\r\n return true;\r\n }\r\n\r\n if (ArrayBuffer.isView(a) \u0026\u0026 ArrayBuffer.isView(b)) {\r\n length = a.length;\r\n if (length != b.length) return false;\r\n for (i = length; i-- !== 0;)\r\n if (a[i] !== b[i]) return false;\r\n return true;\r\n }\r\n\r\n\r\n if (a.constructor === RegExp) return a.source === b.source \u0026\u0026 a.flags === b.flags;\r\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\r\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\r\n\r\n keys = Object.keys(a);\r\n length = keys.length;\r\n if (length !== Object.keys(b).length) return false;\r\n\r\n for (i = length; i-- !== 0;)\r\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\r\n\r\n for (i = length; i-- !== 0;) {\r\n var key = keys[i];\r\n\r\n if (!equal(a[key], b[key])) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // true if both NaN, false otherwise\r\n return a!==a \u0026\u0026 b!==b;\r\n};\r\n\r\nwindow.foo = Array.from({length: 4000}, () =\u003E ([Math.random() * 40, Math.random() * 40]));\r\nwindow.foo2 = JSON.parse(JSON.stringify(window.foo.slice()));\r\nwindow.fox = JSON.parse(JSON.stringify(window.foo.slice(0, 3000))).concat(Array.from({length: 1000}, () =\u003E ([Math.random() * 40, Math.random() * 40])));\r\nwindow.bar = Array.from({length: 4000}, () =\u003E ([Math.random() * 40, Math.random() * 40]));","TestCases":[{"Name":"fast deep equals same","Code":"fdeq(window.foo, window.foo2);","IsDeferred":false},{"Name":"fast deep equals similar","Code":"fdeq(window.foo, window.fox);","IsDeferred":false},{"Name":"fast deep equals different","Code":"fdeq(window.foo, window.bar);","IsDeferred":false},{"Name":"stringify same","Code":"JSON.stringify(window.foo) === JSON.stringify(window.foo2)","IsDeferred":false},{"Name":"stringify similar","Code":"JSON.stringify(window.foo) === JSON.stringify(window.fox)","IsDeferred":false},{"Name":"stringify different","Code":"JSON.stringify(window.foo) === JSON.stringify(window.bar)","IsDeferred":false}]}