@sentry/replay 7.76.0 → 7.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/cjs/index.js +213 -1197
  2. package/cjs/index.js.map +1 -1
  3. package/esm/index.js +214 -1198
  4. package/esm/index.js.map +1 -1
  5. package/package.json +9 -8
  6. package/types/coreHandlers/handleClick.d.ts +10 -2
  7. package/types/coreHandlers/handleClick.d.ts.map +1 -1
  8. package/types/coreHandlers/handleScope.d.ts.map +1 -1
  9. package/types/coreHandlers/util/domUtils.d.ts +2 -0
  10. package/types/coreHandlers/util/domUtils.d.ts.map +1 -1
  11. package/types/coreHandlers/util/networkUtils.d.ts.map +1 -1
  12. package/types/eventBuffer/index.d.ts +2 -1
  13. package/types/eventBuffer/index.d.ts.map +1 -1
  14. package/types/integration.d.ts +1 -1
  15. package/types/integration.d.ts.map +1 -1
  16. package/types/replay.d.ts +0 -5
  17. package/types/replay.d.ts.map +1 -1
  18. package/types/types/replay.d.ts +22 -1
  19. package/types/types/replay.d.ts.map +1 -1
  20. package/types/types/request.d.ts +1 -1
  21. package/types/types/request.d.ts.map +1 -1
  22. package/types/util/handleRecordingEmit.d.ts.map +1 -1
  23. package/types/util/isRrwebError.d.ts.map +1 -1
  24. package/types/util/sendReplayRequest.d.ts +8 -0
  25. package/types/util/sendReplayRequest.d.ts.map +1 -1
  26. package/types-ts3.8/coreHandlers/handleClick.d.ts +10 -2
  27. package/types-ts3.8/coreHandlers/util/domUtils.d.ts +2 -0
  28. package/types-ts3.8/eventBuffer/index.d.ts +2 -1
  29. package/types-ts3.8/integration.d.ts +1 -1
  30. package/types-ts3.8/replay.d.ts +0 -5
  31. package/types-ts3.8/types/replay.d.ts +22 -1
  32. package/types-ts3.8/types/request.d.ts +1 -1
  33. package/types-ts3.8/util/sendReplayRequest.d.ts +8 -0
  34. package/types/util/truncateJson/completeJson.d.ts +0 -9
  35. package/types/util/truncateJson/completeJson.d.ts.map +0 -1
  36. package/types/util/truncateJson/constants.d.ts +0 -12
  37. package/types/util/truncateJson/constants.d.ts.map +0 -1
  38. package/types/util/truncateJson/evaluateJson.d.ts +0 -6
  39. package/types/util/truncateJson/evaluateJson.d.ts.map +0 -1
  40. package/types/util/truncateJson/fixJson.d.ts +0 -6
  41. package/types/util/truncateJson/fixJson.d.ts.map +0 -1
  42. package/types-ts3.8/util/truncateJson/completeJson.d.ts +0 -9
  43. package/types-ts3.8/util/truncateJson/constants.d.ts +0 -12
  44. package/types-ts3.8/util/truncateJson/evaluateJson.d.ts +0 -6
  45. package/types-ts3.8/util/truncateJson/fixJson.d.ts +0 -6
package/cjs/index.js CHANGED
@@ -1587,12 +1587,6 @@ var PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {
1587
1587
  PointerTypes2[PointerTypes2["Touch"] = 2] = "Touch";
1588
1588
  return PointerTypes2;
1589
1589
  })(PointerTypes || {});
1590
- var CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {
1591
- CanvasContext2[CanvasContext2["2D"] = 0] = "2D";
1592
- CanvasContext2[CanvasContext2["WebGL"] = 1] = "WebGL";
1593
- CanvasContext2[CanvasContext2["WebGL2"] = 2] = "WebGL2";
1594
- return CanvasContext2;
1595
- })(CanvasContext || {});
1596
1590
 
1597
1591
  function isNodeInLinkedList(n) {
1598
1592
  return '__ln' in n;
@@ -2425,12 +2419,6 @@ function initViewportResizeObserver({ viewportResizeCb }, { win }) {
2425
2419
  }), 200));
2426
2420
  return on('resize', updateDimension, win);
2427
2421
  }
2428
- function wrapEventWithUserTriggeredFlag(v, enable) {
2429
- const value = Object.assign({}, v);
2430
- if (!enable)
2431
- delete value.userTriggered;
2432
- return value;
2433
- }
2434
2422
  const INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];
2435
2423
  const lastInputValueMap = new WeakMap();
2436
2424
  function initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, unblockSelector, ignoreClass, ignoreSelector, maskInputOptions, maskInputFn, sampling, userTriggeredOnInput, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, }) {
@@ -2469,7 +2457,9 @@ function initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, un
2469
2457
  value: text,
2470
2458
  maskInputFn,
2471
2459
  });
2472
- cbWithDedup(target, callbackWrapper(wrapEventWithUserTriggeredFlag)({ text, isChecked, userTriggered }, userTriggeredOnInput));
2460
+ cbWithDedup(target, userTriggeredOnInput
2461
+ ? { text, isChecked, userTriggered }
2462
+ : { text, isChecked });
2473
2463
  const name = target.name;
2474
2464
  if (type === 'radio' && name && isChecked) {
2475
2465
  doc
@@ -2482,11 +2472,9 @@ function initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, un
2482
2472
  value: getInputValue(el, tagName, type),
2483
2473
  maskInputFn,
2484
2474
  });
2485
- cbWithDedup(el, callbackWrapper(wrapEventWithUserTriggeredFlag)({
2486
- text,
2487
- isChecked: !isChecked,
2488
- userTriggered: false,
2489
- }, userTriggeredOnInput));
2475
+ cbWithDedup(el, userTriggeredOnInput
2476
+ ? { text, isChecked: !isChecked, userTriggered: false }
2477
+ : { text, isChecked: !isChecked });
2490
2478
  }
2491
2479
  });
2492
2480
  }
@@ -2931,94 +2919,12 @@ function initCustomElementObserver({ doc, customElementCb, }) {
2931
2919
  });
2932
2920
  return restoreHandler;
2933
2921
  }
2934
- function mergeHooks(o, hooks) {
2935
- const { mutationCb, mousemoveCb, mouseInteractionCb, scrollCb, viewportResizeCb, inputCb, mediaInteractionCb, styleSheetRuleCb, styleDeclarationCb, canvasMutationCb, fontCb, selectionCb, customElementCb, } = o;
2936
- o.mutationCb = (...p) => {
2937
- if (hooks.mutation) {
2938
- hooks.mutation(...p);
2939
- }
2940
- mutationCb(...p);
2941
- };
2942
- o.mousemoveCb = (...p) => {
2943
- if (hooks.mousemove) {
2944
- hooks.mousemove(...p);
2945
- }
2946
- mousemoveCb(...p);
2947
- };
2948
- o.mouseInteractionCb = (...p) => {
2949
- if (hooks.mouseInteraction) {
2950
- hooks.mouseInteraction(...p);
2951
- }
2952
- mouseInteractionCb(...p);
2953
- };
2954
- o.scrollCb = (...p) => {
2955
- if (hooks.scroll) {
2956
- hooks.scroll(...p);
2957
- }
2958
- scrollCb(...p);
2959
- };
2960
- o.viewportResizeCb = (...p) => {
2961
- if (hooks.viewportResize) {
2962
- hooks.viewportResize(...p);
2963
- }
2964
- viewportResizeCb(...p);
2965
- };
2966
- o.inputCb = (...p) => {
2967
- if (hooks.input) {
2968
- hooks.input(...p);
2969
- }
2970
- inputCb(...p);
2971
- };
2972
- o.mediaInteractionCb = (...p) => {
2973
- if (hooks.mediaInteaction) {
2974
- hooks.mediaInteaction(...p);
2975
- }
2976
- mediaInteractionCb(...p);
2977
- };
2978
- o.styleSheetRuleCb = (...p) => {
2979
- if (hooks.styleSheetRule) {
2980
- hooks.styleSheetRule(...p);
2981
- }
2982
- styleSheetRuleCb(...p);
2983
- };
2984
- o.styleDeclarationCb = (...p) => {
2985
- if (hooks.styleDeclaration) {
2986
- hooks.styleDeclaration(...p);
2987
- }
2988
- styleDeclarationCb(...p);
2989
- };
2990
- o.canvasMutationCb = (...p) => {
2991
- if (hooks.canvasMutation) {
2992
- hooks.canvasMutation(...p);
2993
- }
2994
- canvasMutationCb(...p);
2995
- };
2996
- o.fontCb = (...p) => {
2997
- if (hooks.font) {
2998
- hooks.font(...p);
2999
- }
3000
- fontCb(...p);
3001
- };
3002
- o.selectionCb = (...p) => {
3003
- if (hooks.selection) {
3004
- hooks.selection(...p);
3005
- }
3006
- selectionCb(...p);
3007
- };
3008
- o.customElementCb = (...c) => {
3009
- if (hooks.customElement) {
3010
- hooks.customElement(...c);
3011
- }
3012
- customElementCb(...c);
3013
- };
3014
- }
3015
- function initObservers(o, hooks = {}) {
2922
+ function initObservers(o, _hooks = {}) {
3016
2923
  const currentWindow = o.doc.defaultView;
3017
2924
  if (!currentWindow) {
3018
2925
  return () => {
3019
2926
  };
3020
2927
  }
3021
- mergeHooks(o, hooks);
3022
2928
  const mutationObserver = initMutationObserver(o, o.doc);
3023
2929
  const mousemoveHandler = initMoveObserver(o);
3024
2930
  const mouseInteractionHandler = initMouseInteractionObserver(o);
@@ -3039,10 +2945,6 @@ function initObservers(o, hooks = {}) {
3039
2945
  };
3040
2946
  const selectionObserver = initSelectionObserver(o);
3041
2947
  const customElementObserver = initCustomElementObserver(o);
3042
- const pluginHandlers = [];
3043
- for (const plugin of o.plugins) {
3044
- pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));
3045
- }
3046
2948
  return callbackWrapper(() => {
3047
2949
  mutationBuffers.forEach((b) => b.reset());
3048
2950
  mutationObserver.disconnect();
@@ -3058,7 +2960,6 @@ function initObservers(o, hooks = {}) {
3058
2960
  fontObserver();
3059
2961
  selectionObserver();
3060
2962
  customElementObserver();
3061
- pluginHandlers.forEach((h) => h());
3062
2963
  });
3063
2964
  }
3064
2965
  function hasNestedCSSRule(prop) {
@@ -3427,369 +3328,6 @@ class ShadowDomManager {
3427
3328
  }
3428
3329
  }
3429
3330
 
3430
- /*! *****************************************************************************
3431
- Copyright (c) Microsoft Corporation.
3432
-
3433
- Permission to use, copy, modify, and/or distribute this software for any
3434
- purpose with or without fee is hereby granted.
3435
-
3436
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
3437
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
3438
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
3439
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
3440
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
3441
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
3442
- PERFORMANCE OF THIS SOFTWARE.
3443
- ***************************************************************************** */
3444
-
3445
- function __rest(s, e) {
3446
- var t = {};
3447
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
3448
- t[p] = s[p];
3449
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
3450
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
3451
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
3452
- t[p[i]] = s[p[i]];
3453
- }
3454
- return t;
3455
- }
3456
-
3457
- function __awaiter(thisArg, _arguments, P, generator) {
3458
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3459
- return new (P || (P = Promise))(function (resolve, reject) {
3460
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
3461
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
3462
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
3463
- step((generator = generator.apply(thisArg, _arguments || [])).next());
3464
- });
3465
- }
3466
-
3467
- /*
3468
- * base64-arraybuffer 1.0.1 <https://github.com/niklasvh/base64-arraybuffer>
3469
- * Copyright (c) 2021 Niklas von Hertzen <https://hertzen.com>
3470
- * Released under MIT License
3471
- */
3472
- var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
3473
- // Use a lookup table to find the index.
3474
- var lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);
3475
- for (var i = 0; i < chars.length; i++) {
3476
- lookup[chars.charCodeAt(i)] = i;
3477
- }
3478
- var encode = function (arraybuffer) {
3479
- var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';
3480
- for (i = 0; i < len; i += 3) {
3481
- base64 += chars[bytes[i] >> 2];
3482
- base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
3483
- base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
3484
- base64 += chars[bytes[i + 2] & 63];
3485
- }
3486
- if (len % 3 === 2) {
3487
- base64 = base64.substring(0, base64.length - 1) + '=';
3488
- }
3489
- else if (len % 3 === 1) {
3490
- base64 = base64.substring(0, base64.length - 2) + '==';
3491
- }
3492
- return base64;
3493
- };
3494
-
3495
- const canvasVarMap = new Map();
3496
- function variableListFor(ctx, ctor) {
3497
- let contextMap = canvasVarMap.get(ctx);
3498
- if (!contextMap) {
3499
- contextMap = new Map();
3500
- canvasVarMap.set(ctx, contextMap);
3501
- }
3502
- if (!contextMap.has(ctor)) {
3503
- contextMap.set(ctor, []);
3504
- }
3505
- return contextMap.get(ctor);
3506
- }
3507
- const saveWebGLVar = (value, win, ctx) => {
3508
- if (!value ||
3509
- !(isInstanceOfWebGLObject(value, win) || typeof value === 'object'))
3510
- return;
3511
- const name = value.constructor.name;
3512
- const list = variableListFor(ctx, name);
3513
- let index = list.indexOf(value);
3514
- if (index === -1) {
3515
- index = list.length;
3516
- list.push(value);
3517
- }
3518
- return index;
3519
- };
3520
- function serializeArg(value, win, ctx) {
3521
- if (value instanceof Array) {
3522
- return value.map((arg) => serializeArg(arg, win, ctx));
3523
- }
3524
- else if (value === null) {
3525
- return value;
3526
- }
3527
- else if (value instanceof Float32Array ||
3528
- value instanceof Float64Array ||
3529
- value instanceof Int32Array ||
3530
- value instanceof Uint32Array ||
3531
- value instanceof Uint8Array ||
3532
- value instanceof Uint16Array ||
3533
- value instanceof Int16Array ||
3534
- value instanceof Int8Array ||
3535
- value instanceof Uint8ClampedArray) {
3536
- const name = value.constructor.name;
3537
- return {
3538
- rr_type: name,
3539
- args: [Object.values(value)],
3540
- };
3541
- }
3542
- else if (value instanceof ArrayBuffer) {
3543
- const name = value.constructor.name;
3544
- const base64 = encode(value);
3545
- return {
3546
- rr_type: name,
3547
- base64,
3548
- };
3549
- }
3550
- else if (value instanceof DataView) {
3551
- const name = value.constructor.name;
3552
- return {
3553
- rr_type: name,
3554
- args: [
3555
- serializeArg(value.buffer, win, ctx),
3556
- value.byteOffset,
3557
- value.byteLength,
3558
- ],
3559
- };
3560
- }
3561
- else if (value instanceof HTMLImageElement) {
3562
- const name = value.constructor.name;
3563
- const { src } = value;
3564
- return {
3565
- rr_type: name,
3566
- src,
3567
- };
3568
- }
3569
- else if (value instanceof HTMLCanvasElement) {
3570
- const name = 'HTMLImageElement';
3571
- const src = value.toDataURL();
3572
- return {
3573
- rr_type: name,
3574
- src,
3575
- };
3576
- }
3577
- else if (value instanceof ImageData) {
3578
- const name = value.constructor.name;
3579
- return {
3580
- rr_type: name,
3581
- args: [serializeArg(value.data, win, ctx), value.width, value.height],
3582
- };
3583
- }
3584
- else if (isInstanceOfWebGLObject(value, win) || typeof value === 'object') {
3585
- const name = value.constructor.name;
3586
- const index = saveWebGLVar(value, win, ctx);
3587
- return {
3588
- rr_type: name,
3589
- index: index,
3590
- };
3591
- }
3592
- return value;
3593
- }
3594
- const serializeArgs = (args, win, ctx) => {
3595
- return [...args].map((arg) => serializeArg(arg, win, ctx));
3596
- };
3597
- const isInstanceOfWebGLObject = (value, win) => {
3598
- const webGLConstructorNames = [
3599
- 'WebGLActiveInfo',
3600
- 'WebGLBuffer',
3601
- 'WebGLFramebuffer',
3602
- 'WebGLProgram',
3603
- 'WebGLRenderbuffer',
3604
- 'WebGLShader',
3605
- 'WebGLShaderPrecisionFormat',
3606
- 'WebGLTexture',
3607
- 'WebGLUniformLocation',
3608
- 'WebGLVertexArrayObject',
3609
- 'WebGLVertexArrayObjectOES',
3610
- ];
3611
- const supportedWebGLConstructorNames = webGLConstructorNames.filter((name) => typeof win[name] === 'function');
3612
- return Boolean(supportedWebGLConstructorNames.find((name) => value instanceof win[name]));
3613
- };
3614
-
3615
- function initCanvas2DMutationObserver(cb, win, blockClass, blockSelector, unblockSelector) {
3616
- const handlers = [];
3617
- const props2D = Object.getOwnPropertyNames(win.CanvasRenderingContext2D.prototype);
3618
- for (const prop of props2D) {
3619
- try {
3620
- if (typeof win.CanvasRenderingContext2D.prototype[prop] !== 'function') {
3621
- continue;
3622
- }
3623
- const restoreHandler = patch(win.CanvasRenderingContext2D.prototype, prop, function (original) {
3624
- return function (...args) {
3625
- if (!isBlocked(this.canvas, blockClass, blockSelector, unblockSelector, true)) {
3626
- setTimeout(() => {
3627
- const recordArgs = serializeArgs([...args], win, this);
3628
- cb(this.canvas, {
3629
- type: CanvasContext['2D'],
3630
- property: prop,
3631
- args: recordArgs,
3632
- });
3633
- }, 0);
3634
- }
3635
- return original.apply(this, args);
3636
- };
3637
- });
3638
- handlers.push(restoreHandler);
3639
- }
3640
- catch (_a) {
3641
- const hookHandler = hookSetter(win.CanvasRenderingContext2D.prototype, prop, {
3642
- set(v) {
3643
- cb(this.canvas, {
3644
- type: CanvasContext['2D'],
3645
- property: prop,
3646
- args: [v],
3647
- setter: true,
3648
- });
3649
- },
3650
- });
3651
- handlers.push(hookHandler);
3652
- }
3653
- }
3654
- return () => {
3655
- handlers.forEach((h) => h());
3656
- };
3657
- }
3658
-
3659
- function getNormalizedContextName(contextType) {
3660
- return contextType === 'experimental-webgl' ? 'webgl' : contextType;
3661
- }
3662
- function initCanvasContextObserver(win, blockClass, blockSelector, unblockSelector, setPreserveDrawingBufferToTrue) {
3663
- const handlers = [];
3664
- try {
3665
- const restoreHandler = patch(win.HTMLCanvasElement.prototype, 'getContext', function (original) {
3666
- return function (contextType, ...args) {
3667
- if (!isBlocked(this, blockClass, blockSelector, unblockSelector, true)) {
3668
- const ctxName = getNormalizedContextName(contextType);
3669
- if (!('__context' in this))
3670
- this.__context = ctxName;
3671
- if (setPreserveDrawingBufferToTrue &&
3672
- ['webgl', 'webgl2'].includes(ctxName)) {
3673
- if (args[0] && typeof args[0] === 'object') {
3674
- const contextAttributes = args[0];
3675
- if (!contextAttributes.preserveDrawingBuffer) {
3676
- contextAttributes.preserveDrawingBuffer = true;
3677
- }
3678
- }
3679
- else {
3680
- args.splice(0, 1, {
3681
- preserveDrawingBuffer: true,
3682
- });
3683
- }
3684
- }
3685
- }
3686
- return original.apply(this, [contextType, ...args]);
3687
- };
3688
- });
3689
- handlers.push(restoreHandler);
3690
- }
3691
- catch (_a) {
3692
- console.error('failed to patch HTMLCanvasElement.prototype.getContext');
3693
- }
3694
- return () => {
3695
- handlers.forEach((h) => h());
3696
- };
3697
- }
3698
-
3699
- function patchGLPrototype(prototype, type, cb, blockClass, blockSelector, unblockSelector, mirror, win) {
3700
- const handlers = [];
3701
- const props = Object.getOwnPropertyNames(prototype);
3702
- for (const prop of props) {
3703
- if ([
3704
- 'isContextLost',
3705
- 'canvas',
3706
- 'drawingBufferWidth',
3707
- 'drawingBufferHeight',
3708
- ].includes(prop)) {
3709
- continue;
3710
- }
3711
- try {
3712
- if (typeof prototype[prop] !== 'function') {
3713
- continue;
3714
- }
3715
- const restoreHandler = patch(prototype, prop, function (original) {
3716
- return function (...args) {
3717
- const result = original.apply(this, args);
3718
- saveWebGLVar(result, win, this);
3719
- if ('tagName' in this.canvas &&
3720
- !isBlocked(this.canvas, blockClass, blockSelector, unblockSelector, true)) {
3721
- const recordArgs = serializeArgs([...args], win, this);
3722
- const mutation = {
3723
- type,
3724
- property: prop,
3725
- args: recordArgs,
3726
- };
3727
- cb(this.canvas, mutation);
3728
- }
3729
- return result;
3730
- };
3731
- });
3732
- handlers.push(restoreHandler);
3733
- }
3734
- catch (_a) {
3735
- const hookHandler = hookSetter(prototype, prop, {
3736
- set(v) {
3737
- cb(this.canvas, {
3738
- type,
3739
- property: prop,
3740
- args: [v],
3741
- setter: true,
3742
- });
3743
- },
3744
- });
3745
- handlers.push(hookHandler);
3746
- }
3747
- }
3748
- return handlers;
3749
- }
3750
- function initCanvasWebGLMutationObserver(cb, win, blockClass, blockSelector, unblockSelector, mirror) {
3751
- const handlers = [];
3752
- handlers.push(...patchGLPrototype(win.WebGLRenderingContext.prototype, CanvasContext.WebGL, cb, blockClass, blockSelector, unblockSelector, mirror, win));
3753
- if (typeof win.WebGL2RenderingContext !== 'undefined') {
3754
- handlers.push(...patchGLPrototype(win.WebGL2RenderingContext.prototype, CanvasContext.WebGL2, cb, blockClass, blockSelector, unblockSelector, mirror, win));
3755
- }
3756
- return () => {
3757
- handlers.forEach((h) => h());
3758
- };
3759
- }
3760
-
3761
- function decodeBase64(base64, enableUnicode) {
3762
- var binaryString = atob(base64);
3763
- if (enableUnicode) {
3764
- var binaryView = new Uint8Array(binaryString.length);
3765
- for (var i = 0, n = binaryString.length; i < n; ++i) {
3766
- binaryView[i] = binaryString.charCodeAt(i);
3767
- }
3768
- return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));
3769
- }
3770
- return binaryString;
3771
- }
3772
-
3773
- function createURL(base64, sourcemapArg, enableUnicodeArg) {
3774
- var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;
3775
- var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;
3776
- var source = decodeBase64(base64, enableUnicode);
3777
- var start = source.indexOf('\n', 10) + 1;
3778
- var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : '');
3779
- var blob = new Blob([body], { type: 'application/javascript' });
3780
- return URL.createObjectURL(blob);
3781
- }
3782
-
3783
- function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
3784
- var url;
3785
- return function WorkerFactory(options) {
3786
- url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
3787
- return new Worker(url, options);
3788
- };
3789
- }
3790
-
3791
- var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9CgogICAgLyoKICAgICAqIGJhc2U2NC1hcnJheWJ1ZmZlciAxLjAuMSA8aHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcj4KICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBOaWtsYXMgdm9uIEhlcnR6ZW4gPGh0dHBzOi8vaGVydHplbi5jb20+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgTGljZW5zZQogICAgICovCiAgICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguCiAgICB2YXIgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgICB9CiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykgewogICAgICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTsKICAgICAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107CiAgICAgICAgfQogICAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NDsKICAgIH07CgogICAgY29uc3QgbGFzdEJsb2JNYXAgPSBuZXcgTWFwKCk7DQogICAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gbmV3IE1hcCgpOw0KICAgIGZ1bmN0aW9uIGdldFRyYW5zcGFyZW50QmxvYkZvcih3aWR0aCwgaGVpZ2h0LCBkYXRhVVJMT3B0aW9ucykgew0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgew0KICAgICAgICAgICAgY29uc3QgaWQgPSBgJHt3aWR0aH0tJHtoZWlnaHR9YDsNCiAgICAgICAgICAgIGlmICgnT2Zmc2NyZWVuQ2FudmFzJyBpbiBnbG9iYWxUaGlzKSB7DQogICAgICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50QmxvYk1hcC5oYXMoaWQpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwYXJlbnRCbG9iTWFwLmdldChpZCk7DQogICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgICAgICBvZmZzY3JlZW4uZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoZGF0YVVSTE9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0geWllbGQgYmxvYi5hcnJheUJ1ZmZlcigpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7DQogICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQogICAgY29uc3Qgd29ya2VyID0gc2VsZjsNCiAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsNCiAgICAgICAgICAgIGlmICgnT2Zmc2NyZWVuQ2FudmFzJyBpbiBnbG9iYWxUaGlzKSB7DQogICAgICAgICAgICAgICAgY29uc3QgeyBpZCwgYml0bWFwLCB3aWR0aCwgaGVpZ2h0LCBkYXRhVVJMT3B0aW9ucyB9ID0gZS5kYXRhOw0KICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKHdpZHRoLCBoZWlnaHQsIGRhdGFVUkxPcHRpb25zKTsNCiAgICAgICAgICAgICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICBiaXRtYXAuY2xvc2UoKTsNCiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoZGF0YVVSTE9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7DQogICAgICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICAgICAgY29uc3QgYmFzZTY0ID0gZW5jb2RlKGFycmF5QnVmZmVyKTsNCiAgICAgICAgICAgICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgKHlpZWxkIHRyYW5zcGFyZW50QmFzZTY0KSA9PT0gYmFzZTY0KSB7DQogICAgICAgICAgICAgICAgICAgIGxhc3RCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobGFzdEJsb2JNYXAuZ2V0KGlkKSA9PT0gYmFzZTY0KQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQgfSk7DQogICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgICAgaWQsDQogICAgICAgICAgICAgICAgICAgIHR5cGUsDQogICAgICAgICAgICAgICAgICAgIGJhc2U2NCwNCiAgICAgICAgICAgICAgICAgICAgd2lkdGgsDQogICAgICAgICAgICAgICAgICAgIGhlaWdodCwNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICBsYXN0QmxvYk1hcC5zZXQoaWQsIGJhc2U2NCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfTsKCn0pKCk7Cgo=', null, false);
3792
-
3793
3331
  class CanvasManagerNoop {
3794
3332
  reset() {
3795
3333
  }
@@ -3802,180 +3340,6 @@ class CanvasManagerNoop {
3802
3340
  unlock() {
3803
3341
  }
3804
3342
  }
3805
- class CanvasManager {
3806
- reset() {
3807
- this.pendingCanvasMutations.clear();
3808
- this.resetObservers && this.resetObservers();
3809
- }
3810
- freeze() {
3811
- this.frozen = true;
3812
- }
3813
- unfreeze() {
3814
- this.frozen = false;
3815
- }
3816
- lock() {
3817
- this.locked = true;
3818
- }
3819
- unlock() {
3820
- this.locked = false;
3821
- }
3822
- constructor(options) {
3823
- this.pendingCanvasMutations = new Map();
3824
- this.rafStamps = { latestId: 0, invokeId: null };
3825
- this.frozen = false;
3826
- this.locked = false;
3827
- this.processMutation = (target, mutation) => {
3828
- const newFrame = this.rafStamps.invokeId &&
3829
- this.rafStamps.latestId !== this.rafStamps.invokeId;
3830
- if (newFrame || !this.rafStamps.invokeId)
3831
- this.rafStamps.invokeId = this.rafStamps.latestId;
3832
- if (!this.pendingCanvasMutations.has(target)) {
3833
- this.pendingCanvasMutations.set(target, []);
3834
- }
3835
- this.pendingCanvasMutations.get(target).push(mutation);
3836
- };
3837
- const { sampling = 'all', win, blockClass, blockSelector, unblockSelector, recordCanvas, dataURLOptions, } = options;
3838
- this.mutationCb = options.mutationCb;
3839
- this.mirror = options.mirror;
3840
- if (recordCanvas && sampling === 'all')
3841
- this.initCanvasMutationObserver(win, blockClass, blockSelector, unblockSelector);
3842
- if (recordCanvas && typeof sampling === 'number')
3843
- this.initCanvasFPSObserver(sampling, win, blockClass, blockSelector, unblockSelector, {
3844
- dataURLOptions,
3845
- });
3846
- }
3847
- initCanvasFPSObserver(fps, win, blockClass, blockSelector, unblockSelector, options) {
3848
- const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector, unblockSelector, true);
3849
- const snapshotInProgressMap = new Map();
3850
- const worker = new WorkerFactory();
3851
- worker.onmessage = (e) => {
3852
- const { id } = e.data;
3853
- snapshotInProgressMap.set(id, false);
3854
- if (!('base64' in e.data))
3855
- return;
3856
- const { base64, type, width, height } = e.data;
3857
- this.mutationCb({
3858
- id,
3859
- type: CanvasContext['2D'],
3860
- commands: [
3861
- {
3862
- property: 'clearRect',
3863
- args: [0, 0, width, height],
3864
- },
3865
- {
3866
- property: 'drawImage',
3867
- args: [
3868
- {
3869
- rr_type: 'ImageBitmap',
3870
- args: [
3871
- {
3872
- rr_type: 'Blob',
3873
- data: [{ rr_type: 'ArrayBuffer', base64 }],
3874
- type,
3875
- },
3876
- ],
3877
- },
3878
- 0,
3879
- 0,
3880
- ],
3881
- },
3882
- ],
3883
- });
3884
- };
3885
- const timeBetweenSnapshots = 1000 / fps;
3886
- let lastSnapshotTime = 0;
3887
- let rafId;
3888
- const getCanvas = () => {
3889
- const matchedCanvas = [];
3890
- win.document.querySelectorAll('canvas').forEach((canvas) => {
3891
- if (!isBlocked(canvas, blockClass, blockSelector, unblockSelector, true)) {
3892
- matchedCanvas.push(canvas);
3893
- }
3894
- });
3895
- return matchedCanvas;
3896
- };
3897
- const takeCanvasSnapshots = (timestamp) => {
3898
- if (lastSnapshotTime &&
3899
- timestamp - lastSnapshotTime < timeBetweenSnapshots) {
3900
- rafId = requestAnimationFrame(takeCanvasSnapshots);
3901
- return;
3902
- }
3903
- lastSnapshotTime = timestamp;
3904
- getCanvas()
3905
- .forEach((canvas) => __awaiter(this, void 0, void 0, function* () {
3906
- var _a;
3907
- const id = this.mirror.getId(canvas);
3908
- if (snapshotInProgressMap.get(id))
3909
- return;
3910
- snapshotInProgressMap.set(id, true);
3911
- if (['webgl', 'webgl2'].includes(canvas.__context)) {
3912
- const context = canvas.getContext(canvas.__context);
3913
- if (((_a = context === null || context === void 0 ? void 0 : context.getContextAttributes()) === null || _a === void 0 ? void 0 : _a.preserveDrawingBuffer) === false) {
3914
- context.clear(context.COLOR_BUFFER_BIT);
3915
- }
3916
- }
3917
- const bitmap = yield createImageBitmap(canvas);
3918
- worker.postMessage({
3919
- id,
3920
- bitmap,
3921
- width: canvas.width,
3922
- height: canvas.height,
3923
- dataURLOptions: options.dataURLOptions,
3924
- }, [bitmap]);
3925
- }));
3926
- rafId = requestAnimationFrame(takeCanvasSnapshots);
3927
- };
3928
- rafId = requestAnimationFrame(takeCanvasSnapshots);
3929
- this.resetObservers = () => {
3930
- canvasContextReset();
3931
- cancelAnimationFrame(rafId);
3932
- };
3933
- }
3934
- initCanvasMutationObserver(win, blockClass, blockSelector, unblockSelector) {
3935
- this.startRAFTimestamping();
3936
- this.startPendingCanvasMutationFlusher();
3937
- const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector, unblockSelector, false);
3938
- const canvas2DReset = initCanvas2DMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector, unblockSelector);
3939
- const canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector, unblockSelector, this.mirror);
3940
- this.resetObservers = () => {
3941
- canvasContextReset();
3942
- canvas2DReset();
3943
- canvasWebGL1and2Reset();
3944
- };
3945
- }
3946
- startPendingCanvasMutationFlusher() {
3947
- requestAnimationFrame(() => this.flushPendingCanvasMutations());
3948
- }
3949
- startRAFTimestamping() {
3950
- const setLatestRAFTimestamp = (timestamp) => {
3951
- this.rafStamps.latestId = timestamp;
3952
- requestAnimationFrame(setLatestRAFTimestamp);
3953
- };
3954
- requestAnimationFrame(setLatestRAFTimestamp);
3955
- }
3956
- flushPendingCanvasMutations() {
3957
- this.pendingCanvasMutations.forEach((values, canvas) => {
3958
- const id = this.mirror.getId(canvas);
3959
- this.flushPendingCanvasMutationFor(canvas, id);
3960
- });
3961
- requestAnimationFrame(() => this.flushPendingCanvasMutations());
3962
- }
3963
- flushPendingCanvasMutationFor(canvas, id) {
3964
- if (this.frozen || this.locked) {
3965
- return;
3966
- }
3967
- const valuesWithType = this.pendingCanvasMutations.get(canvas);
3968
- if (!valuesWithType || id === -1)
3969
- return;
3970
- const values = valuesWithType.map((value) => {
3971
- const rest = __rest(value, ["type"]);
3972
- return rest;
3973
- });
3974
- const { type } = valuesWithType[0];
3975
- this.mutationCb({ id, type, commands: values });
3976
- this.pendingCanvasMutations.delete(canvas);
3977
- }
3978
- }
3979
3343
 
3980
3344
  class StylesheetManager {
3981
3345
  constructor(options) {
@@ -4071,17 +3435,16 @@ class ProcessedNodeManager {
4071
3435
  }
4072
3436
 
4073
3437
  function wrapEvent(e) {
4074
- return Object.assign(Object.assign({}, e), { timestamp: nowTimestamp() });
3438
+ const eWithTime = e;
3439
+ eWithTime.timestamp = nowTimestamp();
3440
+ return eWithTime;
4075
3441
  }
4076
- let wrappedEmit;
4077
- let takeFullSnapshot;
4078
- let canvasManager;
4079
- let recording = false;
3442
+ let _takeFullSnapshot;
4080
3443
  const mirror = createMirror();
4081
3444
  function record(options = {}) {
4082
- const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'rr-block', blockSelector = null, unblockSelector = null, ignoreClass = 'rr-ignore', ignoreSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskAttributeFn, maskInputFn, maskTextFn, hooks, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordCanvas = false, recordCrossOriginIframes = false, recordAfter = options.recordAfter === 'DOMContentLoaded'
3445
+ const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'rr-block', blockSelector = null, unblockSelector = null, ignoreClass = 'rr-ignore', ignoreSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskAttributeFn, maskInputFn, maskTextFn, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordCanvas = false, recordCrossOriginIframes = false, recordAfter = options.recordAfter === 'DOMContentLoaded'
4083
3446
  ? options.recordAfter
4084
- : 'load', userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, ignoreCSSAttributes = new Set([]), errorHandler, onMutation, } = options;
3447
+ : 'load', userTriggeredOnInput = false, collectFonts = false, inlineImages = false, keepIframeSrcFn = () => false, ignoreCSSAttributes = new Set([]), errorHandler, onMutation, getCanvasManager, } = options;
4085
3448
  registerErrorHandler(errorHandler);
4086
3449
  const inEmittingFrame = recordCrossOriginIframes
4087
3450
  ? window.parent === window
@@ -4147,18 +3510,13 @@ function record(options = {}) {
4147
3510
  let lastFullSnapshotEvent;
4148
3511
  let incrementalSnapshotCount = 0;
4149
3512
  const eventProcessor = (e) => {
4150
- for (const plugin of plugins || []) {
4151
- if (plugin.eventProcessor) {
4152
- e = plugin.eventProcessor(e);
4153
- }
4154
- }
4155
3513
  if (packFn &&
4156
3514
  !passEmitsToParent) {
4157
3515
  e = packFn(e);
4158
3516
  }
4159
3517
  return e;
4160
3518
  };
4161
- wrappedEmit = (e, isCheckout) => {
3519
+ const wrappedEmit = (e, isCheckout) => {
4162
3520
  var _a;
4163
3521
  if (((_a = mutationBuffers[0]) === null || _a === void 0 ? void 0 : _a.isFrozen()) &&
4164
3522
  e.type !== EventType.FullSnapshot &&
@@ -4227,29 +3585,17 @@ function record(options = {}) {
4227
3585
  recordCrossOriginIframes,
4228
3586
  wrappedEmit,
4229
3587
  });
4230
- for (const plugin of plugins || []) {
4231
- if (plugin.getMirror)
4232
- plugin.getMirror({
4233
- nodeMirror: mirror,
4234
- crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,
4235
- crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror,
4236
- });
4237
- }
4238
3588
  const processedNodeManager = new ProcessedNodeManager();
4239
- canvasManager =
4240
- typeof __RRWEB_EXCLUDE_CANVAS__ === 'boolean' && __RRWEB_EXCLUDE_CANVAS__
4241
- ? new CanvasManagerNoop()
4242
- : new CanvasManager({
4243
- recordCanvas,
4244
- mutationCb: wrappedCanvasMutationEmit,
4245
- win: window,
4246
- blockClass,
4247
- blockSelector,
4248
- unblockSelector,
4249
- mirror,
4250
- sampling: sampling.canvas,
4251
- dataURLOptions,
4252
- });
3589
+ const canvasManager = getCanvasManager
3590
+ ? getCanvasManager({
3591
+ recordCanvas,
3592
+ blockClass,
3593
+ blockSelector,
3594
+ unblockSelector,
3595
+ sampling: sampling['canvas'],
3596
+ dataURLOptions,
3597
+ })
3598
+ : new CanvasManagerNoop();
4253
3599
  const shadowDomManager = typeof __RRWEB_EXCLUDE_SHADOW_DOM__ === 'boolean' &&
4254
3600
  __RRWEB_EXCLUDE_SHADOW_DOM__
4255
3601
  ? new ShadowDomManagerNoop()
@@ -4284,7 +3630,7 @@ function record(options = {}) {
4284
3630
  },
4285
3631
  mirror,
4286
3632
  });
4287
- takeFullSnapshot = (isCheckout = false) => {
3633
+ const takeFullSnapshot = (isCheckout = false) => {
4288
3634
  wrappedEmit(wrapEvent({
4289
3635
  type: EventType.Meta,
4290
3636
  data: {
@@ -4349,10 +3695,10 @@ function record(options = {}) {
4349
3695
  if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)
4350
3696
  stylesheetManager.adoptStyleSheets(document.adoptedStyleSheets, mirror.getId(document));
4351
3697
  };
3698
+ _takeFullSnapshot = takeFullSnapshot;
4352
3699
  try {
4353
3700
  const handlers = [];
4354
3701
  const observe = (doc) => {
4355
- var _a;
4356
3702
  return callbackWrapper(initObservers)({
4357
3703
  onMutation,
4358
3704
  mutationCb: wrappedMutationEmit,
@@ -4436,18 +3782,8 @@ function record(options = {}) {
4436
3782
  processedNodeManager,
4437
3783
  canvasManager,
4438
3784
  ignoreCSSAttributes,
4439
- plugins: ((_a = plugins === null || plugins === void 0 ? void 0 : plugins.filter((p) => p.observer)) === null || _a === void 0 ? void 0 : _a.map((p) => ({
4440
- observer: p.observer,
4441
- options: p.options,
4442
- callback: (payload) => wrappedEmit(wrapEvent({
4443
- type: EventType.Plugin,
4444
- data: {
4445
- plugin: p.name,
4446
- payload,
4447
- },
4448
- })),
4449
- }))) || [],
4450
- }, hooks);
3785
+ plugins: [],
3786
+ }, {});
4451
3787
  };
4452
3788
  iframeManager.addLoadListener((iframeEl) => {
4453
3789
  try {
@@ -4460,7 +3796,6 @@ function record(options = {}) {
4460
3796
  const init = () => {
4461
3797
  takeFullSnapshot();
4462
3798
  handlers.push(observe(document));
4463
- recording = true;
4464
3799
  };
4465
3800
  if (document.readyState === 'interactive' ||
4466
3801
  document.readyState === 'complete') {
@@ -4487,7 +3822,7 @@ function record(options = {}) {
4487
3822
  return () => {
4488
3823
  handlers.forEach((h) => h());
4489
3824
  processedNodeManager.destroy();
4490
- recording = false;
3825
+ _takeFullSnapshot = undefined;
4491
3826
  unregisterErrorHandler();
4492
3827
  };
4493
3828
  }
@@ -4495,28 +3830,17 @@ function record(options = {}) {
4495
3830
  console.warn(error);
4496
3831
  }
4497
3832
  }
4498
- record.addCustomEvent = (tag, payload) => {
4499
- if (!recording) {
4500
- throw new Error('please add custom event after start recording');
4501
- }
4502
- wrappedEmit(wrapEvent({
4503
- type: EventType.Custom,
4504
- data: {
4505
- tag,
4506
- payload,
4507
- },
4508
- }));
4509
- };
4510
- record.freezePage = () => {
4511
- mutationBuffers.forEach((buf) => buf.freeze());
4512
- };
4513
- record.takeFullSnapshot = (isCheckout) => {
4514
- if (!recording) {
3833
+ function takeFullSnapshot(isCheckout) {
3834
+ if (!_takeFullSnapshot) {
4515
3835
  throw new Error('please take full snapshot after start recording');
4516
3836
  }
4517
- takeFullSnapshot(isCheckout);
4518
- };
3837
+ _takeFullSnapshot(isCheckout);
3838
+ }
4519
3839
  record.mirror = mirror;
3840
+ record.takeFullSnapshot = takeFullSnapshot;
3841
+
3842
+ const ReplayEventTypeIncrementalSnapshot = 3;
3843
+ const ReplayEventTypeCustom = 5;
4520
3844
 
4521
3845
  /**
4522
3846
  * Converts a timestamp to ms, if it was in s, or keeps it as ms.
@@ -4568,6 +3892,12 @@ function addBreadcrumbEvent(replay, breadcrumb) {
4568
3892
 
4569
3893
  const INTERACTIVE_SELECTOR = 'button,a';
4570
3894
 
3895
+ /** Get the closest interactive parent element, or else return the given element. */
3896
+ function getClosestInteractive(element) {
3897
+ const closestInteractive = element.closest(INTERACTIVE_SELECTOR);
3898
+ return closestInteractive || element;
3899
+ }
3900
+
4571
3901
  /**
4572
3902
  * For clicks, we check if the target is inside of a button or link
4573
3903
  * If so, we use this as the target instead
@@ -4581,8 +3911,7 @@ function getClickTargetNode(event) {
4581
3911
  return target;
4582
3912
  }
4583
3913
 
4584
- const closestInteractive = target.closest(INTERACTIVE_SELECTOR);
4585
- return closestInteractive || target;
3914
+ return getClosestInteractive(target);
4586
3915
  }
4587
3916
 
4588
3917
  /** Get the event target node. */
@@ -4667,48 +3996,14 @@ class ClickDetector {
4667
3996
 
4668
3997
  /** Register click detection handlers on mutation or scroll. */
4669
3998
  addListeners() {
4670
- const mutationHandler = () => {
4671
- this._lastMutation = nowInSeconds();
4672
- };
4673
-
4674
- const scrollHandler = () => {
4675
- this._lastScroll = nowInSeconds();
4676
- };
4677
-
4678
3999
  const cleanupWindowOpen = onWindowOpen(() => {
4679
4000
  // Treat window.open as mutation
4680
4001
  this._lastMutation = nowInSeconds();
4681
4002
  });
4682
4003
 
4683
- const clickHandler = (event) => {
4684
- if (!event.target) {
4685
- return;
4686
- }
4687
-
4688
- const node = getClickTargetNode(event);
4689
- if (node) {
4690
- this._handleMultiClick(node );
4691
- }
4692
- };
4693
-
4694
- const obs = new MutationObserver(mutationHandler);
4695
-
4696
- obs.observe(WINDOW.document.documentElement, {
4697
- attributes: true,
4698
- characterData: true,
4699
- childList: true,
4700
- subtree: true,
4701
- });
4702
-
4703
- WINDOW.addEventListener('scroll', scrollHandler, { passive: true });
4704
- WINDOW.addEventListener('click', clickHandler, { passive: true });
4705
-
4706
4004
  this._teardown = () => {
4707
- WINDOW.removeEventListener('scroll', scrollHandler);
4708
- WINDOW.removeEventListener('click', clickHandler);
4709
4005
  cleanupWindowOpen();
4710
4006
 
4711
- obs.disconnect();
4712
4007
  this._clicks = [];
4713
4008
  this._lastMutation = 0;
4714
4009
  this._lastScroll = 0;
@@ -4726,7 +4021,7 @@ class ClickDetector {
4726
4021
  }
4727
4022
  }
4728
4023
 
4729
- /** Handle a click */
4024
+ /** @inheritDoc */
4730
4025
  handleClick(breadcrumb, node) {
4731
4026
  if (ignoreElement(node, this._ignoreSelector) || !isClickBreadcrumb(breadcrumb)) {
4732
4027
  return;
@@ -4755,6 +4050,22 @@ class ClickDetector {
4755
4050
  }
4756
4051
  }
4757
4052
 
4053
+ /** @inheritDoc */
4054
+ registerMutation(timestamp = Date.now()) {
4055
+ this._lastMutation = timestampToS(timestamp);
4056
+ }
4057
+
4058
+ /** @inheritDoc */
4059
+ registerScroll(timestamp = Date.now()) {
4060
+ this._lastScroll = timestampToS(timestamp);
4061
+ }
4062
+
4063
+ /** @inheritDoc */
4064
+ registerClick(element) {
4065
+ const node = getClosestInteractive(element);
4066
+ this._handleMultiClick(node );
4067
+ }
4068
+
4758
4069
  /** Count multiple clicks on elements. */
4759
4070
  _handleMultiClick(node) {
4760
4071
  this._getClicks(node).forEach(click => {
@@ -4909,6 +4220,53 @@ function nowInSeconds() {
4909
4220
  return Date.now() / 1000;
4910
4221
  }
4911
4222
 
4223
+ /** Update the click detector based on a recording event of rrweb. */
4224
+ function updateClickDetectorForRecordingEvent(clickDetector, event) {
4225
+ try {
4226
+ // note: We only consider incremental snapshots here
4227
+ // This means that any full snapshot is ignored for mutation detection - the reason is that we simply cannot know if a mutation happened here.
4228
+ // E.g. think that we are buffering, an error happens and we take a full snapshot because we switched to session mode -
4229
+ // in this scenario, we would not know if a dead click happened because of the error, which is a key dead click scenario.
4230
+ // Instead, by ignoring full snapshots, we have the risk that we generate a false positive
4231
+ // (if a mutation _did_ happen but was "swallowed" by the full snapshot)
4232
+ // But this should be more unlikely as we'd generally capture the incremental snapshot right away
4233
+
4234
+ if (!isIncrementalEvent(event)) {
4235
+ return;
4236
+ }
4237
+
4238
+ const { source } = event.data;
4239
+ if (source === IncrementalSource.Mutation) {
4240
+ clickDetector.registerMutation(event.timestamp);
4241
+ }
4242
+
4243
+ if (source === IncrementalSource.Scroll) {
4244
+ clickDetector.registerScroll(event.timestamp);
4245
+ }
4246
+
4247
+ if (isIncrementalMouseInteraction(event)) {
4248
+ const { type, id } = event.data;
4249
+ const node = record.mirror.getNode(id);
4250
+
4251
+ if (node instanceof HTMLElement && type === MouseInteractions.Click) {
4252
+ clickDetector.registerClick(node);
4253
+ }
4254
+ }
4255
+ } catch (e) {
4256
+ // ignore errors here, e.g. if accessing something that does not exist
4257
+ }
4258
+ }
4259
+
4260
+ function isIncrementalEvent(event) {
4261
+ return event.type === ReplayEventTypeIncrementalSnapshot;
4262
+ }
4263
+
4264
+ function isIncrementalMouseInteraction(
4265
+ event,
4266
+ ) {
4267
+ return event.data.source === IncrementalSource.MouseInteraction;
4268
+ }
4269
+
4912
4270
  /**
4913
4271
  * Create a breadcrumb for a replay.
4914
4272
  */
@@ -5315,7 +4673,7 @@ function setupPerformanceObserver(replay) {
5315
4673
  };
5316
4674
  }
5317
4675
 
5318
- const r = `var t={},e={};function a(t){let e=t.length;for(;--e>=0;)t[e]=0}const s=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),r=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),n=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),i=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),_=new Array(576);a(_);const l=new Array(60);a(l);const h=new Array(512);a(h);const o=new Array(256);a(o);const d=new Array(29);a(d);const u=new Array(30);function f(t,e,a,s,r){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=s,this.max_length=r,this.has_stree=t&&t.length}let c,p,g;function w(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}a(u);const m=t=>t<256?h[t]:h[256+(t>>>7)],b=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},y=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<<t.bi_valid&65535,b(t,t.bi_buf),t.bi_buf=e>>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=a)},v=(t,e,a)=>{y(t,a[2*e],a[2*e+1])},z=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},k=(t,e,a)=>{const s=new Array(16);let r,n,i=0;for(r=1;r<=15;r++)i=i+a[r-1]<<1,s[r]=i;for(n=0;n<=e;n++){let e=t[2*n+1];0!==e&&(t[2*n]=z(s[e]++,e))}},x=t=>{let e;for(e=0;e<286;e++)t.dyn_ltree[2*e]=0;for(e=0;e<30;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.sym_next=t.matches=0},A=t=>{t.bi_valid>8?b(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},E=(t,e,a,s)=>{const r=2*e,n=2*a;return t[r]<t[n]||t[r]===t[n]&&s[e]<=s[a]},Z=(t,e,a)=>{const s=t.heap[a];let r=a<<1;for(;r<=t.heap_len&&(r<t.heap_len&&E(e,t.heap[r+1],t.heap[r],t.depth)&&r++,!E(e,s,t.heap[r],t.depth));)t.heap[a]=t.heap[r],a=r,r<<=1;t.heap[a]=s},S=(t,e,a)=>{let n,i,_,l,h=0;if(0!==t.sym_next)do{n=255&t.pending_buf[t.sym_buf+h++],n+=(255&t.pending_buf[t.sym_buf+h++])<<8,i=t.pending_buf[t.sym_buf+h++],0===n?v(t,i,e):(_=o[i],v(t,_+256+1,e),l=s[_],0!==l&&(i-=d[_],y(t,i,l)),n--,_=m(n),v(t,_,a),l=r[_],0!==l&&(n-=u[_],y(t,n,l)))}while(h<t.sym_next);v(t,256,e)},U=(t,e)=>{const a=e.dyn_tree,s=e.stat_desc.static_tree,r=e.stat_desc.has_stree,n=e.stat_desc.elems;let i,_,l,h=-1;for(t.heap_len=0,t.heap_max=573,i=0;i<n;i++)0!==a[2*i]?(t.heap[++t.heap_len]=h=i,t.depth[i]=0):a[2*i+1]=0;for(;t.heap_len<2;)l=t.heap[++t.heap_len]=h<2?++h:0,a[2*l]=1,t.depth[l]=0,t.opt_len--,r&&(t.static_len-=s[2*l+1]);for(e.max_code=h,i=t.heap_len>>1;i>=1;i--)Z(t,a,i);l=n;do{i=t.heap[1],t.heap[1]=t.heap[t.heap_len--],Z(t,a,1),_=t.heap[1],t.heap[--t.heap_max]=i,t.heap[--t.heap_max]=_,a[2*l]=a[2*i]+a[2*_],t.depth[l]=(t.depth[i]>=t.depth[_]?t.depth[i]:t.depth[_])+1,a[2*i+1]=a[2*_+1]=l,t.heap[1]=l++,Z(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,s=e.max_code,r=e.stat_desc.static_tree,n=e.stat_desc.has_stree,i=e.stat_desc.extra_bits,_=e.stat_desc.extra_base,l=e.stat_desc.max_length;let h,o,d,u,f,c,p=0;for(u=0;u<=15;u++)t.bl_count[u]=0;for(a[2*t.heap[t.heap_max]+1]=0,h=t.heap_max+1;h<573;h++)o=t.heap[h],u=a[2*a[2*o+1]+1]+1,u>l&&(u=l,p++),a[2*o+1]=u,o>s||(t.bl_count[u]++,f=0,o>=_&&(f=i[o-_]),c=a[2*o],t.opt_len+=c*(u+f),n&&(t.static_len+=c*(r[2*o+1]+f)));if(0!==p){do{for(u=l-1;0===t.bl_count[u];)u--;t.bl_count[u]--,t.bl_count[u+1]+=2,t.bl_count[l]--,p-=2}while(p>0);for(u=l;0!==u;u--)for(o=t.bl_count[u];0!==o;)d=t.heap[--h],d>s||(a[2*d+1]!==u&&(t.opt_len+=(u-a[2*d+1])*a[2*d],a[2*d+1]=u),o--)}})(t,e),k(a,h,t.bl_count)},R=(t,e,a)=>{let s,r,n=-1,i=e[1],_=0,l=7,h=4;for(0===i&&(l=138,h=3),e[2*(a+1)+1]=65535,s=0;s<=a;s++)r=i,i=e[2*(s+1)+1],++_<l&&r===i||(_<h?t.bl_tree[2*r]+=_:0!==r?(r!==n&&t.bl_tree[2*r]++,t.bl_tree[32]++):_<=10?t.bl_tree[34]++:t.bl_tree[36]++,_=0,n=r,0===i?(l=138,h=3):r===i?(l=6,h=3):(l=7,h=4))},L=(t,e,a)=>{let s,r,n=-1,i=e[1],_=0,l=7,h=4;for(0===i&&(l=138,h=3),s=0;s<=a;s++)if(r=i,i=e[2*(s+1)+1],!(++_<l&&r===i)){if(_<h)do{v(t,r,t.bl_tree)}while(0!=--_);else 0!==r?(r!==n&&(v(t,r,t.bl_tree),_--),v(t,16,t.bl_tree),y(t,_-3,2)):_<=10?(v(t,17,t.bl_tree),y(t,_-3,3)):(v(t,18,t.bl_tree),y(t,_-11,7));_=0,n=r,0===i?(l=138,h=3):r===i?(l=6,h=3):(l=7,h=4)}};let T=!1;const F=(t,e,a,s)=>{y(t,0+(s?1:0),3),A(t),b(t,a),b(t,~a),a&&t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a};e._tr_init=t=>{T||((()=>{let t,e,a,i,w;const m=new Array(16);for(a=0,i=0;i<28;i++)for(d[i]=a,t=0;t<1<<s[i];t++)o[a++]=i;for(o[a-1]=i,w=0,i=0;i<16;i++)for(u[i]=w,t=0;t<1<<r[i];t++)h[w++]=i;for(w>>=7;i<30;i++)for(u[i]=w<<7,t=0;t<1<<r[i]-7;t++)h[256+w++]=i;for(e=0;e<=15;e++)m[e]=0;for(t=0;t<=143;)_[2*t+1]=8,t++,m[8]++;for(;t<=255;)_[2*t+1]=9,t++,m[9]++;for(;t<=279;)_[2*t+1]=7,t++,m[7]++;for(;t<=287;)_[2*t+1]=8,t++,m[8]++;for(k(_,287,m),t=0;t<30;t++)l[2*t+1]=5,l[2*t]=z(t,5);c=new f(_,s,257,286,15),p=new f(l,r,0,30,15),g=new f(new Array(0),n,0,19,7)})(),T=!0),t.l_desc=new w(t.dyn_ltree,c),t.d_desc=new w(t.dyn_dtree,p),t.bl_desc=new w(t.bl_tree,g),t.bi_buf=0,t.bi_valid=0,x(t)},e._tr_stored_block=F,e._tr_flush_block=(t,e,a,s)=>{let r,n,h=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,a=4093624447;for(e=0;e<=31;e++,a>>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<256;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),U(t,t.l_desc),U(t,t.d_desc),h=(t=>{let e;for(R(t,t.dyn_ltree,t.l_desc.max_code),R(t,t.dyn_dtree,t.d_desc.max_code),U(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*i[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),r=t.opt_len+3+7>>>3,n=t.static_len+3+7>>>3,n<=r&&(r=n)):r=n=a+5,a+4<=r&&-1!==e?F(t,e,a,s):4===t.strategy||n===r?(y(t,2+(s?1:0),3),S(t,_,l)):(y(t,4+(s?1:0),3),((t,e,a,s)=>{let r;for(y(t,e-257,5),y(t,a-1,5),y(t,s-4,4),r=0;r<s;r++)y(t,t.bl_tree[2*i[r]+1],3);L(t,t.dyn_ltree,e-1),L(t,t.dyn_dtree,a-1)})(t,t.l_desc.max_code+1,t.d_desc.max_code+1,h+1),S(t,t.dyn_ltree,t.dyn_dtree)),x(t),s&&A(t)},e._tr_tally=(t,e,a)=>(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=a,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(o[a]+256+1)]++,t.dyn_dtree[2*m(e)]++),t.sym_next===t.sym_end),e._tr_align=t=>{y(t,2,3),v(t,256,_),(t=>{16===t.bi_valid?(b(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)};var O=(t,e,a,s)=>{let r=65535&t|0,n=t>>>16&65535|0,i=0;for(;0!==a;){i=a>2e3?2e3:a,a-=i;do{r=r+e[s++]|0,n=n+r|0}while(--i);r%=65521,n%=65521}return r|n<<16|0};const D=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var s=0;s<8;s++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var N=(t,e,a,s)=>{const r=D,n=s+a;t^=-1;for(let a=s;a<n;a++)t=t>>>8^r[255&(t^e[a])];return-1^t},C={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},I={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:H,_tr_stored_block:B,_tr_flush_block:M,_tr_tally:P,_tr_align:Y}=e,K=O,j=N,G=C,{Z_NO_FLUSH:X,Z_PARTIAL_FLUSH:W,Z_FULL_FLUSH:q,Z_FINISH:J,Z_BLOCK:Q,Z_OK:V,Z_STREAM_END:$,Z_STREAM_ERROR:tt,Z_DATA_ERROR:et,Z_BUF_ERROR:at,Z_DEFAULT_COMPRESSION:st,Z_FILTERED:rt,Z_HUFFMAN_ONLY:nt,Z_RLE:it,Z_FIXED:_t,Z_DEFAULT_STRATEGY:lt,Z_UNKNOWN:ht,Z_DEFLATED:ot}=I,dt=(t,e)=>(t.msg=G[e],e),ut=t=>2*t-(t>4?9:0),ft=t=>{let e=t.length;for(;--e>=0;)t[e]=0},ct=t=>{let e,a,s,r=t.w_size;e=t.hash_size,s=e;do{a=t.head[--s],t.head[s]=a>=r?a-r:0}while(--e);e=r,s=e;do{a=t.prev[--s],t.prev[s]=a>=r?a-r:0}while(--e)};let pt=(t,e,a)=>(e<<t.hash_shift^a)&t.hash_mask;const gt=t=>{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},wt=(t,e)=>{M(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,gt(t.strm)},mt=(t,e)=>{t.pending_buf[t.pending++]=e},bt=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},yt=(t,e,a,s)=>{let r=t.avail_in;return r>s&&(r=s),0===r?0:(t.avail_in-=r,e.set(t.input.subarray(t.next_in,t.next_in+r),a),1===t.state.wrap?t.adler=K(t.adler,e,r,a):2===t.state.wrap&&(t.adler=j(t.adler,e,r,a)),t.next_in+=r,t.total_in+=r,r)},vt=(t,e)=>{let a,s,r=t.max_chain_length,n=t.strstart,i=t.prev_length,_=t.nice_match;const l=t.strstart>t.w_size-262?t.strstart-(t.w_size-262):0,h=t.window,o=t.w_mask,d=t.prev,u=t.strstart+258;let f=h[n+i-1],c=h[n+i];t.prev_length>=t.good_match&&(r>>=2),_>t.lookahead&&(_=t.lookahead);do{if(a=e,h[a+i]===c&&h[a+i-1]===f&&h[a]===h[n]&&h[++a]===h[n+1]){n+=2,a++;do{}while(h[++n]===h[++a]&&h[++n]===h[++a]&&h[++n]===h[++a]&&h[++n]===h[++a]&&h[++n]===h[++a]&&h[++n]===h[++a]&&h[++n]===h[++a]&&h[++n]===h[++a]&&n<u);if(s=258-(u-n),n=u-258,s>i){if(t.match_start=e,i=s,s>=_)break;f=h[n+i-1],c=h[n+i]}}}while((e=d[e&o])>l&&0!=--r);return i<=t.lookahead?i:t.lookahead},zt=t=>{const e=t.w_size;let a,s,r;do{if(s=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-262)&&(t.window.set(t.window.subarray(e,e+e-s),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),ct(t),s+=e),0===t.strm.avail_in)break;if(a=yt(t.strm,t.window,t.strstart+t.lookahead,s),t.lookahead+=a,t.lookahead+t.insert>=3)for(r=t.strstart-t.insert,t.ins_h=t.window[r],t.ins_h=pt(t,t.ins_h,t.window[r+1]);t.insert&&(t.ins_h=pt(t,t.ins_h,t.window[r+3-1]),t.prev[r&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=r,r++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<262&&0!==t.strm.avail_in)},kt=(t,e)=>{let a,s,r,n=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,i=0,_=t.strm.avail_in;do{if(a=65535,r=t.bi_valid+42>>3,t.strm.avail_out<r)break;if(r=t.strm.avail_out-r,s=t.strstart-t.block_start,a>s+t.strm.avail_in&&(a=s+t.strm.avail_in),a>r&&(a=r),a<n&&(0===a&&e!==J||e===X||a!==s+t.strm.avail_in))break;i=e===J&&a===s+t.strm.avail_in?1:0,B(t,0,0,i),t.pending_buf[t.pending-4]=a,t.pending_buf[t.pending-3]=a>>8,t.pending_buf[t.pending-2]=~a,t.pending_buf[t.pending-1]=~a>>8,gt(t.strm),s&&(s>a&&(s=a),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+s),t.strm.next_out),t.strm.next_out+=s,t.strm.avail_out-=s,t.strm.total_out+=s,t.block_start+=s,a-=s),a&&(yt(t.strm,t.strm.output,t.strm.next_out,a),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a)}while(0===i);return _-=t.strm.avail_in,_&&(_>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=_&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-_,t.strm.next_in),t.strstart),t.strstart+=_,t.insert+=_>t.w_size-t.insert?t.w_size-t.insert:_),t.block_start=t.strstart),t.high_water<t.strstart&&(t.high_water=t.strstart),i?4:e!==X&&e!==J&&0===t.strm.avail_in&&t.strstart===t.block_start?2:(r=t.window_size-t.strstart,t.strm.avail_in>r&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,r+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),r>t.strm.avail_in&&(r=t.strm.avail_in),r&&(yt(t.strm,t.window,t.strstart,r),t.strstart+=r,t.insert+=r>t.w_size-t.insert?t.w_size-t.insert:r),t.high_water<t.strstart&&(t.high_water=t.strstart),r=t.bi_valid+42>>3,r=t.pending_buf_size-r>65535?65535:t.pending_buf_size-r,n=r>t.w_size?t.w_size:r,s=t.strstart-t.block_start,(s>=n||(s||e===J)&&e!==X&&0===t.strm.avail_in&&s<=r)&&(a=s>r?r:s,i=e===J&&0===t.strm.avail_in&&a===s?1:0,B(t,t.block_start,a,i),t.block_start+=a,gt(t.strm)),i?3:1)},xt=(t,e)=>{let a,s;for(;;){if(t.lookahead<262){if(zt(t),t.lookahead<262&&e===X)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=pt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-262&&(t.match_length=vt(t,a)),t.match_length>=3)if(s=P(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=pt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=pt(t,t.ins_h,t.window[t.strstart+1]);else s=P(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(s&&(wt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===J?(wt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(wt(t,!1),0===t.strm.avail_out)?1:2},At=(t,e)=>{let a,s,r;for(;;){if(t.lookahead<262){if(zt(t),t.lookahead<262&&e===X)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=pt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length<t.max_lazy_match&&t.strstart-a<=t.w_size-262&&(t.match_length=vt(t,a),t.match_length<=5&&(t.strategy===rt||3===t.match_length&&t.strstart-t.match_start>4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){r=t.strstart+t.lookahead-3,s=P(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=r&&(t.ins_h=pt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,s&&(wt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(s=P(t,0,t.window[t.strstart-1]),s&&wt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(s=P(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===J?(wt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(wt(t,!1),0===t.strm.avail_out)?1:2};function Et(t,e,a,s,r){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=s,this.func=r}const Zt=[new Et(0,0,0,0,kt),new Et(4,4,8,4,xt),new Et(4,5,16,8,xt),new Et(4,6,32,32,xt),new Et(4,4,16,16,At),new Et(8,16,32,32,At),new Et(8,16,128,128,At),new Et(8,32,128,256,At),new Et(32,128,258,1024,At),new Et(32,258,258,4096,At)];function St(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ot,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),ft(this.dyn_ltree),ft(this.dyn_dtree),ft(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),ft(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),ft(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Ut=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||42!==e.status&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&113!==e.status&&666!==e.status?1:0},Rt=t=>{if(Ut(t))return dt(t,tt);t.total_in=t.total_out=0,t.data_type=ht;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?42:113,t.adler=2===e.wrap?0:1,e.last_flush=-2,H(e),V},Lt=t=>{const e=Rt(t);var a;return e===V&&((a=t.state).window_size=2*a.w_size,ft(a.head),a.max_lazy_match=Zt[a.level].max_lazy,a.good_match=Zt[a.level].good_length,a.nice_match=Zt[a.level].nice_length,a.max_chain_length=Zt[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=2,a.match_available=0,a.ins_h=0),e},Tt=(t,e,a,s,r,n)=>{if(!t)return tt;let i=1;if(e===st&&(e=6),s<0?(i=0,s=-s):s>15&&(i=2,s-=16),r<1||r>9||a!==ot||s<8||s>15||e<0||e>9||n<0||n>_t||8===s&&1!==i)return dt(t,tt);8===s&&(s=9);const _=new St;return t.state=_,_.strm=t,_.status=42,_.wrap=i,_.gzhead=null,_.w_bits=s,_.w_size=1<<_.w_bits,_.w_mask=_.w_size-1,_.hash_bits=r+7,_.hash_size=1<<_.hash_bits,_.hash_mask=_.hash_size-1,_.hash_shift=~~((_.hash_bits+3-1)/3),_.window=new Uint8Array(2*_.w_size),_.head=new Uint16Array(_.hash_size),_.prev=new Uint16Array(_.w_size),_.lit_bufsize=1<<r+6,_.pending_buf_size=4*_.lit_bufsize,_.pending_buf=new Uint8Array(_.pending_buf_size),_.sym_buf=_.lit_bufsize,_.sym_end=3*(_.lit_bufsize-1),_.level=e,_.strategy=n,_.method=a,Lt(t)};t.deflateInit=(t,e)=>Tt(t,e,ot,15,8,lt),t.deflateInit2=Tt,t.deflateReset=Lt,t.deflateResetKeep=Rt,t.deflateSetHeader=(t,e)=>Ut(t)||2!==t.state.wrap?tt:(t.state.gzhead=e,V),t.deflate=(t,e)=>{if(Ut(t)||e>Q||e<0)return t?dt(t,tt):tt;const a=t.state;if(!t.output||0!==t.avail_in&&!t.input||666===a.status&&e!==J)return dt(t,0===t.avail_out?at:tt);const s=a.last_flush;if(a.last_flush=e,0!==a.pending){if(gt(t),0===t.avail_out)return a.last_flush=-1,V}else if(0===t.avail_in&&ut(e)<=ut(s)&&e!==J)return dt(t,at);if(666===a.status&&0!==t.avail_in)return dt(t,at);if(42===a.status&&0===a.wrap&&(a.status=113),42===a.status){let e=ot+(a.w_bits-8<<4)<<8,s=-1;if(s=a.strategy>=nt||a.level<2?0:a.level<6?1:6===a.level?2:3,e|=s<<6,0!==a.strstart&&(e|=32),e+=31-e%31,bt(a,e),0!==a.strstart&&(bt(a,t.adler>>>16),bt(a,65535&t.adler)),t.adler=1,a.status=113,gt(t),0!==a.pending)return a.last_flush=-1,V}if(57===a.status)if(t.adler=0,mt(a,31),mt(a,139),mt(a,8),a.gzhead)mt(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),mt(a,255&a.gzhead.time),mt(a,a.gzhead.time>>8&255),mt(a,a.gzhead.time>>16&255),mt(a,a.gzhead.time>>24&255),mt(a,9===a.level?2:a.strategy>=nt||a.level<2?4:0),mt(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(mt(a,255&a.gzhead.extra.length),mt(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(t.adler=j(t.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(mt(a,0),mt(a,0),mt(a,0),mt(a,0),mt(a,0),mt(a,9===a.level?2:a.strategy>=nt||a.level<2?4:0),mt(a,3),a.status=113,gt(t),0!==a.pending)return a.last_flush=-1,V;if(69===a.status){if(a.gzhead.extra){let e=a.pending,s=(65535&a.gzhead.extra.length)-a.gzindex;for(;a.pending+s>a.pending_buf_size;){let r=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+r),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>e&&(t.adler=j(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex+=r,gt(t),0!==a.pending)return a.last_flush=-1,V;e=0,s-=r}let r=new Uint8Array(a.gzhead.extra);a.pending_buf.set(r.subarray(a.gzindex,a.gzindex+s),a.pending),a.pending+=s,a.gzhead.hcrc&&a.pending>e&&(t.adler=j(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){let e,s=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>s&&(t.adler=j(t.adler,a.pending_buf,a.pending-s,s)),gt(t),0!==a.pending)return a.last_flush=-1,V;s=0}e=a.gzindex<a.gzhead.name.length?255&a.gzhead.name.charCodeAt(a.gzindex++):0,mt(a,e)}while(0!==e);a.gzhead.hcrc&&a.pending>s&&(t.adler=j(t.adler,a.pending_buf,a.pending-s,s)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){let e,s=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>s&&(t.adler=j(t.adler,a.pending_buf,a.pending-s,s)),gt(t),0!==a.pending)return a.last_flush=-1,V;s=0}e=a.gzindex<a.gzhead.comment.length?255&a.gzhead.comment.charCodeAt(a.gzindex++):0,mt(a,e)}while(0!==e);a.gzhead.hcrc&&a.pending>s&&(t.adler=j(t.adler,a.pending_buf,a.pending-s,s))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(gt(t),0!==a.pending))return a.last_flush=-1,V;mt(a,255&t.adler),mt(a,t.adler>>8&255),t.adler=0}if(a.status=113,gt(t),0!==a.pending)return a.last_flush=-1,V}if(0!==t.avail_in||0!==a.lookahead||e!==X&&666!==a.status){let s=0===a.level?kt(a,e):a.strategy===nt?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(zt(t),0===t.lookahead)){if(e===X)return 1;break}if(t.match_length=0,a=P(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(wt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===J?(wt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(wt(t,!1),0===t.strm.avail_out)?1:2})(a,e):a.strategy===it?((t,e)=>{let a,s,r,n;const i=t.window;for(;;){if(t.lookahead<=258){if(zt(t),t.lookahead<=258&&e===X)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(r=t.strstart-1,s=i[r],s===i[++r]&&s===i[++r]&&s===i[++r])){n=t.strstart+258;do{}while(s===i[++r]&&s===i[++r]&&s===i[++r]&&s===i[++r]&&s===i[++r]&&s===i[++r]&&s===i[++r]&&s===i[++r]&&r<n);t.match_length=258-(n-r),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=P(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=P(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(wt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===J?(wt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(wt(t,!1),0===t.strm.avail_out)?1:2})(a,e):Zt[a.level].func(a,e);if(3!==s&&4!==s||(a.status=666),1===s||3===s)return 0===t.avail_out&&(a.last_flush=-1),V;if(2===s&&(e===W?Y(a):e!==Q&&(B(a,0,0,!1),e===q&&(ft(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),gt(t),0===t.avail_out))return a.last_flush=-1,V}return e!==J?V:a.wrap<=0?$:(2===a.wrap?(mt(a,255&t.adler),mt(a,t.adler>>8&255),mt(a,t.adler>>16&255),mt(a,t.adler>>24&255),mt(a,255&t.total_in),mt(a,t.total_in>>8&255),mt(a,t.total_in>>16&255),mt(a,t.total_in>>24&255)):(bt(a,t.adler>>>16),bt(a,65535&t.adler)),gt(t),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?V:$)},t.deflateEnd=t=>{if(Ut(t))return tt;const e=t.state.status;return t.state=null,113===e?dt(t,et):V},t.deflateSetDictionary=(t,e)=>{let a=e.length;if(Ut(t))return tt;const s=t.state,r=s.wrap;if(2===r||1===r&&42!==s.status||s.lookahead)return tt;if(1===r&&(t.adler=K(t.adler,e,a,0)),s.wrap=0,a>=s.w_size){0===r&&(ft(s.head),s.strstart=0,s.block_start=0,s.insert=0);let t=new Uint8Array(s.w_size);t.set(e.subarray(a-s.w_size,a),0),e=t,a=s.w_size}const n=t.avail_in,i=t.next_in,_=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,zt(s);s.lookahead>=3;){let t=s.strstart,e=s.lookahead-2;do{s.ins_h=pt(s,s.ins_h,s.window[t+3-1]),s.prev[t&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=t,t++}while(--e);s.strstart=t,s.lookahead=2,zt(s)}return s.strstart+=s.lookahead,s.block_start=s.strstart,s.insert=s.lookahead,s.lookahead=0,s.match_length=s.prev_length=2,s.match_available=0,t.next_in=i,t.input=_,t.avail_in=n,s.wrap=r,V},t.deflateInfo="pako deflate (from Nodeca project)";var Ft={};const Ot=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);Ft.assign=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)Ot(a,e)&&(t[e]=a[e])}}return t},Ft.flattenChunks=t=>{let e=0;for(let a=0,s=t.length;a<s;a++)e+=t[a].length;const a=new Uint8Array(e);for(let e=0,s=0,r=t.length;e<r;e++){let r=t[e];a.set(r,s),s+=r.length}return a};var Dt={};let Nt=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){Nt=!1}const Ct=new Uint8Array(256);for(let t=0;t<256;t++)Ct[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Ct[254]=Ct[254]=1,Dt.string2buf=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,s,r,n,i=t.length,_=0;for(r=0;r<i;r++)a=t.charCodeAt(r),55296==(64512&a)&&r+1<i&&(s=t.charCodeAt(r+1),56320==(64512&s)&&(a=65536+(a-55296<<10)+(s-56320),r++)),_+=a<128?1:a<2048?2:a<65536?3:4;for(e=new Uint8Array(_),n=0,r=0;n<_;r++)a=t.charCodeAt(r),55296==(64512&a)&&r+1<i&&(s=t.charCodeAt(r+1),56320==(64512&s)&&(a=65536+(a-55296<<10)+(s-56320),r++)),a<128?e[n++]=a:a<2048?(e[n++]=192|a>>>6,e[n++]=128|63&a):a<65536?(e[n++]=224|a>>>12,e[n++]=128|a>>>6&63,e[n++]=128|63&a):(e[n++]=240|a>>>18,e[n++]=128|a>>>12&63,e[n++]=128|a>>>6&63,e[n++]=128|63&a);return e};Dt.buf2string=(t,e)=>{const a=e||t.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(t.subarray(0,e));let s,r;const n=new Array(2*a);for(r=0,s=0;s<a;){let e=t[s++];if(e<128){n[r++]=e;continue}let i=Ct[e];if(i>4)n[r++]=65533,s+=i-1;else{for(e&=2===i?31:3===i?15:7;i>1&&s<a;)e=e<<6|63&t[s++],i--;i>1?n[r++]=65533:e<65536?n[r++]=e:(e-=65536,n[r++]=55296|e>>10&1023,n[r++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&Nt)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let a="";for(let s=0;s<e;s++)a+=String.fromCharCode(t[s]);return a})(n,r)},Dt.utf8border=(t,e)=>{(e=e||t.length)>t.length&&(e=t.length);let a=e-1;for(;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+Ct[t[a]]>e?a:e};const It=t,Ht=Ft,Bt=Dt,Mt=C,Pt=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},Yt=Object.prototype.toString,{Z_NO_FLUSH:Kt,Z_SYNC_FLUSH:jt,Z_FULL_FLUSH:Gt,Z_FINISH:Xt,Z_OK:Wt,Z_STREAM_END:qt,Z_DEFAULT_COMPRESSION:Jt,Z_DEFAULT_STRATEGY:Qt,Z_DEFLATED:Vt}=I;function $t(t){this.options=Ht.assign({level:Jt,method:Vt,chunkSize:16384,windowBits:15,memLevel:8,strategy:Qt},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Pt,this.strm.avail_out=0;let a=It.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==Wt)throw new Error(Mt[a]);if(e.header&&It.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Bt.string2buf(e.dictionary):"[object ArrayBuffer]"===Yt.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=It.deflateSetDictionary(this.strm,t),a!==Wt)throw new Error(Mt[a]);this._dict_set=!0}}$t.prototype.push=function(t,e){const a=this.strm,s=this.options.chunkSize;let r,n;if(this.ended)return!1;for(n=e===~~e?e:!0===e?Xt:Kt,"string"==typeof t?a.input=Bt.string2buf(t):"[object ArrayBuffer]"===Yt.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(s),a.next_out=0,a.avail_out=s),(n===jt||n===Gt)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(r=It.deflate(a,n),r===qt)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),r=It.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===Wt;if(0!==a.avail_out){if(n>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},$t.prototype.onData=function(t){this.chunks.push(t)},$t.prototype.onEnd=function(t){t===Wt&&(this.result=Ht.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};const te=$t,ee=function(t,e){const a=new $t(e);if(a.push(t,!0),a.err)throw a.msg||Mt[a.err];return a.result},ae=I;const se=new class{constructor(){this._init()}clear(){this._init()}addEvent(t){if(!t)throw new Error("Adding invalid event");const e=this._hasEvents?",":"";this.deflate.push(e+t,ae.Z_SYNC_FLUSH),this._hasEvents=!0}finish(){if(this.deflate.push("]",ae.Z_FINISH),this.deflate.err)throw this.deflate.err;const t=this.deflate.result;return this._init(),t}_init(){this._hasEvents=!1,this.deflate=new te,this.deflate.push("[",ae.Z_NO_FLUSH)}},re={clear:()=>{se.clear()},addEvent:t=>se.addEvent(t),finish:()=>se.finish(),compress:t=>function(t){return ee(t)}(t)};addEventListener("message",(function(t){const e=t.data.method,a=t.data.id,s=t.data.arg;if(e in re&&"function"==typeof re[e])try{const t=re[e](s);postMessage({id:a,method:e,success:!0,response:t})}catch(t){postMessage({id:a,method:e,success:!1,response:t.message}),console.error(t)}})),postMessage({id:void 0,method:"init",success:!0,response:void 0});`;
4676
+ const r = `var t=Uint8Array,n=Uint16Array,r=Int32Array,e=new t([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new t([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=function(t,e){for(var i=new n(31),a=0;a<31;++a)i[a]=e+=1<<t[a-1];var s=new r(i[30]);for(a=1;a<30;++a)for(var o=i[a];o<i[a+1];++o)s[o]=o-i[a]<<5|a;return{b:i,r:s}},o=s(e,2),f=o.b,h=o.r;f[28]=258,h[258]=28;for(var l=s(i,0).r,u=new n(32768),c=0;c<32768;++c){var v=(43690&c)>>1|(21845&c)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,u[c]=((65280&v)>>8|(255&v)<<8)>>1}var d=function(t,r,e){for(var i=t.length,a=0,s=new n(r);a<i;++a)t[a]&&++s[t[a]-1];var o,f=new n(r);for(a=1;a<r;++a)f[a]=f[a-1]+s[a-1]<<1;if(e){o=new n(1<<r);var h=15-r;for(a=0;a<i;++a)if(t[a])for(var l=a<<4|t[a],c=r-t[a],v=f[t[a]-1]++<<c,d=v|(1<<c)-1;v<=d;++v)o[u[v]>>h]=l}else for(o=new n(i),a=0;a<i;++a)t[a]&&(o[a]=u[f[t[a]-1]++]>>15-t[a]);return o},g=new t(288);for(c=0;c<144;++c)g[c]=8;for(c=144;c<256;++c)g[c]=9;for(c=256;c<280;++c)g[c]=7;for(c=280;c<288;++c)g[c]=8;var w=new t(32);for(c=0;c<32;++c)w[c]=5;var p=d(g,9,0),y=d(w,5,0),m=function(t){return(t+7)/8|0},b=function(n,r,e){return(null==r||r<0)&&(r=0),(null==e||e>n.length)&&(e=n.length),new t(n.subarray(r,e))},M=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],E=function(t,n,r){var e=new Error(n||M[t]);if(e.code=t,Error.captureStackTrace&&Error.captureStackTrace(e,E),!r)throw e;return e},z=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8},A=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8,t[e+2]|=r>>16},_=function(r,e){for(var i=[],a=0;a<r.length;++a)r[a]&&i.push({s:a,f:r[a]});var s=i.length,o=i.slice();if(!s)return{t:F,l:0};if(1==s){var f=new t(i[0].s+1);return f[i[0].s]=1,{t:f,l:1}}i.sort((function(t,n){return t.f-n.f})),i.push({s:-1,f:25001});var h=i[0],l=i[1],u=0,c=1,v=2;for(i[0]={s:-1,f:h.f+l.f,l:h,r:l};c!=s-1;)h=i[i[u].f<i[v].f?u++:v++],l=i[u!=c&&i[u].f<i[v].f?u++:v++],i[c++]={s:-1,f:h.f+l.f,l:h,r:l};var d=o[0].s;for(a=1;a<s;++a)o[a].s>d&&(d=o[a].s);var g=new n(d+1),w=x(i[c-1],g,0);if(w>e){a=0;var p=0,y=w-e,m=1<<y;for(o.sort((function(t,n){return g[n.s]-g[t.s]||t.f-n.f}));a<s;++a){var b=o[a].s;if(!(g[b]>e))break;p+=m-(1<<w-g[b]),g[b]=e}for(p>>=y;p>0;){var M=o[a].s;g[M]<e?p-=1<<e-g[M]++-1:++a}for(;a>=0&&p;--a){var E=o[a].s;g[E]==e&&(--g[E],++p)}w=e}return{t:new t(g),l:w}},x=function(t,n,r){return-1==t.s?Math.max(x(t.l,n,r+1),x(t.r,n,r+1)):n[t.s]=r},D=function(t){for(var r=t.length;r&&!t[--r];);for(var e=new n(++r),i=0,a=t[0],s=1,o=function(t){e[i++]=t},f=1;f<=r;++f)if(t[f]==a&&f!=r)++s;else{if(!a&&s>2){for(;s>138;s-=138)o(32754);s>2&&(o(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(o(a),--s;s>6;s-=6)o(8304);s>2&&(o(s-3<<5|8208),s=0)}for(;s--;)o(a);s=1,a=t[f]}return{c:e.subarray(0,i),n:r}},T=function(t,n){for(var r=0,e=0;e<n.length;++e)r+=t[e]*n[e];return r},k=function(t,n,r){var e=r.length,i=m(n+2);t[i]=255&e,t[i+1]=e>>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var a=0;a<e;++a)t[i+a+4]=r[a];return 8*(i+4+e)},C=function(t,r,s,o,f,h,l,u,c,v,m){z(r,m++,s),++f[256];for(var b=_(f,15),M=b.t,E=b.l,x=_(h,15),C=x.t,U=x.l,F=D(M),I=F.c,S=F.n,L=D(C),O=L.c,j=L.n,q=new n(19),B=0;B<I.length;++B)++q[31&I[B]];for(B=0;B<O.length;++B)++q[31&O[B]];for(var G=_(q,7),H=G.t,J=G.l,K=19;K>4&&!H[a[K-1]];--K);var N,P,Q,R,V=v+5<<3,W=T(f,g)+T(h,w)+l,X=T(f,M)+T(h,C)+l+14+3*K+T(q,H)+2*q[16]+3*q[17]+7*q[18];if(c>=0&&V<=W&&V<=X)return k(r,m,t.subarray(c,c+v));if(z(r,m,1+(X<W)),m+=2,X<W){N=d(M,E,0),P=M,Q=d(C,U,0),R=C;var Y=d(H,J,0);z(r,m,S-257),z(r,m+5,j-1),z(r,m+10,K-4),m+=14;for(B=0;B<K;++B)z(r,m+3*B,H[a[B]]);m+=3*K;for(var Z=[I,O],$=0;$<2;++$){var tt=Z[$];for(B=0;B<tt.length;++B){var nt=31&tt[B];z(r,m,Y[nt]),m+=H[nt],nt>15&&(z(r,m,tt[B]>>5&127),m+=tt[B]>>12)}}}else N=p,P=g,Q=y,R=w;for(B=0;B<u;++B){var rt=o[B];if(rt>255){A(r,m,N[(nt=rt>>18&31)+257]),m+=P[nt+257],nt>7&&(z(r,m,rt>>23&31),m+=e[nt]);var et=31&rt;A(r,m,Q[et]),m+=R[et],et>3&&(A(r,m,rt>>5&8191),m+=i[et])}else A(r,m,N[rt]),m+=P[rt]}return A(r,m,N[256]),m+P[256]},U=new r([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),F=new t(0),I=function(){for(var t=new Int32Array(256),n=0;n<256;++n){for(var r=n,e=9;--e;)r=(1&r&&-306674912)^r>>>1;t[n]=r}return t}(),S=function(){var t=1,n=0;return{p:function(r){for(var e=t,i=n,a=0|r.length,s=0;s!=a;){for(var o=Math.min(s+2655,a);s<o;++s)i+=e+=r[s];e=(65535&e)+15*(e>>16),i=(65535&i)+15*(i>>16)}t=e,n=i},d:function(){return(255&(t%=65521))<<24|(65280&t)<<8|(255&(n%=65521))<<8|n>>8}}},L=function(a,s,o,f,u){if(!u&&(u={l:1},s.dictionary)){var c=s.dictionary.subarray(-32768),v=new t(c.length+a.length);v.set(c),v.set(a,c.length),a=v,u.w=c.length}return function(a,s,o,f,u,c){var v=c.z||a.length,d=new t(f+v+5*(1+Math.ceil(v/7e3))+u),g=d.subarray(f,d.length-u),w=c.l,p=7&(c.r||0);if(s){p&&(g[0]=c.r>>3);for(var y=U[s-1],M=y>>13,E=8191&y,z=(1<<o)-1,A=c.p||new n(32768),_=c.h||new n(z+1),x=Math.ceil(o/3),D=2*x,T=function(t){return(a[t]^a[t+1]<<x^a[t+2]<<D)&z},F=new r(25e3),I=new n(288),S=new n(32),L=0,O=0,j=c.i||0,q=0,B=c.w||0,G=0;j+2<v;++j){var H=T(j),J=32767&j,K=_[H];if(A[J]=K,_[H]=J,B<=j){var N=v-j;if((L>7e3||q>24576)&&(N>423||!w)){p=C(a,g,0,F,I,S,O,q,G,j-G,p),q=L=O=0,G=j;for(var P=0;P<286;++P)I[P]=0;for(P=0;P<30;++P)S[P]=0}var Q=2,R=0,V=E,W=J-K&32767;if(N>2&&H==T(j-W))for(var X=Math.min(M,N)-1,Y=Math.min(32767,j),Z=Math.min(258,N);W<=Y&&--V&&J!=K;){if(a[j+Q]==a[j+Q-W]){for(var $=0;$<Z&&a[j+$]==a[j+$-W];++$);if($>Q){if(Q=$,R=W,$>X)break;var tt=Math.min(W,$-2),nt=0;for(P=0;P<tt;++P){var rt=j-W+P&32767,et=rt-A[rt]&32767;et>nt&&(nt=et,K=rt)}}}W+=(J=K)-(K=A[J])&32767}if(R){F[q++]=268435456|h[Q]<<18|l[R];var it=31&h[Q],at=31&l[R];O+=e[it]+i[at],++I[257+it],++S[at],B=j+Q,++L}else F[q++]=a[j],++I[a[j]]}}for(j=Math.max(j,B);j<v;++j)F[q++]=a[j],++I[a[j]];p=C(a,g,w,F,I,S,O,q,G,j-G,p),w||(c.r=7&p|g[p/8|0]<<3,p-=7,c.h=_,c.p=A,c.i=j,c.w=B)}else{for(j=c.w||0;j<v+w;j+=65535){var st=j+65535;st>=v&&(g[p/8|0]=w,st=v),p=k(g,p+1,a.subarray(j,st))}c.i=v}return b(d,0,f+m(p)+u)}(a,null==s.level?6:s.level,null==s.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(a.length)))):12+s.mem,o,f,u)},O=function(t,n,r){for(;r;++n)t[n]=r,r>>>=8},j=function(){function n(n,r){if("function"==typeof n&&(r=n,n={}),this.ondata=r,this.o=n||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new t(98304),this.o.dictionary){var e=this.o.dictionary.subarray(-32768);this.b.set(e,32768-e.length),this.s.i=32768-e.length}}return n.prototype.p=function(t,n){this.ondata(L(t,this.o,0,0,this.s),n)},n.prototype.push=function(n,r){this.ondata||E(5),this.s.l&&E(4);var e=n.length+this.s.z;if(e>this.b.length){if(e>2*this.b.length-32768){var i=new t(-32768&e);i.set(this.b.subarray(0,this.s.z)),this.b=i}var a=this.b.length-this.s.z;a&&(this.b.set(n.subarray(0,a),this.s.z),this.s.z=this.b.length,this.p(this.b,!1)),this.b.set(this.b.subarray(-32768)),this.b.set(n.subarray(a),32768),this.s.z=n.length-a+32768,this.s.i=32766,this.s.w=32768}else this.b.set(n,this.s.z),this.s.z+=n.length;this.s.l=1&r,(this.s.z>this.s.w+8191||r)&&(this.p(this.b,r||!1),this.s.w=this.s.i,this.s.i-=2)},n}();function q(t,n){n||(n={});var r=function(){var t=-1;return{p:function(n){for(var r=t,e=0;e<n.length;++e)r=I[255&r^n[e]]^r>>>8;t=r},d:function(){return~t}}}(),e=t.length;r.p(t);var i,a=L(t,n,10+((i=n).filename?i.filename.length+1:0),8),s=a.length;return function(t,n){var r=n.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=n.level<2?4:9==n.level?2:0,t[9]=3,0!=n.mtime&&O(t,4,Math.floor(new Date(n.mtime||Date.now())/1e3)),r){t[3]=8;for(var e=0;e<=r.length;++e)t[e+10]=r.charCodeAt(e)}}(a,n),O(a,s-8,r.d()),O(a,s-4,e),a}var B=function(){function t(t,n){this.c=S(),this.v=1,j.call(this,t,n)}return t.prototype.push=function(t,n){this.c.p(t),j.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){var r=L(t,this.o,this.v&&(this.o.dictionary?6:2),n&&4,this.s);this.v&&(function(t,n){var r=n.level,e=0==r?0:r<6?1:9==r?3:2;if(t[0]=120,t[1]=e<<6|(n.dictionary&&32),t[1]|=31-(t[0]<<8|t[1])%31,n.dictionary){var i=S();i.p(n.dictionary),O(t,2,i.d())}}(r,this.o),this.v=0),n&&O(r,r.length-4,this.c.d()),this.ondata(r,n)},t}(),G="undefined"!=typeof TextEncoder&&new TextEncoder,H="undefined"!=typeof TextDecoder&&new TextDecoder;try{H.decode(F,{stream:!0})}catch(t){}var J=function(){function t(t){this.ondata=t}return t.prototype.push=function(t,n){this.ondata||E(5),this.d&&E(4),this.ondata(K(t),this.d=n||!1)},t}();function K(n,r){if(r){for(var e=new t(n.length),i=0;i<n.length;++i)e[i]=n.charCodeAt(i);return e}if(G)return G.encode(n);var a=n.length,s=new t(n.length+(n.length>>1)),o=0,f=function(t){s[o++]=t};for(i=0;i<a;++i){if(o+5>s.length){var h=new t(o+8+(a-i<<1));h.set(s),s=h}var l=n.charCodeAt(i);l<128||r?f(l):l<2048?(f(192|l>>6),f(128|63&l)):l>55295&&l<57344?(f(240|(l=65536+(1047552&l)|1023&n.charCodeAt(++i))>>18),f(128|l>>12&63),f(128|l>>6&63),f(128|63&l)):(f(224|l>>12),f(128|l>>6&63),f(128|63&l))}return b(s,0,o)}const N=new class{constructor(){this._init()}clear(){this._init()}addEvent(t){if(!t)throw new Error("Adding invalid event");const n=this._hasEvents?",":"";this.stream.push(n+t),this._hasEvents=!0}finish(){this.stream.push("]",!0);const t=function(t){let n=0;for(let r=0,e=t.length;r<e;r++)n+=t[r].length;const r=new Uint8Array(n);for(let n=0,e=0,i=t.length;n<i;n++){const i=t[n];r.set(i,e),e+=i.length}return r}(this._deflatedData);return this._init(),t}_init(){this._hasEvents=!1,this._deflatedData=[],this.deflate=new B,this.deflate.ondata=(t,n)=>{this._deflatedData.push(t)},this.stream=new J(((t,n)=>{this.deflate.push(t,n)})),this.stream.push("[")}},P={clear:()=>{N.clear()},addEvent:t=>N.addEvent(t),finish:()=>N.finish(),compress:t=>function(t){return q(K(t))}(t)};addEventListener("message",(function(t){const n=t.data.method,r=t.data.id,e=t.data.arg;if(n in P&&"function"==typeof P[n])try{const t=P[n](e);postMessage({id:r,method:n,success:!0,response:t})}catch(t){postMessage({id:r,method:n,success:!1,response:t.message}),console.error(t)}})),postMessage({id:void 0,method:"init",success:!0,response:void 0});`;
5319
4677
 
5320
4678
  function e(){const e=new Blob([r]);return URL.createObjectURL(e)}
5321
4679
 
@@ -5764,18 +5122,19 @@ class EventBufferProxy {
5764
5122
  /**
5765
5123
  * Create an event buffer for replays.
5766
5124
  */
5767
- function createEventBuffer({ useCompression }) {
5768
- // eslint-disable-next-line no-restricted-globals
5769
- if (useCompression && window.Worker) {
5770
- try {
5771
- const workerUrl = e();
5125
+ function createEventBuffer({
5126
+ useCompression,
5127
+ workerUrl: customWorkerUrl,
5128
+ }) {
5129
+ if (
5130
+ useCompression &&
5131
+ // eslint-disable-next-line no-restricted-globals
5132
+ window.Worker
5133
+ ) {
5134
+ const worker = _loadWorker(customWorkerUrl);
5772
5135
 
5773
- logInfo('[Replay] Using compression worker');
5774
- const worker = new Worker(workerUrl);
5775
- return new EventBufferProxy(worker);
5776
- } catch (error) {
5777
- logInfo('[Replay] Failed to create compression worker');
5778
- // Fall back to use simple event buffer array
5136
+ if (worker) {
5137
+ return worker;
5779
5138
  }
5780
5139
  }
5781
5140
 
@@ -5783,6 +5142,31 @@ function createEventBuffer({ useCompression }) {
5783
5142
  return new EventBufferArray();
5784
5143
  }
5785
5144
 
5145
+ function _loadWorker(customWorkerUrl) {
5146
+ try {
5147
+ const workerUrl = customWorkerUrl || _getWorkerUrl();
5148
+
5149
+ if (!workerUrl) {
5150
+ return;
5151
+ }
5152
+
5153
+ logInfo(`[Replay] Using compression worker${customWorkerUrl ? ` from ${customWorkerUrl}` : ''}`);
5154
+ const worker = new Worker(workerUrl);
5155
+ return new EventBufferProxy(worker);
5156
+ } catch (error) {
5157
+ logInfo('[Replay] Failed to create compression worker');
5158
+ // Fall back to use simple event buffer array
5159
+ }
5160
+ }
5161
+
5162
+ function _getWorkerUrl() {
5163
+ if (typeof __SENTRY_EXCLUDE_REPLAY_WORKER__ === 'undefined' || !__SENTRY_EXCLUDE_REPLAY_WORKER__) {
5164
+ return e();
5165
+ }
5166
+
5167
+ return '';
5168
+ }
5169
+
5786
5170
  /** If sessionStorage is available. */
5787
5171
  function hasSessionStorage() {
5788
5172
  try {
@@ -6015,8 +5399,6 @@ function loadOrCreateSession(
6015
5399
  return createSession(sessionOptions, { previousSessionId: existingSession.id });
6016
5400
  }
6017
5401
 
6018
- const ReplayEventTypeCustom = 5;
6019
-
6020
5402
  function isCustomEvent(event) {
6021
5403
  return event.type === EventType.Custom;
6022
5404
  }
@@ -6215,12 +5597,19 @@ function handleErrorEvent(replay, event) {
6215
5597
 
6216
5598
  // If error event is tagged with replay id it means it was sampled (when in buffer mode)
6217
5599
  // Need to be very careful that this does not cause an infinite loop
6218
- if (replay.recordingMode === 'buffer' && event.tags && event.tags.replayId) {
6219
- setTimeout(() => {
6220
- // Capture current event buffer as new replay
6221
- void replay.sendBufferedReplayOrFlush();
6222
- });
5600
+ if (replay.recordingMode !== 'buffer' || !event.tags || !event.tags.replayId) {
5601
+ return;
6223
5602
  }
5603
+
5604
+ const { beforeErrorSampling } = replay.getOptions();
5605
+ if (typeof beforeErrorSampling === 'function' && !beforeErrorSampling(event)) {
5606
+ return;
5607
+ }
5608
+
5609
+ setTimeout(() => {
5610
+ // Capture current event buffer as new replay
5611
+ void replay.sendBufferedReplayOrFlush();
5612
+ });
6224
5613
  }
6225
5614
 
6226
5615
  function isBaseTransportSend() {
@@ -6252,14 +5641,7 @@ function isRrwebError(event, hint) {
6252
5641
  return true;
6253
5642
  }
6254
5643
 
6255
- // Check if any exception originates from rrweb
6256
- return event.exception.values.some(exception => {
6257
- if (!exception.stacktrace || !exception.stacktrace.frames || !exception.stacktrace.frames.length) {
6258
- return false;
6259
- }
6260
-
6261
- return exception.stacktrace.frames.some(frame => frame.filename && frame.filename.includes('/rrweb/src/'));
6262
- });
5644
+ return false;
6263
5645
  }
6264
5646
 
6265
5647
  /**
@@ -6545,393 +5927,6 @@ function handleXhrSpanListener(replay) {
6545
5927
  };
6546
5928
  }
6547
5929
 
6548
- const OBJ = 10;
6549
- const OBJ_KEY = 11;
6550
- const OBJ_KEY_STR = 12;
6551
- const OBJ_VAL = 13;
6552
- const OBJ_VAL_STR = 14;
6553
- const OBJ_VAL_COMPLETED = 15;
6554
-
6555
- const ARR = 20;
6556
- const ARR_VAL = 21;
6557
- const ARR_VAL_STR = 22;
6558
- const ARR_VAL_COMPLETED = 23;
6559
-
6560
- const ALLOWED_PRIMITIVES = ['true', 'false', 'null'];
6561
-
6562
- /**
6563
- * Complete an incomplete JSON string.
6564
- * This will ensure that the last element always has a `"~~"` to indicate it was truncated.
6565
- * For example, `[1,2,` will be completed to `[1,2,"~~"]`
6566
- * and `{"aa":"b` will be completed to `{"aa":"b~~"}`
6567
- */
6568
- function completeJson(incompleteJson, stack) {
6569
- if (!stack.length) {
6570
- return incompleteJson;
6571
- }
6572
-
6573
- let json = incompleteJson;
6574
-
6575
- // Most checks are only needed for the last step in the stack
6576
- const lastPos = stack.length - 1;
6577
- const lastStep = stack[lastPos];
6578
-
6579
- json = _fixLastStep(json, lastStep);
6580
-
6581
- // Complete remaining steps - just add closing brackets
6582
- for (let i = lastPos; i >= 0; i--) {
6583
- const step = stack[i];
6584
-
6585
- switch (step) {
6586
- case OBJ:
6587
- json = `${json}}`;
6588
- break;
6589
- case ARR:
6590
- json = `${json}]`;
6591
- break;
6592
- }
6593
- }
6594
-
6595
- return json;
6596
- }
6597
-
6598
- function _fixLastStep(json, lastStep) {
6599
- switch (lastStep) {
6600
- // Object cases
6601
- case OBJ:
6602
- return `${json}"~~":"~~"`;
6603
- case OBJ_KEY:
6604
- return `${json}:"~~"`;
6605
- case OBJ_KEY_STR:
6606
- return `${json}~~":"~~"`;
6607
- case OBJ_VAL:
6608
- return _maybeFixIncompleteObjValue(json);
6609
- case OBJ_VAL_STR:
6610
- return `${json}~~"`;
6611
- case OBJ_VAL_COMPLETED:
6612
- return `${json},"~~":"~~"`;
6613
-
6614
- // Array cases
6615
- case ARR:
6616
- return `${json}"~~"`;
6617
- case ARR_VAL:
6618
- return _maybeFixIncompleteArrValue(json);
6619
- case ARR_VAL_STR:
6620
- return `${json}~~"`;
6621
- case ARR_VAL_COMPLETED:
6622
- return `${json},"~~"`;
6623
- }
6624
-
6625
- return json;
6626
- }
6627
-
6628
- function _maybeFixIncompleteArrValue(json) {
6629
- const pos = _findLastArrayDelimiter(json);
6630
-
6631
- if (pos > -1) {
6632
- const part = json.slice(pos + 1);
6633
-
6634
- if (ALLOWED_PRIMITIVES.includes(part.trim())) {
6635
- return `${json},"~~"`;
6636
- }
6637
-
6638
- // Everything else is replaced with `"~~"`
6639
- return `${json.slice(0, pos + 1)}"~~"`;
6640
- }
6641
-
6642
- // fallback, this shouldn't happen, to be save
6643
- return json;
6644
- }
6645
-
6646
- function _findLastArrayDelimiter(json) {
6647
- for (let i = json.length - 1; i >= 0; i--) {
6648
- const char = json[i];
6649
-
6650
- if (char === ',' || char === '[') {
6651
- return i;
6652
- }
6653
- }
6654
-
6655
- return -1;
6656
- }
6657
-
6658
- function _maybeFixIncompleteObjValue(json) {
6659
- const startPos = json.lastIndexOf(':');
6660
-
6661
- const part = json.slice(startPos + 1);
6662
-
6663
- if (ALLOWED_PRIMITIVES.includes(part.trim())) {
6664
- return `${json},"~~":"~~"`;
6665
- }
6666
-
6667
- // Everything else is replaced with `"~~"`
6668
- // This also means we do not have incomplete numbers, e.g `[1` is replaced with `["~~"]`
6669
- return `${json.slice(0, startPos + 1)}"~~"`;
6670
- }
6671
-
6672
- /**
6673
- * Evaluate an (incomplete) JSON string.
6674
- */
6675
- function evaluateJson(json) {
6676
- const stack = [];
6677
-
6678
- for (let pos = 0; pos < json.length; pos++) {
6679
- _evaluateJsonPos(stack, json, pos);
6680
- }
6681
-
6682
- return stack;
6683
- }
6684
-
6685
- function _evaluateJsonPos(stack, json, pos) {
6686
- const curStep = stack[stack.length - 1];
6687
-
6688
- const char = json[pos];
6689
-
6690
- const whitespaceRegex = /\s/;
6691
-
6692
- if (whitespaceRegex.test(char)) {
6693
- return;
6694
- }
6695
-
6696
- if (char === '"' && !_isEscaped(json, pos)) {
6697
- _handleQuote(stack, curStep);
6698
- return;
6699
- }
6700
-
6701
- switch (char) {
6702
- case '{':
6703
- _handleObj(stack, curStep);
6704
- break;
6705
- case '[':
6706
- _handleArr(stack, curStep);
6707
- break;
6708
- case ':':
6709
- _handleColon(stack, curStep);
6710
- break;
6711
- case ',':
6712
- _handleComma(stack, curStep);
6713
- break;
6714
- case '}':
6715
- _handleObjClose(stack, curStep);
6716
- break;
6717
- case ']':
6718
- _handleArrClose(stack, curStep);
6719
- break;
6720
- }
6721
- }
6722
-
6723
- function _handleQuote(stack, curStep) {
6724
- // End of obj value
6725
- if (curStep === OBJ_VAL_STR) {
6726
- stack.pop();
6727
- stack.push(OBJ_VAL_COMPLETED);
6728
- return;
6729
- }
6730
-
6731
- // End of arr value
6732
- if (curStep === ARR_VAL_STR) {
6733
- stack.pop();
6734
- stack.push(ARR_VAL_COMPLETED);
6735
- return;
6736
- }
6737
-
6738
- // Start of obj value
6739
- if (curStep === OBJ_VAL) {
6740
- stack.push(OBJ_VAL_STR);
6741
- return;
6742
- }
6743
-
6744
- // Start of arr value
6745
- if (curStep === ARR_VAL) {
6746
- stack.push(ARR_VAL_STR);
6747
- return;
6748
- }
6749
-
6750
- // Start of obj key
6751
- if (curStep === OBJ) {
6752
- stack.push(OBJ_KEY_STR);
6753
- return;
6754
- }
6755
-
6756
- // End of obj key
6757
- if (curStep === OBJ_KEY_STR) {
6758
- stack.pop();
6759
- stack.push(OBJ_KEY);
6760
- return;
6761
- }
6762
- }
6763
-
6764
- function _handleObj(stack, curStep) {
6765
- // Initial object
6766
- if (!curStep) {
6767
- stack.push(OBJ);
6768
- return;
6769
- }
6770
-
6771
- // New object as obj value
6772
- if (curStep === OBJ_VAL) {
6773
- stack.push(OBJ);
6774
- return;
6775
- }
6776
-
6777
- // New object as array element
6778
- if (curStep === ARR_VAL) {
6779
- stack.push(OBJ);
6780
- }
6781
-
6782
- // New object as first array element
6783
- if (curStep === ARR) {
6784
- stack.push(OBJ);
6785
- return;
6786
- }
6787
- }
6788
-
6789
- function _handleArr(stack, curStep) {
6790
- // Initial array
6791
- if (!curStep) {
6792
- stack.push(ARR);
6793
- stack.push(ARR_VAL);
6794
- return;
6795
- }
6796
-
6797
- // New array as obj value
6798
- if (curStep === OBJ_VAL) {
6799
- stack.push(ARR);
6800
- stack.push(ARR_VAL);
6801
- return;
6802
- }
6803
-
6804
- // New array as array element
6805
- if (curStep === ARR_VAL) {
6806
- stack.push(ARR);
6807
- stack.push(ARR_VAL);
6808
- }
6809
-
6810
- // New array as first array element
6811
- if (curStep === ARR) {
6812
- stack.push(ARR);
6813
- stack.push(ARR_VAL);
6814
- return;
6815
- }
6816
- }
6817
-
6818
- function _handleColon(stack, curStep) {
6819
- if (curStep === OBJ_KEY) {
6820
- stack.pop();
6821
- stack.push(OBJ_VAL);
6822
- }
6823
- }
6824
-
6825
- function _handleComma(stack, curStep) {
6826
- // Comma after obj value
6827
- if (curStep === OBJ_VAL) {
6828
- stack.pop();
6829
- return;
6830
- }
6831
- if (curStep === OBJ_VAL_COMPLETED) {
6832
- // Pop OBJ_VAL_COMPLETED & OBJ_VAL
6833
- stack.pop();
6834
- stack.pop();
6835
- return;
6836
- }
6837
-
6838
- // Comma after arr value
6839
- if (curStep === ARR_VAL) {
6840
- // do nothing - basically we'd pop ARR_VAL but add it right back
6841
- return;
6842
- }
6843
-
6844
- if (curStep === ARR_VAL_COMPLETED) {
6845
- // Pop ARR_VAL_COMPLETED
6846
- stack.pop();
6847
-
6848
- // basically we'd pop ARR_VAL but add it right back
6849
- return;
6850
- }
6851
- }
6852
-
6853
- function _handleObjClose(stack, curStep) {
6854
- // Empty object {}
6855
- if (curStep === OBJ) {
6856
- stack.pop();
6857
- }
6858
-
6859
- // Object with element
6860
- if (curStep === OBJ_VAL) {
6861
- // Pop OBJ_VAL, OBJ
6862
- stack.pop();
6863
- stack.pop();
6864
- }
6865
-
6866
- // Obj with element
6867
- if (curStep === OBJ_VAL_COMPLETED) {
6868
- // Pop OBJ_VAL_COMPLETED, OBJ_VAL, OBJ
6869
- stack.pop();
6870
- stack.pop();
6871
- stack.pop();
6872
- }
6873
-
6874
- // if was obj value, complete it
6875
- if (stack[stack.length - 1] === OBJ_VAL) {
6876
- stack.push(OBJ_VAL_COMPLETED);
6877
- }
6878
-
6879
- // if was arr value, complete it
6880
- if (stack[stack.length - 1] === ARR_VAL) {
6881
- stack.push(ARR_VAL_COMPLETED);
6882
- }
6883
- }
6884
-
6885
- function _handleArrClose(stack, curStep) {
6886
- // Empty array []
6887
- if (curStep === ARR) {
6888
- stack.pop();
6889
- }
6890
-
6891
- // Array with element
6892
- if (curStep === ARR_VAL) {
6893
- // Pop ARR_VAL, ARR
6894
- stack.pop();
6895
- stack.pop();
6896
- }
6897
-
6898
- // Array with element
6899
- if (curStep === ARR_VAL_COMPLETED) {
6900
- // Pop ARR_VAL_COMPLETED, ARR_VAL, ARR
6901
- stack.pop();
6902
- stack.pop();
6903
- stack.pop();
6904
- }
6905
-
6906
- // if was obj value, complete it
6907
- if (stack[stack.length - 1] === OBJ_VAL) {
6908
- stack.push(OBJ_VAL_COMPLETED);
6909
- }
6910
-
6911
- // if was arr value, complete it
6912
- if (stack[stack.length - 1] === ARR_VAL) {
6913
- stack.push(ARR_VAL_COMPLETED);
6914
- }
6915
- }
6916
-
6917
- function _isEscaped(str, pos) {
6918
- const previousChar = str[pos - 1];
6919
-
6920
- return previousChar === '\\' && !_isEscaped(str, pos - 1);
6921
- }
6922
-
6923
- /* eslint-disable max-lines */
6924
-
6925
- /**
6926
- * Takes an incomplete JSON string, and returns a hopefully valid JSON string.
6927
- * Note that this _can_ fail, so you should check the return value is valid JSON.
6928
- */
6929
- function fixJson(incompleteJson) {
6930
- const stack = evaluateJson(incompleteJson);
6931
-
6932
- return completeJson(incompleteJson, stack);
6933
- }
6934
-
6935
5930
  /** Get the size of a body. */
6936
5931
  function getBodySize(
6937
5932
  body,
@@ -7066,7 +6061,7 @@ function buildNetworkRequestOrResponse(
7066
6061
 
7067
6062
  const { body: normalizedBody, warnings } = normalizeNetworkBody(body);
7068
6063
  info.body = normalizedBody;
7069
- if (warnings.length > 0) {
6064
+ if (warnings && warnings.length > 0) {
7070
6065
  info._meta = {
7071
6066
  warnings,
7072
6067
  };
@@ -7100,31 +6095,42 @@ function normalizeNetworkBody(body)
7100
6095
  if (!body || typeof body !== 'string') {
7101
6096
  return {
7102
6097
  body,
7103
- warnings: [],
7104
6098
  };
7105
6099
  }
7106
6100
 
7107
6101
  const exceedsSizeLimit = body.length > NETWORK_BODY_MAX_SIZE;
7108
6102
 
7109
- if (_strIsProbablyJson(body)) {
7110
- try {
7111
- const json = exceedsSizeLimit ? fixJson(body.slice(0, NETWORK_BODY_MAX_SIZE)) : body;
7112
- const normalizedBody = JSON.parse(json);
6103
+ const isProbablyJson = _strIsProbablyJson(body);
6104
+
6105
+ if (exceedsSizeLimit) {
6106
+ const truncatedBody = body.slice(0, NETWORK_BODY_MAX_SIZE);
6107
+
6108
+ if (isProbablyJson) {
7113
6109
  return {
7114
- body: normalizedBody,
7115
- warnings: exceedsSizeLimit ? ['JSON_TRUNCATED'] : [],
6110
+ body: truncatedBody,
6111
+ warnings: ['MAYBE_JSON_TRUNCATED'],
7116
6112
  };
7117
- } catch (e3) {
6113
+ }
6114
+
6115
+ return {
6116
+ body: `${truncatedBody}…`,
6117
+ warnings: ['TEXT_TRUNCATED'],
6118
+ };
6119
+ }
6120
+
6121
+ if (isProbablyJson) {
6122
+ try {
6123
+ const jsonBody = JSON.parse(body);
7118
6124
  return {
7119
- body: exceedsSizeLimit ? `${body.slice(0, NETWORK_BODY_MAX_SIZE)}…` : body,
7120
- warnings: exceedsSizeLimit ? ['INVALID_JSON', 'TEXT_TRUNCATED'] : ['INVALID_JSON'],
6125
+ body: jsonBody,
7121
6126
  };
6127
+ } catch (e3) {
6128
+ // fall back to just send the body as string
7122
6129
  }
7123
6130
  }
7124
6131
 
7125
6132
  return {
7126
- body: exceedsSizeLimit ? `${body.slice(0, NETWORK_BODY_MAX_SIZE)}…` : body,
7127
- warnings: exceedsSizeLimit ? ['TEXT_TRUNCATED'] : [],
6133
+ body,
7128
6134
  };
7129
6135
  }
7130
6136
 
@@ -7397,7 +6403,7 @@ async function captureXhrBreadcrumbToReplay(
7397
6403
  const result = makeNetworkReplayBreadcrumb('resource.xhr', data);
7398
6404
  addNetworkBreadcrumb(options.replay, result);
7399
6405
  } catch (error) {
7400
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('[Replay] Failed to capture fetch breadcrumb', error);
6406
+ (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('[Replay] Failed to capture xhr breadcrumb', error);
7401
6407
  }
7402
6408
  }
7403
6409
 
@@ -7677,11 +6683,9 @@ function normalizeConsoleBreadcrumb(
7677
6683
  const normalizedArg = utils.normalize(arg, 7);
7678
6684
  const stringified = JSON.stringify(normalizedArg);
7679
6685
  if (stringified.length > CONSOLE_ARG_MAX_SIZE) {
7680
- const fixedJson = fixJson(stringified.slice(0, CONSOLE_ARG_MAX_SIZE));
7681
- const json = JSON.parse(fixedJson);
7682
- // We only set this after JSON.parse() was successfull, so we know we didn't run into `catch`
7683
6686
  isTruncated = true;
7684
- return json;
6687
+ // We use the pretty printed JSON string here as a base
6688
+ return `${JSON.stringify(normalizedArg, null, 2).slice(0, CONSOLE_ARG_MAX_SIZE)}…`;
7685
6689
  }
7686
6690
  return normalizedArg;
7687
6691
  } catch (e) {
@@ -7879,6 +6883,10 @@ function getHandleRecordingEmit(replay) {
7879
6883
  const isCheckout = _isCheckout || !hadFirstEvent;
7880
6884
  hadFirstEvent = true;
7881
6885
 
6886
+ if (replay.clickDetector) {
6887
+ updateClickDetectorForRecordingEvent(replay.clickDetector, event);
6888
+ }
6889
+
7882
6890
  // The handler returns `true` if we do not want to trigger debounced flush, `false` if we want to debounce flush.
7883
6891
  replay.addUpdate(() => {
7884
6892
  // The session is always started immediately on pageload/init, but for
@@ -8224,6 +7232,11 @@ async function sendReplayRequest({
8224
7232
  throw new TransportStatusCodeError(response.statusCode);
8225
7233
  }
8226
7234
 
7235
+ const rateLimits = utils.updateRateLimits({}, response);
7236
+ if (utils.isRateLimited(rateLimits, 'replay')) {
7237
+ throw new RateLimitError(rateLimits);
7238
+ }
7239
+
8227
7240
  return response;
8228
7241
  }
8229
7242
 
@@ -8236,6 +7249,17 @@ class TransportStatusCodeError extends Error {
8236
7249
  }
8237
7250
  }
8238
7251
 
7252
+ /**
7253
+ * This error indicates that we hit a rate limit API error.
7254
+ */
7255
+ class RateLimitError extends Error {
7256
+
7257
+ constructor(rateLimits) {
7258
+ super('Rate limit hit');
7259
+ this.rateLimits = rateLimits;
7260
+ }
7261
+ }
7262
+
8239
7263
  /**
8240
7264
  * Finalize and send the current replay event to Sentry
8241
7265
  */
@@ -8257,7 +7281,7 @@ async function sendReplay(
8257
7281
  await sendReplayRequest(replayData);
8258
7282
  return true;
8259
7283
  } catch (err) {
8260
- if (err instanceof TransportStatusCodeError) {
7284
+ if (err instanceof TransportStatusCodeError || err instanceof RateLimitError) {
8261
7285
  throw err;
8262
7286
  }
8263
7287
 
@@ -8983,6 +8007,7 @@ class ReplayContainer {
8983
8007
 
8984
8008
  this.eventBuffer = createEventBuffer({
8985
8009
  useCompression: this._options.useCompression,
8010
+ workerUrl: this._options.workerUrl,
8986
8011
  });
8987
8012
 
8988
8013
  this._removeListeners();
@@ -9213,19 +8238,6 @@ class ReplayContainer {
9213
8238
  }
9214
8239
  }
9215
8240
 
9216
- /**
9217
- * Trigger rrweb to take a full snapshot which will cause this plugin to
9218
- * create a new Replay event.
9219
- */
9220
- _triggerFullSnapshot(checkout = true) {
9221
- try {
9222
- logInfo('[Replay] Taking full rrweb snapshot');
9223
- record.takeFullSnapshot(checkout);
9224
- } catch (err) {
9225
- this._handleException(err);
9226
- }
9227
- }
9228
-
9229
8241
  /**
9230
8242
  * Update user activity (across session lifespans)
9231
8243
  */
@@ -9419,7 +8431,7 @@ class ReplayContainer {
9419
8431
  }
9420
8432
 
9421
8433
  if (!this.session) {
9422
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('[Replay] No session found to flush.');
8434
+ // should never happen, as we would have bailed out before
9423
8435
  return;
9424
8436
  }
9425
8437
 
@@ -9674,6 +8686,7 @@ class Replay {
9674
8686
  maxReplayDuration = MAX_REPLAY_DURATION,
9675
8687
  stickySession = true,
9676
8688
  useCompression = true,
8689
+ workerUrl,
9677
8690
  _experiments = {},
9678
8691
  sessionSampleRate,
9679
8692
  errorSampleRate,
@@ -9702,6 +8715,7 @@ class Replay {
9702
8715
  maskFn,
9703
8716
 
9704
8717
  beforeAddRecordingEvent,
8718
+ beforeErrorSampling,
9705
8719
 
9706
8720
  // eslint-disable-next-line deprecation/deprecation
9707
8721
  blockClass,
@@ -9776,6 +8790,7 @@ class Replay {
9776
8790
  sessionSampleRate,
9777
8791
  errorSampleRate,
9778
8792
  useCompression,
8793
+ workerUrl,
9779
8794
  blockAllMedia,
9780
8795
  maskAllInputs,
9781
8796
  maskAllText,
@@ -9789,6 +8804,7 @@ class Replay {
9789
8804
  networkRequestHeaders: _getMergedNetworkHeaders(networkRequestHeaders),
9790
8805
  networkResponseHeaders: _getMergedNetworkHeaders(networkResponseHeaders),
9791
8806
  beforeAddRecordingEvent,
8807
+ beforeErrorSampling,
9792
8808
 
9793
8809
  _experiments,
9794
8810
  };