{"_id":"shaku","_rev":"39-074bdb52af51b3618e001025960014ca","name":"shaku","dist-tags":{"latest":"2.2.4"},"versions":{"1.0.0":{"name":"shaku","version":"1.0.0","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"ff0c64ca764b39b92499ce3df0584b8d9e10393a","_id":"shaku@1.0.0","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-nrLAW8NS4ackzBkzHhVo3qcJqv8lSAhCc8nCY6UK1voaSFygU7QS4dFG3Rs6z41ROQ2dQpMCfJ/K+YokWGKeIA==","shasum":"70d923e76b9f20047d31dbc76bb0c921f20158eb","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.0.0.tgz","fileCount":172,"unpackedSize":10707874,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh4IbOCRA9TVsSAnZWagAABiYP/1P/5dkSOOe2E2YNu6IM\nBGpnEhv2yqQP2cmtWNpjH+yHHbZ0my/f3ic+KvZp5i9pPcvfrvK6wo8PzUxG\nQ54WCGuwxn75PGL6/z0bbcdIOZMDHAxqWSZ09ryQ8B5yTA5ZmkRelBC90ctA\nZRIiwymMZEcEFM/oYTI5l1Guglu31mlZj0g4jiCZJmBrNlKG2tamAksJWH8D\nQynAURGnm1LpIkeTDc1FPp35c//biChEn8onOTKkoAV7e0G0wzTEx/mNx1Ek\n1oPjhpil0UxFD8+uOacfWuD7AwoPS/wzQBOayZ+ojE0VEbj5NtJilFN6XFTA\nWXcx/jVce6zy3/DTT2/v4JYfXTDwDKuLnIOydaJScgyVViunRGbbhlCow/Eo\njYNl/REAWapC5mXJ6ATCgo5is/K7feQpxR5o8SpwX64o4yrgL4CmZpY42bmQ\nTuHXt3CXFRergOzxmF55PxfJxJ/KMkznuIqLxtPnuXe7cPslNDpV0hX6MLKC\nZGg6yTIMaweQUz+qMuVYXo5kknciqrfmK6mgYiom8h/Qfplp2XUl2aZRzRCF\n/cv57x11DVfJd5FweL7+h5naRXyn8I9C7Ie72sUdmeMJH4jaG76Xg0I/9K9R\n1ChCPgDX1Eqx9k85cZLiQ8mlaNb1x0PgFkL3sGFoeMzhAGqI2VjlZP04jw5l\nmKWo\r\n=Z8cq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF4SsghBkg01f/3Apn7uNHMudhdcUUYUsZezVdi5/B0RAiBK+lqMN1yrd/2UwRHdfiBkSSiGlegK12ZIoQ0yts5juw=="}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.0.0_1642104526374_0.6958950675809619"},"_hasShrinkwrap":false},"1.0.1":{"name":"shaku","version":"1.0.1","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"7c0dd9e24378e3dbe744429a3c8febdc18afc320","_id":"shaku@1.0.1","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-10mUMKWwP8LV6cXQ06j7yy5ro84MwwxmczwrEFKXkKllT2D0K6oxX3ShHsIgdtjio1cPa1wX/PFBlngpbZTQfg==","shasum":"ef42ea13517f1b01d9ad018ce2d517a370a78623","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.0.1.tgz","fileCount":174,"unpackedSize":11041564,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh4IrACRA9TVsSAnZWagAApgAP/jMRlqeoRX7DWQk/ofC/\nJoVQ3TvTVcZHbs4YhzM/KHTzTWEaCw9gMnCAvAAv7rLuJTfgjWtk7sSRvIOh\nAdjJKUaYGee9m8f0sKaLIkMdI93VoFwZKv/JCfdsdXs7h58/IdilvqAsYCZS\nzEWNVFhvQPYeTA9bDFl1I4A7un0s8YS2bTI/sK+ZOPVy5lmMLQCMywg/hWl+\nc3zPCeIkeDkTWAvdoLp4bbUx3lZAv1BC6E1zy2gzESijedUzPmdeSv039tRY\nDZL/hGV7DjGaI/RjyMafY9gZ0yDqEdtUuzFwuCeUh0BQp3VQ1/b5NSiVFSAz\nPsxyuPR339AoTUKRitooFi6i6JUkbUCwlBG8oRlTW1+fBDKtXY/oT0+8kBir\n8B3qA6/ZeqIy6mz60wiRQwhfkO5ZaUguZosli2vrT2GznSDKk6ym/oephpCv\n75eltgH1UxqtNFh5xxBZiZY5D0obgqk+r6RBfRAZO5CFRDc1yAcTfQA8oRgv\ni17w4FLiO8uRpOOkGquXFUG+HQN1JYKxaPFe3wAbsHMPBFx3Xy+SvNnoF0Sa\nyirKlWfdDgzm+MbTFx/y48iF8OuJoYTNwCWCK8RF9IfPI1Nz1Ng47YT8s9rV\nV9EhOTsdPH7lVL6Zae4BDnjZkgKzYEVBGpppl9nCGWMeyymhM1ic9nFV+aDX\nGGJA\r\n=LIwk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJ+LPYYgoiY152Cgx9Sb/RACkGKxWKkd+HXVowMvEv0wIhAOUf63oRuTvyScan8KY0DofggNkZVwPStAIHY+1V++Yz"}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.0.1_1642105535778_0.6996403181651718"},"_hasShrinkwrap":false},"1.1.0":{"name":"shaku","version":"1.1.0","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"a6686e80e122e04e74d48a38c88e08999f091e58","_id":"shaku@1.1.0","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-JPNpGGC1kYqUX+jlR0b9sccwzMLEZrwLgqOBS2ZykOO5bETrJes7vBE8uWPfYZnFoiSZhl2Qz3yzewGBwI+pjA==","shasum":"839c6cad700ce7c96c575720702d12529b70d322","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.1.0.tgz","fileCount":174,"unpackedSize":11064202,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh4tbCCRA9TVsSAnZWagAAcWkQAJVEoo8O8qdpvhbO3Vkj\nVEL5TtbXOg0Z7gKssEnracdUN50UGAdhtzu85abxP7vQCV1F0yyFPlkZjeYg\nTuebUKMudzuaZm8+g6AANbc5FtqRUkdRnrUwkPz3pNfDyDxQja0vXnDNGwsr\njDuwKklmdb22wn5svc60tQKjGtlT17dIO3kC2gKQl4H+68eZabxqR9/eAqNQ\n3ImQg4AWSDN1f5kfIlcY8M8SRjvmaIRyK7/E2T8CnetBlOE9I1w2mxq0G1aq\nzEThVWFQH+igUZTCWsfBB1tSH5/ft1WythT0ibqn1/MtxZKKlsFf7M14gLxm\nu20st1zXIA0DaW6gEjXieCvUxEF8sRTLF23V61Pq97z6wCgmvLF+6xgv4Oxl\n593UwqWdw5Hw5v+q7LS3KPavuCSxdczQiYCmfbpf1FuttoLtthKVuYvoXTIw\nQENHtfQV2tzRgafvpW/AJMly9QEHBE827AI5ngO1dceSgwdfBIvgwyql5OcX\nMGD4hFV5bncosk5hxZzJF85h2c99uAFzfovWYAShlj262lnG2YAoXKXe1FcZ\noocIwPpLDSkJvlJjTzMi1m2kWquh8u14/V/GgsuS0J481Y341YI9WVtJcQSc\n+8XHNv2urJ1khZ2xs48JKm4376eTpwh8UNF4vkCQztqZK86DFe1Q8Se0Hp5O\nyOOc\r\n=wIYp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDd0kgNWGwm3ri3w+Fr+0mHPAEYdDLP4EtD3qVFqssQpQIhAPeprIuPCoc9vg29b9r2eCdIPSdFVEBaYGPa+G+U/cU8"}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.1.0_1642256066186_0.02964630227179632"},"_hasShrinkwrap":false},"1.2.0":{"name":"shaku","version":"1.2.0","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"6635e20c04338c0a19ebb1a8a7a6dc6b99981c60","_id":"shaku@1.2.0","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-+bsycV3Y8RQ9R2+K5h5jUyayrRpO1OsSGJ8LBvm52j3j2+IryaXm9ZLHLdg/OsDFVOniqYvGB9UwGGxvJnQGQA==","shasum":"d781af82a8762254cffe634d745bb3128a04957f","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.2.0.tgz","fileCount":196,"unpackedSize":11358073,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh5zwlCRA9TVsSAnZWagAAt9sP/AqK8WLAlpk8rUMnIL13\nJtjTKtOQexEg0dOGCg8ufVvwEz4WA8bVwc1CRCIxLJ1yM+iPBB8YQWr3BZvV\nunJWU+iDZ+Y8Ggui1cTVODeiorzfQS44mMHmUr9lzesC6TzQ3wkbGTXvBrfl\nsP+J8eyDtyY22ltS/Rt8SmoA3LryBUQlXIRhvNofoGiH6RRHnEo8yK6gsWsp\nnUvGBDUSdrYeOzSEf1/gQQ5rmEUquOHQlEMoRqHB9x3sopVsgP6qv4HIkCmC\nI7w/NnoumPLZGgXZL5NQrrTWI0SoovlUMEYKo2QsuvL0YYPEuC8lEncDDhEE\nl3i2+olXQCRVX6nsyv+P33K5Nt5xue+DQcFygBRsbDzTjpE2Idwagxcq/SIO\noMe3O2Pf9wVZo44oEGc8DGPdJcyIh5WDFg8n20jLAJ6fzphyUJRy8stN1NM9\n+gOED12vVMLaEAj70SP5a+UJI/H2sjUaSnTPRuWxOmF/jH5g2igSolBEIZJw\nI8gy6PEmy8cMxFMDwL05yDyk/BeLiFPUtjuq/w5/lGXzB6qftjSZQbDX4lox\nlym27i9llurjhUoitLbweg3m1OmBtfj2oIU/W6Rho8nw/a7BEnWG4gl2Se2J\n6HPTP5znqP7bTULcQIoYaSrMKeLUVXn/0FNP8xFifiznaDGubXgYBQeiOMYi\nwReJ\r\n=YrnW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC35My4MspKrQT3sGXb9tgDF5YneALu5uD6ZSF0bxZPeQIhAJZo+dDnCy1za1S3cIPZ2gF6NudL2s/pAYNwtNsrf6eG"}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.2.0_1642544164625_0.6562283591809079"},"_hasShrinkwrap":false},"1.3.0":{"name":"shaku","version":"1.3.0","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"2dac651d762039c551d27f2282e63a0ca98e1d66","_id":"shaku@1.3.0","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-s4grt8jJRIUMK2xp+s+TXOIbiW/f8y4gD71UqZ5KGxY2ShPIe4YiY8y1YIJ4UCrtWJe/8sLd5gg8TAhJ058Q+A==","shasum":"9752e220f7d3ed456f50daf805d3ae56832b4c0f","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.3.0.tgz","fileCount":197,"unpackedSize":11402211,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh6GvMCRA9TVsSAnZWagAAZAMQAIqNtm8+hOsHtv/Url7f\nv6HiXmk1nK7Jccp/+FGEvHr+hKogHz5GsXLafnReZJ7pggBJb0y97e1iKsuY\nhkOHiG5oHfijiDr5T2cNFqk1ee3dlKNdCY/kck4Egziv7wf3AUt91aVD5Z00\n+V+6Wu2oLNK5/5SdhyC79bTw8lO4yaDfEokNS2e/RHB+i1XKWs3Lob0Rtne9\nYlwBit/pGFQAQLCZLsoYEyb8QNabtU7X1rdub2gbHTP3g6qf8BHGUAvJKcfE\nM+cWxWVEeZCvQLC539yKXp37cA7mVcBhRJfZftuwTG6j1dCa8WBi8KXHInpb\nzbchf4XKIB1hC95ncROH06jnGDRtprJH+m0ozBr6OYVMOPn0he9qM7ItSRMY\nJvkhC8Op3cMsTgjgxv0m7dtBd+e/6waVajv5NCXVD92geyY0oAV825kuRois\nxrCvtXTgDBpmc1Zy4/WPv7nD7dnTWDy1BclGJlFHpyusHvP0uxZ4Y0R0OxUi\ndlKTsPy2DFQZtoHCM5RPIaerVgoK14Q1jPvg76lBYjJJASC76dQwQ43ZkSbc\nx0M1/hj/2zzb9xbp6teYzCj3S7pcmmMkl4yL/0TzESaJyskAMB5jwcGHYQO6\nDmCSuToTQAfCX59um/dXe1xIkVCxKxi3ztwTHPcF0FB48fKG+suZfwrBF82c\nxYp8\r\n=2yvD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBYx13V0F23GIRcsO+Bf6DseHKiFi6YiCVwiN4nw0fGIAiEAvv5gyPDVGgw7c99lUsEMz+kZjzMxBCdOZAeEao2XO20="}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.3.0_1642621900480_0.9167501616425591"},"_hasShrinkwrap":false},"1.3.1":{"name":"shaku","version":"1.3.1","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"fe595dcc39d8f4f7df0ca16075765415dfc30c86","_id":"shaku@1.3.1","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-ifOyphR9CHdwmP1cmIN7jeBFO9JoHLoB76jXcD5P1noThUBEbOSvzNxXOd9AVrBW1DLXSR3a80a6KUzNUfHtwg==","shasum":"439b0cfaff020a53cec218f6a3f4b323d206939a","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.3.1.tgz","fileCount":198,"unpackedSize":11452360,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh6dn/CRA9TVsSAnZWagAAM1cQAICwnPSmWfkGtP93JUkf\nBTfyJKWU4mgmKnGkEQSA9FF0Yg5/oKqo0liK7iWMRK/raXPzp+iswS9Vn+sM\n59yWlPmvrLf6kmCwRzYuvW5d/9E3A1t3gJk4Ggn+bgFLDfFWj9iAFLI2PaNG\nqWCyyTAgS9Fx7+WI9YhkCBORftOlc1VD+7jrCbwrhem4wxi1SBSraewk+/lm\nQyFBplZkh4XU/TcOJgGTjPczWg9N0WzB/PFjosrjBB8gIx5LvVOEqAeKlcm9\nzJvjPRAPymGTJeDlF3jzpVQndgxd6DjvZ3wBJPbAcXyDpTKgUomT75c0Swgc\nIF/7ddON6zbIljLLFg8d16X9v0MBX6Lt+eOR0QOT697IEqYG6YLEvKzBubBh\n/oAQWuFuyg+rob/OQje6DOiFODTXOM7SMI6wiBjz7EvOaBFOjgwjD1Z7xCVH\ntUEh9RRtCsWHV7/PttycJu8XlQLsvP8GIszXDJ3sxnkure3jWIoLgwx448sT\nrWgIWKRxXbF2Ziyq1kwuU+4MYXbkqRKG1uzfdSQRcugW/j/No5a3kwFmJOaI\nl3HU6VdTAGVbXirdiPxJgv3ZxhIZZG0UlBdp32hcZ7qQq3GNvSMItVzk6KbN\n18Ye/IgaudUekQmI+WJ/E/DEBkCclHQEb8sfHUvVrqJEblFgFAoaUmdAbMgq\nLfYh\r\n=/yZX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQChqES8cK4ma4ByaoyI3EAZAAn3FdENNP/Gz0yWWPLfpAIhAOelRog5tzyRtEV2tNwwMPQkotSHtvIEctKXUb7vfQdo"}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.3.1_1642715646658_0.9810630812336418"},"_hasShrinkwrap":false},"1.3.2":{"name":"shaku","version":"1.3.2","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"d94570afe7e92cba25c674df7edcab9e59cf03c1","_id":"shaku@1.3.2","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-OM4MkYcq3c7exrKcARpsyOt4Buh7VWppr9hC2SAY56fVpbilPeXMTMiNJBPvujKwnf/LyfWqhn584lqCgNmuRw==","shasum":"9412eae3e47e8390b6b2743550dac35c5d94af6f","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.3.2.tgz","fileCount":206,"unpackedSize":11539517,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh6wWZCRA9TVsSAnZWagAApBIP/01GBHy1bSkEIoOn0xOf\neOPGHbTe822ymX2sySTyV+bpPb/YAtMOS6CTTJVweSzTyj7uqI4bkVbw7aws\nAhXagYXgEf3r7xr+sxxflZSDMwCY3qzZMejuGj/AbjSomOmz0Kz6yaRIOjrn\nJNmLDG3smRIjp/uUn8Ny4Xd8+Jmf8xtUZPMelythORfNrdAPxbufAOprQj3r\n977euHwW4iqrvHnu7xbdgupLTFBAoE2+kLU2dTu2c7bE6h4Gd99REJ1gy0t+\ncSskSRsi7Zm/Im3X5yqoWQWsHx3klJ52obI/8apI5KXr+ca7UiqRsnn+JUHo\nasRJM/dvnVNhFaYnMPqgF898OLEVWVsr3cGddPuJF8Pw/fabR88rRhNkc4F+\nmffSA1rQy2gsYrxn1GV1HS2kFCYV+UTB2G+XZ0T8zYzqV9NTO2zeurWn7n/Z\nirO2aJuZAg5W8h3C3f3BuHFBSJ/+6zcsDwDXhhs3rOLEO84DWUsqfmz2oUD2\nkhEOE3Lzjts9CCpxqjKXlc4Uimzw2Qubi0yjFycxE1Cb+r7/kgGgWgZXTX9t\nwInB42VIb9j0SC17x+Amt5veDaMglJhx28UyrPlRKFhrwPJtWeM9xrHgxQdy\nRZiei4iFTtwBtWJ0wWdsz8VLhQABrPAYtr1/PzHv4Kw5EiVOACqwWkWzkfn6\nr4Ed\r\n=qN02\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCYsL8kdwFUWVg4LFUWXcVHizoPrIXNMYbvzEraHWPJygIhAKwG14Hif+/s9wmgUVYVKtecSkrvn+dx2N8x5WDIdiLu"}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.3.2_1642792344613_0.03172955784963616"},"_hasShrinkwrap":false},"1.4.0":{"name":"shaku","version":"1.4.0","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"2c53aa62285e91100cf2a0239868a9a25e38d4f9","_id":"shaku@1.4.0","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-cOROFFrx1qLNYTa2K+1528UnO4LmGboXrBidhJPMqr62q+SuyqycNyXSTSzYnlkmHevwK9i051KNjkxt2EYdQQ==","shasum":"b8bdb04012f5239f38b30164dc57805332f9b29c","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.4.0.tgz","fileCount":209,"unpackedSize":11620463,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh7bzpCRA9TVsSAnZWagAAROYP/384wVfymkhoqt8fupgL\nw3Rr2VYEtAkEGz9KHgbqiZaYORohyf4QRxS5QmPrLqrreKUe3ieR1Dhzx8T7\nsBUrXOPJGKqDWR6gkQq0SklxM9ZttsQQE6GifmHccCBkCBBI5LAPmbG/Q/ln\n7AcrA7ijsJzrgcMA2thO2CpsyZzFAF/6XslSnh+TJycXqQPKLeXAtCaWPQmB\nMV4uFGV9jN4/+BorKTYTly5isoyj/SXGVbKUty3DY/uPYQjgMVUqib+3SbsY\nCAdFU1lu/2oQs85nYfgpOXbh9S/2hPONbO3uwPbYTmmmVNRWIWiPGH5CvAtg\no2OPfu5FyCyMdjF7L3vqKhvllFBzMRWeM+XUQdEMEVgevOKOdlpIPXqil5Qd\nqsiRNENmHd9eiE6cpFonDW8GMS3ni36RlIfct2EKHSf0sXT9VZoQE6IAHByN\nm0+fHhA8PT2hIoOKb/nfrhCBR/KKliS7wllU+DQUfMhBvdcOL31IjHSACQpc\nm+PbHuLmsWk0lFDe+F0UdVDSi4u9GYqaeK/H9ZHvICYgscECPV/cu1chaK8Y\nBVl853kT91wz5oW7gPboXCdTRHKz+AsX+onCSAkBt5zB+PjMS+iynV2ZlS9k\nBr7vP23Et1dynAPvfn6yQszDggYoPUDSOIQ20+TvzlsSUnYJOlTjnpgfVBwc\nC2B8\r\n=nz1W\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDA7zTmRXP5OvDsUPrLEfwgSFcOQcPrpe8Pl6gMnc3U8gIgDJ+MBEZ4VZLqr0TA/lJyJ0bDcPcbOkK6v6ZnNYA8KLo="}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.4.0_1642970345088_0.737668807154332"},"_hasShrinkwrap":false},"1.4.1":{"name":"shaku","version":"1.4.1","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"2c53aa62285e91100cf2a0239868a9a25e38d4f9","_id":"shaku@1.4.1","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-2EPWquKy550Q8V1pZzRNMsubL5FwmtFyE7Ly377uk74P3jJB4QBHO3zR1oRfhOoc6rrLIZUfkATV17L9sWkYng==","shasum":"1311b1bbb72b543149b28b6698fe34a55e97cc95","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.4.1.tgz","fileCount":209,"unpackedSize":11618924,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh7b5gCRA9TVsSAnZWagAA0N4P/RBxQJ2DFkbiX4J0ZukR\n5RzCU763nA+rG4u63AwlItwH2dSOEck195jiyY3HzLFpeT6pGVCMVOaiQboE\nngWwZJJc6KOutJP3w1SSWtka/QAZ2dw80WKIjaKHFsCiN3h8t7vgWD39vMyV\nuKH2yGYnLuFOy2fqiw4gFxHnwwEPjcWB3MM5o0M1MqUWS70gVRT5WAteFPN4\nbjGaMoVjEd7QC1Q2LtEHDWEm5qWZGjM0KmAOWBdKZuY84F1/3HH+9t3nU4xG\n5lMeSSCyf5dEsxteyYU7UK53tPcOsZqpyVHrWo0KlBL+tTc6wrTteTZluNDt\nk8iypESA44gZJdDFMt9ACFOXvn7T8dPLQO7MDLWy0L6p3ZFjbdNL5f4xldEl\nyBMt5RcRmw5uBVlQ1HA6WlSgreGUcncWuDxL2jxIhDyfX0Hd8fpM62h5DvEr\nOc8NEVo4c3cVM4gVx7Y1mzSy7J/OPCHsMVSw4fEw7Q1sWQwUQ0ZSCFsd+mQw\ndjhnAqMDQJZhh3bqDHli2QHNSw1+MWHPdyZkyf/jeRXHPdgzWVHZNdnmJSSM\norOH+MjQM9+OmgGOURYJuHK3tQhSGmnjp98oqWUWuBfqDdAfJojyR0dUTBL4\n9I5H6SB/zhgC18m2SIj9NhtN1T4jY4EM8gMR+yCM0HDyrkBO5W0KVoguuqk7\n26Gy\r\n=pNZG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAuOglqDxfmOtwXyW6sYGozJrUN9UXI2EDUCjhCKK0K8AiEAo/RvF5EwU8nSrWq+J6vxrUGkbKhV7wuAvoqdPTT2a0Y="}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.4.1_1642970719730_0.9113981621238811"},"_hasShrinkwrap":false},"1.4.2":{"name":"shaku","version":"1.4.2","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"3bb23e3ff8912a9855b1dcf0ba632d2f6d13e2b3","_id":"shaku@1.4.2","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-W6ZdxusI3fWvwWzNSaBghxD1/hnl+nrhAnQTFgc9sZpsCI4gMgur9RcLSK9LqFHB/Xp8oEeTZ1175Od8i+xBVQ==","shasum":"e4094229947ab476df25dd5451db41916daa9bc6","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.4.2.tgz","fileCount":212,"unpackedSize":11665745,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiDqfHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrzHA/9G37hfDbDree443WkGP5ORdDHFzdNu7eHzm8JTIqULNb1zrhT\r\nZTwM3fohNcDWiW3TjyzBC0o8QIG4fWSLy0NKHikfglYw6bnbwnSzeHCP2KHE\r\nRT2pOkO+qymMnaK2X/aH4seqxqLM1xLvEA5e7W4kuCdA50aKLyh/03wjszYi\r\nFY+VdTG07HRTaNaEeD9Dakgue+7cAoZ1nYGn5NklfbSKRE4JS3X65YJCy2DT\r\nhnGGlOuDYMzggY3rHm3hBlW1OjESwidsKPUhUWPrUKgzloWCcp9H8L+GSWXx\r\nxOAg0iOCG7ZLG+xhe85GDnlLj1d+8YG7jrHuR5pJXnoaJBqYOTbDVmBBtud1\r\nxwJw2Cvx1Gq4ntrpvcS58rlXV6+VurMN/V4M+cpEXzXw9DQinqhWrqfrV1g7\r\ns7M7DLUArvJdMj7wn55tcM0H1LJqKvjE32j6/selxlvTfP1KHenYr3ygIu4T\r\n4je/kf7Ivk2qrrS3nLkziE+4k69ECm5wRptJ1zUdia0yVlNoWBBzI2jWVwOv\r\nqiFTb8XGQGgDONKtS39FiqUPIPIzfgDa/rtgnpEauko5Z/HOZ8aKADqZLRQL\r\nuvOOh+xcP8BnixTBYM+5kVMsKsKG0w/RwgEWs/8GKh6JKc10cGdm3J2bmkUW\r\nSb8ili4DvmRHPQ3NKrX/yH5XZ1iAlWhrns0=\r\n=4m6Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICH/Qosqn1INpg+l7xRhGHgWf57opwCSAkwo14SJmPnJAiAWCXQky4ZrojG/AYLeAuuQMYObaqfO8Zt+G7TP8GFRhg=="}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.4.2_1645127623002_0.4589737361812405"},"_hasShrinkwrap":false},"1.4.3":{"name":"shaku","version":"1.4.3","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"ee5f6b03c910f907c7a23be6b0a7e32d931807e8","_id":"shaku@1.4.3","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-pBqs6/FOd2MbM2NEGYjdnYE1lcX0vGBP+bpWZ1KFI1uqvVMROlzkF8jXL1fTkQimYRjSSTpTpql9mXiPfeNpag==","shasum":"9ca07d3f8de85e1cf7dbead0b4d2e80c04fe18dc","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.4.3.tgz","fileCount":215,"unpackedSize":11739832,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiG/KwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmozqQ/+OUMtm1NxCCCZ5+dxXMEx/FiOfclzHjbRDCq+Ofyzsm+IUVq+\r\nRdjr0q77vZXxNbkMJvU/Ph6vJKWpgSDbsJYnRl6xvyq3W87SHXsvD7vLskgU\r\nbPu3QQVDgLs+pfk/qfbs4Fhlx+7LSgrIY2ZK3mi1Q+mnYGqWRv6wzGgqbC3D\r\nolMPFUGaQfxMrEfV7qZeTrpVyRwhe4TSpxveVqpvGjyhuZRg7UQbfV7AJ3nm\r\nxARZ8hjAiS31WdemDCoKVBYDdWkoqKxC8G53YdpMMnYQg6nR6oY7xVH5jIhP\r\ntKog5uIcdBV229oLQCaChg5mF2NOe9xT+Xc0FBwDVUp3HxszehKxmc1SvCWC\r\nUduW9AIsi9k5kmSpahtbI6o0FBMDhAcY+y9RohwJR+ueepARxaqkq2CDETx7\r\n2IQJb95bIeJw6a9caJndIDAf8+Qh+UPgTaX79mHaec07R03CpGuOzQH4CA90\r\n4RAHs8OtnU5fFcMR+JQF7qyNnfMOVph1o7zfdLvLbGNKbCBek+cCWQX7zsTh\r\nTJjNuTriJlI/3RTtew9V0pSwxcXOeMWQiUxt/XJpRtN45XJLp+vsXuDEXi2m\r\n8+JvDCw55oXC2fGNlLpQhbtPMyC7ckdfF/Mu4kL1vQNep5YN1qwpxHnN/bwY\r\njNYBlZV4fsW0un6aE/pSBdf1hfrnnhRpV2U=\r\n=48sO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCRorflJYLrh/VfJztCeYUnjJDfyXit2uAJI4NxlgJehgIgXcFpLPBxlyWXROO89FQmuJmwapO/ku6Z+k+JvJ8ltQw="}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.4.3_1645998768006_0.1398248728438507"},"_hasShrinkwrap":false},"1.4.4":{"name":"shaku","version":"1.4.4","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"b6fc56bd70866527ae19acd733bb30c04caa95a0","_id":"shaku@1.4.4","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-Rh5spz1wSVZB2Jn0jp+sFLjbD+6yrOfqVjJHjTAekJrABiT5nOmL2iLRbAN221voZGyMnx6KG5OaHx5aKs3HlA==","shasum":"4325ad341590132ac44ed33a8d9b348464baab36","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.4.4.tgz","fileCount":217,"unpackedSize":11760888,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiH+RVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmorog/9G9dSGCqE3h5wWHAadKK7zS5yudzlZCfGrliOM6S3xBLZBp25\r\neG3qvvcftvGwzPG/SvEojCZdTVe0Zn+NFMeQrkbEMvy7lmYmMFcX0GtOg1Us\r\navv0dZaKIwwQtf1yrhR7oEePgAeFJgy1stB0vAK1ATNlcKzrPVMGRZOAuXS7\r\nXDmXopobU9EyuT75B0VtZEuOMZRGGEgkPo1hSp1ANO1ujaqazhGs/XQs7+qm\r\nXWGLkPIG3N7rWavPoWx6P3nu7FvvQ60DrbAA/VXWbja7gdgNeEccfnX4bQdh\r\nEFAjMamyWYITimYyex3iLTMDd4tjoSaynWxFc5FpX3bxhLt4s7RHdXQzXbLX\r\nU+dikG3qBBMGZ0vhbVKBZx6ZlYaotKtb3FwdVpO21shxPTPRJ4ynwfLxZ0aG\r\nsCwgNReAGM/fOUj4i6HBI8fzJjohrRM5RSmA4nkm2BDpLjkHP79EGwnumcfL\r\nQtJIbP7KaDo7RaMubxE3RS/kZ0sdiG0yhZV6du+JQn2m5D0wzR066DtoCyiI\r\nKFr4NJiCo4tnuc1tqnsVXzM7No3Nd4Xby4z8Mqim5bjIqsb34UT66SsyCWyu\r\nECB0JtdfchdrztoeY+cHeIq4l+dHGHJFWSSuLV4+kMCygnjxqd0frIqEvV+1\r\n+/Mmkg/pAMfXic7Fgx+LmPqjNn5qQJ0YFs8=\r\n=d8Wn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC3dj5ueEYEC8X0+DmjQf88BzdENrtrFq204VekX1nEbAIhAN/tUHB14waTGKIQQw+uTkz7SeXDISQ8HhGg76A5xn8I"}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.4.4_1646257237017_0.907328831522052"},"_hasShrinkwrap":false},"1.4.5":{"name":"shaku","version":"1.4.5","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"0c114719f7b713121ff1cb806932a0b20d109485","_id":"shaku@1.4.5","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-UZMv6wVn3relbVt1z20njSx1LNXvjKxm7JoklQKjlV8LrsTfgUj3Gp0mxdKfpTL/I0LDwszM90MpfHbfcE6++Q==","shasum":"8771106992275f3d8febc27b7fcaa0f6b70556a0","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.4.5.tgz","fileCount":220,"unpackedSize":11801718,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDKB00q42QHX3s5w0jLjGdCHYHTT4WftXcWQ/FzwYtYKwIgPrr3cpES+KVse3ZGqSKZQ3k9YDVM6YExINJPlTgJczk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiYcRXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqvkhAAiWEjoWy6QUAXt4QfVCHN4+/P8aT/4BI/nKqb1Q9XkUxlyY2I\r\nbGNL/snVFxE7FtUvbP8BMq5aSh07jZYlqpMLtgpWxI8GR3q15yOH538F8HUN\r\nlT/FJ+BlYyta6BjquDDLVsrvjuVHFY6rDtsiXIaAHDN6ELWQZFmnLDpR1HE3\r\nBbryZNi374hJ6IlFfTDqApiWdOsei9Qm7fwJUnQUBuezWGykJaL+zsM7bPco\r\nuhuDjhJtBUXsGzik+EraSsP63FEQZMfmrogF7LTUDhD6lRxTGxfZWCyzlUNI\r\naSvOEmJ/9T10N3DMezIKXjfl8k/y3TvHc17eAA3Xjvuyj9pRB/NVmM7yusAw\r\nDvidNw2AN7S5Q+f0dN62kSeiaqhfBKhIx0di6Cz/6qD+18Fv7ymrW15yStQR\r\n6kToG0UkEs5f7Y9oEKbOgeX5EBY7mAI0hQyyWk/V6LDhp9hqQRXbnIrl7mV1\r\nsC1EhIhwTp2gBJuNehZslNLH5AFBKcRP9pUoB1z15M0kWMfE977TM6LlZj59\r\nU2RTkgwEcL4QWyLEnv9v0ViM3yjG/+Hh80kNqNZ87SosvL+rPDwQeOGDoE+n\r\n+fJD91oL0QagK+dOO626n5W4iXuWgnQ/EiXJAzAneFItg/olEELN/5uoHkoA\r\n7jo7A5rKNigGm75bcWOu+WkU6X+hjB4NNZY=\r\n=MVOT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.4.5_1650574423070_0.3351424457788854"},"_hasShrinkwrap":false},"1.5.0":{"name":"shaku","version":"1.5.0","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"b2cfda5e42dfce053fd53d4fec2146b47b463220","_id":"shaku@1.5.0","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-uopULCH+brvZ87WdRDne/4iy/njj3S0+n1gZQcoEZfIHrhKUSBKzzpiJZ8W4fFRn47XJpa99q2+kRxq9XQpl6w==","shasum":"22ec3303307b9e016cdc85689f04a150ed7b43f9","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.5.0.tgz","fileCount":220,"unpackedSize":11815764,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGSCTwyBb9WpFcWl2NkFYVbHtD+TPvQITGsg6rKniUyxAiEApOJY1Ay+GafOg/42xRmvrcPozWqiwXVf4pU/zSzUh1Y="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibbbpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrBNg//eW4HmEsWexYR43bxnHd2e/w5CFQwAGdxQ6HHhBuT/XrW0pg/\r\nt3o1sMIe9DcjHYjSsli3J+Vi8yRVGJq83d24AOyMNMR42Uy2iRhqbp5EZ38u\r\n4K7AbaOVpQdtqg+F7djRxPnZFTQWbjLiUZJNwtWV2ZogvhD5hxqFHs4InqRi\r\naSMJ7baYqnQIOob+x47nHCRRuboWn3NVlzS0nhPmCnBbQIVNt9sUCobdUNj8\r\noZaQVektnm6Rus3/+Dmm9hFXwRlUgOxrzKFMphZPUZr2Im+aut0uREBznvsJ\r\niF7QHKyfEb0o3PcizHRBw9SZxueZSkV3aamp/q4yQPM7+AkLz98/rsxevuNG\r\nNXYUfWqpx4UJIH3QQ+ePBsjUcEaBa9H05OSiwcBLK6ENRs+te9J8Fg0pLZiP\r\n9SkDiigMKQePioCA7URkUnEhjwok8EgKJfHNWnWRM7ZgZ+dznpl6G3nVLrwQ\r\nboO14dQZ30S5SBTOr9np1/kAgPQSzUFTzz4MN7RN/J+FSZFMAZI7VzzfJvtX\r\n5GGMgD1yNaITPaYnwxBiRm1rVMnS5Jb2/KwGB9op2Hd+3K9z88JiBomURjwa\r\nvjgwV50UDjrs1TWqdBWQ4ASVeD9uMdwUxGHDiBUckwa7uAJQgoDBSm/1ekmX\r\nPELhut51loJUdB5N4i5LzbE+9JhSMt0c7UY=\r\n=ShV5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.5.0_1651357416717_0.2253121821307129"},"_hasShrinkwrap":false},"1.5.1":{"name":"shaku","version":"1.5.1","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"08f3332733727bd824f35f8c89d0bbcbbbe13773","_id":"shaku@1.5.1","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-9lVXIXFnxA3WVZV33Y3nwkytluYfSvbzHxT6/W0oHKRc54TUe4msQNl/2ijGbaOE01r29eLwqoihoqWzwOamcQ==","shasum":"80761582001a78c6fabc041669de9eef1e4e3b79","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.5.1.tgz","fileCount":222,"unpackedSize":11928690,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICaY9gR1XXJh1JXvL86OhnxPPOvdVxNyEmr28WjOJGNVAiBDkDVevDMhW9CIUMEUI7REcZqR0XaXS2BfvoUKOkkxlg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJic4jlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmonGhAAhlYSVMiYXFYTStvYTf3o/Dv0FfM2axrnG6pDFnStPwdfGnuo\r\nQg2A9mIuwXUr0neDTSAknMlTO4q5Qthpq7xnrSnUxHeSX8/nu5pBeDt+0wdo\r\noKeSI+zA1VOlCxQYkR3VuYPNlbmoXq3okJw67VYGDwjlC0d46AGkHjv1Oj/p\r\navVVLIvLlr0KCzRnSBbGDaq+vkO2MAyDOpAjXO6nST+BU18BQ+aiRpgeVV5+\r\nIEDBWDMOYFNXWH2vDrzyUVcxbfekmG3ClP6C9JKptxgEsAWUas0bqh9Gp3nY\r\n807M789NNX3b/7ZLvnEu/CIpKg0Q+3e03+7EumqjtBYzsfyANybIJ8oOy9oh\r\nPu0TfvufI8kr3lhA47mLQfAe5BDXg4MnRAhbPTIHXeveW3TehI4CE2twqfc6\r\nnwpzb4PcNOp0z1izy/6412ASSgQiFYoAkgNFPSXoRp5dRgdhh2QTf9v43ksD\r\nidEocOGMz/AvDjP7F+BX3jtYgX5+jKNsszGVXyK6FlUFp7B7hM7UvL4DkTPx\r\nbqyJGTlWsjbo9e+B4ajVpyop40cwhqJVTXKEa4Wb4Vtx9SxqUQLDY1c2Jrsr\r\nI5CiEtOlVGsrVdM6qvHYzUFvqaHEDFhop1602CYqDS60HQUckmMOSJGhl8qz\r\nebXu/2YlfELovJ7Z33yme//KXDM99sMlC8E=\r\n=prQQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.5.1_1651738853053_0.4506153378978466"},"_hasShrinkwrap":false},"1.5.2":{"name":"shaku","version":"1.5.2","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"68903d595d0c22e1ccd6503cc3343ed455f04f7a","_id":"shaku@1.5.2","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-fq7BU7ZO3tg+xRliKWBUBerUJE2meSJJEkM71MGYWFTZ21zV82ee0wYqCDLEwQlQVPfsKNZmEpQV26aUXol0Zg==","shasum":"06fc78c1050ed75a44facd962371f848fb20c432","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.5.2.tgz","fileCount":224,"unpackedSize":11967528,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDu6iSDCs9nosq/pLNGZxwlEczf8Ic+HGZhs3PFSE5CAQIhAKFaagEo5aLTPNf2Col3dziuejUwheMUZxXvoZ9v30nQ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJihooDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7sQ/+NM0sF5DMWXOlVhqxtP1h84UENxVXfNvQjvvZCEiiYfAvrez9\r\nLH8uuSZPSixv0w4yCXVaU2RxUCIRYSN+dmTleWULFIgZIkj4lSqPH/zKuXNR\r\n9+K+f504+d0Ib8zyg96jrt1wPYz/4o0vMAmFujkV6tYX2V4UV/0l8ak3fK8Z\r\nJaINRAZtMs1kKUVPdtqfYOEllIg49h/VNfKbW2krnSJcj12LXGoKYjaIG4/4\r\n1d7WAM6fLOvJKnnJHm3/MYcUQO/58tfu4rQfkjpuYGC8ZOylosFoo+JdqFnB\r\nrA4qc1Fv0UVAZQ+7XN4Bh5/2Y2XKycy4gskVXelWL3N3UPRppPPA54/W+BRY\r\nv8qze3dPrHgsS2hiCBbzaVQwPvMh/5QEbkcdiFMBrw2ACMtacDj3jfvdC7/d\r\nKWbzyfUCS8I4e2Tl68Mvfnei+9mszLQYVM4guRKxrDoSKz/CIc6LvArRgJkM\r\nqAfpwhYPYs3YUtz9Rv8cgQSmpgous52ITTeV6rJTK54oELU+ycZ+sb3L5eRh\r\nLGFrfKsKti4MEoE9CDpeUeTVOOlculKeRXTqWDbGsU59poJMQFel5CdIf4BU\r\nA3M212I0ftcyOQPxLu6ZVdcZsYQO5X0wc9WkNLW0soMXwlNrYvEfnU0KawZY\r\nWlo9ioyrSItWxwHDIrvOMxRofyVUJ6mwjRs=\r\n=IiaN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.5.2_1652984323364_0.86659035745413"},"_hasShrinkwrap":false},"1.5.3":{"name":"shaku","version":"1.5.3","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"bc69fdf78487b38f2ad26353ecf17dba2c4026b2","_id":"shaku@1.5.3","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-o9CrXml5580v/HI3/AMTv2S+OGGz1IWMCSnA3Tu8F4jOQFunNTBQxXHRRqXPKVoCXdjzXxP3f5uvkTBStDbunQ==","shasum":"2ce7ac2cafbfbc2f6f7f49331d9ad55700c01e19","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.5.3.tgz","fileCount":224,"unpackedSize":11971869,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRkI8hw2NDCMWGyEwGwIo0vDqMmYvRqAkjTo0NLXDwFAIhAKWIvrSWNiDGAKyCWaz2ijQ/yQGDASbtp05/Bg6agMvG"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiiobvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpCDA/+LgrcFRdRGoSHTNzr6iQqtC+SNGFAwV/rQ8N5ks6WxdYZpWwe\r\nhExgXVIqPTGcdqzeBD6u82Wew8p9gzMWRHOKX3Soq1ZBCB4DCOXsoSu0j/Tf\r\nY56es3v40/k66KwhDHKEM3FYKQDUnpDf0ozAN37l4jAu5VFMZdSbziLavCZM\r\nydEMjpcFfE8BemJTt0VX8oC0o89oslPyqdA10uxPFT7Vqt66FvgdrlbAW1Ch\r\nce9gjB3y2815ABj3yhOI5Hvc5l6gyt/F0ucW6iMIwvMm3fbVzGrJGslckfkL\r\noiuVWtwDt2h9YyyAqnqLi2nakYbLcVmS6uDvSc02SKvM36t3VHiJZME/cnb7\r\nSY1RoPXOvAeG5yxdkn2W9RLJsAjl6Ak522eMUY7ejw/yF5jgO8kSjZTBWxRl\r\nHA3o00GriMnCKU/qPmgBdNGlfFb/gKKFvLDSy0wLrApfbxd7hQJZX6kQenre\r\nkEuRxhtnq3H7pCAsjZefxz8Xx3pia7MrBkURqcdG2X8tHQlJLzgrGIeAMduS\r\nGiO3gmLXbBZppkwXXVItBgaMT5jatOm6rkSXlA+EORoh8w5SqyZp46dJd1/p\r\nwut9VfNvoI7t/CF6lPSN5a9oCWxoUZFO8wfzrl1+vceDW2cxoQqYP15jkzHE\r\nsaIUDflI9nJjXXIhRgS7Vk1bVR0PkeSVVe8=\r\n=sZYX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.5.3_1653245679431_0.09458447742092391"},"_hasShrinkwrap":false},"1.5.4":{"name":"shaku","version":"1.5.4","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"b9390f3516a5013999b308607d746daaa4651d85","_id":"shaku@1.5.4","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-Yn3BdrsZRZdcLre2yCAL0I+7LzwZ5jEAYYGjCmFIVfBo+AtHFKL5yk87uXRcDw8Yob3GzAAbeslajJRHZaQuFQ==","shasum":"ab17bbea848d9a65aa64c42b5165a899e0a746bf","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.5.4.tgz","fileCount":224,"unpackedSize":11983272,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDL0gf/t44ukIrEynQOOnSZ0/tECYyF2j4PmjgbU07ELAIhAPZGOzdNDBf5iBBkosgH98vd5ZInlshLf6MOFiUdQlBp"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJink8mACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo/gw//SmRGjYrLGx9jLBm2nrAgrHJuYr4EpXSmxNFqVX4/Bprlqrw8\r\nUYKlyjPUHjHhkqk/LYnzzPZX4IycfwEL/Ud1DeXm3OPgeD745h3wPenxBNTK\r\noJgmT+avnFXLr1xTDA9M94k9/M4chhxy0AYAKFXrDdXlGRhIMQZwJwiGOdPv\r\n+pSHIvqDU48JH2IU/h+RyNOtOw/QWCb4eP60581wmLNl5Z+XMTEdF2JXsyJY\r\nrvNVN+KuegUHDcmexyoW7DF9ahQCGJQai2S2CyQwgy3Agz2Lxqh/s3Ued9Ev\r\ng7Cm/S0aPwklWEiUgNWDzxIaztDHhlRYhcgyjT6RQmotY88JhL5DLa0vsuvf\r\nScF9RvlfaUCmTAts4tzg/HuSlTuLneYPmmc2GLu+nw8yZ/QUmtDBMCtsvl8N\r\nycYye/Ae/8dcDIBFabE22I89Te14Bo2I9yJYAhgFJeNYmDRneFhMqU3wLHMS\r\nd8xab93J3nyZOnmBPoJmfsKyZwMPnK0duhg9OzcDGnQ+ACh9AQTbg97v9/Ga\r\niXgAWaeVgGcOjSyf5qEpbgFgEJOY2SD5kXhtAdnMqQpUi0FiabjlckZL/AwI\r\nLyIQnt8QcgdMx6E9J6JxsItGQr2os3mpJQHUTMxK4PJ6OUNIXExgHNkwkjzr\r\nseqpVnioZWzRkpvaPHDi3KCbdhn8PKGN5D8=\r\n=1jE+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.5.4_1654542117138_0.09269514937326129"},"_hasShrinkwrap":false},"1.5.5":{"name":"shaku","version":"1.5.5","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"610582095a8b7139936c5935eaa1106015cfc5c1","_id":"shaku@1.5.5","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-/i+4RhBaGGDE6OthR6daTdYEhG5hCfSXo731yU68tg/ixRDRHdHAxBqt+ZALzH1DK40rNqCKjx1GJY133uqZlQ==","shasum":"a3ede659392a4a5f293aceb244c297ffd8797efb","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.5.5.tgz","fileCount":225,"unpackedSize":12019009,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCs4YQSnHjiLm85yiryDekBoiUJb6iO99SHhOWcdzttmgIgZvoeFcQgPAYwYu3io21xxauDuedGlI/utzg3wsmcZCY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJit1AWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmptQQ/+MjIA0rj8RUtAFujC1fTiohoy8gwh3bczpTpnt0lMcBo9G9Sb\r\nKR9loUDvUu989xs8QDgnjSUhL/aaNDNts3wFlIu+/y2U0lBO5pHlJClB8i8W\r\nsgVjytPZTQ2LV+HrieBDWAkVDXFHEKGurQU9P1Hoxj7i86Qfjnnxqs71idl0\r\nPUn6iisr5X4QDcOjTkVp6VqduDcf5Yybl+n+q5Sf7C8Ru+jwBw8IAPYQiBru\r\nBqk7A+uuzaI/J5P92d8aKGNa2ugR6u/ZSF7D1XgN0VlpI0UlGo5uak3o3q6x\r\nxCgKgcHNrKcH9cdX6TLx3qVEvm09uedKqcap0wUogkKQP0P+6Sqo+Gl49n1A\r\niYlIcao5+54AfaC36TfZhVBhx0f59RUfcsDY5eIUkQRJQKrce+sFbiLRvH3k\r\nBp5+P8oUXlciJJ/a/vX+LkGKMfn6hs4/waeQXeLY5QBX/ayljsOGAs5r9+Ue\r\nG7TELE0trWtNEGXWKR4ZiU+Yt+UW8sMJsI+4xkdRR0ZQJz1mjPsi9g1QQaiI\r\nhebiPKMTajtBaylz4qzqvSOdTh68HVxFmGWttCfZ2SU+crGf3SRgZigx7Nw2\r\nxDnJCT+MtWvJ8csr//i+o2XDXgYwhERUD8eWsfHaSfmUN5d8zCh7Nr5PQrGR\r\nRaRp+YOvAi6VLxTMTnPu11luAfS7k5ME7h4=\r\n=1X4U\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.5.5_1656180758196_0.25521682370379417"},"_hasShrinkwrap":false},"1.5.6":{"name":"shaku","version":"1.5.6","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"60367d97060e7aa924c12b3a282c05691815a77c","_id":"shaku@1.5.6","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-pb+3obRvkHud+cGVW2+svfV04h3AZFlTaC6eFEORaZzwcqz+d3uElOo1tReSDrSqRoeTiHX/NmD3iuGjlzIq8w==","shasum":"9081156bee7646bf625221aab418a443bd070219","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.5.6.tgz","fileCount":225,"unpackedSize":12028156,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA5a/+iCw/WBprlAQSEgY29sgonPCHLAee1B8584kKm/AiBBOqsRL9NVmu4tZU9J7Yz2Q+myS7q2aXCLcMzUOuIyLA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0cR7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqgoA/+INcrRcZJlcYpSW+0Ne78LKoapDxU8Az8FOpPxHaX4GK/fu7z\r\natFyt8/NDM0R1dmlHE0fogdokTGcGrMFLufYnVFx9DLWQaA4x/bEtgevZKiB\r\n4zXYrw0bNTkrafcGou7qyhDvNmA7d2ni5qtb9tJL5IbDx3uZfUG0N1FButQj\r\nqLBJCPbs/3exzEajo5F17vyVHkNbQnYPtt1T0zXzLgu6Fpkh4qCGTVKlUe0N\r\n4EjPMCQQsOmBgaGSIMlJZBNLmx/XTGfNjMVRtheBIA0q5pOwHpVO5zmny7U8\r\nUEYCmOdOuqWeNC3zpS2CKzDA7L77Nqc7careyrMj4x3myzB/axdYcvC/sgNd\r\n29WxSA3oZcPcwqEiFdm6h/RAhZxiEgAMTwBwp/P1JPrz+7j+2mHRKUhVygz3\r\nQbmQpW7DK4QJHZt1/qbnUqrqrSlX1L8+yvkx2LRpL5MuoxKhJ4NEgm89PwDa\r\neGSIWM+f2rQoYiOHt3u/dfnYYL/yN7sVM/nXHevOq1amRMg+IsLy7yl1gmNX\r\n+Nk6Q8mcq6UyscCkvBMGuTfKHB9ZskmoP+KfwmsdBL4Zv1CtV7hcMqaOxYmY\r\nRfB7X4yOTLen+IVamm1fgqBclDGPMZW77R8h1SPx3LGJSiEJ0kn9nCCyaGom\r\nqPUgXYyM4L6UVJ1PRYWrHBa2RRCm5zITRW4=\r\n=ScXm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.5.6_1657914490611_0.3396654285252345"},"_hasShrinkwrap":false},"1.5.7":{"name":"shaku","version":"1.5.7","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"7cc1e027006e00dc9e896bdc9c090c678116ac6c","_id":"shaku@1.5.7","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-5Md8bD1dtVdXBSovDa3bp/Np8hKaei1cWBB/zwLstG2xLwW8nRa8b3zuXMuGIyCsOGmm+t36slAlTHtcZUcJOA==","shasum":"31f2df2956938c978fe34866b543322cb3cb702a","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.5.7.tgz","fileCount":230,"unpackedSize":12276183,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCVKPFhcbhijjzvXYMM4WNVGMrBdc1+qmZt30y+JXgIAgIhAOeUBazeV+H/c77ulCoZerHr7tvv7jkiSic/aS8eNQlt"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7XrpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrXaBAAhkAST5LF0ba6hh9I5NqKKphowqEFIo2AMJHnMdPIrwq3SgFB\r\nAQHMWRHfnBzI8ajGGqDulAkl/jU/k2EiX5097QFIPwbSZ1EmpPGVBawygkDZ\r\nKPpYZI0unbdsKdQqW2MgKUQBL4XmsedarFM7OKqnOjpGT22MW2BjPXWsA59W\r\nbfuqG6A6KJrIjlEftRxLSOXPt5GzLYKM5wf0jktOaVJpCL6le+w/NJzXRnPP\r\n/iBY4Ls55bAteTRUYSJ2FxjdpQ5kpUJJzaTvNUm+529zu0VC/nPuTwkqj3r3\r\n4vl4hsnYDU3gMBGkezI+VL6ezqQK/LgwMNGhBHiZMV3P3lJfzYe24OudB0SJ\r\nSD29iWm7x/4QrvCSzoGybDRzuO3lFbdN3gFHQHH+73LjIsJyg9RrgMdHUD+H\r\ne1E/hYmB0TSGt4PtegEi/Us8XzYp87tt+OPKTBQHV/Up+OJ2XpgjGpEzClqV\r\nYLlSLmzE5jA4KlfJCUUy+6NQ+0bksuzC3Y7L8ciHobPbfP6VJPrktVHCxpqM\r\nVDQaLX1QnDt8Bn9+4/NKGAJKm7fVXVdD5JsgSjNS5C/o4R0lAmuX7qW2qH3k\r\nx7H6qY9BGoDvOeQKOtwyupdHiww0x3QV163fVtjNJWFhST4mhQiqodN2Yuer\r\nRSBo0zkJj6jOM1f12oo/W0r6BJY7RPnSp1Y=\r\n=Adnt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.5.7_1659730665003_0.6324100506220891"},"_hasShrinkwrap":false},"1.5.8":{"name":"shaku","version":"1.5.8","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"419acd9e5f5e30ab28cd6681fbe40750d27c3082","_id":"shaku@1.5.8","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-/Mc9wWuKoWq3xpn8Q/CT90DTzrOxCHv2IOOFfgb/MxEe1JTQEZvroWEp8NDGqDkFrV8f0NRoEu3ujCUfN9bDyA==","shasum":"d0f46aa54b059b91f1604012ab470f03b63a0e43","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.5.8.tgz","fileCount":227,"unpackedSize":11921204,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAXiFKNlWHolAOydMRob3wLM+OuTWehrS3GszVy852CBAiBki3f0sCzs4697cLaj0NRdw6UwdYbgH2H5SPcufsf2dA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjBTZ1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr1GA/+Pg6EUC9D4vZ/p8xP7zuy7QXLQL9iUMw4da/6Vu4DtWo462If\r\nhPbTNzbqdGJOSIGK0pDHFkXB8ajJmC0OQmatL46a82+UFgSPiVkJYaYKgJUo\r\noGRPfMWBAo118/vpR2lvGZBykj0va7m2kp5sp6/rlWLpSFrU3TCAIUYl6TXD\r\n5+632mi9ePFioG/hAYrlNGZ5BJUJXMSAILZWvCOVntuW+1xyO8eQ2D0rT2aB\r\nXHKe87xpTMhY3kpSaxZibCQQHlP27oe5IKgFCDIlqsTJaC3NDmpo8vQPSFA4\r\nWqHvCMB0J3doY/duX48l/55UaYZj+d4fitG4WqvNvBlo2rgHVMR2/B1gANDm\r\n2rQ6jdH9Yi6nTNqrKJq7p66DvHLJOrvo2qqRWVdJgiasaxn4mBEuAJ8D+qEp\r\nuN3QN6vvGueq3vqrRx+2HipENC/yQ4JBJxcni7oc5ohYJqBVjofLbruk10uO\r\nB/a9A5Yl4W8SBfeoIRP9VPi+MmnxCqr0ySJRwGsxtx82aL/bSSm3naZsZNrC\r\n/TyoF8uPR7D8btec8TI9DM2tql9zKZXGHBjjHZI6vGe7ZKgD87t7uHRxamIW\r\neiL7kTkFt1ScleUVqKbeyA4f7z/M8oJxbhvbwPrrZrNN+mqWyvLMMHgPe/X0\r\ny8hLd1EPwbK9C+9kYJ1E5agYrGijCn7HK48=\r\n=Pqk0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.5.8_1661286005112_0.7682566214301152"},"_hasShrinkwrap":false},"1.5.9":{"name":"shaku","version":"1.5.9","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"a3d0a2698866efa40442bd635eb7cc6dbbd44f3f","_id":"shaku@1.5.9","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-GTzJ7FWyeqQeIsMD4S5POmBFeCWvhSVxz/MNFOyvw5ldRVHLwa22K7IOJ6SrKqJvmh9qSmLn/JEB5Pr8hPaspQ==","shasum":"b3472db4d2a9f31bf916daa6386ab859e393006b","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.5.9.tgz","fileCount":231,"unpackedSize":12032774,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB9Pm2vZ+2qFbDtZY6IctkqYy9I3xAoIvCmFffsIeg5lAiEAhVo4i6TJZzboBDb+QwXx/0kS8lTHcbgQh/Qjf37TC5s="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJOZYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqxBg//cgVN64dag6JIXEupHfooyGXOTa3wKcYEhwI9vOCY/bU6O+EZ\r\n9J6puX6DvyvNAFxsVZDwpezObe5iGv2wYrCak1nOTdQpxdU3SmW7z6sjiaKC\r\ni9sZxpLRzYrwfzVrEhIOLRurOpb+0qxoCd3vP2N3h+hn3S+DVT42PckYz+fw\r\nwOn/vNnnMfFBnhc6SPmznlMrVphScFKYReXrMUvoVjzEQRZX4QnluXh54yTi\r\n9oGCb3tZFnSq5i9V3eMltTPd1vivdnsNP4noPg9oOq7t2mKiReV1nUsB3Eqf\r\nO9C5sATi0bKXrzR679TSZNgHF1154KsNmZ+wMDrrnBrPkSJjtH14dQ2TNiru\r\nYaB+S/El0m7SgYUyG3mPetihk0xtSLt/VT9ISlI0zH2KaCUGq4fAZsDnff5h\r\nNIyOyysoJO2d3LfstKV/euaDHnISLr4la9Vssynet5W7ouzHjKSNhOPLLVZS\r\nltzq5pp+c6NIO3KFNmNflAJWK/Ok19XGSC0731fW/GHiMHZU8fajJBUUbP5H\r\nICbSHWbBEa9JKcX4sHd5S/7azzu9/vW/DKbEtAAy8J0oFOEvgTd2kqlWFl7K\r\nTmVBjOsP7CvuApiJhQlHWJ7IZ5IpjqisGCGG2z/qd42QeRabjVSnuUIPLNsa\r\nN33MRJKxI9i3a0Dr+JiWy1E88Edyoyk7wsQ=\r\n=A5Df\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.5.9_1663362648471_0.8494896371603742"},"_hasShrinkwrap":false},"1.6.0":{"name":"shaku","version":"1.6.0","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"0c7f99dcdbe01ec22bb6796d27bfc4e8b985798a","_id":"shaku@1.6.0","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-JqO7IZ953FsY9y5EtgcGl1cUjA3mxDGIerIdKdu2A8yPIotALHQ2+zYC6LjHondgM2fpH2KiHDpmn61UQa3ivw==","shasum":"bce9c41786d59ff69ef67d7ec8c4f0b0069881a8","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.6.0.tgz","fileCount":244,"unpackedSize":12644593,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCW32ZDaNSHmQclo3hdFkJeuJ0UP516ykFF1XJjDUTImgIhALZ1I40Mit2WSz5FKXfbmSg8wLAp1s9Qs/ySxXJg2HuM"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJPBvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqGMA/7Bs+Bb/ALZ9mQkPCNCopM+Znt0QUcqA7HO86LuYEyyNrtl89r\r\nmq/oT1DxzDaQIU1u2oE/wep9h3hvWzX/z3FBLiBtYNNUEUYBEBle8FqPugHN\r\nKlrIuRNXogn6asUFVPilkQE7lRro2/KTlLXcTrwdYjTe5+T6uCSB6Xl2/DIs\r\n/Yfgmp+E87PKvtVgxhm0iuoiHlNNfMu17O2VIUWqo/tqH2/TVhFIXHIXUAll\r\nwWisKyrdA1F1L5WCBisBWN0NzQPx6J/NT1VoGRhXJ5+BVbhKgO1LZbDzv4zf\r\na2mARRSkVdlLcr6SmszPPmnbCRHQZ3rmEpCUjT1A0OhXqsqZ3B9EepgjlUTe\r\nxWiXPIZnaiEllp2vJ2vnk86MUiFmseKPMhvRLepHisZse/H97Kwt07EwHj23\r\nZfP9G/+lLIR9ePT2Ke2SSJvbxA43MsF7dOSfo17ZRwDPCTsYYs6b5c44KMo/\r\nagcoSGa2THqy5y5iKbYtpB0H0Z1ZW8d6ixlMdBYxlCdkLUDY8MMxsjKYH5Jv\r\nZr0Y7rmuuF74cL8fsDDEA8k5bO5Bip/supJT7KIYYDhbLpaaac5VyDXVm3uz\r\n7srUFEsTQ0NCbrtk5h6UGGHl/MqIEMJHgBbeicHgTbhxSm1Y98eBOuRbe9UY\r\nm0qpBLQ+5L9G2NYl3XYndq5iFxnSVNs/LF8=\r\n=WSQu\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.6.0_1663365231017_0.24995068835040635"},"_hasShrinkwrap":false},"1.6.1":{"name":"shaku","version":"1.6.1","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"632ffba6b5d8b0dd4858ec44214aadc697f11d6d","_id":"shaku@1.6.1","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-j0dAgXZB69vWzVqUfgJM3Dn7t5/7qddP4R5pO6tP7/pg+0YgyY6XVHq1i8JirJCAOtMmowVu5PPGv7wdzp7dnQ==","shasum":"b3878f930e954ce70a3cc29f2d18391bf6bf609f","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.6.1.tgz","fileCount":384,"unpackedSize":13619936,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCjAid+np9YCIkBnGs+9vYOLposc0WpmwEZKpYZljNHZQIgZGJvw367tvH+d+sPlloLnitzEqCXJyWtcrCQcN2IDeM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUbj7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmozig/+MCeblbwJahjwKkeG1MUr+YfiCmru5uXdRyTdILgRQpT92Yrf\r\nBBD8oThRrwO6i5EMzmMbsUQMzszfyG9lIhoiUSdCWfcdO2gsa4aXeUnqqj9p\r\nk1xg+8G7BUmfAQqBPep6V3NpwwKhujvWtxbWe+DnfCV/AEMcixYvE9Im4kHR\r\nA1htoU4fmxZFL8TDmMZN9NusNsuwIloX0T83rpRD1kzOcyfjSWtz6loDH4GQ\r\n1/LNc6gX2RdpfO+NjsZS9yo8I+FVNlTS58nSECIG/4mqKGL0JkhNH6fkVn+S\r\nU9p0Q5Ic+L5+XAVcezcH5NXZV765ipjbK19uh32agMudS/Ls8eJVhvvtY3ib\r\nHxg07KaR5BKQCjU+lj8UvWjurR8UiqUGnlFQ3ceoVhgr6OEEXboakxYzX+C8\r\nlM3+kI4IvOC6e4bEaxUMvwsl+qj2/AH8qUQS/fj7xI3gfUICuHVQ4ZGAX0ts\r\n5JaOqZZiA/8N6QJkDxiijNo5fLZfN4xG9Beb0KatTsResrVfihzkutfUu+PG\r\ny/PMA8cQHPvKq/ZwKmJlGrXQ3QzWbig0vzr02OYLa/DMkjygUQ5Lx8vALZnG\r\n4wfaGTxQMy5aJ1sSLiL2P4MII1ocJT/HB1ueRtpz1NzxY/grZOljoxUzT/tm\r\nD3IA7ZgfVuBH1/F99YW9t9ZufHKYAD/TPhY=\r\n=z62R\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.6.1_1666300155415_0.6582353191711476"},"_hasShrinkwrap":false},"1.6.2":{"name":"shaku","version":"1.6.2","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"cacad98660db51191e932de7cb20aa69a4e067eb","_id":"shaku@1.6.2","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-UlHZ4sSl57xU27cgnjDJ4ZJq754DtQMCWBlHxHz3RBYzkq2UVnbFQC+0XWnDvehqRT62CMIwHxZTQv9Y7S2jXA==","shasum":"285307b84ebe7259cbf388f7b9352d9f70c55b6f","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.6.2.tgz","fileCount":384,"unpackedSize":13656894,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnjkOzZHhXzP3R/p/TLH5ribLk1h0b3x5T3vBG0NNb4AIgN4Fwe9lDUsLS1cednSzPpfVUS6P+tcjme+R0Xd1ApJk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjWCxXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrIkw/9HoQmoL6WcBEpu2dY9EjBzxdAhtuinY+qZ+50zIFhaIrhxFqB\r\nlR6ZUzZbyyidwS1ZLRSVqUHxzcXKM0x6ViwhxrLsohYB/8GbyxgR5yy+RauT\r\nW8MaTsVXr7ToD3v5MwtHDg3Aibjdwyj7312pi6MhEQO0Na3htRz3k/dfVWhz\r\nDmDr0E4FqRmrnG17Ncc+e7eMLRzS+zEvJLKyYWxdcme2MEHxCE0UrwVBvd6q\r\nwzJKfJ4e5MCzpwwmgCNfrpvL07sopQ1Qbyt7AkOtNi3KOzm+Q9GEJX91A8QP\r\nj1TqIDLglBetR5CU+eZw+XMEZKOnVs2JPFlH35oipXOL1Rz3AYjKwtupDdcO\r\nDcgCaq4V9vwyJ2QQl+oi6xrVWPilzlcR7uFdyhbtT79ovd/uyROPY6pcoE//\r\n69bVXjd69YbJNo+kYoC3ThcrSrRtYDBNQPYiFy45BYzhPlnjsWTfvrCivvw2\r\n2HdtKV2bHddX31wMoiYqsAmnryFYiE1/PKytjS86mtVLNjR9aqzGKCDroqAV\r\n6YgGO5TDKQMUh7YpvVMZB7LYe2AU6HW544uzneHn5ycdgKlyUAXzKJEAiFom\r\nlUvIknssIHCxkrT4F4VMxSVziHm6cmUpwRPTklqqoPdygg7pni/vp6zi3uid\r\ni6ItedYV1rIsTUuLPpGVl86OZszSeYk5YJ8=\r\n=KopY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.6.2_1666722902704_0.35673159786388875"},"_hasShrinkwrap":false},"1.6.3":{"name":"shaku","version":"1.6.3","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"d2aadea8e25df1aeb53e2f3ecf28c99e64ba0438","_id":"shaku@1.6.3","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-oXULJKsPSoY4fcyRhEohDvfbi1mKG521rVX+nLIOE9L5M7AfCNGhyk6tXsDi/b/bsdAB1xBnc6b4uanfEbV0yQ==","shasum":"3b8736a75a6eb63966200661068129ccab34b728","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.6.3.tgz","fileCount":387,"unpackedSize":13713899,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPRSK6X88p0xBMW05ChI+j9hxC9Q07ZouIpIwlh2xPnwIhANnTagQAhBRP3oJ/HCPgTCs9sd2JGsoxllBOmp3NRcSB"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjXF1oACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqfPRAAm8Il5WoQOHk4TgljoXdTVbV0QvJgcM7/2fI+y6ijocagFDbf\r\n/RIKyZ5uUGH/2D5NFWybMMCngczNxtg99OPIPNACWFbuHVSNCvx4DjYRhI4c\r\ncE2+5UjoZ4al8Ouil+KEgD458FqsaUh8FoMAJVNyXsLG/m+4eLsyyfbxljPw\r\nlJIn80Z9IW8MCDR6+HmpknZGSEr/C4Vl4U2cI89eWbfUeTZNksQ5epQdqsuj\r\nZrgMk4fVPjnLxHrbJJoKDG0N1H8/crYvmjQ9qb2pVrq8rftjwUxDRzUSkkBB\r\n/EOX7MTcnGkrIeNH3iZMGCmeCA2Bw7gtFJECCXPGL20rlJ2GoMwIoKUjpuz7\r\n7r97lf2IECxo2bsZwEvnYoXex7lBVG286EiPX+nu5E10ld1oqEiP0zYR7ozk\r\nJWfKKv0HqdPMIEXzL/QnMz4sFhtxE+KIxBIhlCQ8SNteyYRPmrrNCrOyCyW6\r\nqzpnELRDlJC/fCT6DO6eD3vGLyZ5dNh5amM2PKqXUnlyZIHdn5NI+/JrUKg1\r\nC3BsZE6uEu0UHuGzAlMeybUsv4a92/AeQj4g6CcV1kfcNI4Yvzrm0amBV1Hg\r\nOS5jmkuyJQdE9+qkjhteqHQLOJN2ugHPnEcsVL+KdOuwHSsvJxCEfHYpevQm\r\nt/sOeMQGmAxgTM1acZJoNV51iCCq2d2VrR0=\r\n=FaFH\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.6.3_1666997607693_0.24594729017994865"},"_hasShrinkwrap":false},"1.6.4":{"name":"shaku","version":"1.6.4","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"d6fcff56f76eda532904fa70a99093cf1d6c5967","_id":"shaku@1.6.4","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-dkNN2++0Bq5mcedFAmyCCb7qT6s9PSsBe8kxhsLzFkB+dbPgmLj1ml0rVrKhQ6Zn/6m+QUNDS7xlwSsdh6KQwQ==","shasum":"07dbc3d5948e515674389919bd66d9078a3e49eb","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.6.4.tgz","fileCount":387,"unpackedSize":13757597,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE90N/AzVka+QMOC5jIPpJDAVPA9i5vEB7BvYE37pU9XAiEAzdT99vgX6aHEn+oTKqBKW70LPLT5ZrpwdF/BO9F7EzI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjXtR2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqEfhAAnFV8jFmwYWzxAgVgCv3XU2z9gKG/mznp9UFV5SlQBDu1Vvwx\r\nJB0+vS1nGbpZrRNaMgIpQI/MdfFrI3ra0+hKbmFy3f98sxJbSNiNOABkgyVo\r\nn1wjFC3sfQ/PTR1yeuEDBmR3MOyoFWMYvxovmhD7tctYqyoTGamGLqSq90U0\r\nr0JgpxUjEQuuhmkDyLcFAZH3jCHvs+RUYMgAiq0ZLS1iglaMV5M3z1e0g4db\r\nxuZMl/U3EkvAFhBWRTgHgWBqNcCaWORViNy79njjvOGIUWSzHselghTa7xJU\r\nlY3QNPP0IMIGn0P1XLJ5h9O19bxMoLFR4EXxrw+h/ARWo91USXTN0bXKSifb\r\nlpmBU6wwlGEBAYW/iYW7/5pt5QegJmVH+r/rllzNDctYUIny6WEhQB0iD/hM\r\nd1r3wSfaFL0BaScXxA65bCPzoq9YpB4MTXMlq1dA6a5G1OVfgMCkVPGaa74z\r\nLH5T2puDpxCC8Z9Q1YurqwCJfuVBog7gadYZW1m71lIDF8kuUkcU9sX/tkDd\r\nWPseqIsUnfFbxzIcR0j/SsM9yCv0iLkVX2CtK6UwQfMTogkTYlsBU7YntGlA\r\n27rUxY6+DIRIzzdUXE2sZ0ow/okmt0StY15vaxNcToIegxieUOOS/c46LJuY\r\n8dK5xYiHlblYbweB0l+Im/nGZo5/TwjdYqg=\r\n=5Pqr\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.6.4_1667159158639_0.45222435385689796"},"_hasShrinkwrap":false},"1.6.5":{"name":"shaku","version":"1.6.5","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"64502b69370019bacbbbf93beca946ded2e780b4","_id":"shaku@1.6.5","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-c2U1bzsLAfB/Ns4q6muCHsWc+FY4W5eUKeHNveJlCFSaV5Zqeoa0+hmh3jxnjU21I3fTeTl8az0UKHJyVd8ZRQ==","shasum":"b40582b628bd2128ec21962270b32a9e55d6caa3","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.6.5.tgz","fileCount":387,"unpackedSize":13770728,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFNG9fqqy7n82nKM/yMJquN0m1c9L0axxm8rUzJAA9LiAiEA0O/4Eyn9onMZVN5D4EbwAkXatuwAuUGUMNp5tRCH4DE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkOACACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpA+Q/+JEq/l93LLd+48EIh7gE45AjFxKlvU50KblqcmJKrncNT2qR3\r\nOnm9U1gJOmlQ0kQpT+KBJTetyeKhoc/vPF2MQ+PyvvtbAC83gokUrJ9reTN2\r\nWVJX7fIBTgZ2GZX4F2fEdh5P3EXpxXsrSHsmH6i0dE+flHul6jFuo1/6EVpL\r\nuiawgHaBV3vZCYkk0vasPhK7ak+KXXh85FaYCJ+zasd/CwH2fY6nnL2aSJ+9\r\nq7C3rQbiYU55ER1qDuTE2PvuqnipzrRsnbxXH1z3c/moxXh9ncdRU15H1TaC\r\nHFeGKE903pAezOFHFREa1DVlK3SuCXg6VQQNKekfkNyB+YgaiPIMJ2LonlaR\r\ngJSKvT69OgaQMESI6RWmQ+AV6wFMHopnLLvsyZU7Acr14NRRNX1/fgrqaIkC\r\nyXoFdYrchqZoO6/kNwgvnvDyIjv9DQh/dExnfuDDKGSR0p8RcwIl/1Ium2IL\r\ny6A1gxWrNUyGFH5MUGcko+QfkRGJD62Idry4rtGbIQzHbsz9zUKG5SJauQ7/\r\npP5LEVShQyEYS3sI67Jkyy0DzjAbjgc6R3xckUeF1XNgx1RMzqPz/Lsf9hab\r\nV7dp3Y2xOnhh68wvKl6IxSPTgTH24i5mOPByzkX2cLDoqmeYlxk4Gws4eKCA\r\nPDBdHQUKkeqKMPx4K6i+EmgBro+h0neHgWw=\r\n=fShM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.6.5_1670438914031_0.7836239529834903"},"_hasShrinkwrap":false},"1.7.0":{"name":"shaku","version":"1.7.0","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"5088a5ba3414d995374618f9a570f2c22f881c43","_id":"shaku@1.7.0","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-yDTeieZZq4NsY1GTZsPEzmZ0C1UwYFy1I9Ls+tR/PL9/3n7FjScfbh3Jq+Z3GoCl372+jbl9wEb/Nc/Vunyvng==","shasum":"b75105fc1704d9bb3b68f4ac300a50aaa20e4a18","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.7.0.tgz","fileCount":390,"unpackedSize":13834044,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEMgRPlBX9Mp8LUNLgOXDR4Qxkuof3mekMKa1bEQTBPLAiBgHuPI86/kfUVFocCur1/eEJu44KQRmbhWX1nb3/v7tw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj3X2bACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmooTQ//cueYXDo+WcB2xh/k80rSdHm2PTv1drj2loxVPuRaM8Da1T32\r\nOUc+vQHvK6IKJuQ3hxi1eB8ySFz8//Q4P7iLKa/Agg8xauRt8PMF5fJMYG10\r\nOOcBM3yCn1Kt5OtKNgikwSt7s+jgR8Y9PP0MlSgB4ud5RE2z29fjEQ/YrFlW\r\n8/yw1s3pboycgIN7Q8LNW0yi6Nycrn1/0YsXQhNarCPm+/zWXArcI8Huqsmd\r\nsVDTFWFKBVbk4+etRdjkcpMdANEmcnuLt9rKHuDCaqk+sYTbX/zqPri6b9Sg\r\nREHiejdpsukdIagEe+SwMraksgWYCKyeHZ38V1sNd1igEPg1ukr1RJjxKUVk\r\nwNSuYGdC2K8Qnz3LQm9d2fBTlALQn77D6POstSjXTn3pJEN7LBmZwYtdH1Cn\r\nLHgLRF9L3B/dm6qhwM5mcrmjepvmDZPpJyhV8DZX2DzpJcrYDdAL7WAbc+NC\r\nKA59XHwQkq6vENCB0y0o5PXI2u3+BAlSquHzUhbyg/udH7HBXh/OqqMX0I3c\r\n5DajCDVy6z4IDByAZQq8utry54TzsFZ6P4XIdEpj6HT8WnepR+EjA5KpTlcS\r\noV9QapU7rCOxVPMqU7PiBKZKbm7H7Kr7HjMIqrzi3nk4GjKdJhLkeg7NIeTp\r\nZFjS7yoj6A3MaTkzjTbqY2Gn7ZGboUf1asc=\r\n=M6vf\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.7.0_1675459994764_0.5051185130621565"},"_hasShrinkwrap":false},"1.7.1":{"name":"shaku","version":"1.7.1","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"0d8a06f9482b5036963bd5d4c20458c5c218b0d4","_id":"shaku@1.7.1","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-3FttsXN6Y4Ue5oj6/Lxl/fZGLgCiMYrh0Riqfxc5cd823t3SjD0tJXjB2a74g14CtUqeU+wDt7AWb6F8TDm5Ug==","shasum":"e199e5ed608ef82b791a8f3a618ac6a1c0b8cdfe","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.7.1.tgz","fileCount":390,"unpackedSize":13834884,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEDpTRIb58Mv17HPWvrz9R3EoO/UNcy3LCu0UGyLZkOYAiA7hnKAzBl0Uz//NJ1vBXUeLqx/mLaVKr1NGpoZqtEUVg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj9UO0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqQkRAAnm6/6/qOGLwrBPOhReWmiY5EtYI3ch3f7JgygAoO/CqIebxV\r\nErFdtT2xcamPwE5dvcaePwmf/dzQaQcRcU6kCuPhIk0blUrrJMAcTS6HMWTf\r\nEdsva36SglFB/bvJrCrBDC22jvGpgAjEm8w+msN18fiJdaHOicT5rkn/opgt\r\nsDsJmbZxi8DdRVoAA5v+zhMcsyO82eM/P9ts6co1abH1YVuWZyclw+simFhO\r\n+7FmET6adn6RYj8I0VOmCxZ8Ytq0Y6KZKuge3qz54UjZNrBqHflTLlZi+bKp\r\nNn3Ds5bXPADqnV8hjS1446L3MYQV2tCVc6X6H2c9kmGhKYZf4brknD1CZYN0\r\ncPz3vzGTrwSPO8j01rEKnRdIE5gMFg4S/ouPPmyw3whlANHVuMd5TwpMe2HK\r\nIdpalQGmyyp80KfoiM9LfQWxMLZHaV1NUKiTIcM9k4fhLYXTGRFnvHrpG6vs\r\npuzmv8BuNTqwQm6LoC93w/clxDHJG62tTJ2n3FAjgOrWAKj2CWMVaCsUIqsK\r\nhJKDsgJwUHC5nLXaNE7LFq/9XsO0SDu2vgktBKI0RYijYpefdb3nz5VkyeSV\r\n+IW/4lcZvDkv0l7ksWjFXaWduGZw1rpb5e+sSh9DhFnLSbhCPghmtGMIkfFZ\r\nDVYXXzcz/8eIkKQvL9Wq/maL+w3klGD4dVM=\r\n=cqHq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.7.1_1677018036356_0.8692347526772632"},"_hasShrinkwrap":false},"1.7.2":{"name":"shaku","version":"1.7.2","description":"A simple yet effective web game development framework that knows its place!","main":"lib/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"683e003ba70482bfb5b693a7474a28ed6d9a971e","_id":"shaku@1.7.2","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-SJeSrh+eLgsk1dhH/XweWmKz2SKvymEyVavPRAwz1warKit3QJaRfNqxoK2hMBCYhmYp1Bnz9en6p33Cwcxw2g==","shasum":"f4a77381606a82e283045ae7d841366c21b01ffe","tarball":"https://registry.npmjs.org/shaku/-/shaku-1.7.2.tgz","fileCount":390,"unpackedSize":13835193,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDZ6uieL+IN2pWqg88G4DKbhcS+YLqIvvva7ffdhcnVdAiEAt4gKAvPiUUB8RWJLZVP2jh6E8cKH5T2NVVl/uq1GFmg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj+9LGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqVWQ/+LMrpEvvlClwrbNRb5zxaD350zRCbMofcdBEtaoNsP4XQ7Xx9\r\nwCyHoP/lwteCMF+Fc30tq6eboE/4g6gQzdX+1woAVEC1HG2GTd0R9uav/tda\r\n8RX+23VLtSYZJdxD1f+F0Nhjol7VoWtfgI0rpN2VoKhxkpNcE96WG72nA5j0\r\ndRcw4S/w0kDQw9V4yLwwYMvjs2u6280GYTjEElG9iKott/sjoAUKWah47sKG\r\nh7wTifmlsmE4Skuq873oXVKBezvfw5d63K5AlVGgJeO45q/ckbq+YMkGuHHn\r\nzTsF+tVrUUk1j4sCeUUDYyzWXan8q2GvAujNHakchCQ8ZeCExEXBZ1byeSxg\r\nTn0ktb8O4qMiEsCBp1g0VGMSLxWP8/wXJrDB2fn+6k6pOiLfbN0Q2fa/SOwg\r\n8cfTKbT3BlpUz1QuuVJe7QMDQagDwLdjpQQBl56c6/nPCq4eTS5Gcb/urRoS\r\nNF5d9QFe9xMMXSZTtn66w213ynkxHGKZZV6BD+TCv9Iq1vNy7uM9/qzuU7Px\r\n2yDfeZYhDLlT8EEbMwLq/PEe2Vx7zV+g8Ekt5rtwmGKaBMq3/nbfAZKamOTI\r\n7uPFMO0+Wt6p1vk0nisgxu1x0ze6bPp8zF/nA9Y7KXonxeHC0mtHgHDau0u0\r\nNlutMV8kaTF0R2cizCev3cuD/XHHLgdkbs4=\r\n=5j2d\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_1.7.2_1677447878017_0.7680345287814465"},"_hasShrinkwrap":false},"2.0.0":{"name":"shaku","version":"2.0.0","description":"A simple and effective JavaScript game development framework that knows its place!","main":"./src/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"webpack"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"devDependencies":{"unminified-webpack-plugin":"^3.0.0","webpack":"^5.4.0","webpack-cli":"^4.10.0"},"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"aba0a095442400c7569e665955ce8ad89c86282b","_id":"shaku@2.0.0","_nodeVersion":"14.17.4","_npmVersion":"7.5.4","dist":{"integrity":"sha512-rzW6yiHNxNcTpoAmdn3eLurvibxlJj4wkmW/BSbI/tm0nMNJxJExDk7Ca/J/3xgLo+ij/Hv5ZSVxl+UeROykGA==","shasum":"dbbeba98aca479ad95d89a9d3965f10bf0b32a24","tarball":"https://registry.npmjs.org/shaku/-/shaku-2.0.0.tgz","fileCount":452,"unpackedSize":14414143,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAdLkbYVjPDhOgpomCLnHCNztZtflVU8UTeDzVPZGj3QAiEAt6lZZcXGGabVX5S051Rx3xlMmUwrxHF9Ykb2+kQHz20="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkSXDAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoAMg//cmgru921+lb+QBqoE02qzGLJm6NNRK2tcWJd1PDRgh89duGb\r\nOGTOukKr7LF6lRdNA7iJoCRtqBGJOnn3ZuVaOxBSSXcr7OaqSHdvU/IOxGtv\r\ny7vbok8KERxgXYR3ZTcDmgB7szX1JqsuemAzUQho2HkfONGK9h+c4QyY+96k\r\nleyZ/bzQZQ1WeQr9E1q8jvEAEfv3hotpLDOAVRgakDfLM33U0YVwfKZb1mJ2\r\nsvFmPexCk9BMN5RQjIEnFXsl23LEIiQItSMTyBZMm0q5/bMfik7eNZ0xN4dI\r\nGnPMDhRWwTeOP2XL4+VFuqVYgngew1Aw6aFKqB+5VoCmRTo8AnvTg2YCpkY8\r\n2qRlpX8t6D0xWgMHb1eryFCuHlZDujgSA7+Pv50k+AiIaJi6yYeS/2hhtHsK\r\npXiaao2PkF43r2CkxvN6Y/NaNq3ruHQUak8dKP0An1sqMftAkk+hOz9m4V2D\r\nWFEVtureXrTOnf32xNCI8v/RQzDIfoF/poLrX/4lhbz0sgtI4Vy/8ea/dMji\r\nqrObgKalE99cWVkI18uOqFcF6dm7uyhqk5qGlSwTReni46J760m0SrqalXdP\r\nifaZnleHufCbw/waBmKegCM0yECzTNfe04ONDwjjWyRza8PdM6FgXfQrEyy5\r\n7ZsCn1bjULJVrZkw8Txl+YzzGR3vmrj8mZ8=\r\n=Iove\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_2.0.0_1682534592070_0.792235573026417"},"_hasShrinkwrap":false},"2.1.0":{"name":"shaku","version":"2.1.0","description":"A simple and effective JavaScript game development framework that knows its place!","main":"./src/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"webpack"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"devDependencies":{"unminified-webpack-plugin":"^3.0.0","webpack":"^5.4.0","webpack-cli":"^4.10.0"},"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"6045dec1a3da0f4668f9e9df6e3a8bc337dafdb7","_id":"shaku@2.1.0","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-pvn8uD4BdZX3czSzEtCfP4ITi8W1gJcqzFfdt2ZLC748TDOIgjAiRh2T4DFvndKBlTvbxDFecCtsbQYPz/UEMA==","shasum":"e9df9764e2c176f97aee40fb8643775202bcfc40","tarball":"https://registry.npmjs.org/shaku/-/shaku-2.1.0.tgz","fileCount":456,"unpackedSize":14525419,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBIdml71brMWoWhLserRXiCbibjoFx6tJcYBI35BcY5FAiAynNj+6uiztYi8IeEQPYSVQw3W0mAPmqKHYDzmm/L84g=="}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_2.1.0_1684787110154_0.1914611680473104"},"_hasShrinkwrap":false},"2.2.0":{"name":"shaku","version":"2.2.0","description":"A simple and effective JavaScript game development framework that knows its place!","main":"./src/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"webpack"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"devDependencies":{"unminified-webpack-plugin":"^3.0.0","webpack":"^5.4.0","webpack-cli":"^4.10.0"},"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"a6c9e64efa4e9df9a69edaf246caa525a7e1a3ae","_id":"shaku@2.2.0","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-3DmzU5icGlNEdR2jT191xSn2oCXdhJblVyWGdB55B2ZMGV40mE/+wjPlIb2Zp2FP+8XPZ53tpFd8Ju+BWMIcCg==","shasum":"8a65ecfbf323821b7e9d4b4a143ee97c39af3b86","tarball":"https://registry.npmjs.org/shaku/-/shaku-2.2.0.tgz","fileCount":479,"unpackedSize":14693372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBFssdgv3ar1fRfMudE/1HRZWcWQXymi7A7sQ5H59bbgAiAOnYcaqG/cv637At8K1uIhTaVTZVER7RbgRwn4c/ETog=="}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_2.2.0_1685651744947_0.10156536379612713"},"_hasShrinkwrap":false},"2.2.1":{"name":"shaku","version":"2.2.1","description":"A simple and effective JavaScript game development framework that knows its place!","main":"./src/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"webpack"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"devDependencies":{"unminified-webpack-plugin":"^3.0.0","webpack":"^5.4.0","webpack-cli":"^4.10.0"},"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"b9166c91de7a271d900bce28a1a9ef8695678d5c","_id":"shaku@2.2.1","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-hOg1KDw4BRIWbXWfjk0f5aqttU8AsgH9Tk0yfHxh9WI0MCGY2XxiOAnlEPfiW+s6PGm3r6Of7/e4Oj/OZoaRqQ==","shasum":"7a9c23649280bae95d8d7b6830f0dbf1e45bd0be","tarball":"https://registry.npmjs.org/shaku/-/shaku-2.2.1.tgz","fileCount":479,"unpackedSize":14693666,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD87+mCVtijdoUuPIwr/AHnFje3fT0TPkyuolc6CZaICQIgVMKFBDu2bmDRAY4g957BgyDu7p3go4c9n2ZUHgfvLKU="}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_2.2.1_1685652438616_0.03451483295229396"},"_hasShrinkwrap":false},"2.2.2":{"name":"shaku","version":"2.2.2","description":"A simple and effective JavaScript game development framework that knows its place!","main":"./src/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"webpack"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"devDependencies":{"unminified-webpack-plugin":"^3.0.0","webpack":"^5.4.0","webpack-cli":"^4.10.0"},"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"c440c8436faf193f8c9491f9b9d3c13ffe794054","_id":"shaku@2.2.2","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-jP0Tvkt659gxzZhEmI3Gytbq2wJ+USJhU7fE3XT2iSTZGosLY2nwXcna2q4SlFZlfc1Wgi2B3Xbjh14gS0BdSw==","shasum":"fd7e5fc39281644996392ddb3aa92356c747bebe","tarball":"https://registry.npmjs.org/shaku/-/shaku-2.2.2.tgz","fileCount":479,"unpackedSize":14694381,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDhxvV5sRXSApyb2s2ocmIkXqXaZNXYUUj2PtqIsPp/PgIhALMcBTUBnYReWafavfx9r+mHOK1WQwqHS1BS3XeFgurY"}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_2.2.2_1685653188533_0.12329853008907898"},"_hasShrinkwrap":false},"2.2.3":{"name":"shaku","version":"2.2.3","description":"A simple and effective JavaScript game development framework that knows its place!","main":"./src/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"webpack"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"devDependencies":{"unminified-webpack-plugin":"^3.0.0","webpack":"^5.4.0","webpack-cli":"^4.10.0"},"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"e1feca349a01c93bc9c76e741757b919b8e3253e","_id":"shaku@2.2.3","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-ubGHv03dHH4mPpTTl6hUHzgVti6IhF492lQTXiNURAoSOc1vKWnizMp3rV5zDpqyZuNxqsg79Zid962mnuz1rA==","shasum":"de9daae363ae59477c48f4be0bc45fb2f2a3ea33","tarball":"https://registry.npmjs.org/shaku/-/shaku-2.2.3.tgz","fileCount":483,"unpackedSize":14737213,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDtgtvanYPtQ4QK3F0v5sleXRA7U8OZT2NH7sdIv9AjcQIhANiZmlVBqdf1CuxCKzDagaxYv3E/HuQ5cEIMsk5lVyRl"}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_2.2.3_1685906368042_0.044670345317833426"},"_hasShrinkwrap":false},"2.2.4":{"name":"shaku","version":"2.2.4","description":"A simple and effective JavaScript game development framework that knows its place!","main":"./src/index.js","types":"types/index","directories":{"doc":"docs","lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"webpack"},"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"devDependencies":{"unminified-webpack-plugin":"^3.0.0","webpack":"^5.4.0","webpack-cli":"^4.10.0"},"author":{"name":"Ronen Ness"},"license":"MIT","bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"homepage":"https://github.com/RonenNess/Shaku#readme","gitHead":"dc2120e77235dd16ef1d49658642d26f4a3bc7c4","_id":"shaku@2.2.4","_nodeVersion":"14.15.5","_npmVersion":"6.14.11","dist":{"integrity":"sha512-6A5n0ddXXtPDG81XpoWaMicmTZVu5KsSVBzD6y6N9jgxLU1OlNzyeoeeS1N0iPo5Jgok9An7qnUv67F/GnEMMg==","shasum":"d41c8396f3db63eccaec827162e2cd43483d189f","tarball":"https://registry.npmjs.org/shaku/-/shaku-2.2.4.tgz","fileCount":483,"unpackedSize":14768100,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnip9PtNRF6TmYn8WUlWXpReh92tlyv/b0TckwfNuAiAIgEnuQqDWfX4xW5Nmf94WqRjfQQMXoyNqN8KiSj2mopvk="}]},"_npmUser":{"name":"ronenness","email":"ronenness@gmail.com"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/shaku_2.2.4_1687810611484_0.8356155120160411"},"_hasShrinkwrap":false}},"time":{"created":"2022-01-13T20:08:46.373Z","1.0.0":"2022-01-13T20:08:46.854Z","modified":"2023-06-26T20:16:52.257Z","1.0.1":"2022-01-13T20:25:36.160Z","1.1.0":"2022-01-15T14:14:26.676Z","1.2.0":"2022-01-18T22:16:05.034Z","1.3.0":"2022-01-19T19:51:40.857Z","1.3.1":"2022-01-20T21:54:07.150Z","1.3.2":"2022-01-21T19:12:25.034Z","1.4.0":"2022-01-23T20:39:05.420Z","1.4.1":"2022-01-23T20:45:20.047Z","1.4.2":"2022-02-17T19:53:43.345Z","1.4.3":"2022-02-27T21:52:48.421Z","1.4.4":"2022-03-02T21:40:37.471Z","1.4.5":"2022-04-21T20:53:43.387Z","1.5.0":"2022-04-30T22:23:37.044Z","1.5.1":"2022-05-05T08:20:53.470Z","1.5.2":"2022-05-19T18:18:43.738Z","1.5.3":"2022-05-22T18:54:39.759Z","1.5.4":"2022-06-06T19:01:58.278Z","1.5.5":"2022-06-25T18:12:38.548Z","1.5.6":"2022-07-15T19:48:11.237Z","1.5.7":"2022-08-05T20:17:45.400Z","1.5.8":"2022-08-23T20:20:05.789Z","1.5.9":"2022-09-16T21:10:48.801Z","1.6.0":"2022-09-16T21:53:51.443Z","1.6.1":"2022-10-20T21:09:15.814Z","1.6.2":"2022-10-25T18:35:03.229Z","1.6.3":"2022-10-28T22:53:28.069Z","1.6.4":"2022-10-30T19:45:58.913Z","1.6.5":"2022-12-07T18:48:34.626Z","1.7.0":"2023-02-03T21:33:15.184Z","1.7.1":"2023-02-21T22:20:36.762Z","1.7.2":"2023-02-26T21:44:38.369Z","2.0.0":"2023-04-26T18:43:12.410Z","2.1.0":"2023-05-22T20:25:10.526Z","2.2.0":"2023-06-01T20:35:45.328Z","2.2.1":"2023-06-01T20:47:19.006Z","2.2.2":"2023-06-01T20:59:48.893Z","2.2.3":"2023-06-04T19:19:28.447Z","2.2.4":"2023-06-26T20:16:52.065Z"},"maintainers":[{"name":"ronenness","email":"ronenness@gmail.com"}],"description":"A simple and effective JavaScript game development framework that knows its place!","homepage":"https://github.com/RonenNess/Shaku#readme","keywords":["web","game","game","webgl","gamedev","canvas","rendering"],"repository":{"type":"git","url":"git+https://github.com/RonenNess/Shaku.git"},"author":{"name":"Ronen Ness"},"bugs":{"url":"https://github.com/RonenNess/Shaku/issues"},"license":"MIT","readme":"![Shaku JS](resources/logo-sm.png)\r\n\r\n### A simple and effective JavaScript game development framework *that knows its place*!\r\n\r\n**If you're looking for a package that implements rendering, sounds, assets and input, while keeping it low level and simple, this is the library for you!** \r\n\r\n(if you're looking for a game engine with editor like Unity, this library is not what you're looking for)\r\n\r\nDemos & docs:\r\n\r\n- [Online Demos](https://ronenness.github.io/Shaku/demo/index.html)\r\n- [Homepage](https://ronenness.github.io/Shaku/)\r\n- [Full API Docs](https://ronenness.github.io/Shaku/docs/index.html)\r\n\r\nProjects made with *Shaku*:\r\n\r\n- [HellEscape](https://store.steampowered.com/app/2135030/HellEscape/)\r\n- [Game Demo Project](https://ronenness.github.io/Shaku-Demo/)\r\n- [GridBender](https://knexator.itch.io/gridbender)\r\n- [Another Clone](https://knexator.itch.io/another-clone)\r\n- [Catalyst](https://knexator.itch.io/catalyst)\r\n- [King of Veggies](https://pinchazumos.itch.io/king-of-veggies)\r\n\r\n(Want your game listed above? Contact me at ronenness@gmail.com)\r\n\r\n# Table Of Content\r\n\r\n- [About](#about)\r\n  - [Features](#features)\r\n  - [Installation](#installation)\r\n- [Online Demo](#online-demo-projects)\r\n- [Using Shaku](#using-shaku)\r\n  - [Setup](#setup)\r\n  - [graphics](#graphics)\r\n  - [Sounds](#sounds)\r\n  - [Input](#input)\r\n  - [Assets](#assets)\r\n  - [Collision](#collision)\r\n  - [Utils](#utils)\r\n  - [Miscellaneous](#miscellaneous)\r\n- [Advanced Topics](#advanced-topics)\r\n  - [Shaku on NodeJS](#shaku-on-nodejs)\r\n- [Build Shaku](#build-shaku)\r\n- [Changes](#changes)\r\n- [License](#license)\r\n\r\n# About\r\n\r\n*Shaku* is a JavaScript framework for web games development that emphasize **simplicity**, **flexibility** and **freedom**.\r\n\r\nIt's pretty low level and designed to be used as the foundations for a higher-level game engine, or used directly for game development. Kind of like MonoGame, RayLib or libGDX.\r\n\r\nLet's take a quick look at how we make a game main loop with *Shaku*:\r\n\r\n```js\r\n// Init code goes here, we'll review it later..\r\n\r\n// main loop (do updates, render and request next step)\r\nfunction step() \r\n{  \r\n    // start a new frame and clear screen\r\n    Shaku.startFrame();\r\n    Shaku.gfx.clear(Shaku.utils.Color.cornflowerblue);\r\n\r\n    // draw a sprite using the spritebatch\r\n    spritesBatch.begin();\r\n    let position = new Shaku.utils.Vector2(400, 300);\r\n    let size = new Shaku.utils.Vector2(100, 100);\r\n    spritesBatch.drawQuad(texture, position, size);\r\n    spritesBatch.end();\r\n\r\n\r\n    // end frame and request next step\r\n    Shaku.endFrame();\r\n    Shaku.requestAnimationFrame(step);\r\n}\r\n```\r\n\r\n## Main Features\r\n\r\n*Shaku* provides the following key features:\r\n\r\n* Ultra-fast WebGL rendering engine.\r\n* Assets loader to fetch textures, sounds, music, JSON, and other resources.\r\n* Texture Atlas builder to combine textures efficiently at runtime.\r\n* Collision detection.\r\n* Custom effects, text rendering, render targets, batching and other graphics-essentials.\r\n* Input manager for simple touch, mouse, gamepad and keyboard *state-based* input (instead of events).\r\n* Sound effects, music, tracks mixer, pitch and everything you need for sfx.\r\n* Basic utilities such as Vectors, Matrices, 2D Shapes, GameTime and more.\r\n* Advance utilities such as Animators, Path Finder, Perlin generator and other super useful stuff.\r\n* *All packed in a tiny lib with no external dependencies*! A single minified 150Kb JS is all you need to use Shaku.*\r\n\r\n\r\nIf you want to experiment with *Shaku* while reading the docs, you can check out this [Sandbox Demo](https://ronenness.github.io/Shaku/demo/sandbox.html). \r\nSee the [demos assets](demo/assets) folder to see which assets you can use for the sandbox (or load assets from external sources).\r\n\r\n![Sandbox](resources/sandbox.jpg)\r\n\r\n\r\n## Installation\r\n\r\nUsing *Shaku* is super easy! \r\n\r\n1. Get `shaku.js` or `shaku.min.js` from the `dist/` folder and include it in your page (or use npm to get it).\r\n2. Init *Shaku* and append the canvas to your document (or init *Shaku* on an existing canvas).\r\n3. Write a game loop method starting with `Shaku.startFrame()` and ending with `Shaku.endFrame()` and `requestAnimationFrame()` to get next frame.\r\n\r\nTo get *Shaku* via NPM:\r\n\r\n```npm install shaku```\r\n\r\n### HTML Boilerplate\r\n\r\nThe following is a boilerplate HTML with *Shaku* running an empty game main loop:\r\n\r\n```html\r\n<!DOCTYPE html>\r\n<html>\r\n  <head>\r\n    <title>Shaku Example</title>\r\n    <script src=\"dist/shaku.js\"></script>\r\n  </head>\r\n  <body>\r\n      <script>\r\n        (async function runGame()\r\n        {\r\n          // init shaku\r\n          await Shaku.init();\r\n\r\n          // add shaku's canvas to document and set resolution to 800x600\r\n          document.body.appendChild(Shaku.gfx.canvas);\r\n          Shaku.gfx.setResolution(800, 600, true);\r\n\r\n          // TODO: LOAD ASSETS AND INIT GAME LOGIC HERE\r\n\r\n          // do a single main loop step and request next step inside\r\n          function step() \r\n          {  \r\n            // start a new frame and clear screen\r\n            Shaku.startFrame();\r\n            Shaku.gfx.clear(Shaku.utils.Color.cornflowerblue);\r\n\r\n            // TODO: PUT YOUR GAME UPDATES AND RENDERING HERE\r\n\r\n            // end frame and invoke the next step in 60 FPS rate (or more, depend on machine and browser)\r\n            Shaku.endFrame();\r\n            Shaku.requestAnimationFrame(step);\r\n          }\r\n\r\n          // start the main loop\r\n          step();\r\n        })();\r\n      </script>\r\n  </body>\r\n</html>\r\n```\r\n\r\nYou can find the above HTML file [here](html_boilerplate.html).\r\n\r\n# Online Demo Projects\r\n\r\nOnline demo projects can be found [here](https://ronenness.github.io/Shaku/demo/index.html). \r\nThey demonstrate basic to advanced *Shaku* features.\r\n\r\n![Demo-2](resources/demo-2.png)\r\n\r\n# Using Shaku\r\n\r\n*Shaku*'s API mostly consist of five main managers, each solve a different domain of problems in gamedev: *graphics*, *sounds*, *assets*, *collision* and *input*.\r\n\r\nIn this doc we'll explore these managers and cover the most common use cases with them.\r\nIf you want to dive deep into the API, you can check out the [API Docs](docs/index.md), or browse the code.\r\n\r\n\r\n## Setup\r\n\r\nEverything in *Shaku* is located under the `Shaku` object. \r\n\r\nSince the initialization process and asset loading is mostly asynchronous operations, its best to wrap the init code in an `async` method and utilize `await` calls to simplify the code. A common *Shaku* initialization code will look something like this:\r\n\r\n```js\r\n(async function runGame()\r\n{\r\n    // init shaku.\r\n    // for pixel art games its best to set antialias=false before init.\r\n    Shaku.gfx.setContextAttributes({antialias: false});\r\n    await Shaku.init();\r\n\r\n    // add shaku's canvas to document and set resolution to 800x600.\r\n    // this will set the canvas and renderer size.\r\n    document.body.appendChild(Shaku.gfx.canvas);\r\n    Shaku.gfx.setResolution(800, 600, true);\r\n\r\n    // TODO: add code to load assets and init game logic here.\r\n\r\n    // game main loop\r\n    function step() \r\n    {  \r\n        // start frame and clear the screen\r\n        Shaku.startFrame();\r\n        Shaku.gfx.clear(Shaku.utils.Color.cornflowerblue);\r\n\r\n        // TODO: add game logic code here\r\n\r\n        Shaku.endFrame();\r\n        Shaku.requestAnimationFrame(step);\r\n    }\r\n    step();\r\n})();\r\n```\r\n\r\nLet's go over the code above line by line:\r\n\r\n* `Shaku.gfx.setContextAttributes({antialias: false})` will disable smooth filtering, and keep everything crispy and pixelated.\r\n* `await Shaku.init()` will initialize all *Shaku*'s managers. \r\n* `document.body.appendChild(Shaku.gfx.canvas)` add the canvas created by *Shaku* to the document body (you can also use an existing canvas instead).\r\n* `Shaku.gfx.setResolution(800, 600, true)` will set both canvas size and renderer size to 800x600 px.\r\n* `Shaku.startFrame()` must be called at the beginning of every game frame.\r\n* `Shaku.gfx.clear(Shaku.utils.Color.cornflowerblue)` will clear the canvas to blue-ish color.\r\n* `Shaku.endFrame()` must be called at the end of every game frame.\r\n* `Shaku.requestAnimationFrame(step)` will request next frame when its time to render screen again, keeping updates() rate at about 60 FPS (or more if the browser and machine allows it).\r\n\r\nAs you can see from the example above, our step() method represent a single iteration in our game main loop. \r\nIt handles both rendering and updates.\r\n\r\nNow we can start using *Shaku*'s managers, mostly between the `startFrame()` and `endFrame()` calls.\r\n\r\n\r\n## Graphics\r\n\r\nLet's start exploring the APIs from the graphics manager, accessed by `Shaku.gfx`.\r\n\r\nIn *Shaku* we use batches to render everything. \r\nThese batches collect multiple draw calls and batch them together into a single GPU call.\r\nThis way of rendering is essential for performance, but it has some limitations. For example, you can only only batch rendering with the same texture, blend mode, and shaders.\r\n\r\nThis doc don't cover the entirely of the API, only the main parts of it. \r\nTo see the full API, check out the [API docs](docs/gfx_gfx.md).\r\n\r\n### Drawing Textures\r\n\r\nTo draw textures (also known as 2d sprites) we use a `SpriteBatch` renderer.\r\nThis renderer batch together 2d quads and other shapes with textures on them. \r\n\r\nLet's see a minimal code example to render a texture on screen:\r\n\r\n```js\r\n// this part comes after we init shaku, but still outside the main loop:\r\n\r\n// during the init phase, we create a spritebatch and load a texture to draw\r\nconst texture = await Shaku.assets.loadTexture('<your texture path here..>');\r\nconst spriteBatch = new Shaku.gfx.SpriteBatch();\r\n\r\n// this part comes between the Shaku.startFrame() and the Shaku.endFrame() calls:\r\n\r\n// draw the texture with the batch\r\nspritesBatch.begin();\r\nlet position = new Shaku.utils.Vector2(400, 300);\r\nlet size = new Shaku.utils.Vector2(100, 100);\r\nspritesBatch.drawQuad(texture, position, size);\r\nspritesBatch.end();\r\n```\r\n\r\nPretty simple, eh?\r\nNow let's draw with some more parameters:\r\n\r\n```js\r\nspritesBatch.begin();\r\nlet position = new Shaku.utils.Vector2(100, 125);\r\nlet size = new Shaku.utils.Vector2(32, 64);\r\nlet sourceRect = new Shaku.utils.Rectangle(32, 0, 32, 64);\r\nlet color = Shaku.utils.Color.red;\r\nlet rotation = Math.PI / 2;\r\nlet origin = new Shaku.utils.Vector2(0.5, 1);\r\nlet skew = new Shaku.utils.Vector2(32, 0);\r\nShaku.gfx.drawQuad(texture, position, size, sourceRect, color, rotation, origin, skew);\r\nspritesBatch.end();\r\n```\r\n\r\nWhen beginning a batch, you can set different blend modes and effects. For example:\r\n\r\n```js\r\nspritesBatch.begin(Shaku.gfx.BlendModes.Additive, myCustomEffect);\r\n```\r\n\r\nWe'll learn more about effects later, don't worry about it for now.\r\n\r\nA simple rendering demo can be found [here](https://ronenness.github.io/Shaku/demo/gfx_draw.html).\r\n\r\n#### When does a GPU draw call is made?\r\n\r\nThe `SpriteBatch` will call the GPU to draw everything on three different occasions:\r\n\r\n1. When `spritesBatch.end()` is called.\r\n2. When you change the texture.\r\n3. If the batch overflows and can't contain any more drawings.\r\n\r\nAs you can see number #2 is something we need to watch out for. Texture Atlases are great way to reduce draw calls, and when possible, you should sort your rendering order by textures. We'll learn more about Texture Atlases later.\r\n\r\nTo learn more about Sprite Batches and see what else you can do with them, its recommended to check out the docs. For example you can control pixel aligning, buffers size, how to handle overflow, etc.\r\n\r\n\r\n#### Sprites\r\n\r\n`Sprites` are entities that store all rendering parameters required to make a draw call. \r\nIt's just a more object-based approach to draw stuff. \r\n\r\nLets create a sprite and set some of its fields:\r\n\r\n```js\r\n// this part comes after we init shaku, but still outside the main loop:\r\n\r\n// load texture and create sprite\r\nlet texture = await Shaku.assets.loadTexture('assets/my_texture.png');\r\nlet sprite = new Shaku.gfx.Sprite(texture);\r\n\r\n// set some fields\r\nsprite.position.set(100, 125);\r\nsprite.size.set(32, 64);\r\nsprite.sourceRectangle = new Shaku.utils.Rectangle(32, 0, 32, 64);\r\nsprite.color = Shaku.utils.Color.red;\r\nsprite.rotation = Math.PI / 2;\r\nsprite.origin.set(0.5, 1);\r\n\r\n// this part comes between the Shaku.startFrame() and the Shaku.endFrame() calls:\r\n\r\n// draw the sprite in a sprite batch\r\nspritesBatch.begin();\r\nShaku.gfx.drawSprite(sprite);\r\nspritesBatch.end();\r\n```\r\n\r\n#### Sprites Group\r\n\r\nAs the name implies, a sprites group is a collection of sprites.\r\nLet's see how we use it:\r\n\r\n```js\r\n// this part comes after we init shaku, but still outside the main loop:\r\n\r\n// create a group\r\nlet group = new Shaku.gfx.SpritesGroup();\r\n\r\n// set group position, scale and rotation\r\n// these transformations will affect all sprites in group\r\ngroup.position.set(100, 100);\r\ngroup.rotation = Math.PI / 2;\r\ngroup.scale.set(2, 2);\r\n\r\n// add some sprites to the group\r\nlet texture = await Shaku.assets.loadTexture('assets/my_texture.png');\r\nfor (let i = 0; i < 3; ++i) {\r\n  let sprite = new Shaku.gfx.Sprite(texture);\r\n  sprite.position = new Shaku.utils.Vector2(i * 100, 0);\r\n  sprite.size = new Shaku.utils.Vector2(50, 50);\r\n  sprite.origin = new Shaku.utils.Vector2(0, 0);\r\n  group.add(sprite);\r\n}\r\n\r\n// this part comes between the Shaku.startFrame() and the Shaku.endFrame() calls:\r\n\r\n// draw group\r\nspritesBatch.begin();\r\nShaku.gfx.drawSpriteGroup(group);\r\nspritesBatch.end();\r\n```\r\n\r\nThe advantage of groups is that you can apply common transformations on all the sprites in the group around the same origin point. Its also slightly more efficient in some cases.\r\n\r\nA demo page that draw with sprites group can be found [here](https://ronenness.github.io/Shaku/demo/gfx_sprites_group.html).\r\n\r\n\r\n### Drawing 3D Sprites\r\n\r\n*Shaku* provides a simple 3D Sprite Batch renderer. \r\nThis is useful for simple 3D stuff like this:\r\n\r\n![3D Sprites](resources/demo-3.png)\r\n\r\nLet's take a look at a basic 3D sprites example:\r\n\r\n```js\r\n// this part comes after we init shaku, but still outside the main loop:\r\n\r\n// create a 3d sprite and set a default perspective camera.\r\n// check out setPerspectiveCamera() arguments to see more options.\r\nlet spritesBatch3d = new Shaku.gfx.SpriteBatch3D();\r\nspritesBatch3d.setPerspectiveCamera();\r\n\r\n// this part comes between the Shaku.startFrame() and the Shaku.endFrame() calls:\r\n\r\n// begin drawing 3d sprites\r\nspritesBatch3d.begin();\r\n\r\n// set view matrix (camera position and where we look at)\r\nspritesBatch3d.setViewLookat(\r\n  new Shaku.utils.Vector3(0, 500, 600), \r\n  new Shaku.utils.Vector3(0, 0, 0)\r\n);\r\n\r\n// draw 3d quad from 4 vertices\r\nconst v1 = (new Shaku.gfx.Vertex())\r\n          .setPosition(new Shaku.utils.Vector3(-spriteSize.x / 2, 0, 0))\r\n          .setTextureCoords(new Shaku.utils.Vector2(0, 1));\r\nconst v2 = (new Shaku.gfx.Vertex())\r\n          .setPosition(new Shaku.utils.Vector3(spriteSize.x / 2, 0, 0))\r\n          .setTextureCoords(new Shaku.utils.Vector2(1, 1));\r\nconst v3 = (new Shaku.gfx.Vertex())\r\n          .setPosition(new Shaku.utils.Vector3(-spriteSize.x / 2, spriteSize.y, 0))\r\n          .setTextureCoords(new Shaku.utils.Vector2(0, 0));\r\nconst v4 = (new Shaku.gfx.Vertex())\r\n          .setPosition(new Shaku.utils.Vector3(spriteSize.x / 2, spriteSize.y, 0))\r\n          .setTextureCoords(new Shaku.utils.Vector2(1, 0));\r\nspritesBatch3d.drawVertices(texture, [v1, v2, v3, v4]);\r\n\r\n// end rendering\r\nspritesBatch3d.end();\r\n```\r\n\r\n### Drawing Shapes\r\n\r\n*Shaku* also provides a way to draw some basic 2D shapes:\r\n\r\n```js\r\n// this part comes after we init shaku, but still outside the main loop:\r\n\r\n// create shapes batch to render 2d shapes\r\nlet shapesBatch = new Shaku.gfx.ShapesBatch();\r\n\r\n// this part comes between the Shaku.startFrame() and the Shaku.endFrame() calls:\r\n\r\n// start drawing shapes\r\nshapesBatch.begin();\r\n\r\n// draw a circle in the center of screen with radius of 400. its center is red, its outter parts are blue, and it has 32 segments.\r\nshapesBatch.drawCircle(new Shaku.utils.Circle(Shaku.gfx.getCanvasSize().div(2), 400), Shaku.utils.Color.red, 32, Shaku.utils.Color.blue);\r\n\r\n// draw a rectangle at offset 100,100 and size 256,256, with red color, that rotates over time\r\nlet rotation = Shaku.gameTime.elapsed;\r\nshapesBatch.drawRectangle(new Shaku.utils.Rectangle(100, 100, 256, 256), Shaku.utils.Color.red, rotation);\r\n\r\n// draw everything on screen\r\nshapesBatch.end();\r\n```\r\n\r\nSimilar to `ShapesBatch`, there's also a `LinesBatch` renderer to draw just the outline of shapes (or a string of lines from vertices).\r\n\r\n\r\n### Drawing Text\r\n\r\n*Shaku* support rendering text from *Font Texture* (also known as Bitmap Fonts). \r\nThese fonts store the glyphs as pixels data, and render the text as sprites.\r\n\r\nYou don't need to prepare the Font Textures upfront; *Shaku* generates them at runtime from regular TTF fonts.\r\nFor example, *Shaku* generated the following font texture for one of the [online demos](https://ronenness.github.io/Shaku/demo/gfx_draw_text.html):\r\n\r\n![font texture](resources/font-texture.png)\r\n\r\nLet's take a look at how we generate a Sprite Font and render some text with it:\r\n\r\n```js\r\n// this part comes after we init shaku, but still outside the main loop:\r\n\r\n// load font texture\r\n// note: the fontName argument MUST match the font name defined in the ttf file.\r\nlet fontTexture = await Shaku.assets.loadFontTexture('assets/DejaVuSansMono.ttf', {fontName: 'DejaVuSansMono'});\r\n\r\n// create text sprite batch\r\nlet textSpriteBatch = new Shaku.gfx.TextSpriteBatch();\r\n\r\n// generate a text group to render in white, aligned to the left, and positioned at 100,100.\r\nlet textGroup = Shaku.gfx.buildText(fontTexture, \"Hello World!\\nThis is second line.\", 24, Shaku.utils.Color.white, Shaku.gfx.TextAlignments.Left);\r\ntextGroup.position.set(100, 100);\r\n\r\n// this part comes between the Shaku.startFrame() and the Shaku.endFrame() calls:\r\n\r\n// draw the text\r\ntextSpriteBatch.begin();\r\ntextSpriteBatch.drawText(textGroup);\r\ntextSpriteBatch.end();\r\n\r\n// you can also draw the text with outlines:\r\ntextSpriteBatch.outlineWeight = 0.75;\r\ntextSpriteBatch.outlineColor = Shaku.utils.Color.black;\r\ntextSpriteBatch.begin();\r\ntextSpriteBatch.drawText(textGroup);\r\ntextSpriteBatch.end();\r\n```\r\n\r\nWhen loading the `FontTexture` you can provide additional parameters, to learn more about them check out the [API Docs](docs/assets_font_texture_asset.md).\r\n\r\nNote that *Shaku* also support hi-res MSDF Font Textures, but it can't generate them at runtime.\r\nTo see how to use MSDF font textures, check out [this demo](https://ronenness.github.io/Shaku/demo/gfx_draw_text_msdf.html).\r\n\r\n### Render Targets\r\n\r\nRender Targets provide a way to draw *on textures* instead of directly on screen, and then draw these textures on screen. This technique is useful for post processing effects, or to implement virtual resolution (by drawing on a constant-sized texture and then present it on screen).\r\n\r\nFor example [the following game](https://store.steampowered.com/app/2135030/HellEscape/) is built with *Shaku*, and uses Render Targets to implement the 2D lightings you see here:\r\n\r\n![HellEscape](resources/hellescape.png)\r\n\r\nA render target in essence is just a texture asset you can draw on, created like this:\r\n\r\n```js\r\nlet renderTarget = await Shaku.assets.createRenderTarget('_my_render_target', width, height);\r\n```\r\n\r\nThen you can start drawing on it by setting it as the active render target:\r\n\r\n```js\r\n// set render target\r\nShaku.gfx.setRenderTarget(renderTarget);\r\n\r\n// draw some stuff here... \r\n// these renderings will appear on the texture instead of the canvas.\r\n\r\n// reset render target so we can continue drawing on screen / canvas\r\nShaku.gfx.setRenderTarget(null);\r\n```\r\n\r\nAnd finally we can use the render target just like we would use any other texture:\r\n\r\n```js\r\nspritesBatch.begin();\r\nlet position = new Shaku.utils.Vector2(400, 300);\r\nlet size = new Shaku.utils.Vector2(100, 100);\r\nspritesBatch.drawQuad(renderTarget, position, size);\r\nspritesBatch.end();\r\n```\r\n\r\nA demo that uses render targets can be found [here](https://ronenness.github.io/Shaku/demo/gfx_render_target.html).\r\n\r\n### Cameras\r\n\r\nThe camera object define two key properties: \r\n\r\n- Viewport: the region of the canvas we render on. \r\n- Projection: offset and scale of everything we draw on the canvas.\r\n\r\nBy default, *Shaku* will use a camera with no offset and scale of x1, and a viewport that covers the entire canvas. In other words, an identity camera that won't affect anything.\r\n\r\nTo change the default camera:\r\n\r\n```js\r\n// create camera object\r\nlet camera = Shaku.gfx.createCamera();\r\n\r\n// set offset and use the camera (call this before rendering)\r\ncamera.orthographicOffset(cameraOffset);\r\nShaku.gfx.applyCamera(camera);\r\n```\r\n\r\nAnd if later you want to reset camera back to default, you can call the following method:\r\n\r\n```js\r\nShaku.gfx.resetCamera();\r\n```\r\n\r\nFor more details, check out the [Camera object API](docs/gfx_camera.md) in the docs.\r\n\r\nA demo page that uses cameras can be found [here](https://ronenness.github.io/Shaku/demo/miscs_tilemap.html).\r\n\r\n### Texture Atlas\r\n\r\nEvery time you change the texture, a draw call is made to the GPU. This means that if you render 100 different textures in a row you will suffer 100 GPU draw calls (and 100 textures switching), which is very ineffective in terms of performance.\r\n\r\nTo solve this issue video games often use a *Texture Atlas*, which is a single large texture containing multiple smaller textures. That way, we can reduce texture switching and draw calls.\r\n\r\nCreating a Texture Atlas manually is a tedious work, and as you add more and more textures sometimes you end up with inconvenient 'holes' that makes the atlas less space-efficient. For that reason, *Shaku* has a built-in Atlas builder that helps you generate an efficient Texture Atlas at runtime:\r\n\r\n```js\r\n// all source textures URLs\r\nconst sourceUrls = [\r\n    'assets/stone_wall.png',\r\n    'assets/grass.png',\r\n    'assets/tree.png',\r\n    ...\r\n];\r\n\r\n// create a texture atlas named 'my-texture-atlas'.\r\n// you can also limit its dimensions if needed to.\r\nlet textureAtlas = await Shaku.assets.createTextureAtlas('my-texture-atlas', sourceUrls);\r\n\r\n// then you can use the texture atlas like this:\r\n\r\n// extract one of the textures\r\n// textureInAtlas is an object with `texture` and `sourceRectangle`.\r\nlet textureInAtlas = textureAtlas.getTexture('assets/stone_wall.png');\r\n\r\n// draw the texture at 100,100\r\nlet size = textureInAtlas.sourceRectangle.getSize();\r\nspritesBatch.begin();\r\nspritesBatch.drawQuad(textureInAtlas, new Shaku.utils.Vector2(100, 100), size);\r\nspritesBatch.end();\r\n```\r\n\r\nNote that a texture atlas is not necessarily a single texture; Since there's a GPU limit for max textures size, the atlas may generate more than one texture. That's why when you call `getTexture()` the object don't return just source rectangle, but a texture asset as well.\r\n\r\n\r\n### Effects\r\n\r\nEffects provide a way to change the shaders *Shaku* uses to draw textures and shapes.\r\n\r\nWhen implementing an effect, you need to follow four steps:\r\n\r\n1. Write or use an existing *vertex shader code*.\r\n2. Write or use an existing *fragment shader code*.\r\n3. Define your shaders Uniforms.\r\n4. Define your shaders Attributes.\r\n\r\nAnd optionally, you can instruct *Shaku* to use custom attributes and uniforms internally, so you won't need to explicitly set them. More on that later.\r\n\r\nLets write a simple custom effect and then review and explain the code:\r\n\r\n```js\r\n// define a custom effect\r\nclass MyEffect extends Shaku.gfx.SpritesEffect\r\n{\r\n    /**\r\n     * Override the fragment shader for our custom effect.\r\n     */\r\n    get fragmentCode()\r\n    {\r\n      const fragmentShader = `  \r\n            #ifdef GL_ES\r\n                precision highp float;\r\n            #endif\r\n\r\n            uniform sampler2D mainTexture;\r\n            uniform float elapsedTime;\r\n\r\n            varying vec2 v_texCoord;\r\n            varying vec4 v_color;\r\n\r\n            void main(void) {\r\n                gl_FragColor = texture2D(mainTexture, v_texCoord) * v_color;\r\n                gl_FragColor.r *= sin(v_texCoord.y * 10.0 + elapsedTime) + 0.1;\r\n                gl_FragColor.g *= sin(1.8 + v_texCoord.y * 10.0 + elapsedTime) + 0.1;\r\n                gl_FragColor.b *= sin(3.6 + v_texCoord.y * 10.0 + elapsedTime) + 0.1;\r\n                gl_FragColor.rgb *= gl_FragColor.a;\r\n            }\r\n        `; \r\n        return fragmentShader;\r\n    }\r\n\r\n    /**\r\n     * Override the uniform types dictionary to add our custom uniform type.\r\n     */\r\n    get uniformTypes()\r\n    {\r\n      let ret = super.uniformTypes;\r\n      ret['elapsedTime'] = { type: Shaku.gfx.Effect.UniformTypes.Float };\r\n      return ret;\r\n    }\r\n}\r\n```\r\n\r\nBefore reading on, can you guess what this effect do?\r\n\r\nThis effect recieve *elapsed time* as a uniform (called 'elapsedTime') with type `flot`, and animate the texture colors based on the current time value. Since every component gets a different offset from the start, it will create a rainbow-like colors effect.\r\n\r\n![Custom Effects](resources/custom_effects.png)\r\n\r\nA demo page with the above effect can be found [here](https://ronenness.github.io/Shaku/demo/gfx_custom_effects.html).\r\n\r\nNow lets review the code.\r\n\r\n1. First, notice we're extending the `Shaku.gfx.SpritesEffect` class. This is the default effect *Shaku* uses for sprites, and by inheriting from it we can skip implementing the vertex shader and just use the default one. It also covers the basic attributes binding for vertices data. If you want to create a brand new effect that doesn't use anything from the built-in sprites effect, extend `Shaku.gfx.Effect` instead.\r\n2. Next we have `get fragmentCode()`, that returns the fragment shader code to compile for this effect. There is also a `get fragmentCode()` getter for the vertex shader code, but as mentioned earlier we relay on the default sprites vertex shader so we don't need to implement it.\r\n4. And finally, `get uniformTypes()` returns a dictionary with uniforms we want to set in the effect. Note that we do `let ret = super.uniformTypes;` to extend the base class uniforms so we won't miss out on any functionality from the basic effect.\r\n\r\nNow we can start using this effect with our Sprites Batch:\r\n\r\n```js\r\n// create the custom effect\r\nlet effect = new MyEffect();\r\n\r\n// update effect elapsed time and render with it\r\n// the setter `effect.uniforms.elapsedTime` exists because we defined it in `get uniformTypes()`\r\neffect.uniforms.elapsedTime(Shaku.gameTime.elapsed);\r\nspritesBatch.begin(undefined, effect);\r\nspritesBatch.drawQuad(texture, new Shaku.utils.Vector2(100, 100), 400);\r\nspritesBatch.end();\r\n```\r\n\r\n#### Default Effect\r\n\r\nTo learn more about effects, lets review the [default built-in effect](https://github.com/RonenNess/Shaku/blob/main/src/gfx/effects/sprites.js) *Shaku* normally uses for sprites with vertex color:\r\n\r\n```js\r\n// vertex shader code\r\nconst vertexShader = `\r\nattribute vec3 position;\r\nattribute vec2 uv;\r\nattribute vec4 color;\r\n\r\nuniform mat4 projection;\r\nuniform mat4 world;\r\n\r\nvarying vec2 v_texCoord;\r\nvarying vec4 v_color;\r\n\r\nvoid main(void) {\r\n    gl_Position = projection * world * vec4(position, 1.0);\r\n    gl_PointSize = 1.0;\r\n    v_texCoord = uv;\r\n    v_color = color;\r\n}\r\n    `;\r\n\r\n// fragment shader code\r\nconst fragmentShader = `  \r\n#ifdef GL_ES\r\n    precision highp float;\r\n#endif\r\n\r\nuniform sampler2D mainTexture;\r\n\r\nvarying vec2 v_texCoord;\r\nvarying vec4 v_color;\r\n\r\nvoid main(void) {\r\n    gl_FragColor = texture2D(mainTexture, v_texCoord) * v_color;\r\n    gl_FragColor.rgb *= gl_FragColor.a;\r\n}\r\n    `;\r\n\r\n/**\r\n * Default basic effect to draw 2d sprites.\r\n */\r\nclass SpritesEffect extends Effect\r\n{\r\n    /** @inheritdoc */\r\n    get vertexCode() \r\n    { \r\n        return vertexShader; \r\n    }\r\n\r\n    /** @inheritdoc */\r\n    get fragmentCode()\r\n    { \r\n        return fragmentShader;\r\n    }\r\n\r\n    /** @inheritdoc */\r\n    get uniformTypes()\r\n    {\r\n        return {\r\n            [Effect.UniformBinds.MainTexture]: { type: Effect.UniformTypes.Texture, bind: Effect.UniformBinds.MainTexture },\r\n            [Effect.UniformBinds.Projection]: { type: Effect.UniformTypes.Matrix, bind: Effect.UniformBinds.Projection },\r\n            [Effect.UniformBinds.World]: { type: Effect.UniformTypes.Matrix, bind: Effect.UniformBinds.World },\r\n            [Effect.UniformBinds.View]: { type: Effect.UniformTypes.Matrix, bind: Effect.UniformBinds.View }\r\n        };\r\n    }\r\n\r\n    /** @inheritdoc */\r\n    get attributeTypes()\r\n    {\r\n        return {\r\n            [Effect.AttributeBinds.Position]: { size: 3, type: Effect.AttributeTypes.Float, normalize: false, bind: Effect.AttributeBinds.Position },\r\n            [Effect.AttributeBinds.TextureCoords]: { size: 2, type: Effect.AttributeTypes.Float, normalize: false, bind: Effect.AttributeBinds.TextureCoords },\r\n            [Effect.AttributeBinds.Colors]: { size: 4, type: Effect.AttributeTypes.Float, normalize: false, bind: Effect.AttributeBinds.Colors },\r\n        };\r\n    }\r\n}\r\n```\r\n\r\nAs you can see above we use *attributes* for vertices data (position, texture coords, and colors), and uniforms for texture and transformation matrices (projection, world, and view).\r\n\r\n**Binds**\r\n\r\nYou may have noticed an additional parameter added to the attributes and uniforms: `bind`.\r\n\r\nBinding is a way for us to tell *Shaku* how to handle attributes and uniforms we want to use for basic stuff, like vertices color or texture coords, so that *Shaku* can set these values internally when preparing the batch. \r\n\r\nFor example, when we added the bind `Effect.AttributeBinds.Position` to the attributes named `[Effect.AttributeBinds.Position]`, we instructed *Shaku* to send the vertices position data into this attribute from our vertex shader, which is called `position`. \r\n\r\nIf you want to define an effect and call this attribute a different name, for example 'attr_vertexPos', you can just set it like this in your effect:\r\n\r\n`attr_vertexPos: { size: 3, type: Effect.AttributeTypes.Float, normalize: false, bind: Effect.AttributeBinds.Position },`\r\n\r\n**The following binds are valid for uniform types**:\r\n\r\n- *MainTexture*: bind uniform to be used as the main texture.\r\n- *Color*: bind uniform to be used as a main color.\r\n- *Projection*: bind uniform to be used as the projection matrix.\r\n- *World*: bind uniform to be used as the world matrix.\r\n- *View*: bind uniform to be used as the view matrix.\r\n- *UvOffset*: bind uniform to be used as UV offset.\r\n- *UvScale*: bind uniform to be used as UV scale.\r\n- *OutlineWeight*: bind uniform to be used as outline weight.\r\n- *OutlineColor*: bind uniform to be used as outline color.\r\n- *UvNormalizationFactor*: bind uniform to be used as factor to normalize uv values to be 0-1.\r\n- *TextureWidth*: bind uniform to be used as texture width in pixels.\r\n- *TextureHeight*: bind uniform to be used as texture height in pixels.\r\n\r\n**And the following binds are valid for attribute types**:\r\n\r\n- *Position*: bind attribute to be used for vertices position array.\r\n- *TextureCoords*: bind attribute to be used for texture coords array.\r\n- *Colors*: bind attribute to be used for vertices colors array.\r\n\r\nAnything else, you'll just need to set yourself.\r\n\r\n\r\n### Matrices\r\n\r\nMatrices are used to transform vertices. They can express rotation, scale, translation, and camera view and projection.\r\n\r\nYou can access the Matrix class with `Shaku.gfx.Matrix`. \r\nLet's take a look at a basic example of using a matrix to move the position of 3d vertices:\r\n\r\n```js\r\n// create vertices\r\nconst spriteSize = new Shaku.utils.Vector2(spriteTexture.width * 1.5, spriteTexture.height * 1.5);\r\nconst v1 = (new Shaku.gfx.Vertex())\r\n          .setPosition(new Shaku.utils.Vector3(-spriteSize.x / 2, 0, 0))\r\n          .setTextureCoords(new Shaku.utils.Vector2(0, 1));\r\nconst v2 = (new Shaku.gfx.Vertex())\r\n          .setPosition(new Shaku.utils.Vector3(spriteSize.x / 2, 0, 0))\r\n          .setTextureCoords(new Shaku.utils.Vector2(1, 1));\r\nconst v3 = (new Shaku.gfx.Vertex())\r\n          .setPosition(new Shaku.utils.Vector3(-spriteSize.x / 2, spriteSize.y, 0))\r\n          .setTextureCoords(new Shaku.utils.Vector2(0, 0));\r\nconst v4 = (new Shaku.gfx.Vertex())\r\n          .setPosition(new Shaku.utils.Vector3(spriteSize.x / 2, spriteSize.y, 0))\r\n          .setTextureCoords(new Shaku.utils.Vector2(1, 0));\r\n\r\n// create a translation matrix\r\nconst position = new Shaku.utils.Vector3(10, 100, 50);\r\nconst matrix = Shaku.gfx.Matrix.translate(position.x, position.y, position.z);\r\n\r\n// transform the vertices with the matrix and draw them in a 3d batch\r\nconst vertices = [Shaku.gfx.Matrix.transformVertex(matrix, v1), \r\n                  Shaku.gfx.Matrix.transformVertex(matrix, v2), \r\n                  Shaku.gfx.Matrix.transformVertex(matrix, v3), \r\n                  Shaku.gfx.Matrix.transformVertex(matrix, v4)];\r\nspritesBatch3d.begin();\r\nspritesBatch3d.drawVertices(spriteTexture, vertices);\r\nspritesBatch3d.end();\r\n```\r\n\r\nTo learn more about matrices, check out the [API docs](docs/gfx_matrix.md).\r\n\r\n\r\n### Conclusion\r\n\r\nIn this chapter we learned about the `Gfx` manager and how to use it to create batches and render basic things. What we covered here is just the common use cases, to learn more about what you can draw with *Shaku* check out the [online demos](https://ronenness.github.io/Shaku/demo/index.html) or the [online docs](https://ronenness.github.io/Shaku/docs/index.html).\r\n\r\n## Sounds\r\n\r\nWe finally reached our second manager, the sounds manager, which is accessed by `Shaku.sfx`.\r\n\r\nThis doc don't cover the entirely of the API, only the main parts of it. To see the full API, check out the [API docs](docs/sfx_sfx.md).\r\n\r\n\r\n### Play Sound\r\n\r\nTo play an audio asset once:\r\n\r\n```js\r\n// load the sound file\r\nlet sound = await Shaku.assets.loadSound('assets/my_sound_file.ogg');\r\n\r\n// play sound\r\nlet volume = 0.85;\r\nlet pitch = 1;\r\nShaku.sfx.play(sound, volume, pitch);\r\n```\r\n\r\nNote that due to browsers security limitations, you won't be able to play any sound effect until the user interacted with the page with mouse, touch, gamepad, or keyboard. This is not something *Shaku* can solve, as this is by design and enforced by the browsers themselves.\r\n\r\nYou can, however, preload your sound assets before that.\r\n\r\n### Sound Instances\r\n\r\nA sound instance is a way to create a sound object that lives on after it was played, and use it as many times as you like. Its more efficient to reuse instances than to call `play()` multiple times, but its usually an unnecessary optimization as this will rarely be your bottleneck in terms of performance.\r\n\r\nTo create a sound instance:\r\n\r\n```js\r\n// load sound asset and create instance\r\nlet sound = await Shaku.assets.loadSound('assets/my_sound_file.ogg');\r\nlet soundInstance = Shaku.sfx.createSound(sound);\r\n\r\n// play the sound\r\nsoundInstance.play();\r\n```\r\n\r\nThe sound instance have the following properties:\r\n\r\n* *play()*: Start playing the sound.\r\n* *stop()*: Stop playing the sound and reset time to the beginning.\r\n* *pause()*: Stop playing sound but keep current time.\r\n* *loop*: Set if should play in loop or not.\r\n* *volume*: Set volume.\r\n* *currentTime*: Set current time.\r\n* *duration*: Get sound duration.\r\n* *paused*: Is the sound currently paused?\r\n* *playing*: Is the sound currently playing?\r\n* *finished*: Did the sound finish playing?\r\n* *preservesPitch*: Set if to preserve pitch while changing playback rate.\r\n* *playbackRate*: Set playback rate.\r\n\r\nA demo page that play sounds can be found [here](https://ronenness.github.io/Shaku/demo/sfx_basic_audio.html).\r\n\r\n### Sounds Mixer\r\n\r\nSound Mixer is a utility class to mix and fade sounds. \r\nIt's very useful for music transitioning.\r\n\r\nFor example, the following code will create a mixer that transition from music1 to music2, while allowing tracks to overlap (if overlap is false, the mixer will first fade-out music1 completely, and only then begin fading-in music2):\r\n\r\n```js\r\n// load two music tracks\r\nlet music1 = await Shaku.assets.loadSound('assets/music1.ogg');\r\nlet music2 = await Shaku.assets.loadSound('assets/music2.ogg');\r\n\r\n// transition between the tracks\r\nlet overlap = true;\r\nlet mixer = new Shaku.sfx.SoundMixer(Shaku.sfx.createSound(music1), Shaku.sfx.createSound(music2), overlap);\r\n```\r\n\r\nTo run the mixer you then need to call the following inside every step of your game main loop:\r\n\r\n```js\r\n// Shaku.gameTime.delta is transition speed (delta = time between frames, in seconds)\r\nmixer.updateDelta(Shaku.gameTime.delta);\r\n```\r\n\r\nAnd the following code will create a mixer to fade music in without fading anything out:\r\n\r\n```js\r\nlet mixer = new Shaku.sfx.SoundMixer(null, Shaku.sfx.createSound(music2), true);\r\n```\r\n\r\nOr, we can just fade music out without fading anything in:\r\n\r\n```js\r\nlet mixer = new Shaku.sfx.SoundMixer(Shaku.sfx.createSound(music1), null, true);\r\n```\r\n\r\nIf you want to set the mixer to a specific point in time, you can call `update()` with the desired progress from 0.0 to 1.0:\r\n\r\n```js\r\nlet mixProgress = 0.5; // valid range = 0-1\r\nmixer.update(mixProgress);\r\n```\r\n\r\nA demo page with sounds mixer can be found [here](https://ronenness.github.io/Shaku/demo/sfx_sound_mixer.html).\r\n\r\n\r\n### Conclusion\r\n\r\nIn this chapter we learned about the `Sfx` manager and how to use it to play sound effects and music. What we covered here is just the common use cases, to learn more about sound effects with pitch, volume, playback speed and other effects *Shaku* support, check out the [online demos](https://ronenness.github.io/Shaku/demo/index.html) or the [online docs](https://ronenness.github.io/Shaku/docs/index.html).\r\n\r\n\r\n## Input\r\n\r\nThe input manager provides an API to query Keyboard, Mouse, Touch and Gamepad input.\r\nTo access the Input manager we use `Shaku.input`.\r\n\r\nThis doc don't cover the entirely of the API, only the main parts of it. To see the full API, check out the [API docs](docs/input_input.md).\r\n\r\n### States Queries\r\n\r\nThe input manager have five main query method for key states, which can be mouse buttons, touch, keyboard keys, or gamepad buttons. These five methods are the ones you'll use the most:\r\n\r\n- **down**: return true if the button / key is currently held down.\r\n- **released**: return true if the button / key was released in this very update frame.\r\n- **pressed**: return true if the button / key was pressed down in this very update frame.\r\n- **doublePressed**: like pressed, but will only trigger after a second quick press.\r\n- **doubleReleased**: like released, but will only trigger after a second quick release.\r\n\r\nFor example, a double-click with the mouse left button can be detected like this: `Shaku.input.doublePressed('mouse_left')` (or `doubleReleased` if you prefer to only consider double click if used released the key).\r\n\r\nIn addition, all the methods above also accept an array instead of a single key code, to test if any of them match the condition. For example, the following will check if 'w' or arrow up is down: `Shaku.input.down(['w', 'up_arrow'])`.\r\n\r\n![Input Demo](resources/input-demo.png)\r\n\r\nA demo page to demonstrate the input manager can be found [here](https://ronenness.github.io/Shaku/demo/input_basic_input.html).\r\n\r\n### Keyboard\r\n\r\nAll keyboard keys are listed under `Shaku.input.KeyboardKeys`.\r\n\r\nTo query keyboard keys you can just use their names with any of the main state query methods. For example:\r\n\r\n```js\r\nif (Shaku.input.down('left') || Shaku.input.down('a')) { \r\n  // move player left\r\n}\r\n```\r\n\r\nIn addition there are some useful keyboard-specific getters you can use: `shiftDown`, `ctrlDown`, `altDown`, `anyKeyPressed`, `anyKeyDown`.\r\n\r\n\r\n### Mouse\r\n\r\nTo get a mouse button state use the 'mouse_' prefix, followed by the button key (left, right, middle). For example to check if left mouse button is down:\r\n\r\n```js\r\nif (Shaku.input.down('mouse_left')) { \r\n  // mouse left button is down\r\n}\r\n```\r\n\r\n#### Mouse Position\r\n\r\nTo get mouse position use:\r\n\r\n```js\r\n// returns a Vector2 instance\r\nlet mousePos = Shaku.input.mousePosition;\r\n```\r\n\r\nAnd to get mouse position change from last frame:\r\n\r\n```js\r\n// returns a Vector2 instance\r\nlet mouseDelta = Shaku.input.mouseDelta;\r\n```\r\n\r\n**Wait, mouse position is wrong?**\r\n\r\nBy default the input manager will attach events to the *entire document*, meaning that mouse position will be relative to the top-left corner of the web page.\r\n\r\nIf your game canvas does not cover the entire screen, mouse offset will feel wrong because it won't be relative to your canvas top-left corner. You might expect to get 0,0 if you click on the canvas top-left corner, but that would only happen if the canvas starts the the page top-left corner.\r\n\r\nTo solve this, you can instruct the input manager to attach events to the main canvas (or any other element for that matter). This will also make the input manager only work when the canvas is focused, which is useful when combining *Shaku* with HTML UI.\r\n\r\nTo set the Input manager target element, run the following command *before initializing Shaku*:\r\n\r\n```js\r\nShaku.input.setTargetElement(() => Shaku.gfx.canvas);\r\n```\r\n\r\nNote that we use a callback and not `Shaku.gfx.canvas` directly, as `Shaku.gfx.canvas` will be undefined until we call `Shaku.init`, which is when we must call `setTargetElement()`.\r\n\r\n\r\n#### Mouse Wheel\r\n\r\nYou can query mouse wheel delta with `Shaku.input.mouseWheel`, or get just the mouse wheel direction (if the user scrolls up or down) with `Shaku.input.mouseWheelSign` (will be 0 if wheel is not used this frame).\r\n\r\n### Touch\r\n\r\nBy default, *Shaku* will delegate Touch input to Mouse input, so you can use the same key codes for desktop and mobile. This means that Touch start will generate a mouse click input ('mouse_left' code), and when the user drags touch input across the device, the Touch position will update as the Mouse position.\r\n\r\nTo disable this behavior, you can set `Shaku.input.delegateTouchInputToMouse` to `false`.\r\n\r\nIf you choose not to delegate Touch input to Mouse, you can use the following methods to query Touch input:\r\n\r\n- `Shaku.input.touchPosition`: Get touch last position.\r\n- `Shaku.input.touching`: True while the user is touching the device screen.\r\n- `Shaku.input.touchStarted`: True if touch input started during this update frame.\r\n- `Shaku.input.touchEnded`: True if touch input ended during this update frame.\r\n\r\nYou can get `down`, `pressed`, and `released` state for touch input too, similar to how you'd use a keyboard key or mouse button, but with `touch` as the key code:\r\n\r\n```js\r\nif (Shaku.input.down('touch')) { \r\n  // user is touching the screen\r\n}\r\n\r\nif (Shaku.input.released('touch')) { \r\n  // touch was just released\r\n}\r\n\r\nif (Shaku.input.pressed('touch')) { \r\n  // touch was just pressed\r\n}\r\n```\r\n\r\n\r\n### Gamepad\r\n\r\nYou can query Gamepad sticks and buttons with the input manager. Note that gamepads only work after the user press any gamepad button or move the stick. This is due to browsers security limitations.\r\n\r\nTo query connected gamepad ids use:\r\n\r\n```js\r\n// all ids:\r\nconsole.log(\"Gamepads: \", Shaku.input.gamepadIds());\r\n\r\n// by index:\r\nconsole.log(\"Gamepad 2 id: \", Shaku.input.gamepadId(2));\r\n\r\n// default gamepad (lowest connected index):\r\nconsole.log(\"Default gamepad id: \", Shaku.input.gamepadId());\r\n```\r\n\r\nAnd to get a gamepad state object, use:\r\n\r\n```js\r\nlet gamepad = Shaku.input.gamepad(0); // <-- 0 is the index of the gamepad to get, or leave out this param for default gamepad\r\n```\r\n\r\nEvery gamepad state object will have the following properties:\r\n\r\n- `gamepad.axis1`: Vector2 with axis1 current value.\r\n- `gamepad.axis2`: Vector2 with axis2 current value.\r\n- `gamepad.buttonsCount`: How many buttons this gamepad has.\r\n- `gamepad.button(index)`: Get the state of a button (up / down).\r\n- `gamepad.id`: Gamepad id.\r\n- `gamepad.mapping`: Gamepad mapping type.\r\n\r\nIf the gamepad has a standard mapping, `gamepad.isMapped` will be set to true, and the following properties will also appear:\r\n\r\n- `gamepad.leftStick`: Left stick state (same as axis1).\r\n- `gamepad.rightStick`: Left stick state (same as axis2).\r\n- `gamepad.leftStickPressed`: Is left stick pressed?\r\n- `gamepad.rightStickPressed`: Is right stick pressed?\r\n- `gamepad.leftButtons`: Left side buttons cluster (top, bottom, left, right).\r\n- `gamepad.rightButtons`: Right side buttons cluster (top, bottom, left, right).\r\n- `gamepad.centerButtons`: Center buttons cluster (left, right, center).\r\n- `gamepad.frontButtons`: Front buttons (topLeft, topRight, bottomLeft, bottomRight).\r\n\r\n\r\n#### Gamepad Key Codes\r\n\r\nIf `Shaku.input.delegateGamepadInputToKeys` is set to true (default), the Input manager will generate key-like states for all the connected gamepads that have standard mappings.\r\n\r\nThis means that instead of using the gamepad state object like we demonstrated above, you can query it directly with the main `down()`, `pressed()`, `released()`, `doublePressed()` and `doubleReleased()` methods.\r\n\r\nThe following keys will work supported for every connected gamepad (where X represent the gamepad index starting from 0):\r\n\r\n- `gamepadX_top`: state of arrow keys top key (left buttons).\r\n- `gamepadX_bottom`: state of arrow keys bottom key (left buttons).\r\n- `gamepadX_left`: state of arrow keys left key (left buttons).\r\n- `gamepadX_right`: state of arrow keys right key (left buttons).\r\n- `gamepadX_leftStickUp`: true if left stick points directly up.\r\n- `gamepadX_leftStickDown`: true if left stick points directly down.\r\n- `gamepadX_leftStickLeft`: true if left stick points directly left.\r\n- `gamepadX_leftStickRight`: true if left stick points directly right.\r\n- `gamepadX_rightStickUp`: true if right stick points directly up.\r\n- `gamepadX_rightStickDown`: true if right stick points directly down.\r\n- `gamepadX_rightStickLeft`: true if right stick points directly left.\r\n- `gamepadX_rightStickRight`: true if right stick points directly right.\r\n- `gamepadX_a`: state of A key (from right buttons).\r\n- `gamepadX_b`: state of B key (from right buttons).\r\n- `gamepadX_x`: state of X key (from right buttons).\r\n- `gamepadX_y`: state of Y key (from right buttons).\r\n- `gamepadX_frontTopLeft`: state of the front top-left button.\r\n- `gamepadX_frontTopRight`: state of the front top-right button.\r\n- `gamepadX_frontBottomLeft`: state of the front bottom-left button.\r\n- `gamepadX_frontBottomRight`: state of the front bottom-right button.\r\n\r\nFor example, the following will trigger when the player either press the arrow up key on the gamepad, or move the left stick all the way up:\r\n\r\n```js\r\nif (Shaku.input.pressed(['gamepad0_up', 'gamepad0_leftStickUp'])) {\r\n  alert(\"Move Up!\");\r\n}\r\n```\r\n\r\n### Additional Parameters\r\n\r\nThe input manager support some additional parameters you can set:\r\n\r\n- **preventDefaults**: If true will prevent default input events by calling preventDefault().\r\n- **disableMouseWheelAutomaticScrolling**: If true will disable the special scroll mode that starts in chromium browsers when you click the wheel button not on a link.\r\n- **disableContextMenu**: If true will disable the context menu that opens on right mouse button click.\r\n- **delegateTouchInputToMouse**: If true will treat touch events (touch start / touch end / touch move) as if the user clicked and moved a mouse.\r\n- **delegateGamepadInputToKeys**: If true will generate gamepad key codes so you can query gamepad like you would query a keyboard key.\r\n- **resetOnFocusLoss**: If true, will reset input states when the page or target element loses focus.\r\n- **defaultDoublePressInterval**: The interval in milliseconds to consider two consecutive key presses as a double-press.\r\n\r\n### Conclusion\r\n\r\nIn this chapter we learned about the `Input` manager and how to use it to get input from keyboard, mouse, touch and gamepad. What we covered here is just the common use cases, to learn more about input methods, check out the [online demos](https://ronenness.github.io/Shaku/demo/index.html) or the [online docs](https://ronenness.github.io/Shaku/docs/index.html).\r\n\r\n\r\n## Assets\r\n\r\nThe *Assets* manager handle loading and runtime creation of game assets, and is accessed by `Shaku.assets`.\r\nWe already covered most of it while exploring the other managers, but in this section we will focus on the input manager itself.\r\n\r\nThis doc don't cover the entirely of the API, only the main parts of it. To see the full API, check out the [API docs](docs/assets_assets.md).\r\n\r\n### Assets Loading\r\n\r\nThere are two things to keep in mind while dealing with the assets manager:\r\n\r\n#### Assets URL\r\n\r\nEvery asset have a unique identifier field called `url`. This is how we identify the asset and store it in cache.\r\nIf you try to load the same asset twice, in the second call will just return the copy from the cache, provided the URL is *exactly* the same.\r\n\r\nWhen creating assets dynamically by code, you can also provide a unique `url`, if you want to add the asset to cache and make it accessible anywhere via the assets manager.\r\n\r\n#### Promises\r\n\r\nEvery `load` and `create` method in the assets manager returns a `promise` that is resolved when the asset is loaded. \r\nEven if the asset was returned from cache, it will be returned via a promise.\r\n\r\nNote that you can query the cache directly without loading a new asset, by calling the `getCached()` method.\r\n\r\n**Promise.asset**\r\n\r\nAll returned promises from the assets manager have additional property: `asset`. \r\nThis property provide access the asset itself before the promise is resolved, at your own risk (since the asset may be invalid). For example, you can fetch a texture *without waiting* like this:\r\n\r\n```js\r\n// myTexture may not be loaded yet!\r\nlet myTexture = Shaku.assets.loadTexture(url).asset;\r\n```\r\n\r\nInstead of loading it with `await`:\r\n\r\n```js\r\nlet myTexture = await Shaku.assets.loadTexture(url);\r\n```\r\n\r\nOr with `then`:\r\n\r\n```js\r\nShaku.assets.loadTexture(url).then((asset) => myTexture = asset);\r\n```\r\n\r\nThe idea behind the `Promise.asset` property is to make it easier to perform parallel loading. \r\nFor example, the following code creates a dictionary of assets, and wait for all to load before proceeding:\r\n\r\n```js\r\nlet assets = {\r\n  tree: Shaku.assets.loadTexture(\"tree.png\").asset,\r\n  rock: Shaku.assets.loadTexture(\"rock.png\").asset,\r\n  house: Shaku.assets.loadTexture(\"house.png\").asset\r\n}\r\nawait Shaku.assets.waitForAll();\r\n```\r\n\r\nJust keep in mind that using an asset before its ready may cause undefined behavior and exceptions. \r\nTo check if an asset is loaded and valid, you can use `asset.valid`.\r\n\r\n\r\n### Load a Sound\r\n\r\nTo load a sound asset:\r\n\r\n```js\r\nlet sound = await Shaku.assets.loadSound(url);\r\n```\r\n\r\nTo learn more about sound assets, check out the [API docs](docs/assets_sound_asset.md).\r\n\r\n### Load a Texture\r\n\r\nTo load a texture asset:\r\n\r\n```js\r\nlet sound = await Shaku.assets.loadTexture(url, params);\r\n```\r\n\r\nParams is an *optional* dictionary that accepts the following keys:\r\n\r\n* **generateMipMaps**: (default=false) if true will generate mipmaps for this texture.\r\n\r\nTo learn more about texture assets, check out the [API docs](docs/assets_texture_asset.md).\r\n\r\n### Create a Render Target\r\n\r\nTo create a render target (a texture we can render on):\r\n\r\n```js\r\nlet rt = await Shaku.assets.createRenderTarget(name, width, height)\r\n```\r\n\r\nIn the above example `name` will be used as `url`, ie to put the loaded render target in cache.\r\n\r\nA render target is just a texture asset created via code. To learn more about texture assets, check out the [API docs](docs/assets_texture_asset.md).\r\n\r\n### Load a Font Texture\r\n\r\nTo load a font texture asset:\r\n\r\n```js\r\nlet fontTexture = await Shaku.assets.loadFontTexture(url, params);\r\n```\r\n\r\nParams is a *mandatory* dictionary that accepts the following keys:\r\n\r\n* *fontName*: mandatory font name. on some browsers if the font name does not match the font you actually load via the URL, it will not be loaded properly.\r\n* *missingCharPlaceholder (default='?')*: character to use for missing characters.\r\n* *smoothFont (default=true)*: if true, will set font to smooth mode.\r\n* *fontSize (default=52)*: font size to generate in texture. larget font size will take more memory, but allow for sharper text rendering in larger scales.\r\n* *enforceTexturePowerOfTwo (default=true)*: if true, will force texture size to be power of two.\r\n* *maxTextureWidth (default=1024)*: max texture width.\r\n* *charactersSet (default=FontTextureAsset.defaultCharactersSet)*: which characters to set in the texture.\r\n\r\nTo learn more about font texture assets, check out the [API docs](docs/assets_texture_asset.md).\r\n\r\n### Load Json File\r\n\r\nTo load a json file:\r\n\r\n```js\r\nlet json = await Shaku.assets.loadJson(url);\r\nconsole.log(json.data);\r\n```\r\n\r\nTo learn more about json assets, check out the [API docs](docs/assets_json_asset.md).\r\n\r\n#### Create Json File\r\n\r\nYou can also create a json asset dynamically, and add it to assets cache:\r\n\r\n```js\r\nlet json = await Shaku.assets.createJson(url, data);\r\n```\r\n\r\n### Load Binary File\r\n\r\nTo load a binary file:\r\n\r\n```js\r\nlet bin = await Shaku.assets.loadBinary(url);\r\nconsole.log(bin.data);\r\n```\r\n\r\nTo learn more about binary assets, check out the [API docs](docs/assets_binary_asset.md).\r\n\r\n#### Create Binary\r\n\r\nYou can also create a binary asset dynamically, and add it to assets cache:\r\n\r\n```js\r\nlet bin = await Shaku.assets.createBinary(url, data);\r\n```\r\n\r\n### Create a Texture Atlas\r\n\r\nTexture Atlas was already covered when talking about the `Gfx` manager. To load multiple textures and generate an atlas from them, call `createTextureAtlas`:\r\n\r\n```js\r\nlet textureAtlas = await createTextureAtlas(name, sources, maxWidth, maxHeight, extraMargins)\r\n```\r\n\r\n- **name** is just a unique identifier for the atlas asset.\r\n- **sources** is a list of URL to load the textures from.\r\n- **maxWidth** is an optional limit to the atlas textures width.\r\n- **maxHeight** is an optional limit to the atlas textures height.\r\n- **extraMargins** is an optional extra empty pixels to put between textures in the atlas.\r\n\r\n### Get Cached Asset\r\n\r\nTo get an already-loaded asset from cache, you can use:\r\n\r\n```js\r\nlet asset = Shaku.assets.getCached(url);\r\n```\r\n\r\nThis method is more convinient and just return the asset immediately, without a promise. \r\nIf the asset is not loaded yet, it will return null.\r\n\r\n### Waiting For Assets\r\n\r\nThere are three main properties we can use to wait and monitor assets loading progress:\r\n\r\n#### Shaku.assets.pendingAssets\r\n\r\nReturn how many assets are currently waiting to be loaded.\r\n\r\n#### Shaku.assets.failedAssets\r\n\r\nReturn how many assets failed to load.\r\n\r\n#### Shaku.assets.waitForAll\r\n\r\nReturn a promise that will be resolved when all assets are fully loaded, or rejected if one or more failed. You can use it to load multiple assets in parallel (without await) and then call `waitForAll` to wait for all of them to load.\r\n\r\n### Freeing Assets\r\n\r\nAll loaded assets are stored in local cache. To free a specific asset you can call:\r\n\r\n```js\r\nShaku.assets.free(url);\r\n```\r\n\r\nNote that if you have a reference to this asset from before freeing it and you try to use it, an exception will most likely be thrown.\r\n\r\nYou can also free all loaded assets at once, by calling `clearCache`:\r\n\r\n```js\r\nShaku.assets.clearCache();\r\n```\r\n\r\n## Collision\r\n\r\nThe *Collision* manager provides basic 2D collision detection, and is accessed by `Shaku.collision`.\r\nThe collision manager handles only detection, its not a physics engine.\r\n\r\nThis doc don't cover the entirely of the API, only the main parts of it. To see the full collision manager API, check out the [API docs](docs/collision_collision.md).\r\n\r\n### Collision Shapes\r\n\r\nA collision shape is a 2d body we use to test collision.\r\nThere are currently five collision shapes *Shaku* supports:\r\n\r\n* [Point](docs/collision_shapes_point.md).\r\n* [Rectangle](docs/collision_shapes_point.md).\r\n* [Circle](docs/collision_shapes_point.md).\r\n* [Lines](docs/collision_shapes_lines.md).\r\n* [Tilemap](docs/collision_shapes_tilemap.md).\r\n\r\n#### Collision Flags\r\n\r\nEvery shape has a property called `collisionFlags`. \r\nThis property is a number used as a bitmap for collision filtering. For example, you can define the following flags:\r\n\r\n```js\r\nconst CollisionFlags = {\r\n  Walls: 1,\r\n  Lava: 1 << 1,\r\n  Floor: 1 << 2,\r\n  Enemy: 1 << 3,\r\n}\r\n```\r\n\r\nThen define a shape to represent a wall with the 'walls' collision flags:\r\n\r\n```js\r\nshape.collisionFlags = CollisionFlags.Walls;\r\n```\r\n\r\nAnd later if we want to only collide with walls or laval, we can use the following collision mask:\r\n\r\n```js\r\nconst WallsAndLavaMask = CollisionFlags.Walls | CollisionFlags.Lava;\r\n```\r\n\r\n### Collision World\r\n\r\nA `Collision World` is a group of collision shapes you can query, debug render, and more. It represent a scene where you need to perform collision detection.\r\n\r\nEvery collision world have an internal grid used for the broad phase detection. Set the grid size proportionately to your collision shape sizes, so that every grid cell would only contain a handful of shapes.\r\n\r\nLets start by creating a collision world:\r\n\r\n```js\r\nlet gridSize = new Shaku.utils.Vector2(256, 256);\r\nlet world = Shaku.collision.createWorld(gridSize);\r\n```\r\n\r\n#### Adding Shapes\r\n\r\nNow lets add 3 shapes to the world:\r\n\r\n```js\r\n// add point to world\r\nlet point = new Shaku.collision.PointShape(new Shaku.utils.Vector2(125, 65));\r\nworld.addShape(point);\r\n\r\n// add rectangle to world\r\nlet rect = new Shaku.collision.RectangleShape(new Shaku.utils.Rectangle(45, 75, 100, 50));\r\nworld.addShape(rect);\r\n\r\n// add circle to world\r\nlet circle = new Shaku.collision.CircleShape(new Shaku.utils.Circle(new Shaku.utils.Vector2(300, 315), 150));\r\nworld.addShape(circle);\r\n```\r\n\r\n#### Picking\r\n\r\nTo 'pick' shapes that touch a position, you can use the `pick()` method:\r\n\r\n```js\r\n// shapes will be an array with all shapes the mouse was pointing on\r\nlet shapes = world.pick(Shaku.input.mousePosition);\r\n```\r\n\r\nOr with additional parameters:\r\n\r\n```js\r\nlet position = Shaku.input.mousePosition;\r\nlet radius = 10;\r\nlet sortByDistance = false;\r\nlet mask = 0xffffff;\r\nlet predicate = (shape) => { return true; };\r\nlet shapes = world.pick(position, radius, sortByDistance, mask, predicate)\r\n```\r\n\r\n- **radius** is radius around the position to pick shapes from.\r\n- **sortByDistance** if true, will sort results by distance from position.\r\n- **mask** optional collision mask, to match against the shapes collision flags.\r\n- **predicate** optional filter method to run in broad phase. Return false to skip a shape, or true to test it.\r\n\r\n#### Collision Tests\r\n\r\nIf you want to test collision using a specific shape that isn't a point or circle, you can either use `testCollision(sourceShape, sortByDistance, mask, predicate)` to get a single result (faster), or `testCollisionMany(sourceShape, sortByDistance, mask, predicate)` for multiple results.\r\n\r\n### Resolver\r\n\r\nThe resolver is a class responsible to perform the math behind the collision detection of different shapes. If you want to create your own custom shapes, you need to register a handler method in the resolver to handle your new shape against all existing shapes.\r\n\r\nYou can access the resolver with `Shaku.collision.resolver`. \r\nTo learn more about it, check out the [API docs](docs/collision_resolver.md).\r\n\r\n### Debug Draw\r\n\r\nIts often useful to draw the collision world when debugging. \r\nTo do so, you can use the `debugDraw()` method:\r\n\r\n```js\r\nworld.debugDraw(gridColor, gridHighlitColor, opacity, camera);\r\n```\r\n\r\n* *gridColor*: optional grid lines color, for cells that have no collision shapes in them.\r\n* *gridHighlitColor*: optional grid lines color, for cells that have collision shapes in them.\r\n* *opacity*: optional opacity for all shapes and grid.\r\n* *camera*: optional camera to draw the collision world with.\r\n\r\nNote that you can set debug color for individual shapes by calling:\r\n\r\n```js\r\nshape.setDebugColor(color);\r\n```\r\n\r\n![physics-example](resources/physics.png)\r\n\r\n## Utils\r\n\r\nUtils is a collection of built-in utility classes and core objects we use with *Shaku*. \r\nYou access them with `Shaku.utils`.\r\n\r\nIn this section we'll only mention the main objects and won't explain most of them. To learn more about them, check out the docs.\r\n\r\n### Vector2\r\n\r\nRepresent a 2d vector.\r\nFor more info check out the [API docs](docs/utils_vector2.md).\r\n\r\n### Vector3\r\n\r\nRepresent a 3d vector.\r\nFor more info check out the [API docs](docs/utils_vector3.md).\r\n\r\n### Rectangle\r\n\r\nRepresent a 2d rectangle. \r\nFor more info check out the [API docs](docs/utils_rectangle.md).\r\n\r\n### Circle\r\n\r\nRepresent a 2d circle. \r\nFor more info check out the [API docs](docs/utils_circle.md).\r\n\r\n### Line\r\n\r\nRepresent a 2d line. \r\nFor more info check out the [API docs](docs/utils_line.md).\r\n\r\n### MathHelper\r\n\r\nContains useful math-related functions that extend the basic JavaScript `Math` object.\r\nFor more info check out the [API docs](docs/utils_math_helper.md).\r\n\r\n### SeededRandom\r\n\r\nGenerate semi-random numbers using a seed.\r\n\r\nThis is useful when you want to generate the same random numbers on different browsers and runs, based on a constant seed. For example you can use this to implement randomness in your game levels, but a *consistent randomness* that will generate the the same output no matter the browser or when you run it.\r\n\r\nFor more info check out the [API docs](docs/utils_seeded_random.md).\r\n\r\n### Color\r\n\r\nRepresent a color value. \r\nThe Color object store RGBA components as floats, ranging from 0.0 to 1.0.\r\n\r\nFor convenience, it also have all the built-in CSS colors as static getters, so you can easily get the following standard color values:\r\n\r\n```aliceblue, antiquewhite, aqua, aquamarine, azure, beige, bisque, black, blanchedalmond, blue, blueviolet, brown, burlywood, cadetblue, chartreuse, chocolate, coral, cornflowerblue, cornsilk, crimson, cyan, darkblue, darkcyan, darkgoldenrod, darkgray, darkgreen, darkkhaki, darkmagenta, darkolivegreen, darkorange, darkorchid, darkred, darksalmon, darkseagreen, darkslateblue, darkslategray, darkturquoise, darkviolet, deeppink, deepskyblue, dimgray, dodgerblue, firebrick, floralwhite, forestgreen, fuchsia, gainsboro, ghostwhite, gold, goldenrod, gray, green, greenyellow, honeydew, hotpink, indianred , indigo, ivory, khaki, lavender, lavenderblush, lawngreen, lemonchiffon, lightblue, lightcoral, lightcyan, lightgoldenrodyellow, lightgrey, lightgreen, lightpink, lightsalmon, lightseagreen, lightskyblue, lightslategray, lightsteelblue, lightyellow, lime, limegreen, linen, magenta, maroon, mediumaquamarine, mediumblue, mediumorchid, mediumpurple, mediumseagreen, mediumslateblue, mediumspringgreen, mediumturquoise, mediumvioletred, midnightblue, mintcream, mistyrose, moccasin, navajowhite, navy, oldlace, olive, olivedrab, orange, orangered, orchid, palegoldenrod, palegreen, paleturquoise, palevioletred, papayawhip, peachpuff, peru, pink, plum, powderblue, purple, rebeccapurple, red, rosybrown, royalblue, saddlebrown, salmon, sandybrown, seagreen, seashell, sienna, silver, skyblue, slateblue, slategray, snow, springgreen, steelblue, tan, teal, thistle, tomato, turquoise, violet, wheat, white, whitesmoke, yellow, yellowgreen```\r\n\r\nSo for example you can get the css red color with `Shaku.utils.Color.red`. \r\nNote that these colors are pre-compiled and are not generated at runtime, so they will have the same values on all browsers and platforms, even if some of them decide to implement different values for the css keyword.\r\n\r\nFor more info check out the [API docs](docs/utils_color.md).\r\n\r\n### Animators\r\n\r\n`Animator`s are objects you can attach to any JavaScript object and animate any property in it over time. Animators can also register themselves to update automatically, so you don't need to update them and can just launch and forget about them.\r\n\r\nNote that Animators are not exclusive to *Shaku* objects, they are generic and work on anything.\r\n\r\nLet's start with a simple animator to create a heartbeat-like pulse that runs once, then we'll explain the code:\r\n\r\n```js\r\n// create an animator that will grow 'sprite' to x1.5 of its size, then shrink it back to original size over the course of 0.5 seconds per direction (grow / shrink).\r\n// smoothDamp means the animation won't be linear, it will be faster at the beginning and slower as we reach the target size\r\nlet heartbeat = (new Shaku.utils.Animator(sprite))\r\n\t\t\t\t.to({'size': sprite.size.mul(1.5)})\r\n\t\t\t\t.reverseBackToStart()\r\n\t\t\t\t.duration(0.5)\r\n\t\t\t\t.smoothDamp(true);\r\n\r\n// run the animation once\r\nheartbeat.play();\r\n```\r\n\r\nLets review the code above:\r\n\r\n1. First we create an animator that takes `sprite` as its target (assume its a Sprite object we created earlier).\r\n2. Next we set a target values with `to()`, instructing the animator to change the 'size' property to x1.5 its starting value (Animators know how to handle the Vector2 objects and can lerp their x and y components).\r\n3. Then we instruct the animator to animate back to the starting state with `reverseBackToStart()`, so it will grow and then shrink back to original size. The animator keeps the value of all the properties it animates when the animation begins, so it knows how to reverse back to start. Note that we don't even know the size of the sprite, nor does it matter.\r\n4. Next we set the animation duration in seconds - 0.5 seconds to grow, 0.5 seconds to shrink.\r\n5. And finally we set mode to `smoothDamp()`, meaning animation will not be linear but will start faster and slow dow","readmeFilename":"README.md"}