/**
 * window.requestIdleCallback()
 * version 0.0.0
 * Browser Compatibility:
 * https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback#browser_compatibility
 */
if (!window.requestIdleCallback) {
  window.requestIdleCallback = function (callback, options) {
    var options = options || {};
    var relaxation = 1;
    var timeout = options.timeout || relaxation;
    var start = performance.now();
    return setTimeout(function () {
      callback({
        get didTimeout() {
          return options.timeout ? false : (performance.now() - start) - relaxation > timeout;
        },
        timeRemaining: function () {
          return Math.max(0, relaxation + (performance.now() - start));
        },
      });
    }, relaxation);
  };
}

/**
* window.cancelIdleCallback()
* version 0.0.0
* Browser Compatibility:
* https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelIdleCallback#browser_compatibility
*/
if (!window.cancelIdleCallback) {
  window.cancelIdleCallback = function (id) {
    clearTimeout(id);
  };
}
@@ -1036,16 +1036,684 @@
 eout(id);%0A  %7D;%0A%7D
+%0A%0A/**%0A* window.requestAnimationFrame()%0A* version 0.0.0%0A* Browser Compatibility:%0A* https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame#browser_compatibility%0A*/%0Aif (!window.requestAnimationFrame) %7B%0A  window.requestAnimationFrame = function (callback) %7B%0A    return window.setTimeout(function () %7B%0A      callback(Date.now());%0A    %7D, 1000 / 60);%0A  %7D;%0A%7D%0A%0A/**%0A* window.cancelAnimationFrame()%0A* version 0.0.0%0A* Browser Compatibility:%0A* https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelAnimationFrame#browser_compatibility%0A*/%0Aif (!window.cancelAnimationFrame) %7B%0A  window.cancelAnimationFrame = function (id) %7B%0A    clearTimeout(id);%0A  %7D;%0A%7D

add polyfill requestAnimationFrame and cancelAnimationFrame