Version in base suite: 140.8.0esr-1~deb13u1 Version in overlay suite: 140.9.1esr-1~deb13u1 Base version: firefox-esr_140.9.1esr-1~deb13u1 Target version: firefox-esr_140.10.0esr-1~deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/f/firefox-esr/firefox-esr_140.9.1esr-1~deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/f/firefox-esr/firefox-esr_140.10.0esr-1~deb13u1.dsc .cargo/config.toml.in | 4 .gitignore | 3 CLOBBER | 2 Cargo.lock | 4 accessible/base/AccIterator.cpp | 4 accessible/base/AccIterator.h | 6 accessible/base/TextLeafRange.cpp | 2 accessible/base/TextLeafRange.h | 2 accessible/generic/HyperTextAccessible.cpp | 11 accessible/ipc/DocAccessibleParent.cpp | 24 browser/actors/BlockedSiteChild.sys.mjs | 16 browser/actors/BlockedSiteParent.sys.mjs | 38 browser/actors/DOMFullscreenParent.sys.mjs | 6 browser/base/content/browser-fullScreenAndPointerLock.js | 10 browser/base/content/test/fullscreen/browser.toml | 3 browser/base/content/test/fullscreen/browser_fullscreen_toplevel_warning.js | 184 browser/components/asrouter/modules/ASRouterTargeting.sys.mjs | 7 browser/components/asrouter/tests/browser/browser_asrouter_targeting.js | 15 browser/components/urlbar/schema/urlbar-persisted-search-terms-schema.json | 2 browser/config/version.txt | 2 browser/config/version_display.txt | 2 config/milestone.txt | 2 debian/changelog | 13 devtools/client/aboutdebugging/test/browser/browser.toml | 1 devtools/client/application/test/browser/browser.toml | 7 devtools/client/debugger/src/.eslintrc.mjs | 2 devtools/client/debugger/src/components/QuickOpenModal.js | 64 devtools/client/debugger/test/mochitest/browser_aj.toml | 4 devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js | 28 devtools/client/framework/test/browser.toml | 9 devtools/client/inspector/animation/test/browser.toml | 7 devtools/client/webconsole/test/browser/_webconsole.toml | 2 devtools/client/webconsole/test/browser/stub-generator-helpers.js | 14 docshell/base/BrowsingContext.cpp | 13 docshell/base/BrowsingContext.h | 9 dom/abort/AbortSignal.cpp | 7 dom/animation/Animation.cpp | 44 dom/animation/Animation.h | 1 dom/base/Document.cpp | 13 dom/base/Document.h | 2 dom/base/Element.cpp | 6 dom/base/ImageEncoder.cpp | 18 dom/base/ScreenOrientation.cpp | 17 dom/base/ScreenOrientation.h | 9 dom/base/ShadowRoot.cpp | 2 dom/base/ShadowRoot.h | 2 dom/base/StructuredCloneBlob.cpp | 10 dom/base/TextInputProcessor.cpp | 5 dom/base/TextInputProcessor.h | 7 dom/base/nsAttrValue.cpp | 8 dom/base/nsContentList.cpp | 9 dom/base/nsContentList.h | 10 dom/base/nsDOMWindowUtils.cpp | 5 dom/base/nsFrameLoaderOwner.cpp | 2 dom/base/nsGlobalWindowInner.cpp | 2 dom/base/nsINode.cpp | 6 dom/base/nsObjectLoadingContent.cpp | 40 dom/base/nsRange.cpp | 14 dom/base/nsScreen.cpp | 10 dom/base/nsScreen.h | 5 dom/base/nsWrapperCache.cpp | 7 dom/base/nsWrapperCache.h | 2 dom/base/nsWrapperCacheInlines.h | 6 dom/base/test/jsmodules/mochitest.toml | 2 dom/base/test/jsmodules/test_bug_2027541.html | 47 dom/bindings/BindingUtils.cpp | 19 dom/bindings/Codegen.py | 62 dom/bindings/ErrorResult.h | 7 dom/cache/Manager.cpp | 12 dom/cache/StreamList.cpp | 7 dom/canvas/CanvasRenderingContext2D.cpp | 123 dom/canvas/CanvasRenderingContext2D.h | 20 dom/canvas/ClientWebGLContext.cpp | 11 dom/canvas/DrawTargetWebgl.cpp | 75 dom/canvas/DrawTargetWebgl.h | 2 dom/canvas/ImageData.cpp | 25 dom/canvas/TexUnpackBlob.cpp | 13 dom/canvas/TexUnpackBlob.h | 4 dom/canvas/WebGLContext.cpp | 115 dom/canvas/WebGLContext.h | 4 dom/canvas/WebGLShaderValidator.cpp | 29 dom/clients/manager/ClientNavigateOpChild.cpp | 4 dom/console/Console.cpp | 1 dom/cookiestore/CookieStoreNotifier.cpp | 7 dom/events/EventListenerManager.cpp | 8 dom/events/IMEContentObserver.cpp | 3 dom/events/IMEContentObserver.h | 11 dom/events/IMEStateManager.cpp | 17 dom/fetch/Fetch.cpp | 55 dom/fetch/InternalResponse.cpp | 13 dom/fetch/InternalResponse.h | 2 dom/file/Blob.cpp | 11 dom/file/Blob.h | 6 dom/filesystem/FileSystemSecurity.cpp | 14 dom/filesystem/FileSystemUtils.cpp | 25 dom/fs/child/FileSystemRequestHandler.cpp | 13 dom/fs/include/fs/FileSystemRequestHandler.h | 4 dom/fs/parent/FileSystemAccessHandle.cpp | 3 dom/fs/test/gtest/FileSystemMocks.h | 7 dom/gamepad/GamepadPlatformService.cpp | 38 dom/gamepad/GamepadPlatformService.h | 60 dom/gamepad/GamepadRemapping.cpp | 10 dom/gamepad/GamepadRemapping.h | 3 dom/gamepad/cocoa/CocoaGamepad.cpp | 83 dom/gamepad/windows/WindowsGamepad.cpp | 4 dom/geolocation/Geolocation.cpp | 7 dom/geolocation/Geolocation.h | 5 dom/html/HTMLAllCollection.cpp | 35 dom/html/HTMLFormElement.cpp | 2 dom/html/HTMLMediaElement.cpp | 27 dom/html/HTMLMediaElement.h | 1 dom/html/HTMLSlotElement.cpp | 42 dom/html/TextTrackManager.cpp | 15 dom/indexedDB/ActorsParent.cpp | 2 dom/indexedDB/IDBObjectStore.cpp | 59 dom/indexedDB/Key.cpp | 6 dom/interfaces/base/nsIDOMWindowUtils.idl | 7 dom/ipc/BrowserBridgeParent.cpp | 3 dom/ipc/BrowserParent.cpp | 6 dom/ipc/BrowserParent.h | 3 dom/ipc/ClonedErrorHolder.cpp | 9 dom/ipc/ContentParent.cpp | 29 dom/ipc/PBrowser.ipdl | 3 dom/ipc/RefMessageBodyService.cpp | 18 dom/ipc/RefMessageBodyService.h | 7 dom/ipc/VsyncParent.cpp | 1 dom/ipc/VsyncParent.h | 5 dom/locks/LockRequestChild.cpp | 2 dom/media/AsyncLogger.h | 19 dom/media/BaseMediaResource.cpp | 13 dom/media/ExternalEngineStateMachine.cpp | 7 dom/media/MediaData.cpp | 4 dom/media/MediaData.h | 4 dom/media/MediaDecoderStateMachine.cpp | 18 dom/media/eme/mediafoundation/WMFCDMProxy.cpp | 3 dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp | 4 dom/media/gmp/ChromiumCDMCallback.h | 4 dom/media/gmp/ChromiumCDMCallbackProxy.cpp | 13 dom/media/gmp/ChromiumCDMCallbackProxy.h | 7 dom/media/gmp/ChromiumCDMChild.cpp | 143 dom/media/gmp/ChromiumCDMChild.h | 4 dom/media/gmp/ChromiumCDMParent.cpp | 41 dom/media/gmp/ChromiumCDMParent.h | 19 dom/media/gmp/GMPChild.cpp | 3 dom/media/gmp/GMPContentChild.cpp | 6 dom/media/gmp/GMPMessageUtils.h | 28 dom/media/gmp/GMPPlatform.cpp | 127 dom/media/gmp/GMPPlatform.h | 22 dom/media/gmp/GMPService.cpp | 8 dom/media/gmp/GMPSharedMemManager.cpp | 4 dom/media/gmp/GMPSharedMemManager.h | 1 dom/media/gmp/GMPStorageChild.cpp | 164 dom/media/gmp/GMPStorageChild.h | 26 dom/media/gmp/GMPTypes.ipdlh | 3 dom/media/gmp/GMPUtils.cpp | 68 dom/media/gmp/GMPUtils.h | 4 dom/media/gmp/GMPVideoDecoderChild.cpp | 100 dom/media/gmp/GMPVideoDecoderChild.h | 15 dom/media/gmp/GMPVideoDecoderParent.cpp | 26 dom/media/gmp/GMPVideoDecoderParent.h | 11 dom/media/gmp/GMPVideoEncodedFrameImpl.cpp | 55 dom/media/gmp/GMPVideoEncodedFrameImpl.h | 6 dom/media/gmp/GMPVideoEncoderChild.cpp | 56 dom/media/gmp/GMPVideoEncoderChild.h | 11 dom/media/gmp/GMPVideoEncoderParent.cpp | 31 dom/media/gmp/GMPVideoEncoderParent.h | 11 dom/media/gmp/GMPVideoHost.cpp | 50 dom/media/gmp/GMPVideoHost.h | 36 dom/media/gmp/GMPVideoi420FrameImpl.cpp | 53 dom/media/gmp/GMPVideoi420FrameImpl.h | 7 dom/media/gmp/PChromiumCDM.ipdl | 20 dom/media/gmp/widevine-adapter/WidevineFileIO.cpp | 18 dom/media/gmp/widevine-adapter/WidevineFileIO.h | 9 dom/media/gtest/TestCDMStorage.cpp | 8 dom/media/ipc/RDDChild.cpp | 38 dom/media/ipc/RemoteAudioDecoder.cpp | 10 dom/media/ipc/RemoteDecoderManagerChild.cpp | 39 dom/media/ipc/RemoteDecoderParent.cpp | 20 dom/media/ipc/RemoteDecoderParent.h | 2 dom/media/ipc/RemoteMediaData.cpp | 8 dom/media/ipc/RemoteVideoDecoder.cpp | 18 dom/media/ipc/RemoteVideoDecoder.h | 2 dom/media/platforms/MediaCodecsSupport.cpp | 33 dom/media/platforms/MediaCodecsSupport.h | 2 dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp | 9 dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp | 3 dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h | 18 dom/media/platforms/ffmpeg/VALibWrapper.cpp | 30 dom/media/platforms/ffmpeg/VALibWrapper.h | 11 dom/media/systemservices/MediaSystemResourceManager.cpp | 45 dom/media/systemservices/MediaSystemResourceManager.h | 12 dom/media/systemservices/MediaSystemResourceManagerChild.cpp | 3 dom/media/systemservices/MediaSystemResourceManagerParent.cpp | 9 dom/media/systemservices/MediaSystemResourceManagerParent.h | 2 dom/media/systemservices/MediaSystemResourceService.cpp | 10 dom/media/systemservices/MediaSystemResourceService.h | 2 dom/media/systemservices/PMediaSystemResourceManager.ipdl | 7 dom/media/webaudio/AudioBufferSourceNode.cpp | 12 dom/media/webcodecs/AudioData.cpp | 28 dom/media/webcodecs/ImageDecoder.cpp | 4 dom/media/webcodecs/ImageDecoderReadRequest.cpp | 3 dom/media/webcodecs/VideoFrame.cpp | 27 dom/media/webrtc/jsapi/PeerConnectionImpl.cpp | 32 dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp | 29 dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h | 10 dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp | 29 dom/media/webrtc/jsapi/RTCEncodedFrameBase.h | 6 dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp | 25 dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h | 11 dom/media/webrtc/libwebrtcglue/VideoConduit.cpp | 4 dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp | 10 dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.cpp | 9 dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.h | 7 dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.cpp | 14 dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.h | 3 dom/media/webrtc/transport/nr_socket_prsock.cpp | 2 dom/media/webrtc/transport/third_party/nICEr/src/ice/ice_parser.c | 4 dom/media/webrtc/transport/third_party/nICEr/src/net/transport_addr.c | 3 dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.c | 18 dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.h | 1 dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_proc.c | 2 dom/media/webvtt/TextTrack.cpp | 1 dom/network/TCPServerSocketParent.cpp | 10 dom/network/TCPSocket.cpp | 5 dom/network/TCPSocketParent.cpp | 8 dom/network/UDPSocket.cpp | 2 dom/network/UDPSocketParent.cpp | 4 dom/network/tests/chrome.toml | 1 dom/reporting/ReportingHeader.cpp | 3 dom/security/nsCSPUtils.cpp | 10 dom/serviceworkers/ServiceWorkerOp.cpp | 8 dom/serviceworkers/ServiceWorkerRegistrationChild.cpp | 3 dom/smil/SMILCSSValueType.cpp | 2 dom/streams/QueueWithSizes.h | 24 dom/streams/ReadableStream.cpp | 29 dom/streams/ReadableStream.h | 4 dom/streams/ReadableStreamBYOBReader.cpp | 6 dom/streams/ReadableStreamDefaultController.cpp | 5 dom/streams/ReadableStreamDefaultReader.cpp | 9 dom/streams/ReadableStreamPipeTo.cpp | 19 dom/streams/ReadableStreamTee.cpp | 12 dom/streams/TeeState.cpp | 18 dom/streams/TeeState.h | 6 dom/streams/TransformStream.cpp | 24 dom/streams/TransformStreamDefaultController.cpp | 7 dom/streams/UnderlyingSourceCallbackHelpers.cpp | 6 dom/streams/WritableStream.cpp | 14 dom/streams/WritableStream.h | 4 dom/streams/WritableStreamDefaultController.cpp | 15 dom/streams/WritableStreamDefaultWriter.cpp | 26 dom/svg/DOMSVGLength.cpp | 4 dom/svg/DOMSVGLength.h | 5 dom/svg/DOMSVGLengthList.cpp | 7 dom/svg/DOMSVGNumber.h | 5 dom/svg/DOMSVGNumberList.cpp | 7 dom/svg/DOMSVGPoint.cpp | 4 dom/svg/DOMSVGPoint.h | 5 dom/svg/DOMSVGPointList.cpp | 7 dom/svg/DOMSVGTransform.h | 5 dom/svg/DOMSVGTransformList.cpp | 7 dom/svg/SVGFEBlendElement.cpp | 37 dom/svg/SVGFEColorMatrixElement.cpp | 22 dom/svg/SVGFEComponentTransferElement.cpp | 2 dom/svg/SVGFECompositeElement.cpp | 23 dom/svg/SVGFEConvolveMatrixElement.cpp | 10 dom/svg/SVGFEDisplacementMapElement.cpp | 18 dom/svg/SVGFEMorphologyElement.cpp | 10 dom/svg/SVGFETurbulenceElement.cpp | 11 dom/svg/SVGFilters.cpp | 27 dom/webauthn/AuthenticatorAssertionResponse.cpp | 42 dom/webauthn/AuthenticatorAssertionResponse.h | 5 dom/webauthn/AuthenticatorAttestationResponse.cpp | 20 dom/webauthn/AuthenticatorAttestationResponse.h | 3 dom/webauthn/AuthenticatorResponse.cpp | 19 dom/webauthn/AuthenticatorResponse.h | 3 dom/webauthn/MacOSWebAuthnService.mm | 19 dom/webauthn/PublicKeyCredential.cpp | 19 dom/webauthn/PublicKeyCredential.h | 3 dom/webauthn/WebAuthnHandler.cpp | 4 dom/webauthn/WebAuthnTransactionParent.cpp | 10 dom/webauthn/WebAuthnUtil.h | 2 dom/webbrowserpersist/WebBrowserPersistSerializeParent.cpp | 7 dom/webidl/WebAuthentication.webidl | 24 dom/webtransport/parent/WebTransportParent.cpp | 3 dom/workers/MessageEventRunnable.cpp | 9 dom/workers/MessageEventRunnable.h | 6 dom/workers/RuntimeService.cpp | 18 dom/workers/RuntimeService.h | 8 dom/workers/WorkerError.cpp | 4 dom/workers/WorkerError.h | 4 dom/workers/WorkerNavigator.cpp | 2 dom/xhr/XMLHttpRequestMainThread.cpp | 1 dom/xml/nsXMLPrettyPrinter.cpp | 2 dom/xslt/xpath/txForwardContext.h | 2 dom/xslt/xpath/txPathExpr.cpp | 4 dom/xslt/xslt/txInstructions.cpp | 12 dom/xslt/xslt/txKey.h | 10 dom/xslt/xslt/txKeyFunctionCall.cpp | 14 dom/xslt/xslt/txXSLTNumber.cpp | 2 editor/libeditor/HTMLEditorDeleteHandler.cpp | 10 extensions/permissions/test/unit/test_permmanager_expiration.js | 7 extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.cpp | 12 extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.h | 3 extensions/spellcheck/src/mozSpellChecker.cpp | 2 gfx/2d/2D.h | 1 gfx/2d/DrawTargetSkia.cpp | 8 gfx/2d/FilterNodeSoftware.cpp | 10 gfx/2d/FilterProcessingScalar.cpp | 4 gfx/angle/checkout/include/GLSLANG/ShaderVars.h | 1 gfx/angle/checkout/out/gen/angle/angle_commit.h | 6 gfx/angle/checkout/src/compiler/translator/BaseTypes.h | 3 gfx/angle/checkout/src/compiler/translator/Compiler.cpp | 14 gfx/angle/checkout/src/compiler/translator/ParseContext.cpp | 62 gfx/angle/checkout/src/compiler/translator/ParseContext.h | 4 gfx/angle/checkout/src/compiler/translator/glslang_tab_autogen.cpp | 7 gfx/angle/cherry_picks.txt | 200 gfx/cairo/cairo/src/cairo-cff-subset.c | 6 gfx/gl/GLBlitHelper.cpp | 11 gfx/gl/GLLibraryEGL.cpp | 11 gfx/harfbuzz/src/hb-aat-layout-morx-table.hh | 13 gfx/harfbuzz/src/moz.build | 5 gfx/ipc/CanvasShutdownManager.cpp | 27 gfx/ipc/CanvasShutdownManager.h | 3 gfx/ipc/GPUChild.cpp | 50 gfx/ipc/GPUChild.h | 2 gfx/ipc/GPUParent.cpp | 8 gfx/ipc/GPUParent.h | 2 gfx/ipc/GPUProcessManager.cpp | 5 gfx/ipc/GPUProcessManager.h | 6 gfx/ipc/GfxMessageUtils.h | 31 gfx/ipc/PGPU.ipdl | 8 gfx/layers/BufferTexture.cpp | 4 gfx/layers/D3D11ShareHandleImage.cpp | 4 gfx/layers/D3D11YCbCrImage.cpp | 2 gfx/layers/DMABUFSurfaceImage.cpp | 2 gfx/layers/DcompSurfaceImage.cpp | 14 gfx/layers/ImageDataSerializer.cpp | 4 gfx/layers/MacIOSurfaceImage.cpp | 2 gfx/layers/ScreenshotGrabber.cpp | 6 gfx/layers/SourceSurfaceSharedData.cpp | 6 gfx/layers/apz/src/APZCTreeManager.cpp | 3 gfx/layers/apz/util/CheckerboardReportService.cpp | 2 gfx/layers/client/ImageClient.cpp | 2 gfx/layers/client/TextureClient.cpp | 59 gfx/layers/composite/TextureHost.cpp | 139 gfx/layers/composite/TextureHost.h | 19 gfx/layers/d3d11/TextureD3D11.cpp | 36 gfx/layers/ipc/APZInputBridgeChild.cpp | 4 gfx/layers/ipc/CanvasChild.cpp | 61 gfx/layers/ipc/CanvasTranslator.cpp | 33 gfx/layers/ipc/CompositableTransactionParent.cpp | 16 gfx/layers/ipc/CompositableTransactionParent.h | 2 gfx/layers/ipc/CompositorBridgeChild.cpp | 10 gfx/layers/ipc/CompositorBridgeChild.h | 2 gfx/layers/ipc/CompositorBridgeParent.cpp | 3 gfx/layers/ipc/CompositorBridgeParent.h | 4 gfx/layers/ipc/CompositorThread.cpp | 4 gfx/layers/ipc/ContentCompositorBridgeParent.cpp | 31 gfx/layers/ipc/ContentCompositorBridgeParent.h | 2 gfx/layers/ipc/ISurfaceAllocator.cpp | 15 gfx/layers/ipc/ISurfaceAllocator.h | 12 gfx/layers/ipc/ImageBridgeChild.h | 2 gfx/layers/ipc/ImageBridgeParent.cpp | 17 gfx/layers/ipc/KnowsCompositor.cpp | 52 gfx/layers/ipc/KnowsCompositor.h | 4 gfx/layers/ipc/PCompositorBridge.ipdl | 2 gfx/layers/ipc/PWebRenderBridge.ipdl | 2 gfx/layers/ipc/RemoteContentController.cpp | 4 gfx/layers/ipc/SharedSurfacesParent.cpp | 5 gfx/layers/ipc/VideoBridgeChild.cpp | 2 gfx/layers/ipc/VideoBridgeChild.h | 2 gfx/layers/ipc/VideoBridgeParent.cpp | 38 gfx/layers/ipc/VideoBridgeParent.h | 7 gfx/layers/opengl/DMABUFTextureHostOGL.cpp | 58 gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp | 60 gfx/layers/opengl/TextureHostOGL.cpp | 31 gfx/layers/wr/AsyncImagePipelineOp.cpp | 30 gfx/layers/wr/AsyncImagePipelineOp.h | 36 gfx/layers/wr/WebRenderBridgeChild.cpp | 7 gfx/layers/wr/WebRenderBridgeChild.h | 4 gfx/layers/wr/WebRenderBridgeParent.cpp | 49 gfx/layers/wr/WebRenderBridgeParent.h | 2 gfx/layers/wr/WebRenderMessageUtils.h | 78 gfx/layers/wr/WebRenderScrollData.cpp | 6 gfx/ots/moz.yaml | 4 gfx/ots/ots-lz4.patch | 37 gfx/ots/src/cff.cc | 9 gfx/ots/src/cff_charstring.cc | 2 gfx/ots/src/cmap.cc | 3 gfx/ots/src/glat.cc | 2 gfx/ots/src/layout.cc | 12 gfx/ots/src/ots.cc | 2 gfx/ots/src/silf.cc | 4 gfx/ots/src/variations.cc | 6 gfx/src/FilterSupport.cpp | 187 gfx/src/FilterSupport.h | 204 gfx/tests/gtest/TestYUVtoRGB32.cpp | 156 gfx/thebes/COLRFonts.cpp | 2 gfx/thebes/CoreTextFontList.h | 2 gfx/thebes/SharedFontList.cpp | 8 gfx/thebes/SharedFontList.h | 3 gfx/thebes/gfxDWriteFontList.cpp | 21 gfx/thebes/gfxDWriteFontList.h | 4 gfx/thebes/gfxFT2FontBase.cpp | 4 gfx/thebes/gfxFT2FontBase.h | 2 gfx/thebes/gfxFT2FontList.cpp | 95 gfx/thebes/gfxFT2FontList.h | 17 gfx/thebes/gfxFcPlatformFontList.cpp | 99 gfx/thebes/gfxFcPlatformFontList.h | 15 gfx/thebes/gfxFont.cpp | 4 gfx/thebes/gfxFontEntry.cpp | 261 gfx/thebes/gfxFontEntry.h | 132 gfx/thebes/gfxGDIFontList.cpp | 17 gfx/thebes/gfxGDIFontList.h | 6 gfx/thebes/gfxHarfBuzzShaper.cpp | 261 gfx/thebes/gfxHarfBuzzShaper.h | 191 gfx/thebes/gfxPlatformFontList.cpp | 138 gfx/thebes/gfxPlatformFontList.h | 66 gfx/thebes/gfxTextRun.cpp | 13 gfx/thebes/gfxUserFontSet.cpp | 31 gfx/thebes/gfxUserFontSet.h | 2 gfx/thebes/gfxUtils.cpp | 6 gfx/vr/VRManager.cpp | 4 gfx/vr/external_api/moz_external_vr.h | 3 gfx/vr/ipc/VRChild.cpp | 38 gfx/webrender_bindings/RenderTextureHost.cpp | 3 gfx/webrender_bindings/RenderTextureHost.h | 11 gfx/webrender_bindings/RenderTextureHostSWGL.h | 2 gfx/webrender_bindings/RenderTextureHostWrapper.cpp | 24 gfx/webrender_bindings/RenderTextureHostWrapper.h | 7 gfx/webrender_bindings/WebRenderAPI.cpp | 11 gfx/webrender_bindings/WebRenderAPI.h | 2 gfx/webrender_bindings/src/bindings.rs | 13 gfx/ycbcr/scale_yuv_argb.cpp | 3 gfx/ycbcr/yuv_convert.cpp | 82 image/ImageWrapper.cpp | 3 image/RasterImage.cpp | 8 image/RasterImage.h | 3 image/VectorImage.cpp | 4 image/decoders/nsPNGDecoder.cpp | 139 ipc/glue/BackgroundParentImpl.cpp | 10 ipc/glue/UtilityProcessParent.cpp | 25 js/loader/ModuleLoaderBase.cpp | 21 js/loader/ModuleLoaderBase.h | 2 js/public/Object.h | 6 js/src/debugger/Debugger.cpp | 3 js/src/gc/GC.cpp | 7 js/src/gc/GCRuntime.h | 4 js/src/gc/Heap.cpp | 7 js/src/jit-test/tests/arguments/bug2029316.js | 17 js/src/jit-test/tests/arguments/bug2029317.js | 25 js/src/jit-test/tests/modules/bug-2027274.js | 14 js/src/jit-test/tests/structured-clone/allobjs.js | 34 js/src/jit-test/tests/wasm/bug2020378.js | 177 js/src/jit-test/tests/wasm/gc/i31ref.js | 23 js/src/jit-test/tests/wasm/regress/bug2029735.js | 11 js/src/jit/MIR-wasm.cpp | 10 js/src/jit/MIR.cpp | 28 js/src/jit/MIR.h | 12 js/src/jit/MIROps.yaml | 16 js/src/jit/ScalarReplacement.cpp | 12 js/src/jsfriendapi.cpp | 4 js/src/proxy/Proxy.cpp | 17 js/src/vm/ArgumentsObject.cpp | 18 js/src/vm/AsyncFunction.cpp | 3 js/src/vm/CharacterEncoding.cpp | 17 js/src/vm/EnvironmentObject.cpp | 24 js/src/vm/EnvironmentObject.h | 1 js/src/vm/MatchPairs.h | 5 js/src/vm/Modules.cpp | 51 js/src/vm/Modules.h | 4 js/src/vm/RegExpStatics.h | 1 js/src/vm/StructuredClone.cpp | 20 js/src/wasm/WasmInstance.cpp | 20 js/src/wasm/WasmJS.cpp | 9 js/src/wasm/WasmJS.h | 1 js/xpconnect/src/ExportHelpers.cpp | 10 js/xpconnect/src/XPCJSRuntime.cpp | 2 layout/base/PresShell.cpp | 24 layout/base/PresShell.h | 5 layout/base/tests/mochitest.toml | 2 layout/base/tests/test_getClientRects_emptytext.html | 26 layout/forms/nsRangeFrame.cpp | 10 layout/forms/nsTextControlFrame.cpp | 5 layout/generic/ScrollbarActivity.cpp | 1 layout/generic/nsFrameSelection.cpp | 134 layout/generic/nsFrameSelection.h | 7 layout/generic/nsIFrame.cpp | 10 layout/printing/ipc/RemotePrintJobParent.cpp | 9 layout/printing/ipc/RemotePrintJobParent.h | 4 layout/style/FontFaceSet.cpp | 12 layout/style/FontFaceSetDocumentImpl.cpp | 2 layout/style/FontFaceSetImpl.cpp | 8 layout/style/FontFaceSetImpl.h | 5 layout/style/PostTraversalTask.cpp | 28 layout/style/PostTraversalTask.h | 50 layout/style/ServoStyleSet.cpp | 1 layout/style/ServoStyleSet.h | 2 layout/style/nsFontFaceLoader.cpp | 3 layout/svg/CSSFilterInstance.cpp | 32 layout/svg/FilterInstance.cpp | 116 layout/svg/SVGObserverUtils.cpp | 6 media/ffvpx/README_MOZILLA | 5 media/ffvpx/libavcodec/vp9.c | 4 media/ffvpx/vp9-get-format-rollback.patch | 16 media/gmp-clearkey/0.1/VideoDecoder.cpp | 14 media/gmp-clearkey/0.1/VideoDecoder.h | 8 media/gmp-clearkey/0.1/WMFH264Decoder.cpp | 34 media/gmp-clearkey/0.1/WMFH264Decoder.h | 20 media/libpng/ANNOUNCE | 52 media/libpng/AUTHORS | 1 media/libpng/CHANGES | 11 media/libpng/README | 2 media/libpng/libpng-manual.txt | 2 media/libpng/moz.yaml | 4 media/libpng/png.c | 4 media/libpng/png.h | 14 media/libpng/pngconf.h | 2 media/libpng/pngrtran.c | 28 media/libpng/pngset.c | 54 media/libvpx/libvpx/vp8/common/alloccommon.c | 6 media/libvpx/moz.yaml | 1 media/libvpx/reset_post_proc_state.patch | 32 mfbt/CheckedInt.h | 2 modules/brotli/common/constants.c | 14 modules/brotli/common/constants.h | 7 modules/brotli/common/context.c | 4 modules/brotli/common/context.h | 3 modules/brotli/common/dictionary.c | 5860 ---------- modules/brotli/common/dictionary.h | 3 modules/brotli/common/dictionary_inc.h | 5847 +++++++++ modules/brotli/common/platform.c | 4 modules/brotli/common/platform.h | 240 modules/brotli/common/shared_dictionary.c | 10 modules/brotli/common/shared_dictionary_internal.h | 2 modules/brotli/common/static_init.h | 56 modules/brotli/common/transform.c | 10 modules/brotli/common/transform.h | 3 modules/brotli/common/version.h | 6 modules/brotli/dec/bit_reader.c | 11 modules/brotli/dec/bit_reader.h | 4 modules/brotli/dec/decode.c | 267 modules/brotli/dec/huffman.c | 7 modules/brotli/dec/huffman.h | 2 modules/brotli/dec/prefix.c | 67 modules/brotli/dec/prefix.h | 726 - modules/brotli/dec/prefix_inc.h | 707 + modules/brotli/dec/state.c | 33 modules/brotli/dec/state.h | 8 modules/brotli/dec/static_init.c | 53 modules/brotli/dec/static_init.h | 30 modules/brotli/include/brotli/decode.h | 6 modules/brotli/include/brotli/encode.h | 6 modules/brotli/include/brotli/port.h | 11 modules/brotli/include/brotli/types.h | 4 modules/brotli/moz.build | 2 modules/brotli/moz.yaml | 8 modules/libpref/Preferences.cpp | 1 modules/libpref/init/StaticPrefList.yaml | 16 mozglue/interposers/env_interposer.cpp | 18 netwerk/base/Tickler.cpp | 10 netwerk/base/Tickler.h | 7 netwerk/base/nsBaseChannel.cpp | 2 netwerk/base/nsDownloader.cpp | 1 netwerk/base/nsSyncStreamListener.cpp | 3 netwerk/base/nsUDPSocket.cpp | 30 netwerk/base/nsUDPSocket.h | 18 netwerk/build/components.conf | 1 netwerk/build/moz.build | 6 netwerk/dns/DNS.cpp | 49 netwerk/dns/DNS.h | 1 netwerk/dns/TRRServiceChild.cpp | 2 netwerk/dns/TRRServiceParent.cpp | 15 netwerk/dns/effective_tld_names.dat | 84 netwerk/dns/nsDNSService2.cpp | 2 netwerk/dns/nsHostResolver.cpp | 2 netwerk/ipc/DocumentLoadListener.cpp | 1 netwerk/ipc/NeckoChannelParams.ipdlh | 25 netwerk/ipc/NeckoChild.cpp | 21 netwerk/ipc/NeckoChild.h | 6 netwerk/ipc/NeckoMessageUtils.h | 7 netwerk/ipc/NeckoParent.cpp | 54 netwerk/ipc/NeckoParent.h | 11 netwerk/ipc/PNecko.ipdl | 9 netwerk/ipc/SocketProcessBridgeParent.cpp | 4 netwerk/ipc/SocketProcessParent.cpp | 58 netwerk/ipc/moz.build | 2 netwerk/protocol/gio/GIOChannelChild.cpp | 457 netwerk/protocol/gio/GIOChannelChild.h | 111 netwerk/protocol/gio/GIOChannelParent.cpp | 324 netwerk/protocol/gio/GIOChannelParent.h | 80 netwerk/protocol/gio/PGIOChannel.ipdl | 51 netwerk/protocol/gio/components.conf | 24 netwerk/protocol/gio/moz.build | 42 netwerk/protocol/gio/nsGIOProtocolHandler.cpp | 1027 - netwerk/protocol/gio/nsGIOProtocolHandler.h | 38 netwerk/protocol/http/BackgroundChannelRegistrar.cpp | 20 netwerk/protocol/http/BackgroundChannelRegistrar.h | 11 netwerk/protocol/http/BackgroundDataBridgeParent.cpp | 14 netwerk/protocol/http/BackgroundDataBridgeParent.h | 3 netwerk/protocol/http/HttpChannelParent.cpp | 16 netwerk/protocol/http/HttpTransactionParent.cpp | 35 netwerk/protocol/http/ObliviousHttpChannel.cpp | 17 netwerk/protocol/http/ObliviousHttpChannel.h | 2 netwerk/protocol/http/ReplacedHttpResponse.cpp | 8 netwerk/protocol/http/ReplacedHttpResponse.h | 2 netwerk/protocol/http/TLSTransportLayer.cpp | 12 netwerk/protocol/http/nsHttpActivityDistributor.cpp | 2 netwerk/protocol/http/nsHttpChannel.cpp | 68 netwerk/protocol/http/nsHttpChannel.h | 11 netwerk/protocol/http/nsHttpConnection.cpp | 3 netwerk/protocol/http/nsHttpHandler.cpp | 4 netwerk/protocol/http/nsHttpHandler.h | 8 netwerk/protocol/http/nsHttpTransaction.cpp | 4 netwerk/protocol/moz.build | 14 netwerk/protocol/res/ExtensionProtocolHandler.cpp | 22 netwerk/protocol/websocket/WebSocketChannelChild.cpp | 26 netwerk/protocol/webtransport/WebTransportSessionProxy.cpp | 20 netwerk/streamconv/converters/mozTXTToHTMLConv.cpp | 11 netwerk/system/mac/nsNetworkLinkService.mm | 37 netwerk/test/unit/test_gio_protocol.js | 201 netwerk/test/unit/xpcshell.toml | 3 netwerk/test/unit_ipc/test_gio_protocol_wrap.js | 21 netwerk/test/unit_ipc/xpcshell.toml | 4 parser/html/nsHtml5TreeOperation.cpp | 20 security/ct/CTKnownLogs.h | 2 security/manager/ssl/PSMRunnable.cpp | 42 security/manager/ssl/PSMRunnable.h | 49 security/manager/ssl/SSLServerCertVerification.cpp | 1 security/manager/ssl/StaticHPKPins.h | 2 security/manager/ssl/moz.build | 7 security/manager/ssl/nsNSSCallbacks.cpp | 37 security/manager/ssl/nsNSSIOLayer.cpp | 1 security/manager/ssl/nsSTSPreloadList.inc | 4378 +++---- security/manager/tools/PreloadedHPKPins.json | 4 security/manager/tools/log_list.json | 4 security/nss/cpputil/nss_scoped_ptrs.h | 11 security/nss/doc/rst/releases/nss_3_112_4.rst | 52 security/nss/gtests/der_gtest/der_gtest.gyp | 1 security/nss/gtests/der_gtest/p12_import_unittest.cc | 23 security/nss/gtests/der_gtest/p7_import_unittest.cc | 60 security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp | 39 security/nss/gtests/ssl_gtest/ssl_certificate_compression_unittest.cc | 116 security/nss/lib/certdb/alg1485.c | 8 security/nss/lib/certdb/stanpcertdb.c | 13 security/nss/lib/certhigh/certvfy.c | 7 security/nss/lib/cryptohi/dsautil.c | 21 security/nss/lib/freebl/blapii.h | 1 security/nss/lib/freebl/rsa_blind.c | 3 security/nss/lib/freebl/rsapkcs.c | 21 security/nss/lib/mozpkix/lib/pkixnames.cpp | 76 security/nss/lib/nss/nss.h | 4 security/nss/lib/pk11wrap/pk11pk12.c | 11 security/nss/lib/pkcs7/p7decode.c | 61 security/nss/lib/pki/tdcache.c | 31 security/nss/lib/smime/cmsdecode.c | 16 security/nss/lib/smime/cmspubkey.c | 1 security/nss/lib/softoken/softkver.h | 4 security/nss/lib/ssl/dtlscon.c | 33 security/nss/lib/ssl/ssl3con.c | 1 security/nss/lib/ssl/ssl3ext.c | 20 security/nss/lib/ssl/ssl3ext.h | 3 security/nss/lib/ssl/ssl3exthandle.c | 38 security/nss/lib/ssl/tls13con.c | 21 security/nss/lib/ssl/tls13ech.c | 2 security/nss/lib/ssl/tls13exthandle.c | 43 security/nss/lib/util/nssutil.h | 4 security/nss/lib/util/quickder.c | 11 security/nss/moz.yaml | 4 services/settings/dumps/blocklists/addons-bloomfilters.json | 5149 ++++++++ services/settings/dumps/main/devtools-compatibility-browsers.json | 394 services/settings/dumps/main/search-config-icons.json | 19 services/settings/dumps/main/search-config-v2.json | 36 services/settings/dumps/main/search-telemetry-v2.json | 747 - services/settings/dumps/main/urlbar-persisted-search-terms.json | 28 services/settings/dumps/security-state/intermediates.json | 553 services/settings/dumps/security-state/onecrl.json | 92 servo/components/style/values/specified/calc.rs | 3 sourcestamp.txt | 4 taskcluster/docker/periodic-updates/scripts/genHPKPStaticPins.js | 10 taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js | 13 testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html | 1 third_party/libwebrtc/call/BUILD.gn | 1 third_party/libwebrtc/call/rtp_video_sender.cc | 5 third_party/libwebrtc/call/rtp_video_sender_unittest.cc | 70 third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.cc | 9 third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.h | 6 third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder.cc | 25 third_party/libwebrtc/moz-patch-stack/77d265670f.no-op-cherry-pick-msg | 1 third_party/libwebrtc/net/dcsctp/tx/outstanding_data.cc | 11 third_party/libwebrtc/net/dcsctp/tx/outstanding_data.h | 1 third_party/libwebrtc/net/dcsctp/tx/retransmission_queue.cc | 8 third_party/rust/cubeb-coreaudio/.cargo-checksum.json | 2 third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs | 14 toolkit/actors/FindBarParent.sys.mjs | 16 toolkit/actors/PictureInPictureChild.sys.mjs | 4 toolkit/components/antitracking/StorageAccessAPIHelper.cpp | 36 toolkit/components/downloads/DownloadPaths.sys.mjs | 9 toolkit/components/downloads/test/unit/test_DownloadPaths.js | 10 toolkit/components/extensions/MatchPattern.cpp | 2 toolkit/components/formautofill/FormAutofillParent.sys.mjs | 21 toolkit/components/messaging-system/lib/SpecialMessageActions.sys.mjs | 6 toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/SpecialMessageActionSchemas.json | 18 toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/index.md | 6 toolkit/components/passwordmgr/LoginManagerParent.sys.mjs | 2 toolkit/components/reputationservice/ApplicationReputation.cpp | 4 toolkit/components/reputationservice/ApplicationReputation.h | 4 toolkit/components/reputationservice/test/gtest/TestExecutableLists.cpp | 2 toolkit/components/search/schema/search-config-v2-schema.json | 2 toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js | 26 toolkit/components/search/tests/xpcshell/searchconfigs/test_google.js | 4 toolkit/components/url-classifier/LookupCache.cpp | 2 toolkit/components/utils/SimpleServices.sys.mjs | 4 toolkit/content/widgets/findbar.js | 8 toolkit/crashreporter/client/app/src/glean.rs | 75 toolkit/crashreporter/client/app/src/lang/langpack.rs | 17 toolkit/crashreporter/client/app/src/main.rs | 1 toolkit/crashreporter/client/app/src/prefs_parser.rs | 86 toolkit/crashreporter/client/app/src/std/fs.rs | 6 toolkit/crashreporter/client/app/src/test.rs | 97 toolkit/crashreporter/client/app/src/ui/gtk.rs | 62 toolkit/crashreporter/client/gtkbind/build.rs | 2 toolkit/library/rust/shared/Cargo.toml | 2 toolkit/mozapps/update/updater/updater.cpp | 51 widget/ClipboardWriteRequestParent.cpp | 6 widget/IMEData.h | 86 widget/PuppetWidget.cpp | 17 widget/SwipeTracker.cpp | 35 widget/SwipeTracker.h | 7 widget/TextEventDispatcher.cpp | 2 widget/TextEventDispatcherListener.h | 4 widget/android/GeckoEditableSupport.cpp | 2 widget/cocoa/TextInputHandler.mm | 2 widget/gtk/DMABufSurface.cpp | 32 widget/gtk/IMContextWrapper.cpp | 9 widget/gtk/nsFilePicker.cpp | 5 widget/gtk/nsPrintDialogGTK.cpp | 40 widget/nsBaseClipboard.cpp | 16 widget/nsBaseWidget.cpp | 4 widget/nsColorPickerProxy.cpp | 14 widget/nsGUIEventIPC.h | 121 widget/nsIWidget.h | 1 widget/nsTransferable.cpp | 1 widget/uikit/TextInputHandler.mm | 2 widget/windows/IMMHandler.cpp | 5 widget/windows/TSFEmptyTextStore.cpp | 2 widget/windows/TSFTextStore.cpp | 11 widget/windows/TSFUtils.cpp | 2 widget/windows/TSFUtils.h | 3 widget/windows/WinIMEHandler.cpp | 2 xpcom/base/CycleCollectedJSContext.cpp | 36 xpcom/base/CycleCollectedJSContext.h | 4 xpcom/base/CycleCollectedJSRuntime.cpp | 20 xpcom/base/CycleCollectedJSRuntime.h | 1 xpcom/base/nsISupportsImpl.h | 26 xpcom/ds/StaticAtoms.py | 1 xpcom/io/nsLocalFileCommon.cpp | 2 xpcom/io/nsLocalFileCommon.h | 4 xpcom/io/nsLocalFileUnix.cpp | 23 xpcom/tests/gtest/TestAutoRefCnt.cpp | 114 xpcom/threads/nsThreadPool.cpp | 4 761 files changed, 24306 insertions(+), 16876 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmpkknhihq2/firefox-esr_140.9.1esr-1~deb13u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmpkknhihq2/firefox-esr_140.10.0esr-1~deb13u1.dsc: no acceptable signature found diff -Nru firefox-esr-140.9.1esr/.cargo/config.toml.in firefox-esr-140.10.0esr/.cargo/config.toml.in --- firefox-esr-140.9.1esr/.cargo/config.toml.in 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/.cargo/config.toml.in 2026-04-15 01:59:46.000000000 +0000 @@ -85,9 +85,9 @@ rev = "e6f44a2bd1e57d11dfc737632a9e849077632330" replace-with = "vendored-sources" -[source."git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=579b75af21c040700eee6a1d8520e222699fe4cd"] +[source."git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=bebaa23317332c95734df76e25193c24a83a6840"] git = "https://github.com/mozilla/cubeb-coreaudio-rs" -rev = "579b75af21c040700eee6a1d8520e222699fe4cd" +rev = "bebaa23317332c95734df76e25193c24a83a6840" replace-with = "vendored-sources" [source."git+https://github.com/mozilla/cubeb-pulse-rs?rev=8678dcab1c287de79c4c184ccc2e065bc62b70e2"] diff -Nru firefox-esr-140.9.1esr/.gitignore firefox-esr-140.10.0esr/.gitignore --- firefox-esr-140.9.1esr/.gitignore 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/.gitignore 2026-04-15 01:59:47.000000000 +0000 @@ -373,3 +373,6 @@ # Ignore mozperftest artifacts folder /artifacts/ + +# Ignore personal preferences files +CLAUDE.local.md diff -Nru firefox-esr-140.9.1esr/CLOBBER firefox-esr-140.10.0esr/CLOBBER --- firefox-esr-140.9.1esr/CLOBBER 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/CLOBBER 2026-04-15 01:59:47.000000000 +0000 @@ -22,4 +22,4 @@ # changes to stick? As of bug 928195, this shouldn't be necessary! Please # don't change CLOBBER for WebIDL changes any more. -Merge day clobber 2026-02-23 \ No newline at end of file +Merge day clobber 2026-03-23 \ No newline at end of file diff -Nru firefox-esr-140.9.1esr/Cargo.lock firefox-esr-140.10.0esr/Cargo.lock --- firefox-esr-140.9.1esr/Cargo.lock 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/Cargo.lock 2026-04-15 01:59:47.000000000 +0000 @@ -1086,7 +1086,7 @@ [[package]] name = "coreaudio-sys-utils" version = "0.1.0" -source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=579b75af21c040700eee6a1d8520e222699fe4cd#579b75af21c040700eee6a1d8520e222699fe4cd" +source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=bebaa23317332c95734df76e25193c24a83a6840#bebaa23317332c95734df76e25193c24a83a6840" dependencies = [ "core-foundation-sys", "coreaudio-sys", @@ -1398,7 +1398,7 @@ [[package]] name = "cubeb-coreaudio" version = "0.1.0" -source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=579b75af21c040700eee6a1d8520e222699fe4cd#579b75af21c040700eee6a1d8520e222699fe4cd" +source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=bebaa23317332c95734df76e25193c24a83a6840#bebaa23317332c95734df76e25193c24a83a6840" dependencies = [ "atomic", "audio-mixer", diff -Nru firefox-esr-140.9.1esr/accessible/base/AccIterator.cpp firefox-esr-140.10.0esr/accessible/base/AccIterator.cpp --- firefox-esr-140.9.1esr/accessible/base/AccIterator.cpp 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/accessible/base/AccIterator.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -23,7 +23,7 @@ // AccIterator //////////////////////////////////////////////////////////////////////////////// -AccIterator::AccIterator(const LocalAccessible* aAccessible, +AccIterator::AccIterator(LocalAccessible* aAccessible, filters::FilterFuncPtr aFilterFunc) : mFilterFunc(aFilterFunc) { mState = new IteratorState(aAccessible); @@ -63,7 +63,7 @@ //////////////////////////////////////////////////////////////////////////////// // nsAccIterator::IteratorState -AccIterator::IteratorState::IteratorState(const LocalAccessible* aParent, +AccIterator::IteratorState::IteratorState(LocalAccessible* aParent, IteratorState* mParentState) : mParent(aParent), mIndex(0), mParentState(mParentState) {} diff -Nru firefox-esr-140.9.1esr/accessible/base/AccIterator.h firefox-esr-140.10.0esr/accessible/base/AccIterator.h --- firefox-esr-140.9.1esr/accessible/base/AccIterator.h 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/accessible/base/AccIterator.h 2026-04-15 01:59:47.000000000 +0000 @@ -42,7 +42,7 @@ */ class AccIterator : public AccIterable { public: - AccIterator(const LocalAccessible* aRoot, filters::FilterFuncPtr aFilterFunc); + AccIterator(LocalAccessible* aRoot, filters::FilterFuncPtr aFilterFunc); virtual ~AccIterator(); /** @@ -57,10 +57,10 @@ AccIterator& operator=(const AccIterator&); struct IteratorState { - explicit IteratorState(const LocalAccessible* aParent, + explicit IteratorState(LocalAccessible* aParent, IteratorState* mParentState = nullptr); - const LocalAccessible* mParent; + RefPtr mParent; int32_t mIndex; IteratorState* mParentState; }; diff -Nru firefox-esr-140.9.1esr/accessible/base/TextLeafRange.cpp firefox-esr-140.10.0esr/accessible/base/TextLeafRange.cpp --- firefox-esr-140.9.1esr/accessible/base/TextLeafRange.cpp 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/accessible/base/TextLeafRange.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -536,7 +536,7 @@ return startFrameSel ? &startFrameSel->NormalSelection() : nullptr; } -std::pair TextLeafPoint::ToDOMPoint( +std::pair, uint32_t> TextLeafPoint::ToDOMPoint( bool aIncludeGenerated) const { if (!(*this) || !mAcc->IsLocal()) { MOZ_ASSERT_UNREACHABLE("Invalid point"); diff -Nru firefox-esr-140.9.1esr/accessible/base/TextLeafRange.h firefox-esr-140.10.0esr/accessible/base/TextLeafRange.h --- firefox-esr-140.9.1esr/accessible/base/TextLeafRange.h 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/accessible/base/TextLeafRange.h 2026-04-15 01:59:47.000000000 +0000 @@ -188,7 +188,7 @@ /** * Translate given TextLeafPoint into a DOM point. */ - MOZ_CAN_RUN_SCRIPT std::pair ToDOMPoint( + MOZ_CAN_RUN_SCRIPT std::pair, uint32_t> ToDOMPoint( bool aIncludeGenerated = true) const; private: diff -Nru firefox-esr-140.9.1esr/accessible/generic/HyperTextAccessible.cpp firefox-esr-140.10.0esr/accessible/generic/HyperTextAccessible.cpp --- firefox-esr-140.9.1esr/accessible/generic/HyperTextAccessible.cpp 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/accessible/generic/HyperTextAccessible.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -859,16 +859,15 @@ return; } + RefPtr editorBase = GetEditor(); + SetSelectionBoundsAt(TextLeafRange::kRemoveAllExistingSelectedRanges, 0, CharacterCount()); - RefPtr editorBase = GetEditor(); - if (!editorBase) { - return; + if (editorBase) { + DebugOnly rv = editorBase->InsertTextAsAction(aText); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to insert the new text"); } - - DebugOnly rv = editorBase->InsertTextAsAction(aText); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to insert the new text"); } void HyperTextAccessible::InsertText(const nsAString& aText, diff -Nru firefox-esr-140.9.1esr/accessible/ipc/DocAccessibleParent.cpp firefox-esr-140.10.0esr/accessible/ipc/DocAccessibleParent.cpp --- firefox-esr-140.9.1esr/accessible/ipc/DocAccessibleParent.cpp 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/accessible/ipc/DocAccessibleParent.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -118,6 +118,11 @@ return IPC_OK(); #endif } + + if (parent->IsOuterDoc()) { + return IPC_FAIL(this, "Cannot attach non-doc to OuterDoc"); + } + lastParent = parent; lastParentID = accData.ParentID(); @@ -223,6 +228,11 @@ RemoteAccessible* DocAccessibleParent::CreateAcc( const AccessibleData& aAccData) { + if (aAccData.ID() == 0) { + MOZ_ASSERT_UNREACHABLE("An ID of 0 is reserved for the document itself"); + return nullptr; + } + RemoteAccessible* newProxy; if ((newProxy = GetAccessible(aAccData.ID()))) { // This is a move. Reuse the Accessible; don't destroy it. @@ -906,6 +916,10 @@ MOZ_ASSERT(CheckDocTree()); auto childDoc = static_cast(aChildDoc.get()); + if (childDoc->IsShutdown()) { + return IPC_FAIL(this, "Attempt to bind a shutdown child doc"); + } + ipc::IPCResult result = AddChildDoc(childDoc, aID, false); MOZ_ASSERT(result); MOZ_ASSERT(CheckDocTree()); @@ -928,6 +942,10 @@ "Attempt to add child doc which already has a parent"); } + if (aChildDoc->IsShutdown()) { + return IPC_FAIL(this, "Attempt to add a shutdown child doc"); + } + // We do not use GetAccessible here because we want to be sure to not get the // document it self. ProxyEntry* e = mAccessibles.GetEntry(aParentID); @@ -1030,6 +1048,9 @@ // If we are already shutdown that is because our containing tab parent is // shutting down in which case we don't need to do anything. if (mShutdown) { + // Just in case there is a cycle in the document heirarchy. + mParent = nullptr; + mIndexInParent = -1; return; } @@ -1112,6 +1133,9 @@ if (!mShutdown) { ACQUIRE_ANDROID_LOCK Destroy(); + } else if (RemoteParent()) { + ACQUIRE_ANDROID_LOCK + Unbind(); } } diff -Nru firefox-esr-140.9.1esr/browser/actors/BlockedSiteChild.sys.mjs firefox-esr-140.10.0esr/browser/actors/BlockedSiteChild.sys.mjs --- firefox-esr-140.9.1esr/browser/actors/BlockedSiteChild.sys.mjs 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/actors/BlockedSiteChild.sys.mjs 2026-04-15 01:59:47.000000000 +0000 @@ -16,25 +16,9 @@ Ci.nsIClassifiedChannel ); if (classifiedChannel) { - let httpChannel = docShell.failedChannel.QueryInterface( - Ci.nsIHttpChannel - ); - - let reportUri = httpChannel.URI; - - // Remove the query to avoid leaking sensitive data - if (reportUri instanceof Ci.nsIURL) { - reportUri = reportUri.mutate().setQuery("").finalize(); - } - - let triggeringPrincipal = docShell.failedChannel.loadInfo - ? docShell.failedChannel.loadInfo.triggeringPrincipal - : null; blockedInfo = { list: classifiedChannel.matchedList, - triggeringPrincipal, provider: classifiedChannel.matchedProvider, - uri: reportUri.asciiSpec, }; } } diff -Nru firefox-esr-140.9.1esr/browser/actors/BlockedSiteParent.sys.mjs firefox-esr-140.10.0esr/browser/actors/BlockedSiteParent.sys.mjs --- firefox-esr-140.9.1esr/browser/actors/BlockedSiteParent.sys.mjs 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/actors/BlockedSiteParent.sys.mjs 2026-04-15 01:59:47.000000000 +0000 @@ -177,8 +177,11 @@ // site, so that they don't lose track after, e.g., tab switching. // We can't use browser.contentPrincipal which is principal of about:blocked // Create one from uri with current principal origin attributes + + // Remove the query to avoid leaking sensitive data + let uri = browsingContext.currentURI.mutate().setQuery("").finalize(); let principal = Services.scriptSecurityManager.createContentPrincipal( - Services.io.newURI(blockedInfo.uri), + uri, browsingContext.currentWindowGlobal.documentPrincipal.originAttributes ); Services.perms.addFromPrincipal( @@ -206,10 +209,10 @@ let title; let chromeWin = browsingContext.topChromeWindow; if (reason === "malware") { - let reportUrl = lazy.SafeBrowsing.getReportURL( - "MalwareMistake", - blockedInfo - ); + let reportUrl = lazy.SafeBrowsing.getReportURL("MalwareMistake", { + ...blockedInfo, + uri: uri.asciiSpec, + }); title = lazy.browserBundle.GetStringFromName( "safebrowsing.reportedAttackSite" ); @@ -233,10 +236,10 @@ }; } } else if (reason === "phishing") { - let reportUrl = lazy.SafeBrowsing.getReportURL( - "PhishMistake", - blockedInfo - ); + let reportUrl = lazy.SafeBrowsing.getReportURL("PhishMistake", { + ...blockedInfo, + uri: uri.asciiSpec, + }); title = lazy.browserBundle.GetStringFromName( "safebrowsing.deceptiveSite" ); @@ -281,16 +284,15 @@ buttons ); - // Allow users to override and continue through to the site. - // Note that we have to use the passed URI info and can't just - // rely on the document URI, because the latter contains - // additional query parameters that should be stripped. - let triggeringPrincipal = - blockedInfo.triggeringPrincipal || - Services.scriptSecurityManager.createNullPrincipal({}); + let activeSHEntry = browsingContext.activeSessionHistoryEntry; + if (!activeSHEntry) { + console.error("No active session history entry found"); + return; + } - browsingContext.fixupAndLoadURIString(blockedInfo.uri, { - triggeringPrincipal, + // Allow users to override and continue through to the site. + browsingContext.loadURI(uri, { + triggeringPrincipal: activeSHEntry.triggeringPrincipal, loadFlags: Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CLASSIFIER, }); } diff -Nru firefox-esr-140.9.1esr/browser/actors/DOMFullscreenParent.sys.mjs firefox-esr-140.10.0esr/browser/actors/DOMFullscreenParent.sys.mjs --- firefox-esr-140.9.1esr/browser/actors/DOMFullscreenParent.sys.mjs 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/actors/DOMFullscreenParent.sys.mjs 2026-04-15 01:59:46.000000000 +0000 @@ -142,9 +142,7 @@ case "DOMFullscreen:NewOrigin": { // Don't show the warning if we've already exited fullscreen. if (window.document.fullscreen) { - window.PointerlockFsWarning.showFullScreen( - aMessage.data.originNoSuffix - ); + window.PointerlockFsWarning.showFullScreen(topBrowsingContext); } this.updateFullscreenWindowReference(window); break; @@ -222,7 +220,7 @@ if (!this.hasBeenDestroyed() && this.requestOrigin) { window.PointerlockFsWarning.showFullScreen( - this.requestOrigin.manager.documentPrincipal.originNoSuffix + this.requestOrigin.browsingContext ); } break; diff -Nru firefox-esr-140.9.1esr/browser/base/content/browser-fullScreenAndPointerLock.js firefox-esr-140.10.0esr/browser/base/content/browser-fullScreenAndPointerLock.js --- firefox-esr-140.9.1esr/browser/base/content/browser-fullScreenAndPointerLock.js 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/base/content/browser-fullScreenAndPointerLock.js 2026-04-15 01:59:47.000000000 +0000 @@ -49,10 +49,16 @@ } }, - showFullScreen(aOrigin) { + // Show info that top level has entered fullscreen. Ultimately, it is always + // ancestors who are in control and can with various means make the user believe + // a site has entered fullscreen while displaying it's own content. + // We try to make it clear to the user that it's the top level that is actually in fullscreen + showFullScreen(browsingContext) { + const origin = + browsingContext.top.currentWindowGlobal.documentPrincipal.originNoSuffix; let timeout = Services.prefs.getIntPref("full-screen-api.warning.timeout"); let delay = Services.prefs.getIntPref("full-screen-api.warning.delay"); - this.show(aOrigin, "fullscreen-warning", timeout, delay); + this.show(origin, "fullscreen-warning", timeout, delay); }, // Shows a warning that the site has entered fullscreen or diff -Nru firefox-esr-140.9.1esr/browser/base/content/test/fullscreen/browser.toml firefox-esr-140.10.0esr/browser/base/content/test/fullscreen/browser.toml --- firefox-esr-140.9.1esr/browser/base/content/test/fullscreen/browser.toml 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/base/content/test/fullscreen/browser.toml 2026-04-15 01:59:47.000000000 +0000 @@ -60,6 +60,9 @@ "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && swgl", # Bug 1949995 ] +["browser_fullscreen_toplevel_warning.js"] +support-files = ["fullscreen.html"] + ["browser_fullscreen_warning.js"] support-files = ["fullscreen.html"] skip-if = [ diff -Nru firefox-esr-140.9.1esr/browser/base/content/test/fullscreen/browser_fullscreen_toplevel_warning.js firefox-esr-140.10.0esr/browser/base/content/test/fullscreen/browser_fullscreen_toplevel_warning.js --- firefox-esr-140.9.1esr/browser/base/content/test/fullscreen/browser_fullscreen_toplevel_warning.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/base/content/test/fullscreen/browser_fullscreen_toplevel_warning.js 2026-04-15 01:59:47.000000000 +0000 @@ -0,0 +1,184 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const FULLSCREEN_PATH = + "/browser/browser/base/content/test/fullscreen/fullscreen.html"; + +function getWarningDomain(warning) { + let textElem = warning.querySelector(".pointerlockfswarning-domain-text"); + if (textElem.hidden) { + return null; + } + let args = textElem.getAttribute("data-l10n-args"); + return args ? JSON.parse(args).domain : null; +} + +async function waitForWarningState(aWarningElement, aExpectedState) { + await BrowserTestUtils.waitForAttribute(aExpectedState, aWarningElement, ""); +} + +add_setup(async function init() { + await SpecialPowers.pushPrefEnv({ + set: [ + ["test.wait300msAfterTabSwitch", true], + ["full-screen-api.enabled", true], + ["full-screen-api.allow-trusted-requests-only", false], + ], + }); +}); + +// Bug 2021080 - Verify the fullscreen warning always displays the top-level domain, +// not the origin of the cross-origin frame that requested fullscreen. +add_task(async function test_fullscreen_warning_cross_origin_shows_toplevel() { + await BrowserTestUtils.withNewTab("https://example.com", async browser => { + let warning = document.getElementById("fullscreen-warning"); + + await SpecialPowers.spawn(browser, [FULLSCREEN_PATH], async path => { + let iframe = content.document.createElement("iframe"); + iframe.allow = "fullscreen"; + iframe.src = `https://example.org${path}`; + let loaded = new Promise(r => + iframe.addEventListener("load", r, { once: true }) + ); + content.document.body.appendChild(iframe); + await loaded; + }); + + let warningShown = waitForWarningState(warning, "onscreen"); + await SpecialPowers.spawn(browser, [], async () => { + let frame = content.document.querySelector("iframe"); + frame.focus(); + await SpecialPowers.spawn(frame, [], () => { + content.document.getElementById("request").click(); + }); + }); + await warningShown; + + let activeOrigin = await SpecialPowers.spawn(browser, [], async () => { + let frame = content.document.querySelector("iframe"); + return SpecialPowers.spawn(frame, [], () => content.location.hostname); + }); + is( + activeOrigin, + "example.org", + "Cross-origin frame (example.org) is the active fullscreen document" + ); + is( + getWarningDomain(warning), + "example.com", + "Warning shows top-level domain, not the active fullscreen frame's domain" + ); + + let warningHidden = waitForWarningState(warning, "hidden"); + let exitPromise = BrowserTestUtils.waitForEvent( + document, + "fullscreenchange", + false, + () => !document.fullscreenElement + ); + document.getElementById("fullscreen-exit-button").click(); + await Promise.all([exitPromise, warningHidden]); + }); +}); + +// Bug 2021080 - Verify the fullscreen warning shows the top-level domain when each +// of three nested cross-origin frames (top, middle, inner) requests fullscreen. +add_task(async function test_fullscreen_warning_three_nested_origins() { + await BrowserTestUtils.withNewTab("https://example.com", async browser => { + let warning = document.getElementById("fullscreen-warning"); + + // Build a 3-level nested structure: + // example.com (div > iframe[example.org (div > iframe[example.net])]) + await SpecialPowers.spawn(browser, [FULLSCREEN_PATH], async path => { + let topDiv = content.document.createElement("div"); + content.document.body.appendChild(topDiv); + + let middleFrame = content.document.createElement("iframe"); + middleFrame.allow = "fullscreen"; + middleFrame.src = `https://example.org${path}`; + let loaded = new Promise(r => + middleFrame.addEventListener("load", r, { once: true }) + ); + topDiv.appendChild(middleFrame); + await loaded; + + await SpecialPowers.spawn(middleFrame, [path], async innerPath => { + let middleDiv = content.document.createElement("div"); + content.document.body.appendChild(middleDiv); + + let innerFrame = content.document.createElement("iframe"); + innerFrame.allow = "fullscreen"; + innerFrame.src = `https://example.net${innerPath}`; + let innerLoaded = new Promise(r => + innerFrame.addEventListener("load", r, { once: true }) + ); + middleDiv.appendChild(innerFrame); + await innerLoaded; + }); + }); + + async function exitFullscreen() { + let warningHidden = waitForWarningState(warning, "hidden"); + let exitPromise = BrowserTestUtils.waitForEvent( + document, + "fullscreenchange", + false, + () => !document.fullscreenElement + ); + document.getElementById("fullscreen-exit-button").click(); + await Promise.all([exitPromise, warningHidden]); + } + + // Step 1: Top-level (example.com) requests fullscreen on its div. + let warningShown = waitForWarningState(warning, "onscreen"); + await SpecialPowers.spawn(browser, [], () => { + content.document.querySelector("div").requestFullscreen(); + }); + await warningShown; + is( + getWarningDomain(warning), + "example.com", + "Top-level fullscreen: warning shows top-level domain" + ); + await exitFullscreen(); + + // Step 2: Middle frame (example.org) requests fullscreen on its div. + warningShown = waitForWarningState(warning, "onscreen"); + await SpecialPowers.spawn(browser, [], async () => { + let middleFrame = content.document.querySelector("iframe"); + middleFrame.focus(); + await SpecialPowers.spawn(middleFrame, [], () => { + content.document.querySelector("div").requestFullscreen(); + }); + }); + await warningShown; + is( + getWarningDomain(warning), + "example.com", + "Middle frame fullscreen: warning shows top-level domain" + ); + await exitFullscreen(); + + // Step 3: Inner frame (example.net) requests fullscreen on an element. + warningShown = waitForWarningState(warning, "onscreen"); + await SpecialPowers.spawn(browser, [], async () => { + let middleFrame = content.document.querySelector("iframe"); + await SpecialPowers.spawn(middleFrame, [], async () => { + let innerFrame = content.document.querySelector("iframe"); + innerFrame.focus(); + await SpecialPowers.spawn(innerFrame, [], () => { + content.document.getElementById("request").click(); + }); + }); + }); + await warningShown; + is( + getWarningDomain(warning), + "example.com", + "Inner frame fullscreen: warning shows top-level domain" + ); + await exitFullscreen(); + }); +}); diff -Nru firefox-esr-140.9.1esr/browser/components/asrouter/modules/ASRouterTargeting.sys.mjs firefox-esr-140.10.0esr/browser/components/asrouter/modules/ASRouterTargeting.sys.mjs --- firefox-esr-140.9.1esr/browser/components/asrouter/modules/ASRouterTargeting.sys.mjs 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/components/asrouter/modules/ASRouterTargeting.sys.mjs 2026-04-15 01:59:47.000000000 +0000 @@ -551,11 +551,8 @@ // JSActors, but that would import a lot of code for a targeting attribute. return 0; } - let records = await actor?.receiveMessage({ - name: "FormAutofill:GetRecords", - data, - }); - return records?.records?.length ?? 0; + let records = await actor?.getRecords(data); + return records?.length ?? 0; } // Attribution data can be encoded multiple times so we need this function to diff -Nru firefox-esr-140.9.1esr/browser/components/asrouter/tests/browser/browser_asrouter_targeting.js firefox-esr-140.10.0esr/browser/components/asrouter/tests/browser/browser_asrouter_targeting.js --- firefox-esr-140.9.1esr/browser/components/asrouter/tests/browser/browser_asrouter_targeting.js 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/components/asrouter/tests/browser/browser_asrouter_targeting.js 2026-04-15 01:59:47.000000000 +0000 @@ -1418,15 +1418,10 @@ gBrowser.selectedBrowser.browsingContext.currentWindowGlobal.getActor( "FormAutofill" ), - "receiveMessage" + "getRecords" ) - .withArgs( - sandbox.match({ - name: "FormAutofill:GetRecords", - data: { collectionName: "creditCards" }, - }) - ) - .resolves({ records: [creditcard] }) + .withArgs(sandbox.match({ collectionName: "creditCards" })) + .resolves([creditcard]) .callThrough(); is( @@ -1435,8 +1430,8 @@ "Should return 1 when 1 credit card is saved" ); ok( - stub.calledWithMatch({ name: "FormAutofill:GetRecords" }), - "Targeting called FormAutofill:GetRecords" + stub.calledWithMatch({ collectionName: "creditCards" }), + "Targeting called getRecords" ); sandbox.restore(); diff -Nru firefox-esr-140.9.1esr/browser/components/urlbar/schema/urlbar-persisted-search-terms-schema.json firefox-esr-140.10.0esr/browser/components/urlbar/schema/urlbar-persisted-search-terms-schema.json --- firefox-esr-140.9.1esr/browser/components/urlbar/schema/urlbar-persisted-search-terms-schema.json 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/components/urlbar/schema/urlbar-persisted-search-terms-schema.json 2026-04-15 01:59:47.000000000 +0000 @@ -60,5 +60,5 @@ } } }, - "required": ["providerId", "searchPageRegexp", "includeParams"] + "required": ["providerId", "searchPageRegexp"] } diff -Nru firefox-esr-140.9.1esr/browser/config/version.txt firefox-esr-140.10.0esr/browser/config/version.txt --- firefox-esr-140.9.1esr/browser/config/version.txt 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/config/version.txt 2026-04-15 01:59:47.000000000 +0000 @@ -1 +1 @@ -140.9.1 +140.10.0 diff -Nru firefox-esr-140.9.1esr/browser/config/version_display.txt firefox-esr-140.10.0esr/browser/config/version_display.txt --- firefox-esr-140.9.1esr/browser/config/version_display.txt 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/browser/config/version_display.txt 2026-04-15 01:59:47.000000000 +0000 @@ -1 +1 @@ -140.9.1esr +140.10.0esr diff -Nru firefox-esr-140.9.1esr/config/milestone.txt firefox-esr-140.10.0esr/config/milestone.txt --- firefox-esr-140.9.1esr/config/milestone.txt 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/config/milestone.txt 2026-04-15 01:59:47.000000000 +0000 @@ -10,4 +10,4 @@ # hardcoded milestones in the tree from these two files. #-------------------------------------------------------- -140.9.1 +140.10.0 diff -Nru firefox-esr-140.9.1esr/debian/changelog firefox-esr-140.10.0esr/debian/changelog --- firefox-esr-140.9.1esr/debian/changelog 2026-04-07 22:01:40.000000000 +0000 +++ firefox-esr-140.10.0esr/debian/changelog 2026-04-22 05:21:00.000000000 +0000 @@ -1,3 +1,16 @@ +firefox-esr (140.10.0esr-1~deb13u1) trixie-security; urgency=medium + + * New upstream release. + * Fixes for mfsa2026-32, also known as: + CVE-2026-6746, CVE-2026-6747, CVE-2026-6748, CVE-2026-6749, + CVE-2026-6750, CVE-2026-6751, CVE-2026-6752, CVE-2026-6753, + CVE-2026-6754, CVE-2026-6757, CVE-2026-6761, CVE-2026-6762, + CVE-2026-6763, CVE-2026-6764, CVE-2026-6765, CVE-2026-6766, + CVE-2026-6767, CVE-2026-6769, CVE-2026-6770, CVE-2026-6771, + CVE-2026-6772, CVE-2026-6776, CVE-2026-6785, CVE-2026-6786. + + -- Mike Hommey Wed, 22 Apr 2026 14:21:00 +0900 + firefox-esr (140.9.1esr-1~deb13u1) trixie-security; urgency=medium * New upstream release. diff -Nru firefox-esr-140.9.1esr/devtools/client/aboutdebugging/test/browser/browser.toml firefox-esr-140.10.0esr/devtools/client/aboutdebugging/test/browser/browser.toml --- firefox-esr-140.9.1esr/devtools/client/aboutdebugging/test/browser/browser.toml 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/devtools/client/aboutdebugging/test/browser/browser.toml 2026-04-15 01:59:47.000000000 +0000 @@ -190,6 +190,7 @@ ["browser_aboutdebugging_serviceworker_start.js"] skip-if = [ + "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && tsan", # Bug 1947358, Bug 2030884 "os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && tsan", # Bug 1947358 ] diff -Nru firefox-esr-140.9.1esr/devtools/client/application/test/browser/browser.toml firefox-esr-140.10.0esr/devtools/client/application/test/browser/browser.toml --- firefox-esr-140.9.1esr/devtools/client/application/test/browser/browser.toml 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/devtools/client/application/test/browser/browser.toml 2026-04-15 01:59:47.000000000 +0000 @@ -96,8 +96,11 @@ ["browser_application_panel_start-service-worker.js"] fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled skip-if = [ - "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && tsan", # Bug 1608640 - "os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && tsan", # Bug 1608640 + "os == 'linux' && processor == 'x86_64' && tsan", # Bug 1608640, Bug 2030884 + "os == 'linux' && processor == 'x86_64' && asan", # Bug 1781479, Bug 2030884 + "os == 'mac' && os_version == '14.70' && processor == 'x86_64'", # Bug 1980084, Bug 2030884 + "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && asan", # Bug 1781479, Bug 2030884 + "os == 'win' && os_version == '11.26200' && processor == 'x86_64' && asan", # Bug 1781479, Bug 2030884 ] ["browser_application_panel_target-switching.js"] diff -Nru firefox-esr-140.9.1esr/devtools/client/debugger/src/.eslintrc.mjs firefox-esr-140.10.0esr/devtools/client/debugger/src/.eslintrc.mjs --- firefox-esr-140.9.1esr/devtools/client/debugger/src/.eslintrc.mjs 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/devtools/client/debugger/src/.eslintrc.mjs 2026-04-15 01:59:48.000000000 +0000 @@ -47,6 +47,8 @@ process: true, global: true, L10N: true, + // TODO: Add this to the main ESlint globals Bug 2025542 + Sanitizer: true, }, }, rules: { diff -Nru firefox-esr-140.9.1esr/devtools/client/debugger/src/components/QuickOpenModal.js firefox-esr-140.10.0esr/devtools/client/debugger/src/components/QuickOpenModal.js --- firefox-esr-140.9.1esr/devtools/client/debugger/src/components/QuickOpenModal.js 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/devtools/client/debugger/src/components/QuickOpenModal.js 2026-04-15 01:59:48.000000000 +0000 @@ -2,11 +2,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at . */ -import React, { Component } from "devtools/client/shared/vendor/react"; -import { div } from "devtools/client/shared/vendor/react-dom-factories"; +import React, { + Component, + createRef, +} from "devtools/client/shared/vendor/react"; import PropTypes from "devtools/client/shared/vendor/react-prop-types"; import { connect } from "devtools/client/shared/vendor/react-redux"; -import { basename } from "../utils/path"; import { createLocation } from "../utils/location"; const fuzzyAldrin = require("resource://devtools/client/shared/vendor/fuzzaldrin-plus.js"); @@ -59,6 +60,7 @@ constructor(props) { super(props); this.state = { results: null, selectedIndex: 0 }; + this.resultListRef = createRef(); } static get propTypes() { @@ -223,20 +225,14 @@ if (query == "" && !this.isShortcutQuery()) { this.showTopSources(); - return; - } - - if (this.isSymbolSearch()) { + } else if (this.isSymbolSearch()) { await this.searchSymbols(query); - return; - } - - if (this.isShortcutQuery()) { + } else if (this.isShortcutQuery()) { this.searchShortcuts(query); - return; + } else { + this.searchSources(query); } - - this.searchSources(query); + this.highlightQueryMatches(this.props.query); } catch (e) { // Due to throttling this might get scheduled after the component and the // toolbox are destroyed. @@ -394,23 +390,35 @@ isSourcesQuery = () => this.props.searchType === "sources"; isSourceSearch = () => this.isSourcesQuery() || this.isGotoSourceQuery(); - /* eslint-disable react/no-danger */ - renderHighlight(candidateString, query) { + highlightQueryMatches(query) { const options = { wrap: { tagOpen: '', tagClose: "", }, }; - const html = fuzzyAldrin.wrap(candidateString, query, options); - return div({ - dangerouslySetInnerHTML: { - __html: html, - }, - }); + if (this.resultListRef.current) { + const domEl = this.resultListRef.current.ref.current; + for (const titleNode of domEl.querySelectorAll(".title")) { + const htmlString = fuzzyAldrin.wrap( + titleNode.innerText, + query, + options + ); + // Sanitizer API not supported in ESR 140 + // Should remove at ESR 153 + if ("Sanitizer" in window) { + const sanitizer = new Sanitizer({ + elements: ["mark"], + attributes: ["class"], + }); + titleNode.setHTML(htmlString, { sanitizer }); + } + } + } } - highlightMatching = (query, results) => { + renderResults = (query, results) => { let newQuery = query; if (newQuery === "") { return results; @@ -421,11 +429,7 @@ if (typeof result.title == "string") { return { ...result, - title: this.renderHighlight( - result.title, - basename(newQuery), - "title" - ), + title: result.title, }; } return result; @@ -454,7 +458,7 @@ const { query } = this.props; const { selectedIndex, results } = this.state; - const items = this.highlightMatching(query, results || []); + const items = this.renderResults(query, results || []); const expanded = !!items && !!items.length; return React.createElement( Modal, @@ -487,7 +491,7 @@ items, selected: selectedIndex, selectItem: this.selectResultItem, - ref: "resultList", + ref: this.resultListRef, expanded, ...(this.isSourceSearch() ? SIZE_BIG : SIZE_DEFAULT), }) diff -Nru firefox-esr-140.9.1esr/devtools/client/debugger/test/mochitest/browser_aj.toml firefox-esr-140.10.0esr/devtools/client/debugger/test/mochitest/browser_aj.toml --- firefox-esr-140.9.1esr/devtools/client/debugger/test/mochitest/browser_aj.toml 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/devtools/client/debugger/test/mochitest/browser_aj.toml 2026-04-15 01:59:48.000000000 +0000 @@ -115,6 +115,9 @@ ["browser_dbg-call-stack.js"] ["browser_dbg-chrome-create.js"] +skip-if = [ + "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && asan", # Bug 2030884 +] ["browser_dbg-console-async.js"] @@ -286,6 +289,7 @@ ["browser_dbg-javascript-tracer-values-preview.js"] skip-if = [ "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && opt && a11y_checks", # Bug The tracer tree isn't yet accessible + "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && tsan", # Bug 1959018, Bug 2030884 "os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && opt && a11y_checks", # Bug The tracer tree isn't yet accessible ] diff -Nru firefox-esr-140.9.1esr/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js firefox-esr-140.10.0esr/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js --- firefox-esr-140.9.1esr/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js 2026-04-15 01:59:48.000000000 +0000 @@ -94,6 +94,18 @@ pressKey(dbg, "Escape"); assertQuickOpenDisabled(dbg); + info("Test that the highlighted result matches match the query"); + await quickOpen(dbg, "sw"); + await waitForResults(dbg, [ + "script-switching-01.js", + "script-switching-02.js", + ]); + await assertHighlightMatches(dbg, 1, "sw"); + await assertHighlightMatches(dbg, 2, "sw"); + EventUtils.sendString("i"); + await assertHighlightMatches(dbg, 1, "swi"); + pressKey(dbg, "Escape"); + info("Testing goto line:column"); assertLine(dbg, 0); assertColumn(dbg, 1); @@ -170,3 +182,19 @@ "Result should be a tab" ); } + +async function assertHighlightMatches(dbg, resultIndex, expectedMatchText) { + // Sanitizer API not supported in ESR 140 + // Should remove at ESR 153 + if ("Sanitizer" in dbg.win) { + const el = await findResultEl(dbg, resultIndex); + const highlight = await waitForElementWithSelector(dbg, "mark.highlight"); + ok(el && !!highlight, "The query match is highlighted"); + await waitUntil( + () => el.querySelector("mark.highlight").innerText == expectedMatchText + ); + ok(true, "The highlighted text matches the query text"); + } else { + ok(true, "The text is not highlighted"); + } +} diff -Nru firefox-esr-140.9.1esr/devtools/client/framework/test/browser.toml firefox-esr-140.10.0esr/devtools/client/framework/test/browser.toml --- firefox-esr-140.9.1esr/devtools/client/framework/test/browser.toml 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/devtools/client/framework/test/browser.toml 2026-04-15 01:59:47.000000000 +0000 @@ -112,6 +112,12 @@ ["browser_tab_commands_factory.js"] ["browser_tab_descriptor_fission.js"] +skip-if = [ + "os == 'linux' && processor == 'x86_64' && asan", # Bug 1966872, Bug 2030884 + "os == 'linux' && processor == 'x86_64' && tsan", # Bug 1966872, Bug 2030884 + "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && asan", # Bug 1966872, Bug 2030884 + "os == 'win' && os_version == '11.26200' && processor == 'x86_64' && asan", # Bug 1966872, Bug 2030884 +] ["browser_target_cached-front.js"] @@ -291,6 +297,9 @@ ["browser_toolbox_watchedByDevTools.js"] ["browser_toolbox_window_global_debugging.js"] +skip-if = [ + "os == 'linux' && processor == 'x86_64' && tsan", # Bug 1950845, Bug 2030884 +] ["browser_toolbox_window_reload_target.js"] diff -Nru firefox-esr-140.9.1esr/devtools/client/inspector/animation/test/browser.toml firefox-esr-140.10.0esr/devtools/client/inspector/animation/test/browser.toml --- firefox-esr-140.9.1esr/devtools/client/inspector/animation/test/browser.toml 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/devtools/client/inspector/animation/test/browser.toml 2026-04-15 01:59:47.000000000 +0000 @@ -150,8 +150,11 @@ ["browser_animation_logic_mutations_fast.js"] skip-if = [ - "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && debug", # Bug 1567800 - "os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && debug", # Bug 1567800 + "os == 'linux' && processor == 'x86_64' && asan", # Bug 1980142, Bug 2030884 + "os == 'linux' && processor == 'x86_64' && debug", # Bug 1567800, Bug 2030884 + "os == 'linux' && processor == 'x86_64' && tsan", # Bug 1980142, Bug 2030884 + "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && debug", # Bug 1980142, Bug 2030884 + "os == 'win' && os_version == '11.26200' && processor == 'x86_64' && debug", # Bug 1980142, Bug 2030884 ] ["browser_animation_logic_mutations_properties.js"] diff -Nru firefox-esr-140.9.1esr/devtools/client/webconsole/test/browser/_webconsole.toml firefox-esr-140.10.0esr/devtools/client/webconsole/test/browser/_webconsole.toml --- firefox-esr-140.9.1esr/devtools/client/webconsole/test/browser/_webconsole.toml 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/devtools/client/webconsole/test/browser/_webconsole.toml 2026-04-15 01:59:47.000000000 +0000 @@ -587,7 +587,9 @@ https_first_disabled = true # JS HttpServer doesn't support https skip-if = [ "http3", # JS HttpServer doesn't support http3 + "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && opt", # Bug 1965340, Bug 2030884 "os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && opt", # Bug 1965340 + "os == 'mac' && os_version == '14.70' && processor == 'x86_64'", # Bug 1965340, Bug 2030884 ] ["browser_webconsole_object_inspector_getters.js"] diff -Nru firefox-esr-140.9.1esr/devtools/client/webconsole/test/browser/stub-generator-helpers.js firefox-esr-140.10.0esr/devtools/client/webconsole/test/browser/stub-generator-helpers.js --- firefox-esr-140.9.1esr/devtools/client/webconsole/test/browser/stub-generator-helpers.js 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/devtools/client/webconsole/test/browser/stub-generator-helpers.js 2026-04-15 01:59:47.000000000 +0000 @@ -179,17 +179,17 @@ res.startedDateTime = existingPacket.startedDateTime; } - if (res.totalTime && existingPacket.totalTime) { - res.totalTime = existingPacket.totalTime; - } - if (res.securityState && existingPacket.securityState) { res.securityState = existingPacket.securityState; } - // waitingTime can be very small and rounded to 0. However this is still a - // valid waiting time, so check isNaN instead of a simple truthy check. - if (!isNaN(res.waitingTime) && existingPacket.waitingTime) { + // totalTime and waitingTime can be very small and rounded to 0. However this + // is still a valid time value, so check isNaN instead of a simple truthy check. + if (!isNaN(res.totalTime) && !isNaN(existingPacket.totalTime)) { + res.totalTime = existingPacket.totalTime; + } + + if (!isNaN(res.waitingTime) && !isNaN(existingPacket.waitingTime)) { res.waitingTime = existingPacket.waitingTime; } diff -Nru firefox-esr-140.9.1esr/docshell/base/BrowsingContext.cpp firefox-esr-140.10.0esr/docshell/base/BrowsingContext.cpp --- firefox-esr-140.9.1esr/docshell/base/BrowsingContext.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/docshell/base/BrowsingContext.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -1937,6 +1937,19 @@ return IsCertainlyAliveForCC(tmp); NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END +/* static */ +void BrowsingContext::SweepWindowProxies(JSTracer* aTrc) { + if (!sBrowsingContexts) { + return; + } + + for (BrowsingContext* bc : sBrowsingContexts->Values()) { + if (bc->mWindowProxy) { + JS_UpdateWeakPointerAfterGC(aTrc, &bc->mWindowProxy); + } + } +} + class RemoteLocationProxy : public RemoteObjectProxy { diff -Nru firefox-esr-140.9.1esr/docshell/base/BrowsingContext.h firefox-esr-140.10.0esr/docshell/base/BrowsingContext.h --- firefox-esr-140.9.1esr/docshell/base/BrowsingContext.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/docshell/base/BrowsingContext.h 2026-04-15 01:59:48.000000000 +0000 @@ -734,6 +734,9 @@ mWindowProxy = aWindowProxy; } + // Since mWindowProxy is a weak pointer it has to be updated during sweeping. + static void SweepWindowProxies(JSTracer* aTrc); + Nullable GetWindow(); NS_DECL_CYCLE_COLLECTING_ISUPPORTS @@ -1378,10 +1381,8 @@ RefPtr mGeolocationServiceOverride; - // This is not a strong reference, but using a JS::Heap for that should be - // fine. The JSObject stored in here should be a proxy with a - // nsOuterWindowProxy handler, which will update the pointer from its - // objectMoved hook and clear it from its finalize hook. + // This is a weak reference. It will be updated automatically during sweeping + // by SweepWindowProxies. JS::Heap mWindowProxy; LocationProxy mLocation; diff -Nru firefox-esr-140.9.1esr/dom/abort/AbortSignal.cpp firefox-esr-140.10.0esr/dom/abort/AbortSignal.cpp --- firefox-esr-140.9.1esr/dom/abort/AbortSignal.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/abort/AbortSignal.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -38,6 +38,11 @@ } MaybeAssignAbortError(aCx); aReason.set(mReason); + if (NS_WARN_IF(!JS_WrapValue(aCx, aReason))) { + aReason.setUndefined(); + // TODO(Bug 2026137) - AbortSignalImpl::GetReason should be made fallible + JS_ClearPendingException(aCx); + } } JS::Value AbortSignalImpl::RawReason() const { return mReason.get(); } @@ -75,7 +80,7 @@ // https://dom.spec.whatwg.org/#abortsignal-remove could be invoked in an // earlier algorithm to remove a later algorithm, so |mFollowers| must be a // |nsTObserverArray| to defend against mutation. - for (RefPtr& follower : mFollowers.ForwardRange()) { + for (RefPtr follower : mFollowers.ForwardRange()) { MOZ_ASSERT(follower->mFollowingSignal == this); follower->RunAbortAlgorithm(); } diff -Nru firefox-esr-140.9.1esr/dom/animation/Animation.cpp firefox-esr-140.10.0esr/dom/animation/Animation.cpp --- firefox-esr-140.9.1esr/dom/animation/Animation.cpp 2026-04-03 15:52:18.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/animation/Animation.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -386,11 +386,9 @@ } CancelPendingTasks(); - if (mReady) { - // We may have already resolved mReady, but in that case calling - // MaybeResolve is a no-op, so that's okay. - mReady->MaybeResolve(this); - } + // We may have already resolved mReady, but in that case calling + // MaybeResolve is a no-op, so that's okay. + MaybeResolvePromiseWithThis(mReady); UpdateTiming(SeekFlag::DidSeek, SyncNotifyFlag::Async); if (IsRelevant()) { @@ -449,9 +447,7 @@ ApplyPendingPlaybackRate(); mStartTime.SetNull(); - if (mReady) { - mReady->MaybeResolve(this); - } + MaybeResolvePromiseWithThis(mReady); CancelPendingTasks(); } @@ -608,11 +604,25 @@ return nullptr; } if (!Pending()) { - mReady->MaybeResolve(this); + MaybeResolvePromiseWithThis(mReady); } return mReady; } +void Animation::MaybeResolvePromiseWithThis(Promise* aPromise) { + if (!aPromise) { + return; + } + if (!nsContentUtils::IsSafeToRunScript()) { + nsContentUtils::AddScriptRunner(NewRunnableMethod>( + "MaybeResolvePromiseWithThis", this, + &Animation::MaybeResolvePromiseWithThis, aPromise)); + return; + } + RefPtr promise = aPromise; + promise->MaybeResolve(this); +} + Promise* Animation::GetFinished(ErrorResult& aRv) { nsCOMPtr global = GetOwnerGlobal(); if (!mFinished && global) { @@ -714,9 +724,7 @@ } CancelPendingTasks(); didChange = true; - if (mReady) { - mReady->MaybeResolve(this); - } + MaybeResolvePromiseWithThis(mReady); } UpdateTiming(SeekFlag::DidSeek, SyncNotifyFlag::Sync); if (didChange && IsRelevant()) { @@ -1607,9 +1615,7 @@ MutationObservers::NotifyAnimationChanged(this); } - if (mReady) { - mReady->MaybeResolve(this); - } + MaybeResolvePromiseWithThis(mReady); } void Animation::PauseAt(const TimeDuration& aReadyTime) { @@ -1626,9 +1632,7 @@ UpdateTiming(SeekFlag::NoSeek, SyncNotifyFlag::Async); - if (mReady) { - mReady->MaybeResolve(this); - } + MaybeResolvePromiseWithThis(mReady); } void Animation::UpdateTiming(SeekFlag aSeekFlag, @@ -1877,10 +1881,8 @@ } void Animation::MaybeResolveFinishedPromise() { - if (mFinished) { - mFinished->MaybeResolve(this); - } mFinishedIsResolved = true; + MaybeResolvePromiseWithThis(mFinished); } void Animation::DoFinishNotificationImmediately(MicroTaskRunnable* aAsync) { diff -Nru firefox-esr-140.9.1esr/dom/animation/Animation.h firefox-esr-140.10.0esr/dom/animation/Animation.h --- firefox-esr-140.9.1esr/dom/animation/Animation.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/animation/Animation.h 2026-04-15 01:59:47.000000000 +0000 @@ -466,6 +466,7 @@ friend class AsyncFinishNotification; void DoFinishNotificationImmediately(MicroTaskRunnable* aAsync = nullptr); void QueuePlaybackEvent(nsAtom* aOnEvent, TimeStamp&& aScheduledEventTime); + void MaybeResolvePromiseWithThis(Promise*); /** * Remove this animation from the pending animation tracker and reset diff -Nru firefox-esr-140.9.1esr/dom/base/Document.cpp firefox-esr-140.10.0esr/dom/base/Document.cpp --- firefox-esr-140.9.1esr/dom/base/Document.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/Document.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -16277,11 +16277,16 @@ /* static */ bool Document::HandlePendingFullscreenRequests(Document* aDoc) { + AutoTArray, 1> requests; + { + PendingFullscreenChangeList::Iterator iter( + aDoc, PendingFullscreenChangeList::eDocumentsWithSameRoot); + while (!iter.AtEnd()) { + requests.AppendElement(iter.TakeAndNext()); + } + } bool handled = false; - PendingFullscreenChangeList::Iterator iter( - aDoc, PendingFullscreenChangeList::eDocumentsWithSameRoot); - while (!iter.AtEnd()) { - UniquePtr request = iter.TakeAndNext(); + for (UniquePtr& request : requests) { Document* doc = request->Document(); if (doc->ApplyFullscreen(std::move(request))) { handled = true; diff -Nru firefox-esr-140.9.1esr/dom/base/Document.h firefox-esr-140.10.0esr/dom/base/Document.h --- firefox-esr-140.9.1esr/dom/base/Document.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/Document.h 2026-04-15 01:59:48.000000000 +0000 @@ -5732,7 +5732,7 @@ } private: - Document* mDoc; + RefPtr mDoc; }; bool IsInFocusedTab(Document* aDoc); diff -Nru firefox-esr-140.9.1esr/dom/base/Element.cpp firefox-esr-140.10.0esr/dom/base/Element.cpp --- firefox-esr-140.9.1esr/dom/base/Element.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/Element.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -279,8 +279,9 @@ return nullptr; } + RefPtr presShell = frame->PresShell(); if (aType == mozilla::FlushType::Layout) { - frame->PresShell()->EnsureReflowIfFrameHasHiddenContent(frame); + presShell->EnsureReflowIfFrameHasHiddenContent(frame); frame = GetPrimaryFrame(); } @@ -2807,6 +2808,7 @@ } nsAutoScriptBlocker scriptBlocker; + OnAttrSetButNotChanged(aNamespaceID, aName, aValue, aNotify); MutationObservers::NotifyAttributeSetToCurrentValue(this, aNamespaceID, aName); return true; @@ -2856,7 +2858,6 @@ if (OnlyNotifySameValueSet(aNamespaceID, aName, aPrefix, value, aNotify, oldValue, &modType, &hasListeners, &oldValueSet)) { - OnAttrSetButNotChanged(aNamespaceID, aName, value, aNotify); return NS_OK; } } @@ -2906,7 +2907,6 @@ if (OnlyNotifySameValueSet(aNamespaceID, aName, aPrefix, value, aNotify, oldValue, &modType, &hasListeners, &oldValueSet)) { - OnAttrSetButNotChanged(aNamespaceID, aName, value, aNotify); return NS_OK; } } diff -Nru firefox-esr-140.9.1esr/dom/base/ImageEncoder.cpp firefox-esr-140.10.0esr/dom/base/ImageEncoder.cpp --- firefox-esr-140.9.1esr/dom/base/ImageEncoder.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/ImageEncoder.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -341,8 +341,8 @@ return NS_ERROR_INVALID_ARG; } auto size = data->GetSize(); - rv = aEncoder->InitFromData(map.mData, size.width * size.height * 4, - size.width, size.height, size.width * 4, + rv = aEncoder->InitFromData(map.mData, map.mStride * size.height, + size.width, size.height, map.mStride, imgIEncoder::INPUT_FORMAT_HOSTARGB, aOptions); data->Unmap(); } @@ -374,8 +374,8 @@ } rv = aEncoder->InitFromData(data.Elements(), - aSize.width * aSize.height * 4, aSize.width, - aSize.height, aSize.width * 4, + length, aSize.width, + aSize.height, stride, imgIEncoder::INPUT_FORMAT_HOSTARGB, aOptions); } else { if (BufferSizeFromDimensions(aSize.width, aSize.height, 4) == 0) { @@ -391,8 +391,8 @@ return NS_ERROR_INVALID_ARG; } auto size = dataSurface->GetSize(); - rv = aEncoder->InitFromData(map.mData, size.width * size.height * 4, - size.width, size.height, size.width * 4, + rv = aEncoder->InitFromData(map.mData, map.mStride * size.height, + size.width, size.height, map.mStride, imgIEncoder::INPUT_FORMAT_HOSTARGB, aOptions); dataSurface->Unmap(); } @@ -421,13 +421,13 @@ if (!emptyCanvas->Map(DataSourceSurface::MapType::WRITE, &map)) { return NS_ERROR_INVALID_ARG; } + auto size = map.mStride * aSize.height; if (aUsePlaceholder) { - auto size = 4 * aSize.width * aSize.height; auto* data = map.mData; GeneratePlaceholderCanvasData(size, data); } - rv = aEncoder->InitFromData(map.mData, aSize.width * aSize.height * 4, - aSize.width, aSize.height, aSize.width * 4, + rv = aEncoder->InitFromData(map.mData, size, aSize.width, aSize.height, + map.mStride, imgIEncoder::INPUT_FORMAT_HOSTARGB, aOptions); emptyCanvas->Unmap(); if (NS_SUCCEEDED(rv)) { diff -Nru firefox-esr-140.9.1esr/dom/base/ScreenOrientation.cpp firefox-esr-140.10.0esr/dom/base/ScreenOrientation.cpp --- firefox-esr-140.9.1esr/dom/base/ScreenOrientation.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/ScreenOrientation.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -70,15 +70,24 @@ : DOMEventTargetHelper(aWindow), mScreen(aScreen) { MOZ_ASSERT(aWindow); MOZ_ASSERT(aScreen); +} + +/* static */ already_AddRefed ScreenOrientation::Create( + nsPIDOMWindowInner* aWindow, nsScreen* aScreen) { + RefPtr screenOrientation = new ScreenOrientation(aWindow, aScreen); - mAngle = aScreen->GetOrientationAngle(); - mType = InternalOrientationToType(aScreen->GetOrientationType()); + screenOrientation->mAngle = aScreen->GetOrientationAngle(); + screenOrientation->mType = + InternalOrientationToType(aScreen->GetOrientationType()); - Document* doc = GetResponsibleDocument(); + Document* doc = screenOrientation->GetResponsibleDocument(); BrowsingContext* bc = doc ? doc->GetBrowsingContext() : nullptr; if (bc && !bc->IsDiscarded() && !bc->InRDMPane()) { - MOZ_ALWAYS_SUCCEEDS(bc->SetCurrentOrientation(mType, mAngle)); + MOZ_ALWAYS_SUCCEEDS(bc->SetCurrentOrientation(screenOrientation->mType, + screenOrientation->mAngle)); } + + return screenOrientation.forget(); } ScreenOrientation::~ScreenOrientation() { diff -Nru firefox-esr-140.9.1esr/dom/base/ScreenOrientation.h firefox-esr-140.10.0esr/dom/base/ScreenOrientation.h --- firefox-esr-140.9.1esr/dom/base/ScreenOrientation.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/ScreenOrientation.h 2026-04-15 01:59:48.000000000 +0000 @@ -33,8 +33,13 @@ // Called when the orientation may have changed. void MaybeChanged(); + private: ScreenOrientation(nsPIDOMWindowInner* aWindow, nsScreen* aScreen); + public: + static already_AddRefed Create(nsPIDOMWindowInner* aWindow, + nsScreen* aScreen); + already_AddRefed Lock(OrientationLockType aOrientation, ErrorResult& aRv); @@ -107,8 +112,8 @@ RefPtr mScreen; RefPtr mFullscreenListener; RefPtr mVisibleListener; - OrientationType mType; - uint16_t mAngle; + OrientationType mType{}; + uint16_t mAngle{}; // Whether we've tried to call into hal to lock the device orientation. This // is needed because you don't want calling UnlockDeviceOrientation() during // shutdown to initialize PHal if it hasn't been initialized earlier. Also, diff -Nru firefox-esr-140.9.1esr/dom/base/ShadowRoot.cpp firefox-esr-140.10.0esr/dom/base/ShadowRoot.cpp --- firefox-esr-140.9.1esr/dom/base/ShadowRoot.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/ShadowRoot.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -213,7 +213,7 @@ void ShadowRoot::InvalidateStyleAndLayoutOnSubtree(Element* aElement) { MOZ_ASSERT(aElement); - Document* doc = GetComposedDoc(); + Document* doc = aElement->GetComposedDoc(); if (!doc) { return; } diff -Nru firefox-esr-140.9.1esr/dom/base/ShadowRoot.h firefox-esr-140.10.0esr/dom/base/ShadowRoot.h --- firefox-esr-140.9.1esr/dom/base/ShadowRoot.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/ShadowRoot.h 2026-04-15 01:59:47.000000000 +0000 @@ -136,7 +136,7 @@ * It is important that this runs _before_ actually shuffling the flat tree * around, so that layout knows the actual tree that it needs to invalidate. */ - void InvalidateStyleAndLayoutOnSubtree(Element*); + static void InvalidateStyleAndLayoutOnSubtree(Element*); private: void InsertSheetIntoAuthorData(size_t aIndex, StyleSheet&, diff -Nru firefox-esr-140.9.1esr/dom/base/StructuredCloneBlob.cpp firefox-esr-140.10.0esr/dom/base/StructuredCloneBlob.cpp --- firefox-esr-140.9.1esr/dom/base/StructuredCloneBlob.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/StructuredCloneBlob.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -15,6 +15,7 @@ #include "js/Wrapper.h" #include "jsapi.h" #include "mozilla/Assertions.h" +#include "mozilla/CheckedInt.h" #include "mozilla/ErrorResult.h" #include "mozilla/Maybe.h" #include "mozilla/Span.h" @@ -214,8 +215,13 @@ bool StructuredCloneBlob::Holder::WriteStructuredClone( JSContext* aCx, JSStructuredCloneWriter* aWriter, StructuredCloneHolder* aHolder) { - auto& data = mBuffer->data(); - if (!JS_WriteUint32Pair(aWriter, data.Size(), JS_STRUCTURED_CLONE_VERSION) || + const auto& data = mBuffer->data(); + CheckedUint32 dataSize(data.Size()); + if (!dataSize.isValid()) { + return false; + } + if (!JS_WriteUint32Pair(aWriter, dataSize.value(), + JS_STRUCTURED_CLONE_VERSION) || !JS_WriteUint32Pair(aWriter, aHolder->BlobImpls().Length(), BlobImpls().Length())) { return false; diff -Nru firefox-esr-140.9.1esr/dom/base/TextInputProcessor.cpp firefox-esr-140.10.0esr/dom/base/TextInputProcessor.cpp --- firefox-esr-140.9.1esr/dom/base/TextInputProcessor.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/TextInputProcessor.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -938,9 +938,8 @@ NS_IMETHODIMP_(IMENotificationRequests) TextInputProcessor::GetIMENotificationRequests() { // TextInputProcessor should support all change notifications. - return IMENotificationRequests( - IMENotificationRequests::NOTIFY_TEXT_CHANGE | - IMENotificationRequests::NOTIFY_POSITION_CHANGE); + return {IMENotificationRequest::TextChange, + IMENotificationRequest::PositionChange}; } NS_IMETHODIMP_(void) diff -Nru firefox-esr-140.9.1esr/dom/base/TextInputProcessor.h firefox-esr-140.10.0esr/dom/base/TextInputProcessor.h --- firefox-esr-140.9.1esr/dom/base/TextInputProcessor.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/TextInputProcessor.h 2026-04-15 01:59:47.000000000 +0000 @@ -27,9 +27,10 @@ class TextInputProcessor final : public nsITextInputProcessor, public widget::TextEventDispatcherListener { - typedef mozilla::widget::IMENotification IMENotification; - typedef mozilla::widget::IMENotificationRequests IMENotificationRequests; - typedef mozilla::widget::TextEventDispatcher TextEventDispatcher; + using IMENotification = mozilla::widget::IMENotification; + using IMENotificationRequest = mozilla::widget::IMENotificationRequest; + using IMENotificationRequests = mozilla::widget::IMENotificationRequests; + using TextEventDispatcher = mozilla::widget::TextEventDispatcher; public: TextInputProcessor(); diff -Nru firefox-esr-140.9.1esr/dom/base/nsAttrValue.cpp firefox-esr-140.10.0esr/dom/base/nsAttrValue.cpp --- firefox-esr-140.9.1esr/dom/base/nsAttrValue.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsAttrValue.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -1333,7 +1333,11 @@ void nsAttrValue::ParseAtomArray(nsAtom* aValue) { if (MiscContainer* cont = AtomArrayCache::Lookup(aValue)) { // Set our MiscContainer to the cached one. + // AddRef must happen before ResetIfSet: the cache does not hold a strong + // reference, and ResetIfSet could release the last reference to cont if + // this nsAttrValue is already holding it. NS_ADDREF(cont); + ResetIfSet(); SetPtrValueAndType(cont, eOtherBase); return; } @@ -1933,7 +1937,11 @@ if (cachingAllowed) { if (MiscContainer* cont = attrStyles->LookupStyleAttr(aString)) { // Set our MiscContainer to the cached one. + // AddRef must happen before ResetIfSet: the cache does not hold a strong + // reference, and ResetIfSet could release the last reference to cont if + // this nsAttrValue is already holding it. NS_ADDREF(cont); + ResetIfSet(); SetPtrValueAndType(cont, eOtherBase); return true; } diff -Nru firefox-esr-140.9.1esr/dom/base/nsContentList.cpp firefox-esr-140.10.0esr/dom/base/nsContentList.cpp --- firefox-esr-140.9.1esr/dom/base/nsContentList.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsContentList.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -592,7 +592,8 @@ return mNamedItemsCache->Get(name); } -void nsContentList::GetSupportedNames(nsTArray& aNames) { +void nsContentList::GetSupportedNames(nsTArray& aNames, + FilterElementWithName aFilter) { BringSelfUpToDate(true); AutoTArray atoms; @@ -606,14 +607,14 @@ } } - nsGenericHTMLElement* el = nsGenericHTMLElement::FromNode(content); - if (el) { + if (nsGenericHTMLElement* el = nsGenericHTMLElement::FromNode(content)) { // XXXbz should we be checking for particular tags here? How // stable is this part of the spec? // Note: nsINode::HasName means the name is exposed on the document, // which is false for options, so we don't check it here. const nsAttrValue* val = el->GetParsedAttr(nsGkAtoms::name); - if (val && val->Type() == nsAttrValue::eAtom) { + if (val && val->Type() == nsAttrValue::eAtom && + (!aFilter || aFilter(el))) { nsAtom* name = val->GetAtomValue(); MOZ_ASSERT(name != nsGkAtoms::_empty, "Empty names don't get atomized"); if (!atoms.Contains(name)) { diff -Nru firefox-esr-140.9.1esr/dom/base/nsContentList.h firefox-esr-140.10.0esr/dom/base/nsContentList.h --- firefox-esr-140.9.1esr/dom/base/nsContentList.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsContentList.h 2026-04-15 01:59:48.000000000 +0000 @@ -296,13 +296,21 @@ aFound = !!item; return item; } - void GetSupportedNames(nsTArray& aNames) override; + void GetSupportedNames(nsTArray& aNames) override { + GetSupportedNames(aNames, nullptr); + } // nsContentList public methods uint32_t Length(bool aDoFlush); nsIContent* Item(uint32_t aIndex, bool aDoFlush); Element* NamedItem(const nsAString& aName, bool aDoFlush); + // Used by HTMLAllCollection to limit the elements whose name attribute is + // considered. The filter MUST NOT cause any flushes. + using FilterElementWithName = bool (*)(nsIContent*); + void GetSupportedNames(nsTArray& aNames, + FilterElementWithName aFilter); + // nsIMutationObserver NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTECHANGED NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED diff -Nru firefox-esr-140.9.1esr/dom/base/nsDOMWindowUtils.cpp firefox-esr-140.10.0esr/dom/base/nsDOMWindowUtils.cpp --- firefox-esr-140.9.1esr/dom/base/nsDOMWindowUtils.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsDOMWindowUtils.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -4533,10 +4533,9 @@ } NS_IMETHODIMP -nsDOMWindowUtils::WrStartCaptureSequence(const nsACString& aPath, - uint32_t aFlags) { +nsDOMWindowUtils::WrStartCaptureSequence(uint32_t aFlags) { if (WebRenderBridgeChild* wrbc = GetWebRenderBridge()) { - wrbc->StartCaptureSequence(nsCString(aPath), aFlags); + wrbc->StartCaptureSequence(aFlags); } return NS_OK; } diff -Nru firefox-esr-140.9.1esr/dom/base/nsFrameLoaderOwner.cpp firefox-esr-140.10.0esr/dom/base/nsFrameLoaderOwner.cpp --- firefox-esr-140.9.1esr/dom/base/nsFrameLoaderOwner.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsFrameLoaderOwner.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -105,7 +105,7 @@ // no other blockers. Since we're going to be adding a new blocker as soon as // we recreate the frame loader, this is not what we want, so add our own // blocker until the process is complete. - Document* doc = owner->OwnerDoc(); + RefPtr doc = owner->OwnerDoc(); doc->BlockOnload(); auto cleanup = MakeScopeExit([&]() { doc->UnblockOnload(false); }); diff -Nru firefox-esr-140.9.1esr/dom/base/nsGlobalWindowInner.cpp firefox-esr-140.10.0esr/dom/base/nsGlobalWindowInner.cpp --- firefox-esr-140.9.1esr/dom/base/nsGlobalWindowInner.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsGlobalWindowInner.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -2459,7 +2459,7 @@ nsScreen* nsGlobalWindowInner::Screen() { if (!mScreen) { - mScreen = new nsScreen(this); + mScreen = nsScreen::Create(this); } return mScreen; } diff -Nru firefox-esr-140.9.1esr/dom/base/nsINode.cpp firefox-esr-140.10.0esr/dom/base/nsINode.cpp --- firefox-esr-140.9.1esr/dom/base/nsINode.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsINode.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -1105,11 +1105,7 @@ const nsTextFragment* text = node->GetText(); if (text->GetLength()) { nsIContent* target = node->GetPreviousSibling(); - NS_ASSERTION( - (target && target->NodeType() == TEXT_NODE) || hasRemoveListeners, - "Should always have a previous text sibling unless " - "mutation events messed us up"); - if (!hasRemoveListeners || (target && target->NodeType() == TEXT_NODE)) { + if (target && target->NodeType() == TEXT_NODE) { nsTextNode* t = static_cast(target); if (text->Is2b()) { t->AppendTextForNormalize(text->Get2b(), text->GetLength(), true, diff -Nru firefox-esr-140.9.1esr/dom/base/nsObjectLoadingContent.cpp firefox-esr-140.10.0esr/dom/base/nsObjectLoadingContent.cpp --- firefox-esr-140.9.1esr/dom/base/nsObjectLoadingContent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsObjectLoadingContent.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -214,8 +214,8 @@ } if (!docShell) { - mFrameLoader->Destroy(); - mFrameLoader = nullptr; + RefPtr loader = std::move(mFrameLoader); + loader->Destroy(); return nullptr; } @@ -1284,8 +1284,8 @@ nsCOMPtr uriLoader(components::URILoader::Service()); if (NS_WARN_IF(!uriLoader)) { MOZ_ASSERT_UNREACHABLE("Failed to get uriLoader service"); - mFrameLoader->Destroy(); - mFrameLoader = nullptr; + RefPtr loader = std::move(mFrameLoader); + loader->Destroy(); break; } @@ -1591,11 +1591,6 @@ } void nsObjectLoadingContent::Destroy() { - if (mFrameLoader) { - mFrameLoader->Destroy(); - mFrameLoader = nullptr; - } - // Reset state so that if the element is re-appended to tree again (e.g. // adopting to another document), it will reload resource again. UnloadObject(); @@ -1619,8 +1614,8 @@ void nsObjectLoadingContent::UnloadObject(bool aResetState) { if (mFrameLoader) { - mFrameLoader->Destroy(); - mFrameLoader = nullptr; + RefPtr loader = std::move(mFrameLoader); + loader->Destroy(); } if (aResetState) { @@ -1718,23 +1713,30 @@ } // Do a depth-first traverse of node tree with the current element as root, // looking for non- elements. If we find some then we have an HTML - // fallback for this element. + // fallback for this element + AutoTArray, 4> targets; for (nsIContent* child = el->GetFirstChild(); child;) { // and elements in the fallback need to StartObjectLoad. // Their children should be ignored since they are part of those element's // fallback. - if (auto* embed = HTMLEmbedElement::FromNode(child)) { - embed->StartObjectLoad(true, true); - // Skip the children - child = child->GetNextNonChildNode(el); - } else if (auto* object = HTMLObjectElement::FromNode(child)) { - object->StartObjectLoad(true, true); - // Skip the children + if (child->IsAnyOfHTMLElements(nsGkAtoms::embed, nsGkAtoms::object)) { + targets.AppendElement(child); child = child->GetNextNonChildNode(el); } else { child = child->GetNextNode(el); } } + + for (RefPtr& target : targets) { + if (!target->IsInclusiveDescendantOf(el)) { + continue; + } + if (auto* embed = HTMLEmbedElement::FromNode(target)) { + embed->StartObjectLoad(true, true); + } else if (auto* object = HTMLObjectElement::FromNode(target)) { + object->StartObjectLoad(true, true); + } + } } NS_IMETHODIMP diff -Nru firefox-esr-140.9.1esr/dom/base/nsRange.cpp firefox-esr-140.10.0esr/dom/base/nsRange.cpp --- firefox-esr-140.9.1esr/dom/base/nsRange.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsRange.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -2829,20 +2829,6 @@ return nullptr; } - // Try to un-suppress whitespace if needed, but only if we'll be able to flush - // to immediately see the results of the un-suppression. If we can't flush - // here, then calling EnsureFrameForTextNodeIsCreatedAfterFlush would be - // pointless anyway. - if (aFlushLayout) { - const bool frameWillBeUnsuppressed = - presShell->FrameConstructor() - ->EnsureFrameForTextNodeIsCreatedAfterFlush( - static_cast(aContent)); - if (frameWillBeUnsuppressed) { - doc->FlushPendingNotifications(FlushType::Layout); - } - } - nsIFrame* frame = aContent->GetPrimaryFrame(); if (!frame || !frame->IsTextFrame()) { return nullptr; diff -Nru firefox-esr-140.9.1esr/dom/base/nsScreen.cpp firefox-esr-140.10.0esr/dom/base/nsScreen.cpp --- firefox-esr-140.9.1esr/dom/base/nsScreen.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsScreen.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -23,8 +23,14 @@ using namespace mozilla::dom; nsScreen::nsScreen(nsPIDOMWindowInner* aWindow) - : DOMEventTargetHelper(aWindow), - mScreenOrientation(new ScreenOrientation(aWindow, this)) {} + : DOMEventTargetHelper(aWindow) {} + +/* static */ already_AddRefed nsScreen::Create( + nsPIDOMWindowInner* aWindow) { + RefPtr screen = new nsScreen(aWindow); + screen->mScreenOrientation = ScreenOrientation::Create(aWindow, screen); + return screen.forget(); +} nsScreen::~nsScreen() = default; diff -Nru firefox-esr-140.9.1esr/dom/base/nsScreen.h firefox-esr-140.10.0esr/dom/base/nsScreen.h --- firefox-esr-140.9.1esr/dom/base/nsScreen.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsScreen.h 2026-04-15 01:59:47.000000000 +0000 @@ -21,9 +21,12 @@ // Script "screen" object class nsScreen : public mozilla::DOMEventTargetHelper { - public: + private: explicit nsScreen(nsPIDOMWindowInner* aWindow); + public: + static already_AddRefed Create(nsPIDOMWindowInner* aWindow); + NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsScreen, mozilla::DOMEventTargetHelper) diff -Nru firefox-esr-140.9.1esr/dom/base/nsWrapperCache.cpp firefox-esr-140.10.0esr/dom/base/nsWrapperCache.cpp --- firefox-esr-140.9.1esr/dom/base/nsWrapperCache.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsWrapperCache.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -47,6 +47,13 @@ } } +void nsWrapperCache::ClearWrapperOnWrapFailure() { + if (IsNurseryWrapper(mWrapper)) { + CycleCollectedJSRuntime::Get()->NurseryWrapperRemovedSlow(this); + } + ClearWrapper(); +} + void nsWrapperCache::ReleaseWrapper(void* aScriptObjectHolder) { // If the behavior here changes in a substantive way, you may need // to update css::Rule::UnlinkDeclarationWrapper as well. diff -Nru firefox-esr-140.9.1esr/dom/base/nsWrapperCache.h firefox-esr-140.10.0esr/dom/base/nsWrapperCache.h --- firefox-esr-140.9.1esr/dom/base/nsWrapperCache.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsWrapperCache.h 2026-04-15 01:59:47.000000000 +0000 @@ -170,6 +170,8 @@ } } + void ClearWrapperOnWrapFailure(); + /** * Update the wrapper when the object moves between globals. */ diff -Nru firefox-esr-140.9.1esr/dom/base/nsWrapperCacheInlines.h firefox-esr-140.10.0esr/dom/base/nsWrapperCacheInlines.h --- firefox-esr-140.9.1esr/dom/base/nsWrapperCacheInlines.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/nsWrapperCacheInlines.h 2026-04-15 01:59:47.000000000 +0000 @@ -86,12 +86,18 @@ SetPreservingWrapper(false); } + JSObject* oldWrapper = mWrapper; SetWrapper(aNewWrapper); if (zoneChanged) { PreserveWrapper(aScriptObjectHolder); } else if (preserving) { SetPreservingWrapper(true); + if (!JS::ObjectIsTenured(mWrapper)) { + // SetWrapper doesn't fire a write barrier; add one so minor GC can + // update mWrapper if the new wrapper is tenured. + JS::HeapObjectPostWriteBarrier(&mWrapper, oldWrapper, mWrapper); + } } } diff -Nru firefox-esr-140.9.1esr/dom/base/test/jsmodules/mochitest.toml firefox-esr-140.10.0esr/dom/base/test/jsmodules/mochitest.toml --- firefox-esr-140.9.1esr/dom/base/test/jsmodules/mochitest.toml 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/test/jsmodules/mochitest.toml 2026-04-15 01:59:48.000000000 +0000 @@ -1,3 +1,5 @@ [DEFAULT] +["test_bug_2027541.html"] + ["test_nested_modules.html"] diff -Nru firefox-esr-140.9.1esr/dom/base/test/jsmodules/test_bug_2027541.html firefox-esr-140.10.0esr/dom/base/test/jsmodules/test_bug_2027541.html --- firefox-esr-140.9.1esr/dom/base/test/jsmodules/test_bug_2027541.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/base/test/jsmodules/test_bug_2027541.html 2026-04-15 01:59:48.000000000 +0000 @@ -0,0 +1,47 @@ + + + + Call import.meta.resolve after iframe removal + + + + + diff -Nru firefox-esr-140.9.1esr/dom/bindings/BindingUtils.cpp firefox-esr-140.10.0esr/dom/bindings/BindingUtils.cpp --- firefox-esr-140.9.1esr/dom/bindings/BindingUtils.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/bindings/BindingUtils.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -2473,8 +2473,7 @@ } // We've set up |newobj|, so we make it own the native by setting its reserved - // slot and nulling out the reserved slot of |obj|. Update the wrapper cache - // to keep everything consistent in case GC moves newobj. + // slot and nulling out the reserved slot of |obj|. // // NB: It's important to do this _after_ copying the properties to // propertyHolder. Otherwise, an object with |foo.x === foo| will @@ -2497,16 +2496,23 @@ nsWrapperCache* cache = nullptr; CallQueryInterface(native, &cache); - cache->UpdateWrapperForNewGlobal(native, newobj); + + // For preserved wrappers the store buffer keeps mWrapper consistent across + // the transplant. For non-preserved wrappers clear mWrapper so that + // JSObjectsTenured doesn't follow a stale pointer if nursery GC fires. + bool preserving = cache->PreservingWrapper(); + if (preserving) { + cache->UpdateWrapperForNewGlobal(native, newobj); + } else { + cache->ClearWrapper(); + } aObj = xpc::TransplantObjectRetainingXrayExpandos(aCx, aObj, newobj); if (!aObj) { MOZ_CRASH(); } - // Update the wrapper cache again if transplanting didn't use newobj but - // returned some other object. - if (aObj != newobj) { + if (!preserving || aObj != newobj) { MOZ_ASSERT(UnwrapDOMObjectToISupports(aObj) == native); cache->UpdateWrapperForNewGlobal(native, aObj); } @@ -3567,6 +3573,7 @@ ? aObj : js::UncheckedUnwrap(aObj, /* stopAtWindowProxy = */ false); + MOZ_ASSERT(aSlotIndex < JSCLASS_RESERVED_SLOTS(JS::GetClass(reflector))); // Retrieve the backing object from the reserved slot on the maplike/setlike // object. If it doesn't exist yet, create it. diff -Nru firefox-esr-140.9.1esr/dom/bindings/Codegen.py firefox-esr-140.10.0esr/dom/bindings/Codegen.py --- firefox-esr-140.9.1esr/dom/bindings/Codegen.py 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/bindings/Codegen.py 2026-04-15 01:59:48.000000000 +0000 @@ -4683,7 +4683,7 @@ failureCode = dedent( """ aCache->ReleaseWrapper(aObject); - aCache->ClearWrapper(); + aCache->ClearWrapperOnWrapFailure(); return false; """ ) @@ -23213,7 +23213,9 @@ CGGeneric.__init__(self, createIterator) -def getObservableArrayBackingObject(descriptor, attr, errorReturn="return false;\n"): +def getObservableArrayBackingObject( + descriptor, attr, objName="obj", errorReturn="return false;\n" +): """ Generate code to get/create a JS backing list for an observableArray attribute from the declaration slot. @@ -23228,7 +23230,7 @@ """ JS::Rooted backingObj(cx); bool created = false; - if (!GetObservableArrayBackingObject(cx, obj, ${slot}, + if (!GetObservableArrayBackingObject(cx, ${objName}, ${slot}, &backingObj, &created, ${namespace}::ObservableArrayProxyHandler::getInstance(), self)) { $*{errorReturn} @@ -23237,8 +23239,9 @@ PreserveWrapper(self); } """, - namespace=toBindingNamespace(MakeNativeName(attr.identifier.name)), + objName=objName, slot=memberReservedSlot(attr, descriptor), + namespace=toBindingNamespace(MakeNativeName(attr.identifier.name)), errorReturn=errorReturn, selfType=descriptor.nativeType, ) @@ -23350,12 +23353,18 @@ $*{convertType} $*{preCallback} - JS::Value val = js::GetProxyReservedSlot(aProxy, OBSERVABLE_ARRAY_DOM_INTERFACE_SLOT); - auto* interface = static_cast<${ifaceType}*>(val.toPrivate()); - MOZ_ASSERT(interface); + const JS::Value& val = js::GetProxyReservedSlot(aProxy, OBSERVABLE_ARRAY_DOM_INTERFACE_SLOT); + if (MOZ_LIKELY(!val.isUndefined())) { + auto* interface = static_cast<${ifaceType}*>(val.toPrivate()); + MOZ_ASSERT(interface); + + ErrorResult rv; + MOZ_KnownLive(interface)->${methodName}(${callbackArgs}); + if (rv.MaybeSetPendingException(cx)) { + return false; + } + } - ErrorResult rv; - MOZ_KnownLive(interface)->${methodName}(${callbackArgs}); $*{postCallback} """, preConversion=self.preConversion(), @@ -23399,7 +23408,7 @@ def postCallback(self): return dedent( """ - return !rv.MaybeSetPendingException(cx); + return true; """ ) @@ -23464,10 +23473,6 @@ def postCallback(self): return dedent( """ - if (rv.MaybeSetPendingException(cx)) { - return false; - } - if (!JS_SetElement(aCx, aBackingList, aIndex, aValue)) { return false; } @@ -23530,7 +23535,9 @@ def __init__(self, descriptor, attr): assert attr.isAttr() assert attr.type.isObservableArray() - getBackingObject = getObservableArrayBackingObject(descriptor, attr) + getBackingObject = getObservableArrayBackingObject( + descriptor, attr, objName="unwrappedObj" + ) setElement = dedent( """ if (!JS_SetElement(cx, backingObj, i, val)) { @@ -23557,15 +23564,22 @@ return false; } - ${getBackingObject} - const ObservableArrayProxyHandler* handler = GetObservableArrayProxyHandler(backingObj); - if (!handler->SetLength(cx, backingObj, 0)) { - return false; - } + JS::Rooted unwrappedObj(cx, js::UncheckedUnwrap(obj, /* stopAtWindowProxy = */ false)); + MOZ_ASSERT(IsDOMObject(unwrappedObj)); + { + JSAutoRealm ar(cx, unwrappedObj); - JS::Rooted val(cx); - for (size_t i = 0; i < arg0.Length(); i++) { - $*{conversion} + $*{getBackingObject} + + const ObservableArrayProxyHandler* handler = GetObservableArrayProxyHandler(backingObj); + if (!handler->SetLength(cx, backingObj, 0)) { + return false; + } + + JS::Rooted val(cx); + for (size_t i = 0; i < arg0.Length(); i++) { + $*{conversion} + } } """, conversion=conversion, @@ -23611,7 +23625,7 @@ getObservableArrayBackingObject( descriptor, attr, - dedent( + errorReturn=dedent( """ aRv.Throw(NS_ERROR_UNEXPECTED); return%s; diff -Nru firefox-esr-140.9.1esr/dom/bindings/ErrorResult.h firefox-esr-140.10.0esr/dom/bindings/ErrorResult.h --- firefox-esr-140.9.1esr/dom/bindings/ErrorResult.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/bindings/ErrorResult.h 2026-04-15 01:59:48.000000000 +0000 @@ -215,6 +215,7 @@ // informative message and calling the relevant Throw*Error. void MOZ_MUST_RETURN_FROM_CALLER_IF_THIS_IS_ARG Throw(nsresult rv) { MOZ_ASSERT(NS_FAILED(rv), "Please don't try throwing success"); + ClearUnionData(); AssignErrorCode(rv); } @@ -431,7 +432,10 @@ // Backwards-compat to make conversion simpler. We don't call // Throw() here because people can easily pass success codes to // this. This operator is deprecated and ideally shouldn't be used. - void operator=(nsresult rv) { AssignErrorCode(rv); } + void operator=(nsresult rv) { + ClearUnionData(); + AssignErrorCode(rv); + } bool Failed() const { return NS_FAILED(mResult); } @@ -542,6 +546,7 @@ } void AssignErrorCode(nsresult aRv) { + MOZ_ASSERT(mUnionState == HasNothing); MOZ_ASSERT(aRv != NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR, "Use ThrowTypeError()"); MOZ_ASSERT(aRv != NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR, diff -Nru firefox-esr-140.9.1esr/dom/cache/Manager.cpp firefox-esr-140.10.0esr/dom/cache/Manager.cpp --- firefox-esr-140.9.1esr/dom/cache/Manager.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/cache/Manager.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -658,7 +658,8 @@ // If we entered shutdown on the main thread while we were doing IO, // bail out now. - if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { + if (IsCanceled() || + AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { if (stream) { stream->Close(); } @@ -734,7 +735,8 @@ // If we entered shutdown on the main thread while we were doing IO, // bail out now. - if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { + if (IsCanceled() || + AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { if (stream) { stream->Close(); } @@ -1289,7 +1291,8 @@ // If we entered shutdown on the main thread while we were doing IO, // bail out now. - if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { + if (IsCanceled() || + AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { if (stream) { stream->Close(); } @@ -1368,7 +1371,8 @@ // If we entered shutdown on the main thread while we were doing IO, // bail out now. - if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { + if (IsCanceled() || + AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { if (stream) { stream->Close(); } diff -Nru firefox-esr-140.9.1esr/dom/cache/StreamList.cpp firefox-esr-140.10.0esr/dom/cache/StreamList.cpp --- firefox-esr-140.9.1esr/dom/cache/StreamList.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/cache/StreamList.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -30,7 +30,6 @@ mStreamControl(nullptr), mActivated(false) { MOZ_DIAGNOSTIC_ASSERT(mManager); - mContext->AddActivity(*this); } Manager& StreamList::GetManager() const { @@ -73,6 +72,9 @@ MOZ_DIAGNOSTIC_ASSERT(mCacheId == INVALID_CACHE_ID); mActivated = true; mCacheId = aCacheId; + + mContext->AddActivity(*this); + mManager->AddRefCacheId(mCacheId); mManager->AddStreamList(*this); @@ -134,6 +136,7 @@ void StreamList::CloseAll() { NS_ASSERT_OWNINGTHREAD(StreamList); + SafeRefPtr kungFuDeathGrip = SafeRefPtrFromThis(); if (mStreamControl && mStreamControl->CanSend()) { // CloseAll will kick off everything needed for shutdown. @@ -192,13 +195,13 @@ NS_ASSERT_OWNINGTHREAD(StreamList); MOZ_DIAGNOSTIC_ASSERT(!mStreamControl); if (mActivated) { + mContext->RemoveActivity(*this); mManager->RemoveStreamList(*this); for (uint32_t i = 0; i < mList.Length(); ++i) { mManager->ReleaseBodyId(mList[i].mId); } mManager->ReleaseCacheId(mCacheId); } - mContext->RemoveActivity(*this); } } // namespace mozilla::dom::cache diff -Nru firefox-esr-140.9.1esr/dom/canvas/CanvasRenderingContext2D.cpp firefox-esr-140.10.0esr/dom/canvas/CanvasRenderingContext2D.cpp --- firefox-esr-140.9.1esr/dom/canvas/CanvasRenderingContext2D.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/CanvasRenderingContext2D.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -880,6 +880,8 @@ NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(CanvasRenderingContext2D) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CanvasRenderingContext2D) + tmp->RemoveShutdownObserver(); + tmp->OnShutdown(); // Make sure we remove ourselves from the list of demotable contexts (raw // pointers), since we're logically destructed at this point. NS_IMPL_CYCLE_COLLECTION_UNLINK(mCanvasElement) @@ -2888,8 +2890,12 @@ void CanvasRenderingContext2D::SetLetterSpacing( const nsACString& aLetterSpacing) { - ParseSpacing(aLetterSpacing, &CurrentState().letterSpacing, - CurrentState().letterSpacingStr); + nsAutoCString normalized; + Maybe value = ParseSpacing(aLetterSpacing, normalized); + if (value) { + CurrentState().letterSpacing = *value; + CurrentState().letterSpacingStr = normalized; + } } void CanvasRenderingContext2D::GetWordSpacing(nsACString& aWordSpacing) { @@ -2901,8 +2907,12 @@ } void CanvasRenderingContext2D::SetWordSpacing(const nsACString& aWordSpacing) { - ParseSpacing(aWordSpacing, &CurrentState().wordSpacing, - CurrentState().wordSpacingStr); + nsAutoCString normalized; + Maybe value = ParseSpacing(aWordSpacing, normalized); + if (value) { + CurrentState().wordSpacing = *value; + CurrentState().wordSpacingStr = normalized; + } } static GeckoFontMetrics GetFontMetricsFromCanvas(void* aContext) { @@ -2933,9 +2943,8 @@ 0.0f}; } -void CanvasRenderingContext2D::ParseSpacing(const nsACString& aSpacing, - float* aValue, - nsACString& aNormalized) { +Maybe CanvasRenderingContext2D::ParseSpacing(const nsACString& aSpacing, + nsACString& aNormalized) { // Normalize whitespace in the string before trying to parse it, as we want // to store it in normalized form, and this allows a simple check against the // 'normal' keyword, which is not accepted. @@ -2943,28 +2952,28 @@ normalized.CompressWhitespace(true, true); ToLowerCase(normalized); if (normalized.EqualsLiteral("normal")) { - return; + return Nothing(); } float value; if (!Servo_ParseLengthWithoutStyleContext(&normalized, &value, GetFontMetricsFromCanvas, this)) { if (!GetPresShell()) { - return; + return Nothing(); } // This will parse aSpacing as a ... RefPtr style = ResolveStyleForProperty(eCSSProperty_letter_spacing, aSpacing); if (!style) { - return; + return Nothing(); } // ...but only is allowed according to the canvas spec. if (!style->StyleText()->mLetterSpacing.IsLength()) { - return; + return Nothing(); } value = style->StyleText()->mLetterSpacing.AsLength().ToCSSPixels(); } aNormalized = normalized; - *aValue = value; + return Some(value); } class CanvasUserSpaceMetrics final : public UserSpaceMetricsWithSize { @@ -4696,6 +4705,7 @@ } mCtx->EnsureTarget(); + const bool needBounds = mCtx->NeedToCalculateBounds(); if (!mCtx->IsTargetValid()) { return; } @@ -4710,7 +4720,7 @@ const ContextState& state = mCtx->CurrentState(); gfx::Rect bounds; - if (mCtx->NeedToCalculateBounds()) { + if (needBounds) { bounds = ToRect(mBoundingBox); bounds.MoveBy(mPt / mAppUnitsPerDevPixel); if (style == Style::STROKE) { @@ -4858,6 +4868,9 @@ canvasStyle = nsComputedDOMStyle::GetComputedStyle(mCanvasElement); } + // This is only needed to know if we can know the drawing bounding box easily. + const bool doCalculateBounds = NeedToCalculateBounds(); + // Get text direction, either from the property or inherited from context. const ContextState& state = CurrentState(); bool isRTL; @@ -4883,8 +4896,6 @@ MOZ_CRASH("unknown direction!"); } - // This is only needed to know if we can know the drawing bounding box easily. - const bool doCalculateBounds = NeedToCalculateBounds(); if (presShell && presShell->IsDestroying()) { aError = NS_ERROR_FAILURE; return nullptr; @@ -5164,50 +5175,54 @@ nsPresContext* presContext = presShell ? presShell->GetPresContext() : nullptr; - // If we have a cached fontGroup, check that it is valid for the current - // prescontext; if not, we need to discard and re-create it. - RefPtr& fontGroup = CurrentState().fontGroup; - if (fontGroup) { - if (fontGroup->GetPresContext() != presContext) { - fontGroup = nullptr; + { + // If we have a cached fontGroup, check that it is valid for the current + // prescontext; if not, we need to discard and re-create it. + RefPtr& fontGroup = CurrentState().fontGroup; + if (fontGroup) { + if (fontGroup->GetPresContext() != presContext) { + fontGroup = nullptr; + } else { + return fontGroup; + } } } - if (!fontGroup) { - ErrorResult err; - constexpr auto kDefaultFontStyle = "10px sans-serif"_ns; - const float kDefaultFontSize = 10.0; - // If the font has already been set, we're re-creating the fontGroup - // and should re-use the existing font attribute; if not, we initialize - // it to the canvas default. - const nsCString& currentFont = CurrentState().font; - bool fontUpdated = SetFontInternal( - currentFont.IsEmpty() ? kDefaultFontStyle : currentFont, err); - if (err.Failed() || !fontUpdated) { - err.SuppressException(); - // XXX Should we get a default lang from the prescontext or something? - nsAtom* language = nsGkAtoms::x_western; - bool explicitLanguage = false; - gfxFontStyle style; - style.size = kDefaultFontSize; - int32_t perDevPixel, perCSSPixel; - GetAppUnitsValues(&perDevPixel, &perCSSPixel); - gfxFloat devToCssSize = gfxFloat(perDevPixel) / gfxFloat(perCSSPixel); - const auto* sans = - Servo_FontFamily_Generic(StyleGenericFontFamily::SansSerif); - fontGroup = new gfxFontGroup( - presContext, sans->families, &style, language, explicitLanguage, - presContext ? presContext->GetTextPerfMetrics() : nullptr, nullptr, - devToCssSize, StyleFontVariantEmoji::Normal); - if (fontGroup) { - CurrentState().font = kDefaultFontStyle; - } else { - NS_ERROR("Default canvas font is invalid"); - } + ErrorResult err; + constexpr auto kDefaultFontStyle = "10px sans-serif"_ns; + const float kDefaultFontSize = 10.0; + // If the font has already been set, we're re-creating the fontGroup + // and should re-use the existing font attribute; if not, we initialize + // it to the canvas default. + nsAutoCString currentFont(CurrentState().font); + if (currentFont.IsEmpty()) { + currentFont = kDefaultFontStyle; + } + bool fontUpdated = SetFontInternal(currentFont, err); + if (err.Failed() || !fontUpdated) { + err.SuppressException(); + // XXX Should we get a default lang from the prescontext or something? + nsAtom* language = nsGkAtoms::x_western; + bool explicitLanguage = false; + gfxFontStyle style; + style.size = kDefaultFontSize; + int32_t perDevPixel, perCSSPixel; + GetAppUnitsValues(&perDevPixel, &perCSSPixel); + gfxFloat devToCssSize = gfxFloat(perDevPixel) / gfxFloat(perCSSPixel); + const auto* sans = + Servo_FontFamily_Generic(StyleGenericFontFamily::SansSerif); + CurrentState().fontGroup = new gfxFontGroup( + presContext, sans->families, &style, language, explicitLanguage, + presContext ? presContext->GetTextPerfMetrics() : nullptr, nullptr, + devToCssSize, StyleFontVariantEmoji::Normal); + if (CurrentState().fontGroup) { + CurrentState().font = kDefaultFontStyle; + } else { + NS_ERROR("Default canvas font is invalid"); } } - return fontGroup; + return CurrentState().fontGroup; } // @@ -5712,7 +5727,7 @@ HTMLVideoElement* video = HTMLVideoElement::FromNodeOrNull(element); if (video && mBufferProvider->IsAccelerated() && mTarget->IsRecording() && - !(!NeedToApplyFilter() && NeedToDrawShadow())) { + !(NeedToApplyFilter() || NeedToDrawShadow())) { res = nsLayoutUtils::SurfaceFromElement( video, sfeFlags, mTarget, /* aOptimizeSourceSurface */ false); surfaceDescriptor = MaybeGetSurfaceDescriptorForRemoteCanvas(res); diff -Nru firefox-esr-140.9.1esr/dom/canvas/CanvasRenderingContext2D.h firefox-esr-140.10.0esr/dom/canvas/CanvasRenderingContext2D.h --- firefox-esr-140.9.1esr/dom/canvas/CanvasRenderingContext2D.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/CanvasRenderingContext2D.h 2026-04-15 01:59:48.000000000 +0000 @@ -613,11 +613,13 @@ protected: /** * Helper to parse a value for the letterSpacing or wordSpacing attribute. - * If successful, returns the result in aValue, and the whitespace-normalized - * value string in aNormalized; if unsuccessful these are left untouched. + * If the string can be parsed, returns Some(value) and sets aNormalized to + * the normalized form of the specified string. If it cannot be parsed as a + * spacing value, returns Nothing, and aNormalized is untouched. + * Note that ParseSpacing may flush style (to resolve font-relative units). */ - void ParseSpacing(const nsACString& aSpacing, float* aValue, - nsACString& aNormalized); + mozilla::Maybe ParseSpacing(const nsACString& aSpacing, + nsACString& aNormalized); already_AddRefed ResolveStyleForProperty( nsCSSPropertyID aProperty, const nsACString& aValue); @@ -1000,10 +1002,14 @@ * last call to UpdateFilter and now. */ const gfx::FilterDescription& EnsureUpdatedFilter() { - bool isWriteOnly = mCanvasElement && mCanvasElement->IsWriteOnly(); + bool isWriteOnly = IsWriteOnly() || + (mCanvasElement && mCanvasElement->IsWriteOnly()) || + (mOffscreenCanvas && mOffscreenCanvas->IsWriteOnly()); if (CurrentState().filterSourceGraphicTainted != isWriteOnly) { - UpdateFilter(/* aFlushIfNeeded = */ true); - EnsureTarget(); + // Do not flush here: this runs inside drawing operations that hold raw + // references to mPath/state, and a flush can run script that resets the + // context, leading to UAF. Flush already happened at SetFilter() time. + UpdateFilter(/* aFlushIfNeeded = */ false); } MOZ_ASSERT(CurrentState().filterSourceGraphicTainted == isWriteOnly); return CurrentState().filter; diff -Nru firefox-esr-140.9.1esr/dom/canvas/ClientWebGLContext.cpp firefox-esr-140.10.0esr/dom/canvas/ClientWebGLContext.cpp --- firefox-esr-140.9.1esr/dom/canvas/ClientWebGLContext.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/ClientWebGLContext.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -198,8 +198,7 @@ : mIsWebGL2(webgl2), mExtLoseContext(new ClientWebGLExtensionLoseContext(*this)) {} -static inline void SafeReleaseNotLostData( - std::shared_ptr& notLost) { +static inline void SafeReleaseNotLostData(std::shared_ptr& notLost) { if (notLost) { const auto keepAlive = std::move(notLost); keepAlive->extensions = {}; @@ -4523,6 +4522,14 @@ std::string{"gpuProcessTextureId works only in GPU process."}); } } break; + case layers::SurfaceDescriptor::TSurfaceDescriptorDXGIYCbCr: { + MOZ_ASSERT(desc->image); + keepAliveImage = desc->image; + } break; + case layers::SurfaceDescriptor::TSurfaceDescriptorMacIOSurface: { + MOZ_ASSERT(desc->image); + keepAliveImage = desc->image; + } break; case layers::SurfaceDescriptor::TSurfaceDescriptorGPUVideo: { const auto& inProcess = mNotLost->inProcess; MOZ_ASSERT(desc->image); diff -Nru firefox-esr-140.9.1esr/dom/canvas/DrawTargetWebgl.cpp firefox-esr-140.10.0esr/dom/canvas/DrawTargetWebgl.cpp --- firefox-esr-140.9.1esr/dom/canvas/DrawTargetWebgl.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/DrawTargetWebgl.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -21,7 +21,6 @@ #include "mozilla/gfx/Swizzle.h" #include "mozilla/layers/ImageDataSerializer.h" #include "mozilla/layers/RemoteTextureMap.h" -#include "mozilla/widget/ScreenManager.h" #include "skia/include/core/SkPixmap.h" #include "nsContentUtils.h" #include "nsIMemoryReporter.h" @@ -817,7 +816,7 @@ return !!data; } -bool DrawTargetWebgl::SetSimpleClipRect() { +Maybe DrawTargetWebgl::ComputeSimpleClipRect() const { // Determine whether the clipping rectangle is simple enough to accelerate. // Check if there is a device space clip rectangle available from the Skia // target. @@ -829,9 +828,7 @@ if (!clip->IsEmpty() && clip->Contains(GetRect())) { clip = Some(GetRect()); } - mSharedContext->SetClipRect(*clip); - mSharedContext->SetNoClipMask(); - return true; + return Some(Rect(*clip)); } // There was no pixel-aligned clip rect available, so check the clip stack to @@ -842,15 +839,22 @@ // complex. if (clipStack.mPath || !clipStack.mTransform.PreservesAxisAlignedRectangles()) { - return false; + return Nothing(); } // Transform the rect and intersect it with the current clip. rect = clipStack.mTransform.TransformBounds(clipStack.mRect).Intersect(rect); } - mSharedContext->SetClipRect(rect); - mSharedContext->SetNoClipMask(); - return true; + return Some(rect); +} + +bool DrawTargetWebgl::SetSimpleClipRect() { + if (Maybe rect = ComputeSimpleClipRect()) { + mSharedContext->SetClipRect(*rect); + mSharedContext->SetNoClipMask(); + return true; + } + return false; } // Installs the Skia clip rectangle, if applicable, onto the shared WebGL @@ -874,6 +878,21 @@ return mSharedContext->SetTarget(this); } +// Whether clipping may be necessary for the operation. This tries to avoid +// generating a complex clip mask in case the current target is not active +// or not using WebGL. If there is only a simple clip mask and its bounds +// encompass the viewport, then no clipping is required. +bool DrawTargetWebgl::ShouldClip() { + if (mSharedContext->IsCurrentTarget(this) && !mRefreshClipState) { + return mSharedContext->HasClipMask() || + !mSharedContext->mClipAARect.Contains(Rect(GetRect())); + } + if (Maybe rect = ComputeSimpleClipRect()) { + return !rect->Contains(Rect(GetRect())); + } + return true; +} + bool SharedContextWebgl::IsContextLost() const { return !mWebgl || mWebgl->IsContextLost(); } @@ -905,29 +924,12 @@ return false; } - // Maximum pref allows 3 different options: - // 0 means unlimited size, + // Maximum pref allows 2 different options: + // <= 0 means unlimited size, // > 0 means use value as an absolute threshold, - // < 0 means use the number of screen pixels as a threshold. int32_t maxSize = StaticPrefs::gfx_canvas_accelerated_max_size(); - if (maxSize > 0) { - if (std::max(aSize.width, aSize.height) > maxSize) { - return false; - } - } else if (maxSize < 0) { - // Default to historical mobile screen size of 980x480, like FishIEtank. - // In addition, allow acceleration up to this size even if the screen is - // smaller. A lot content expects this size to work well. See Bug 999841 - static const int32_t kScreenPixels = 980 * 480; - - if (RefPtr screen = - widget::ScreenManager::GetSingleton().GetPrimaryScreen()) { - LayoutDeviceIntSize screenSize = screen->GetRect().Size(); - if (aSize.width * aSize.height > - std::max(screenSize.width * screenSize.height, kScreenPixels)) { - return false; - } - } + if (maxSize > 0 && std::max(aSize.width, aSize.height) > maxSize) { + return false; } return true; @@ -1645,9 +1647,7 @@ // If the clear rectangle encompasses the entire viewport and is not clipped, // then mark the target as entirely clear. - if (containsViewport && mSharedContext->IsCurrentTarget(this) && - !mSharedContext->HasClipMask() && - mSharedContext->mClipAARect.Contains(Rect(GetRect()))) { + if (containsViewport && !ShouldClip()) { mIsClear = true; } } @@ -2038,6 +2038,7 @@ if (srcRect.IsEmpty()) { return true; } + Maybe map; if (aData) { // If the source rect could not possibly overlap the surface, then it is // effectively empty with nothing to upload. @@ -2058,15 +2059,15 @@ // The surface needs to be uploaded to its backing texture either to // initialize or update the texture handle contents. Map the data // contents of the surface so it can be read. - DataSourceSurface::ScopedMap map(aData, DataSourceSurface::READ); - if (!map.IsMapped()) { + map.emplace(aData, DataSourceSurface::READ); + if (!map->IsMapped()) { return false; } - int32_t stride = map.GetStride(); + int32_t stride = map->GetStride(); // Get the data pointer range considering the sampling rect offset and // size. Span range( - map.GetData() + srcRect.y * size_t(stride) + srcRect.x * bpp, + map->GetData() + srcRect.y * size_t(stride) + srcRect.x * bpp, std::max(srcRect.height - 1, 0) * size_t(stride) + srcRect.width * bpp); texDesc.cpuData = Some(range); // If the stride happens to be 4 byte aligned, assume that is the diff -Nru firefox-esr-140.9.1esr/dom/canvas/DrawTargetWebgl.h firefox-esr-140.10.0esr/dom/canvas/DrawTargetWebgl.h --- firefox-esr-140.9.1esr/dom/canvas/DrawTargetWebgl.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/DrawTargetWebgl.h 2026-04-15 01:59:48.000000000 +0000 @@ -617,9 +617,11 @@ return mSharedContext->SupportsPattern(aPattern); } + Maybe ComputeSimpleClipRect() const; bool SetSimpleClipRect(); bool GenerateComplexClipMask(); bool PrepareContext(bool aClipped = true); + bool ShouldClip(); void DrawRectFallback(const Rect& aRect, const Pattern& aPattern, const DrawOptions& aOptions, diff -Nru firefox-esr-140.9.1esr/dom/canvas/ImageData.cpp firefox-esr-140.10.0esr/dom/canvas/ImageData.cpp --- firefox-esr-140.9.1esr/dom/canvas/ImageData.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/ImageData.cpp 2026-04-15 01:59:47.000000000 +0000 @@ -146,10 +146,29 @@ !JS_ReadTypedArray(aReader, &dataArray)) { return nullptr; } - MOZ_ASSERT(dataArray.isObject()); - JS::Rooted arrayObj(aCx, &dataArray.toObject()); - RefPtr imageData = new ImageData(aGlobal, width, height, arrayObj); + JS::Rooted dataObj(aCx, &dataArray.toObject()); + RootedSpiderMonkeyInterface data(aCx); + if (!data.Init(dataObj)) { + return nullptr; + } + + Maybe maybeLength = data.ProcessData( + [&](const Span& aData, JS::AutoCheckCannotGC&& nogc) { + return Some(aData.Length()); + }); + if (maybeLength.isNothing()) { + return nullptr; + } + + CheckedInt calculatedLength = + CheckedInt(width) * height * 4; + if (!calculatedLength.isValid() || + size_t(calculatedLength.value()) != maybeLength.value()) { + return nullptr; + } + + RefPtr imageData = new ImageData(aGlobal, width, height, dataObj); return imageData.forget(); } diff -Nru firefox-esr-140.9.1esr/dom/canvas/TexUnpackBlob.cpp firefox-esr-140.10.0esr/dom/canvas/TexUnpackBlob.cpp --- firefox-esr-140.9.1esr/dom/canvas/TexUnpackBlob.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/TexUnpackBlob.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -391,8 +391,8 @@ } bool TexUnpackBlob::ConvertIfNeeded( - const WebGLContext* const webgl, const uint32_t rowLength, - const uint32_t rowCount, WebGLTexelFormat srcFormat, + const WebGLContext* const webgl, const size_t rowLength, + const size_t rowCount, WebGLTexelFormat srcFormat, const uint8_t* const srcBegin, const ptrdiff_t srcStride, WebGLTexelFormat dstFormat, const ptrdiff_t dstStride, const uint8_t** const out_begin, @@ -469,7 +469,7 @@ //// - const auto dstTotalBytes = CheckedUint32(rowCount) * dstStride; + const auto dstTotalBytes = CheckedInt(rowCount) * dstStride; if (!dstTotalBytes.isValid()) { webgl->ErrorOutOfMemory("Calculation failed."); return false; @@ -855,9 +855,14 @@ : dom::PredefinedColorSpace::Srgb; bool sameColorSpace = (srcColorSpace == dstColorSpace); - const auto reason = BlitPreventReason( + Maybe reason; + if (!webgl->IsUploadableSdType(sd)) { + reason = Some(std::string("Unsupported surface descriptor type")); + } else { + reason = BlitPreventReason( level, {xOffset, yOffset, zOffset}, dui->internalFormat, pi, mDesc, webgl->mOptionalRenderableFormatBits, sameColorSpace); + } if (reason) { webgl->GeneratePerfWarning( "Failed to hit GPU-copy fast-path." diff -Nru firefox-esr-140.9.1esr/dom/canvas/TexUnpackBlob.h firefox-esr-140.10.0esr/dom/canvas/TexUnpackBlob.h --- firefox-esr-140.9.1esr/dom/canvas/TexUnpackBlob.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/TexUnpackBlob.h 2026-04-15 01:59:48.000000000 +0000 @@ -65,8 +65,8 @@ virtual ~TexUnpackBlob() = default; protected: - bool ConvertIfNeeded(const WebGLContext*, const uint32_t rowLength, - const uint32_t rowCount, WebGLTexelFormat srcFormat, + bool ConvertIfNeeded(const WebGLContext*, const size_t rowLength, + const size_t rowCount, WebGLTexelFormat srcFormat, const uint8_t* const srcBegin, const ptrdiff_t srcStride, WebGLTexelFormat dstFormat, const ptrdiff_t dstStride, diff -Nru firefox-esr-140.9.1esr/dom/canvas/WebGLContext.cpp firefox-esr-140.10.0esr/dom/canvas/WebGLContext.cpp --- firefox-esr-140.9.1esr/dom/canvas/WebGLContext.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/WebGLContext.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -630,50 +630,6 @@ // - - const auto UploadableSdTypes = [&]() { - webgl::EnumMask types; - types[layers::SurfaceDescriptor::TSurfaceDescriptorBuffer] = true; - // Only support canvas surface interchange if using AC2D. This guarantees - // that WebGL and AC2D commands are sequenced and processed on the same - // thread, so that there is no mal-ordering between AC2D and WebGL - // processing. We can flush out AC2D commands to produce a surface in time - // for WebGL to use without requiring any blocking to occur. - types[layers::SurfaceDescriptor::TSurfaceDescriptorCanvasSurface] = - gfx::gfxVars::UseAcceleratedCanvas2D(); - // This is conditional on not using the Compositor thread because we may - // need to synchronize with the RDD process over the PVideoBridge protocol - // to wait for the texture to be available in the compositor process. We - // cannot block on the Compositor thread, so in that configuration, we would - // prefer to do the readback from the RDD which is guaranteed to work, and - // only block the owning thread for WebGL. - const bool offCompositorThread = gfx::gfxVars::UseCanvasRenderThread() || - !gfx::gfxVars::SupportsThreadsafeGL(); - types[layers::SurfaceDescriptor::TSurfaceDescriptorGPUVideo] = - offCompositorThread; - // Similarly to the PVideoBridge protocol, we may need to synchronize with - // the content process over the PCompositorManager protocol to wait for the - // shared surface to be available in the compositor process, and we cannot - // block on the Compositor thread. - types[layers::SurfaceDescriptor::TSurfaceDescriptorExternalImage] = - offCompositorThread; - if (webgl->gl->IsANGLE()) { - types[layers::SurfaceDescriptor::TSurfaceDescriptorD3D10] = true; - types[layers::SurfaceDescriptor::TSurfaceDescriptorDXGIYCbCr] = true; - } - if (kIsMacOS) { - types[layers::SurfaceDescriptor::TSurfaceDescriptorMacIOSurface] = true; - } - if (kIsAndroid) { - types[layers::SurfaceDescriptor::TSurfaceTextureDescriptor] = true; - } - if (kIsLinux) { - types[layers::SurfaceDescriptor::TSurfaceDescriptorDMABuf] = true; - } - return types; - }; - - // - - constexpr GLenum SHADER_TYPES[] = { LOCAL_GL_VERTEX_SHADER, LOCAL_GL_FRAGMENT_SHADER, @@ -709,7 +665,7 @@ out->options = webgl->mOptions; out->limits = *webgl->mLimits; - out->uploadableSdTypes = UploadableSdTypes(); + out->uploadableSdTypes = webgl->mUploadableSdTypes; out->vendor = webgl->gl->Vendor(); out->optionalRenderableFormatBits = webgl->mOptionalRenderableFormatBits; @@ -811,6 +767,58 @@ gl->ResetSyncCallCount("WebGLContext Initialization"); LoseLruContextIfLimitExceeded(); + + InitUploadableSdTypes(); +} + +void WebGLContext::InitUploadableSdTypes() { + webgl::EnumMask types; + types[layers::SurfaceDescriptor::TSurfaceDescriptorBuffer] = true; + // Only support canvas surface interchange if using AC2D. This guarantees + // that WebGL and AC2D commands are sequenced and processed on the same + // thread, so that there is no mal-ordering between AC2D and WebGL + // processing. We can flush out AC2D commands to produce a surface in time + // for WebGL to use without requiring any blocking to occur. + types[layers::SurfaceDescriptor::TSurfaceDescriptorCanvasSurface] = + gfx::gfxVars::UseAcceleratedCanvas2D(); + // This is conditional on not using the Compositor thread because we may + // need to synchronize with the RDD process over the PVideoBridge protocol + // to wait for the texture to be available in the compositor process. We + // cannot block on the Compositor thread, so in that configuration, we would + // prefer to do the readback from the RDD which is guaranteed to work, and + // only block the owning thread for WebGL. + const bool offCompositorThread = gfx::gfxVars::UseCanvasRenderThread() || + !gfx::gfxVars::SupportsThreadsafeGL(); + types[layers::SurfaceDescriptor::TSurfaceDescriptorGPUVideo] = + offCompositorThread; + // Similarly to the PVideoBridge protocol, we may need to synchronize with + // the content process over the PCompositorManager protocol to wait for the + // shared surface to be available in the compositor process, and we cannot + // block on the Compositor thread. + types[layers::SurfaceDescriptor::TSurfaceDescriptorExternalImage] = + offCompositorThread; + if (gl->IsANGLE()) { + types[layers::SurfaceDescriptor::TSurfaceDescriptorD3D10] = true; + types[layers::SurfaceDescriptor::TSurfaceDescriptorDXGIYCbCr] = true; + } + if (kIsMacOS) { + types[layers::SurfaceDescriptor::TSurfaceDescriptorMacIOSurface] = true; + } + if (kIsAndroid) { + types[layers::SurfaceDescriptor::TSurfaceTextureDescriptor] = true; + } + if (kIsLinux) { + types[layers::SurfaceDescriptor::TSurfaceDescriptorDMABuf] = true; + } + + mUploadableSdTypes = types; +} + +bool WebGLContext::IsUploadableSdType( + const layers::SurfaceDescriptor& sd) const { + // If the WebGLContext is remote, then validate that the SD is an allowed + // type. + return !bool(mHost) || mUploadableSdTypes[sd.type()]; } void WebGLContext::SetCompositableHost( @@ -2787,6 +2795,23 @@ const Maybe bytesPerRowStrideOverride) { auto state = stateOrZero; + // Enforce the GLES alignmentInTypeElems invariant. ElemsPerRowStride below + // assumes a in {1,2,4,8}. Callers at IPC entry points validate this but + // alignmentInTypeElems is deserialized from IPC, so guard it here too. + switch (state.alignmentInTypeElems) { + case 1: + case 2: + case 4: + case 8: + break; + default: { + const auto text = nsPrintfCString( + "PACK/UNPACK_ALIGNMENT must be one of [1,2,4,8], was %u.", + state.alignmentInTypeElems); + return Err(mozilla::ToString(text)); + } + } + if (!IsTexTarget3D(target)) { state.skipImages = 0; state.imageHeight = 0; diff -Nru firefox-esr-140.9.1esr/dom/canvas/WebGLContext.h firefox-esr-140.10.0esr/dom/canvas/WebGLContext.h --- firefox-esr-140.9.1esr/dom/canvas/WebGLContext.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/WebGLContext.h 2026-04-15 01:59:48.000000000 +0000 @@ -292,6 +292,7 @@ WebGLContextOptions mOptions; const uint32_t mPrincipalKey; Maybe mLimits; + webgl::EnumMask mUploadableSdTypes; const uint32_t mMaxVertIdsPerDraw = StaticPrefs::webgl_max_vert_ids_per_draw(); @@ -340,6 +341,7 @@ webgl::OptionalRenderableFormatBits mOptionalRenderableFormatBits = webgl::OptionalRenderableFormatBits{0}; void FinishInit(); + void InitUploadableSdTypes(); protected: WebGLContext(HostWebGLContext*, const webgl::InitContextDesc&); @@ -995,6 +997,8 @@ bool IsFormatValidForFB(TexInternalFormat format) const; + bool IsUploadableSdType(const layers::SurfaceDescriptor& sd) const; + protected: // ------------------------------------------------------------------------- // WebGL extensions (implemented in WebGLContextExtensions.cpp) diff -Nru firefox-esr-140.9.1esr/dom/canvas/WebGLShaderValidator.cpp firefox-esr-140.10.0esr/dom/canvas/WebGLShaderValidator.cpp --- firefox-esr-140.9.1esr/dom/canvas/WebGLShaderValidator.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/canvas/WebGLShaderValidator.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -487,23 +487,28 @@ size_t ShaderValidatorResults::SizeOfIncludingThis( const MallocSizeOf fnSizeOf) const { auto ret = fnSizeOf(this); - ret += mInfoLog.size(); - ret += mObjectCode.size(); - for (const auto& cur : mAttributes) { - ret += fnSizeOf(&cur); + // std::string heap allocations are not measured here because: + // 1. Small String Optimization (SSO) means data() may point to inline + // storage within the std::string object (already counted in + // fnSizeOf(this)) + // 2. There's no standard way to distinguish SSO from heap-allocated strings + // 3. Calling fnSizeOf on a pointer to inline storage is inappropriate + + if (!mAttributes.empty()) { + ret += fnSizeOf(mAttributes.data()); } - for (const auto& cur : mInterfaceBlocks) { - ret += fnSizeOf(&cur); + if (!mInterfaceBlocks.empty()) { + ret += fnSizeOf(mInterfaceBlocks.data()); } - for (const auto& cur : mOutputVariables) { - ret += fnSizeOf(&cur); + if (!mOutputVariables.empty()) { + ret += fnSizeOf(mOutputVariables.data()); } - for (const auto& cur : mUniforms) { - ret += fnSizeOf(&cur); + if (!mUniforms.empty()) { + ret += fnSizeOf(mUniforms.data()); } - for (const auto& cur : mVaryings) { - ret += fnSizeOf(&cur); + if (!mVaryings.empty()) { + ret += fnSizeOf(mVaryings.data()); } return ret; diff -Nru firefox-esr-140.9.1esr/dom/clients/manager/ClientNavigateOpChild.cpp firefox-esr-140.10.0esr/dom/clients/manager/ClientNavigateOpChild.cpp --- firefox-esr-140.9.1esr/dom/clients/manager/ClientNavigateOpChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/clients/manager/ClientNavigateOpChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -279,7 +279,7 @@ return ClientOpPromise::CreateAndReject(result, __func__); } - if (!aProxy->Get()) { + if (!aProxy->Get() || !CanSend()) { CopyableErrorResult result; result.ThrowInvalidStateError("Unknown Client"); return ClientOpPromise::CreateAndReject(result, __func__); @@ -315,7 +315,7 @@ void ClientNavigateOpChild::Init(const ClientNavigateOpConstructorArgs& aArgs, mozilla::ipc::ActorLifecycleProxy* aProxy) { RefPtr promise = DoNavigate(aArgs, aProxy); - if (!aProxy->Get()) { + if (!aProxy->Get() || !CanSend()) { return; } diff -Nru firefox-esr-140.9.1esr/dom/console/Console.cpp firefox-esr-140.10.0esr/dom/console/Console.cpp --- firefox-esr-140.9.1esr/dom/console/Console.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/console/Console.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -424,6 +424,7 @@ } Sequence arguments; + SequenceRooter rooter(aCx, &arguments); for (uint32_t i = 0; i < length; ++i) { JS::Rooted value(aCx); diff -Nru firefox-esr-140.9.1esr/dom/cookiestore/CookieStoreNotifier.cpp firefox-esr-140.10.0esr/dom/cookiestore/CookieStoreNotifier.cpp --- firefox-esr-140.9.1esr/dom/cookiestore/CookieStoreNotifier.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/cookiestore/CookieStoreNotifier.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -196,10 +196,17 @@ void CookieStoreNotifier::FireDelayedDOMEvents() { MOZ_ASSERT(NS_IsMainThread()); + RefPtr kungFuDeathGrip(this); + nsTArray> delayedDOMEvents; delayedDOMEvents.SwapElements(mDelayedDOMEvents); for (Event* event : delayedDOMEvents) { + // mCookieStore is a raw pointer cleared by Disentangle(). + if (!mCookieStore) { + break; + } + mCookieStore->DispatchEvent(*event); } } diff -Nru firefox-esr-140.9.1esr/dom/events/EventListenerManager.cpp firefox-esr-140.10.0esr/dom/events/EventListenerManager.cpp --- firefox-esr-140.9.1esr/dom/events/EventListenerManager.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/events/EventListenerManager.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -2134,9 +2134,13 @@ } JSEventHandler* jsEventHandler = listener->GetJSEventHandler(); - + Maybe> pin; if (listener->mHandlerIsString) { - CompileEventHandlerInternal(listener, aEventName, nullptr, nullptr); + pin.emplace(jsEventHandler); + if (NS_FAILED(CompileEventHandlerInternal(listener, aEventName, nullptr, + nullptr))) { + listener = nullptr; + } } const TypedEventHandler& typedHandler = diff -Nru firefox-esr-140.9.1esr/dom/events/IMEContentObserver.cpp firefox-esr-140.10.0esr/dom/events/IMEContentObserver.cpp --- firefox-esr-140.9.1esr/dom/events/IMEContentObserver.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/events/IMEContentObserver.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -788,7 +788,8 @@ bool IMEContentObserver::OnMouseButtonEvent(nsPresContext& aPresContext, WidgetMouseEvent& aMouseEvent) { if (!mIMENotificationRequests || - !mIMENotificationRequests->WantMouseButtonEventOnChar()) { + !mIMENotificationRequests->contains( + IMENotificationRequest::MouseEventOnChar)) { return false; } if (!aMouseEvent.IsTrusted() || aMouseEvent.DefaultPrevented() || diff -Nru firefox-esr-140.9.1esr/dom/events/IMEContentObserver.h firefox-esr-140.10.0esr/dom/events/IMEContentObserver.h --- firefox-esr-140.9.1esr/dom/events/IMEContentObserver.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/events/IMEContentObserver.h 2026-04-15 01:59:49.000000000 +0000 @@ -47,6 +47,7 @@ using SelectionChangeData = widget::IMENotification::SelectionChangeData; using TextChangeData = widget::IMENotification::TextChangeData; using TextChangeDataBase = widget::IMENotification::TextChangeDataBase; + using IMENotificationRequest = widget::IMENotificationRequest; using IMENotificationRequests = widget::IMENotificationRequests; using IMEMessage = widget::IMEMessage; enum class ForRemoval : bool { No, Yes }; @@ -163,7 +164,8 @@ bool IsEditorHandlingEventForComposition() const; bool KeepAliveDuringDeactive() const { return mIMENotificationRequests && - mIMENotificationRequests->WantDuringDeactive(); + mIMENotificationRequests->contains( + IMENotificationRequest::NotifyDuringInactive); } [[nodiscard]] bool EditorIsTextEditor() const { return mEditorBase && mEditorBase->IsTextEditor(); @@ -328,12 +330,13 @@ void UnregisterObservers(); void FlushMergeableNotifications(); bool NeedsTextChangeNotification() const { - return mIMENotificationRequests && - mIMENotificationRequests->WantTextChange(); + return mIMENotificationRequests && mIMENotificationRequests->contains( + IMENotificationRequest::TextChange); } bool NeedsPositionChangeNotification() const { return mIMENotificationRequests && - mIMENotificationRequests->WantPositionChanged(); + mIMENotificationRequests->contains( + IMENotificationRequest::PositionChange); } void ClearPendingNotifications() { mNeedsToNotifyIMEOfFocusSet = false; diff -Nru firefox-esr-140.9.1esr/dom/events/IMEStateManager.cpp firefox-esr-140.10.0esr/dom/events/IMEStateManager.cpp --- firefox-esr-140.9.1esr/dom/events/IMEStateManager.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/events/IMEStateManager.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -198,13 +198,12 @@ RefPtr composition = sTextCompositions->GetCompositionFor(oldWidget); if (composition) { - MOZ_LOG( - sISMLog, LogLevel::Debug, - (" OnFocusMovedBetweenBrowsers(), requesting to commit " - "composition to " - "the (previous) focused widget (would request=%s)", - GetBoolName( - !oldWidget->IMENotificationRequestsRef().WantDuringDeactive()))); + MOZ_LOG(sISMLog, LogLevel::Debug, + (" OnFocusMovedBetweenBrowsers(), requesting to commit " + "composition to " + "the (previous) focused widget (would request=%s)", + GetBoolName(!oldWidget->IMENotificationRequestsRef().contains( + IMENotificationRequest::NotifyDuringInactive)))); NotifyIME(REQUEST_TO_COMMIT_COMPOSITION, oldWidget, composition->GetBrowserParent()); } @@ -727,8 +726,8 @@ // such case, sFocusedIMEWidget is perhaps nullptr). For example, IME // may receive only blur notification but still has composition. // We need to clean up only the oldWidget's composition state here. - if (aPresContext || - !oldWidget->IMENotificationRequestsRef().WantDuringDeactive()) { + if (aPresContext || !oldWidget->IMENotificationRequestsRef().contains( + IMENotificationRequest::NotifyDuringInactive)) { MOZ_LOG( sISMLog, LogLevel::Info, (" OnChangeFocusInternal(), requesting to commit composition to " diff -Nru firefox-esr-140.9.1esr/dom/fetch/Fetch.cpp firefox-esr-140.10.0esr/dom/fetch/Fetch.cpp --- firefox-esr-140.9.1esr/dom/fetch/Fetch.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/fetch/Fetch.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -66,21 +66,17 @@ // https://fetch.spec.whatwg.org/#concept-http-network-fetch // If stream is readable, then error stream with ... void AbortStream(JSContext* aCx, ReadableStream* aReadableStream, - ErrorResult& aRv, JS::Handle aReasonDetails) { + AbortSignalImpl* aSignal, ErrorResult& aRv) { + MOZ_ASSERT(aSignal->Aborted()); + if (aReadableStream->State() != ReadableStream::ReaderState::Readable) { return; } - JS::Rooted value(aCx, aReasonDetails); - - if (aReasonDetails.isUndefined()) { - RefPtr e = DOMException::Create(NS_ERROR_DOM_ABORT_ERR); - if (!GetOrCreateDOMReflector(aCx, e, &value)) { - return; - } - } + JS::Rooted reason(aCx); + aSignal->GetReason(aCx, &reason); - aReadableStream->ErrorNative(aCx, value, aRv); + aReadableStream->ErrorNative(aCx, reason, aRv); } } // namespace @@ -533,12 +529,8 @@ if (signalImpl && signalImpl->Aborted()) { // Already aborted signal rejects immediately. - JS::Rooted reason(cx, signalImpl->RawReason()); - if (reason.get().isUndefined()) { - aRv.Throw(NS_ERROR_DOM_ABORT_ERR); - return nullptr; - } - + JS::Rooted reason(cx); + signalImpl->GetReason(cx, &reason); p->MaybeReject(reason); return p.forget(); } @@ -1422,16 +1414,15 @@ DerivedClass()->GetSignalImplToConsumeBody(); if (signalImpl && signalImpl->Aborted()) { - JS::Rooted abortReason(aCx, signalImpl->RawReason()); + JS::Rooted abortReason(aCx); + signalImpl->GetReason(aCx, &abortReason); - if (abortReason.get().isUndefined()) { - aRv.Throw(NS_ERROR_DOM_ABORT_ERR); + nsCOMPtr global = DerivedClass()->GetParentObject(); + RefPtr promise = Promise::Create(global, aRv); + if (aRv.Failed()) { return nullptr; } - nsCOMPtr go = DerivedClass()->GetParentObject(); - - RefPtr promise = Promise::Create(go, aRv); promise->MaybeReject(abortReason); return promise.forget(); } @@ -1572,11 +1563,9 @@ return; } - bool aborted = signalImpl->Aborted(); - if (aborted) { + if (signalImpl->Aborted()) { IgnoredErrorResult result; - JS::Rooted abortReason(aCx, signalImpl->RawReason()); - AbortStream(aCx, mReadableStreamBody, result, abortReason); + AbortStream(aCx, mReadableStreamBody, signalImpl, result); if (NS_WARN_IF(result.Failed())) { return; } @@ -1632,8 +1621,7 @@ RefPtr signalImpl = DerivedClass()->GetSignalImpl(); if (signalImpl) { if (signalImpl->Aborted()) { - JS::Rooted abortReason(aCx, signalImpl->RawReason()); - AbortStream(aCx, body, aRv, abortReason); + AbortStream(aCx, body, signalImpl, aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } @@ -1733,16 +1721,7 @@ JSContext* cx = jsapi.cx(); RefPtr body(mReadableStreamBody); - IgnoredErrorResult result; - - JS::Rooted abortReason(cx); - - AbortSignalImpl* signalImpl = Signal(); - if (signalImpl) { - abortReason.set(signalImpl->RawReason()); - } - - AbortStream(cx, body, result, abortReason); + AbortStream(cx, body, Signal(), IgnoredErrorResult()); } template void FetchBody::RunAbortAlgorithm(); diff -Nru firefox-esr-140.9.1esr/dom/fetch/InternalResponse.cpp firefox-esr-140.10.0esr/dom/fetch/InternalResponse.cpp --- firefox-esr-140.9.1esr/dom/fetch/InternalResponse.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/fetch/InternalResponse.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -123,6 +123,19 @@ InternalResponse::~InternalResponse() = default; +void InternalResponse::SnapshotUnfilteredHeaders() { + auto snapshot = [](InternalHeaders* aHeaders) { + nsTArray entries; + aHeaders->GetEntries(entries); + return MakeRefPtr(std::move(entries), aHeaders->Guard()); + }; + if (mWrappedResponse) { + mWrappedResponse->mHeaders = snapshot(mWrappedResponse->mHeaders); + } else { + mHeaders = snapshot(mHeaders); + } +} + InternalResponseMetadata InternalResponse::GetMetadata() { nsTArray headers; HeadersGuardEnum headersGuard; diff -Nru firefox-esr-140.9.1esr/dom/fetch/InternalResponse.h firefox-esr-140.10.0esr/dom/fetch/InternalResponse.h --- firefox-esr-140.9.1esr/dom/fetch/InternalResponse.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/fetch/InternalResponse.h 2026-04-15 01:59:48.000000000 +0000 @@ -169,6 +169,8 @@ return Headers(); } + void SnapshotUnfilteredHeaders(); + void GetUnfilteredBody(nsIInputStream** aStream, int64_t* aBodySize = nullptr) { if (mWrappedResponse) { diff -Nru firefox-esr-140.9.1esr/dom/file/Blob.cpp firefox-esr-140.10.0esr/dom/file/Blob.cpp --- firefox-esr-140.9.1esr/dom/file/Blob.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/file/Blob.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -8,6 +8,7 @@ #include "EmptyBlobImpl.h" #include "File.h" #include "MemoryBlobImpl.h" +#include "js/Object.h" #include "mozilla/dom/BlobBinding.h" #include "mozilla/dom/ReadableStream.h" #include "mozilla/dom/WorkerCommon.h" @@ -121,6 +122,16 @@ Blob::~Blob() = default; +already_AddRefed Blob::Clone() const { + RefPtr clone = Create(GetParentObject(), Impl()); + return clone.forget(); +} + +bool Blob::HasExpandos() const { + const JSObject* wrapper = GetWrapperPreserveColor(); + return wrapper && JS::NativeObjectHasOwnProperties(wrapper); +} + bool Blob::IsFile() const { return mImpl->IsFile(); } const nsTArray>* Blob::GetSubBlobImpls() const { diff -Nru firefox-esr-140.9.1esr/dom/file/Blob.h firefox-esr-140.10.0esr/dom/file/Blob.h --- firefox-esr-140.9.1esr/dom/file/Blob.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/file/Blob.h 2026-04-15 01:59:49.000000000 +0000 @@ -56,6 +56,12 @@ uint64_t aLength, const nsAString& aContentType); + // This clones the current Blob + already_AddRefed Clone() const; + + // Returns true if the blob's JS wrapper has user-added properties (expandos). + bool HasExpandos() const; + BlobImpl* Impl() const { return mImpl; } bool IsFile() const; diff -Nru firefox-esr-140.9.1esr/dom/filesystem/FileSystemSecurity.cpp firefox-esr-140.10.0esr/dom/filesystem/FileSystemSecurity.cpp --- firefox-esr-140.9.1esr/dom/filesystem/FileSystemSecurity.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/filesystem/FileSystemSecurity.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -80,22 +80,24 @@ #if defined(XP_WIN) if (StringBeginsWith(aPath, u"..\\"_ns) || - FindInReadable(u"\\..\\"_ns, aPath)) { + FindInReadable(u"\\..\\"_ns, aPath) || + StringEndsWith(aPath, u"\\.."_ns)) { return false; } -#elif defined(XP_UNIX) - if (StringBeginsWith(aPath, u"../"_ns) || FindInReadable(u"/../"_ns, aPath)) { +#endif + if (StringBeginsWith(aPath, u"../"_ns) || FindInReadable(u"/../"_ns, aPath) || + StringEndsWith(aPath, u"/.."_ns) || aPath.EqualsLiteral("..")) { return false; } -#endif nsTArray* paths; if (!mPaths.Get(aId, &paths)) { return false; } - for (uint32_t i = 0, len = paths->Length(); i < len; ++i) { - if (FileSystemUtils::IsDescendantPath(paths->ElementAt(i), aPath)) { + MOZ_DIAGNOSTIC_ASSERT(paths); + for (const auto& authorizedRoot : *paths) { + if (FileSystemUtils::IsDescendantPath(authorizedRoot, aPath)) { return true; } } diff -Nru firefox-esr-140.9.1esr/dom/filesystem/FileSystemUtils.cpp firefox-esr-140.10.0esr/dom/filesystem/FileSystemUtils.cpp --- firefox-esr-140.9.1esr/dom/filesystem/FileSystemUtils.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/filesystem/FileSystemUtils.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -12,11 +12,28 @@ namespace mozilla::dom { /* static */ -bool FileSystemUtils::IsDescendantPath(const nsAString& aPath, - const nsAString& aDescendantPath) { +bool FileSystemUtils::IsDescendantPath(const nsAString& aAuthorizedRoot, + const nsAString& aRequestedDescendant) { // Check the sub-directory path to see if it has the parent path as prefix. - if (!aDescendantPath.Equals(aPath) && - !StringBeginsWith(aDescendantPath, aPath)) { + if (aRequestedDescendant.Equals(aAuthorizedRoot)) { + return true; + } + + if (!StringBeginsWith(/*aSource*/ aRequestedDescendant, + /*aSubstring*/ aAuthorizedRoot)) { + return false; + } + + // Require a path separator immediately after the granted prefix. + const uint32_t prefixLen = aAuthorizedRoot.Length(); + if (prefixLen > 0 && + aAuthorizedRoot.Last() == FILESYSTEM_DOM_PATH_SEPARATOR_CHAR) { + return true; + } + + if (aRequestedDescendant.Length() <= prefixLen || + aRequestedDescendant.CharAt(prefixLen) != + FILESYSTEM_DOM_PATH_SEPARATOR_CHAR) { return false; } diff -Nru firefox-esr-140.9.1esr/dom/fs/child/FileSystemRequestHandler.cpp firefox-esr-140.10.0esr/dom/fs/child/FileSystemRequestHandler.cpp --- firefox-esr-140.9.1esr/dom/fs/child/FileSystemRequestHandler.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/fs/child/FileSystemRequestHandler.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -214,12 +214,13 @@ HandleFailedStatus(aResponse.get_nsresult(), aPromise); } -template <> void ResolveCallback( FileSystemMoveEntryResponse&& aResponse, RefPtr aPromise, // NOLINT(performance-unnecessary-value-param) - FileSystemEntryMetadata* const& aEntry, const Name& aName) { + RefPtr aHandle, FileSystemEntryMetadata* const& aEntry, + const Name& aName) { MOZ_ASSERT(aPromise); + MOZ_ASSERT(aHandle); QM_TRY(OkIf(Promise::PromiseState::Pending == aPromise->State()), QM_VOID); if (FileSystemMoveEntryResponse::TEntryId == aResponse.type()) { @@ -553,7 +554,7 @@ } void FileSystemRequestHandler::MoveEntry( - RefPtr& aManager, FileSystemHandle* aHandle, + RefPtr& aManager, RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const FileSystemChildMetadata& aNewEntry, RefPtr aPromise, // NOLINT(performance-unnecessary-value-param) @@ -577,7 +578,7 @@ aManager->BeginRequest( [request = FileSystemMoveEntryRequest(*aEntry, aNewEntry), onResolve = SelectResolveCallback( - aPromise, aEntry, aNewEntry.childName()), + aPromise, std::move(aHandle), aEntry, aNewEntry.childName()), onReject = GetRejectCallback(aPromise)](const auto& actor) mutable { actor->SendMoveEntry(request, std::move(onResolve), std::move(onReject)); @@ -586,7 +587,7 @@ } void FileSystemRequestHandler::RenameEntry( - RefPtr& aManager, FileSystemHandle* aHandle, + RefPtr& aManager, RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const Name& aName, RefPtr aPromise, // NOLINT(performance-unnecessary-value-param) ErrorResult& aError) { @@ -609,7 +610,7 @@ aManager->BeginRequest( [request = FileSystemRenameEntryRequest(*aEntry, aName), onResolve = SelectResolveCallback( - aPromise, aEntry, aName), + aPromise, std::move(aHandle), aEntry, aName), onReject = GetRejectCallback(aPromise)](const auto& actor) mutable { actor->SendRenameEntry(request, std::move(onResolve), std::move(onReject)); diff -Nru firefox-esr-140.9.1esr/dom/fs/include/fs/FileSystemRequestHandler.h firefox-esr-140.10.0esr/dom/fs/include/fs/FileSystemRequestHandler.h --- firefox-esr-140.9.1esr/dom/fs/include/fs/FileSystemRequestHandler.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/fs/include/fs/FileSystemRequestHandler.h 2026-04-15 01:59:48.000000000 +0000 @@ -69,13 +69,13 @@ ErrorResult& aError); virtual void MoveEntry(RefPtr& aManager, - FileSystemHandle* aHandle, + RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const FileSystemChildMetadata& aNewEntry, RefPtr aPromise, ErrorResult& aError); virtual void RenameEntry(RefPtr& aManager, - FileSystemHandle* aHandle, + RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const Name& aName, RefPtr aPromise, ErrorResult& aError); diff -Nru firefox-esr-140.9.1esr/dom/fs/parent/FileSystemAccessHandle.cpp firefox-esr-140.10.0esr/dom/fs/parent/FileSystemAccessHandle.cpp --- firefox-esr-140.9.1esr/dom/fs/parent/FileSystemAccessHandle.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/fs/parent/FileSystemAccessHandle.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -124,6 +124,9 @@ bool FileSystemAccessHandle::IsOpen() const { return !mClosed; } RefPtr FileSystemAccessHandle::BeginClose() { + if (mClosed) { + return BoolPromise::CreateAndResolve(true, __func__); + } MOZ_ASSERT(IsOpen()); LOG(("Closing AccessHandle")); diff -Nru firefox-esr-140.9.1esr/dom/fs/test/gtest/FileSystemMocks.h firefox-esr-140.10.0esr/dom/fs/test/gtest/FileSystemMocks.h --- firefox-esr-140.9.1esr/dom/fs/test/gtest/FileSystemMocks.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/fs/test/gtest/FileSystemMocks.h 2026-04-15 01:59:48.000000000 +0000 @@ -24,6 +24,7 @@ #include "mozilla/dom/BindingUtils.h" #include "mozilla/dom/DOMException.h" #include "mozilla/dom/DOMExceptionBinding.h" +#include "mozilla/dom/FileSystemHandle.h" #include "mozilla/dom/FileSystemManagerChild.h" #include "mozilla/dom/Promise.h" #include "mozilla/dom/PromiseNativeHandler.h" @@ -92,14 +93,16 @@ (override)); MOCK_METHOD(void, MoveEntry, - (RefPtr & aManager, FileSystemHandle* aHandle, + (RefPtr & aManager, + RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const FileSystemChildMetadata& aNewEntry, RefPtr aPromise, ErrorResult& aError), (override)); MOCK_METHOD(void, RenameEntry, - (RefPtr & aManager, FileSystemHandle* aHandle, + (RefPtr & aManager, + RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const Name& aName, RefPtr aPromise, ErrorResult& aError), (override)); diff -Nru firefox-esr-140.9.1esr/dom/gamepad/GamepadPlatformService.cpp firefox-esr-140.10.0esr/dom/gamepad/GamepadPlatformService.cpp --- firefox-esr-140.9.1esr/dom/gamepad/GamepadPlatformService.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/gamepad/GamepadPlatformService.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -80,8 +80,8 @@ } GamepadPlatformService::GamepadPlatformService() - : mNextGamepadHandleValue(1), - mMutex("mozilla::dom::GamepadPlatformService") {} + : mMutex("mozilla::dom::GamepadPlatformService"), + mNextGamepadHandleValue(1) {} GamepadPlatformService::~GamepadPlatformService() { Cleanup(); } @@ -113,10 +113,6 @@ GamepadChangeEventBody body(aInfo); GamepadChangeEvent e(aHandle, body); - // mChannelParents may be accessed by background thread in the - // same time, we use mutex to prevent possible race condtion - MutexAutoLock autoLock(mMutex); - for (uint32_t i = 0; i < mChannelParents.Length(); ++i) { mChannelParents[i]->DispatchUpdateEvent(e); } @@ -131,16 +127,19 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); - GamepadHandle gamepadHandle{mNextGamepadHandleValue++, - GamepadHandleKind::GamepadPlatformManager}; - // Only VR controllers has displayID, we give 0 to the general gamepads. GamepadAdded a(NS_ConvertUTF8toUTF16(nsDependentCString(aID)), aMapping, aHand, 0, aNumButtons, aNumAxes, aHaptics, aNumLightIndicator, aNumTouchEvents); - mGamepadAdded.emplace(gamepadHandle, a); - NotifyGamepadChange(gamepadHandle, a); + GamepadHandle gamepadHandle; + { + MutexAutoLock autoLock(mMutex); + gamepadHandle = GamepadHandle{mNextGamepadHandleValue++, + GamepadHandleKind::GamepadPlatformManager}; + mGamepadAdded.emplace(gamepadHandle, a); + NotifyGamepadChange(gamepadHandle, a); + } return gamepadHandle; } @@ -150,8 +149,11 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); GamepadRemoved a; - NotifyGamepadChange(aHandle, a); - mGamepadAdded.erase(aHandle); + { + MutexAutoLock autoLock(mMutex); + NotifyGamepadChange(aHandle, a); + mGamepadAdded.erase(aHandle); + } } void GamepadPlatformService::NewButtonEvent(GamepadHandle aHandle, @@ -162,6 +164,7 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); GamepadButtonInformation a(aButton, aValue, aPressed, aTouched); + MutexAutoLock autoLock(mMutex); NotifyGamepadChange(aHandle, a); } @@ -204,6 +207,7 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); GamepadAxisInformation a(aAxis, aValue); + MutexAutoLock autoLock(mMutex); NotifyGamepadChange(aHandle, a); } @@ -214,6 +218,7 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); GamepadLightIndicatorTypeInformation a(aLight, aType); + MutexAutoLock autoLock(mMutex); NotifyGamepadChange(aHandle, a); } @@ -224,6 +229,7 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); GamepadPoseInformation a(aState); + MutexAutoLock autoLock(mMutex); NotifyGamepadChange(aHandle, a); } @@ -236,6 +242,7 @@ MOZ_ASSERT(!NS_IsMainThread()); GamepadTouchInformation a(aTouchArrayIndex, aState); + MutexAutoLock autoLock(mMutex); NotifyGamepadChange(aHandle, a); } @@ -244,6 +251,7 @@ // platform-dependent backends MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); + MutexAutoLock autoLock(mMutex); mNextGamepadHandleValue = 1; } @@ -253,11 +261,11 @@ // is created or removed in Background thread AssertIsOnBackgroundThread(); MOZ_ASSERT(aParent); - MOZ_ASSERT(!mChannelParents.Contains(aParent)); // We use mutex here to prevent race condition with monitor thread { MutexAutoLock autoLock(mMutex); + MOZ_ASSERT(!mChannelParents.Contains(aParent)); mChannelParents.AppendElement(aParent); // For a new GamepadEventChannel, we have to send the exising GamepadAdded @@ -282,11 +290,11 @@ // is created or removed in Background thread AssertIsOnBackgroundThread(); MOZ_ASSERT(aParent); - MOZ_ASSERT(mChannelParents.Contains(aParent)); // We use mutex here to prevent race condition with monitor thread { MutexAutoLock autoLock(mMutex); + MOZ_ASSERT(mChannelParents.Contains(aParent)); mChannelParents.RemoveElement(aParent); if (!mChannelParents.IsEmpty()) { return; diff -Nru firefox-esr-140.9.1esr/dom/gamepad/GamepadPlatformService.h firefox-esr-140.10.0esr/dom/gamepad/GamepadPlatformService.h --- firefox-esr-140.9.1esr/dom/gamepad/GamepadPlatformService.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/gamepad/GamepadPlatformService.h 2026-04-15 01:59:48.000000000 +0000 @@ -75,9 +75,9 @@ GamepadHand aHand, uint32_t aNumButtons, uint32_t aNumAxes, uint32_t aNumHaptics, uint32_t aNumLightIndicator, - uint32_t aNumTouchEvents); + uint32_t aNumTouchEvents) MOZ_EXCLUDES(mMutex); // Remove the gamepad at |aHandle| from the list of known gamepads. - void RemoveGamepad(GamepadHandle aHandle); + void RemoveGamepad(GamepadHandle aHandle) MOZ_EXCLUDES(mMutex); // Update the state of |aButton| for the gamepad at |aHandle| for all // windows that are listening and visible, and fire one of @@ -85,44 +85,51 @@ // aPressed is used for digital buttons, aTouched is for detecting touched // events, aValue is for analog buttons. void NewButtonEvent(GamepadHandle aHandle, uint32_t aButton, bool aPressed, - bool aTouched, double aValue); + bool aTouched, double aValue) MOZ_EXCLUDES(mMutex); // When only a digital button is available the value will be synthesized. - void NewButtonEvent(GamepadHandle aHandle, uint32_t aButton, bool aPressed); + void NewButtonEvent(GamepadHandle aHandle, uint32_t aButton, bool aPressed) + MOZ_EXCLUDES(mMutex); // When only a digital button are available the value will be synthesized. void NewButtonEvent(GamepadHandle aHandle, uint32_t aButton, bool aPressed, - bool aTouched); + bool aTouched) MOZ_EXCLUDES(mMutex); // When only a digital button are available the value will be synthesized. void NewButtonEvent(GamepadHandle aHandle, uint32_t aButton, bool aPressed, - double aValue); + double aValue) MOZ_EXCLUDES(mMutex); // Update the state of |aAxis| for the gamepad at |aHandle| for all // windows that are listening and visible, and fire a gamepadaxismove // event at them as well. - void NewAxisMoveEvent(GamepadHandle aHandle, uint32_t aAxis, double aValue); + void NewAxisMoveEvent(GamepadHandle aHandle, uint32_t aAxis, double aValue) + MOZ_EXCLUDES(mMutex); // Update the state of |aState| for the gamepad at |aHandle| for all // windows that are listening and visible. - void NewPoseEvent(GamepadHandle aHandle, const GamepadPoseState& aState); + void NewPoseEvent(GamepadHandle aHandle, const GamepadPoseState& aState) + MOZ_EXCLUDES(mMutex); // Update the type of |aType| for the gamepad at |aHandle| for all // windows that are listening and visible. void NewLightIndicatorTypeEvent(GamepadHandle aHandle, uint32_t aLight, - GamepadLightIndicatorType aType); + GamepadLightIndicatorType aType) + MOZ_EXCLUDES(mMutex); // Update the state of |aState| for the gamepad at |aHandle| with // |aTouchArrayIndex| for all windows that are listening and visible. void NewMultiTouchEvent(GamepadHandle aHandle, uint32_t aTouchArrayIndex, - const GamepadTouchState& aState); + const GamepadTouchState& aState) MOZ_EXCLUDES(mMutex); // When shutting down the platform communications for gamepad, also reset the // indexes. - void ResetGamepadIndexes(); + void ResetGamepadIndexes() MOZ_EXCLUDES(mMutex); // Add IPDL parent instance - void AddChannelParent(GamepadEventChannelParent* aParent); + void AddChannelParent(GamepadEventChannelParent* aParent) + MOZ_EXCLUDES(mMutex); // Remove IPDL parent instance - void RemoveChannelParent(GamepadEventChannelParent* aParent); + void RemoveChannelParent(GamepadEventChannelParent* aParent) + MOZ_EXCLUDES(mMutex); - void MaybeShutdown(); + void MaybeShutdown() MOZ_EXCLUDES(mMutex); - nsTArray GetAllGamePads() { + nsTArray GetAllGamePads() MOZ_EXCLUDES(mMutex) { + MutexAutoLock autoLock(mMutex); nsTArray gamepads; for (const auto& elem : mGamepadAdded) { @@ -135,23 +142,24 @@ GamepadPlatformService(); ~GamepadPlatformService(); template - void NotifyGamepadChange(GamepadHandle aHandle, const T& aInfo); + void NotifyGamepadChange(GamepadHandle aHandle, const T& aInfo) + MOZ_REQUIRES(mMutex); - void Cleanup(); + void Cleanup() MOZ_EXCLUDES(mMutex); - // mNextGamepadHandleValue can only be accessed by monitor thread - uint32_t mNextGamepadHandleValue; + // This mutex protects mNextGamepadHandleValue, mChannelParents, and + // mGamepadAdded from race condition between background and monitor thread + Mutex mMutex; + + uint32_t mNextGamepadHandleValue MOZ_GUARDED_BY(mMutex); // mChannelParents stores all the GamepadEventChannelParent instances // which may be accessed by both background thread and monitor thread - // simultaneously, so we have a mutex to prevent race condition - nsTArray> mChannelParents; - - // This mutex protects mChannelParents from race condition - // between background and monitor thread - Mutex mMutex MOZ_UNANNOTATED; + // simultaneously + nsTArray> mChannelParents + MOZ_GUARDED_BY(mMutex); - std::map mGamepadAdded; + std::map mGamepadAdded MOZ_GUARDED_BY(mMutex); }; } // namespace mozilla::dom diff -Nru firefox-esr-140.9.1esr/dom/gamepad/GamepadRemapping.cpp firefox-esr-140.10.0esr/dom/gamepad/GamepadRemapping.cpp --- firefox-esr-140.9.1esr/dom/gamepad/GamepadRemapping.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/gamepad/GamepadRemapping.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -477,10 +477,16 @@ return MAX_INPUT_LEN; } - virtual void ProcessTouchData(GamepadHandle aHandle, void* aInput) override { + static constexpr size_t kMinTouchReportLen = 43; + + virtual void ProcessTouchData(GamepadHandle aHandle, const uint8_t* aInput, + size_t aInputLen) override { + if (aInputLen < kMinTouchReportLen) { + return; + } nsTArray touches(TOUCH_EVENT_COUNT); touches.SetLength(TOUCH_EVENT_COUNT); - uint8_t* rawData = (uint8_t*)aInput; + const uint8_t* rawData = aInput; const uint32_t kTouchDimensionX = 1920; const uint32_t kTouchDimensionY = 942; diff -Nru firefox-esr-140.9.1esr/dom/gamepad/GamepadRemapping.h firefox-esr-140.10.0esr/dom/gamepad/GamepadRemapping.h --- firefox-esr-140.9.1esr/dom/gamepad/GamepadRemapping.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/gamepad/GamepadRemapping.h 2026-04-15 01:59:49.000000000 +0000 @@ -152,7 +152,8 @@ virtual GamepadMappingType GetMappingType() const { return GamepadMappingType::Standard; } - virtual void ProcessTouchData(GamepadHandle aHandle, void* aInput) {} + virtual void ProcessTouchData(GamepadHandle aHandle, const uint8_t* aInput, + size_t aInputLen) {} virtual void RemapAxisMoveEvent(GamepadHandle aHandle, uint32_t aAxis, double aValue) const = 0; virtual void RemapButtonEvent(GamepadHandle aHandle, uint32_t aButton, diff -Nru firefox-esr-140.9.1esr/dom/gamepad/cocoa/CocoaGamepad.cpp firefox-esr-140.10.0esr/dom/gamepad/cocoa/CocoaGamepad.cpp --- firefox-esr-140.9.1esr/dom/gamepad/cocoa/CocoaGamepad.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/gamepad/cocoa/CocoaGamepad.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -7,6 +7,8 @@ // mostly derived from the Allegro source code at: // http://alleg.svn.sourceforge.net/viewvc/alleg/allegro/branches/4.9/src/macosx/hidjoy.m?revision=13760&view=markup +#include "mozilla/Atomics.h" +#include "mozilla/Mutex.h" #include "mozilla/dom/GamepadHandle.h" #include "mozilla/dom/GamepadPlatformService.h" #include "mozilla/dom/GamepadRemapping.h" @@ -96,6 +98,7 @@ bool operator==(IOHIDDeviceRef device) const { return mDevice == device; } bool empty() const { return mDevice == nullptr; } + IOHIDDeviceRef Device() const { return mDevice; } void clear() { mDevice = nullptr; buttons.Clear(); @@ -104,7 +107,6 @@ } void init(IOHIDDeviceRef device, bool defaultRemapper); void ReportChanged(uint8_t* report, CFIndex report_length); - size_t WriteOutputReport(const std::vector& aReport) const; size_t numButtons() { return buttons.Length(); } size_t numAxes() { return axes.Length(); } @@ -200,12 +202,13 @@ class DarwinGamepadService { private: IOHIDManagerRef mManager; - nsTArray mGamepads; + Mutex mGamepadsMutex; + nsTArray mGamepads MOZ_GUARDED_BY(mGamepadsMutex); nsCOMPtr mMonitorThread; nsCOMPtr mBackgroundThread; nsCOMPtr mPollingTimer; - bool mIsRunning; + Atomic mIsRunning; static void DeviceAddedCallback(void* data, IOReturn result, void* sender, IOHIDDeviceRef device); @@ -292,6 +295,12 @@ return; } + // Holding the lock through IOHIDDeviceRegisterInputReportCallback is safe: + // ReportChangedCallback (which also acquires this lock) is only ever invoked + // from within CFRunLoopRunInMode on the monitor thread, which is not running + // while DeviceAdded is executing. + MutexAutoLock lock(mGamepadsMutex); + size_t slot = size_t(-1); for (size_t i = 0; i < mGamepads.Length(); i++) { if (mGamepads[i] == device) return; @@ -368,6 +377,11 @@ if (!service) { return; } + // Same reasoning as DeviceAdded: holding the lock through + // IOHIDDeviceRegisterInputReportCallback (the unregister call) is safe + // because ReportChangedCallback only runs from within CFRunLoopRunInMode on + // the monitor thread, which is not running while DeviceRemoved executes. + MutexAutoLock lock(mGamepadsMutex); for (Gamepad& gamepad : mGamepads) { if (gamepad == device) { IOHIDDeviceRegisterInputReportCallback( @@ -390,6 +404,7 @@ if (context && report_type == kIOHIDReportTypeInput && report_length) { auto reportContext = static_cast(context); DarwinGamepadService* service = reportContext->service; + MutexAutoLock lock(service->mGamepadsMutex); service->mGamepads[reportContext->gamepadSlot].ReportChanged(report, report_length); } @@ -397,16 +412,7 @@ void Gamepad::ReportChanged(uint8_t* report, CFIndex report_len) { MOZ_RELEASE_ASSERT(report_len <= mRemapper->GetMaxInputReportLength()); - mRemapper->ProcessTouchData(mHandle, report); -} - -size_t Gamepad::WriteOutputReport(const std::vector& aReport) const { - IOReturn success = - IOHIDDeviceSetReport(mDevice, kIOHIDReportTypeOutput, aReport[0], - aReport.data(), aReport.size()); - - MOZ_ASSERT(success == kIOReturnSuccess); - return (success == kIOReturnSuccess) ? aReport.size() : 0; + mRemapper->ProcessTouchData(mHandle, report, report_len); } void DarwinGamepadService::InputValueChanged(IOHIDValueRef value) { @@ -425,6 +431,7 @@ IOHIDElementRef element = IOHIDValueGetElement(value); IOHIDDeviceRef device = IOHIDElementGetDevice(element); + MutexAutoLock lock(mGamepadsMutex); for (Gamepad& gamepad : mGamepads) { if (gamepad == device) { // Axis elements represent axes and d-pads. @@ -505,7 +512,9 @@ } DarwinGamepadService::DarwinGamepadService() - : mManager(nullptr), mIsRunning(false) {} + : mManager(nullptr), + mGamepadsMutex("DarwinGamepadService::mGamepads"), + mIsRunning(false) {} DarwinGamepadService::~DarwinGamepadService() { if (mManager != nullptr) CFRelease(mManager); @@ -612,24 +621,38 @@ const uint8_t& aGreen, const uint8_t& aBlue) { // We get aControllerIdx from GamepadPlatformService::AddGamepad(), // It begins from 1 and is stored at Gamepad.id. - const Gamepad* gamepad = MOZ_FIND_AND_VALIDATE( - aGamepadHandle, list_item.mHandle == aGamepadHandle, mGamepads); - if (!gamepad) { - MOZ_ASSERT(false); - return; - } + IOHIDDeviceRef device = nullptr; + std::vector report; + { + MutexAutoLock lock(mGamepadsMutex); + // the tainting macro confuses clang + MOZ_PUSH_IGNORE_THREAD_SAFETY + const Gamepad* gamepad = MOZ_FIND_AND_VALIDATE( + aGamepadHandle, list_item.mHandle == aGamepadHandle, mGamepads); + MOZ_POP_THREAD_SAFETY + if (!gamepad) { + MOZ_ASSERT(false); + return; + } - RefPtr remapper = gamepad->mRemapper; - if (!remapper || - MOZ_IS_VALID(aLightColorIndex, - remapper->GetLightIndicatorCount() <= aLightColorIndex)) { - MOZ_ASSERT(false); - return; - } + RefPtr remapper = gamepad->mRemapper; + if (!remapper || + MOZ_IS_VALID(aLightColorIndex, + remapper->GetLightIndicatorCount() <= aLightColorIndex)) { + MOZ_ASSERT(false); + return; + } - std::vector report; - remapper->GetLightColorReport(aRed, aGreen, aBlue, report); - gamepad->WriteOutputReport(report); + remapper->GetLightColorReport(aRed, aGreen, aBlue, report); + device = gamepad->Device(); + } + if (device) { + IOReturn success = IOHIDDeviceSetReport(device, kIOHIDReportTypeOutput, + report[0], report.data(), + report.size()); + MOZ_ASSERT(success == kIOReturnSuccess); + (void)success; + } } } // namespace diff -Nru firefox-esr-140.9.1esr/dom/gamepad/windows/WindowsGamepad.cpp firefox-esr-140.10.0esr/dom/gamepad/windows/WindowsGamepad.cpp --- firefox-esr-140.9.1esr/dom/gamepad/windows/WindowsGamepad.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/gamepad/windows/WindowsGamepad.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -883,8 +883,8 @@ } } - BYTE* rawData = raw->data.hid.bRawData; - gamepad->remapper->ProcessTouchData(gamepad->gamepadHandle, rawData); + gamepad->remapper->ProcessTouchData( + gamepad->gamepadHandle, raw->data.hid.bRawData, raw->data.hid.dwSizeHid); return true; } diff -Nru firefox-esr-140.9.1esr/dom/geolocation/Geolocation.cpp firefox-esr-140.10.0esr/dom/geolocation/Geolocation.cpp --- firefox-esr-140.9.1esr/dom/geolocation/Geolocation.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/geolocation/Geolocation.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -1018,9 +1018,12 @@ } void nsGeolocationService::MoveLocators(nsGeolocationService* aService) { - for (uint32_t i = 0; i < mGeolocators.Length(); i++) { - aService->AddLocator(mGeolocators[i]); + for (Geolocation* loc : mGeolocators) { + aService->AddLocator(loc); + loc->SetService(aService); } + + mGeolocators.Clear(); } //////////////////////////////////////////////////// diff -Nru firefox-esr-140.9.1esr/dom/geolocation/Geolocation.h firefox-esr-140.10.0esr/dom/geolocation/Geolocation.h --- firefox-esr-140.9.1esr/dom/geolocation/Geolocation.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/geolocation/Geolocation.h 2026-04-15 01:59:48.000000000 +0000 @@ -126,6 +126,8 @@ * Can return a geolocation info */ class Geolocation final : public nsIGeolocationUpdate, public nsWrapperCache { + friend class ::nsGeolocationService; + public: NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(Geolocation) @@ -234,6 +236,9 @@ // Initates the asynchronous process of filling the request. static void RequestIfPermitted(nsGeolocationRequest* request); + // Allow updating service for shutdown deregistering + void SetService(nsGeolocationService* aService) { mService = aService; } + // Two callback arrays. The first |mPendingCallbacks| holds objects for only // one callback and then they are released/removed from the array. The second // |mWatchingCallbacks| holds objects until the object is explicitly removed diff -Nru firefox-esr-140.9.1esr/dom/html/HTMLAllCollection.cpp firefox-esr-140.10.0esr/dom/html/HTMLAllCollection.cpp --- firefox-esr-140.9.1esr/dom/html/HTMLAllCollection.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/html/HTMLAllCollection.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -151,40 +151,7 @@ } void HTMLAllCollection::GetSupportedNames(nsTArray& aNames) { - // XXXbz this is very similar to nsContentList::GetSupportedNames, - // but has to check IsAllNamedElement for the name case. - AutoTArray atoms; - for (uint32_t i = 0; i < Length(); ++i) { - nsIContent* content = Item(i); - if (content->HasID()) { - nsAtom* id = content->GetID(); - MOZ_ASSERT(id != nsGkAtoms::_empty, "Empty ids don't get atomized"); - if (!atoms.Contains(id)) { - atoms.AppendElement(id); - } - } - - nsGenericHTMLElement* el = nsGenericHTMLElement::FromNode(content); - if (el) { - // Note: nsINode::HasName means the name is exposed on the document, - // which is false for options, so we don't check it here. - const nsAttrValue* val = el->GetParsedAttr(nsGkAtoms::name); - if (val && val->Type() == nsAttrValue::eAtom && - IsAllNamedElement(content)) { - nsAtom* name = val->GetAtomValue(); - MOZ_ASSERT(name != nsGkAtoms::_empty, "Empty names don't get atomized"); - if (!atoms.Contains(name)) { - atoms.AppendElement(name); - } - } - } - } - - uint32_t atomsLen = atoms.Length(); - nsString* names = aNames.AppendElements(atomsLen); - for (uint32_t i = 0; i < atomsLen; ++i) { - atoms[i]->ToString(names[i]); - } + Collection()->GetSupportedNames(aNames, IsAllNamedElement); } JSObject* HTMLAllCollection::WrapObject(JSContext* aCx, diff -Nru firefox-esr-140.9.1esr/dom/html/HTMLFormElement.cpp firefox-esr-140.10.0esr/dom/html/HTMLFormElement.cpp --- firefox-esr-140.9.1esr/dom/html/HTMLFormElement.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/html/HTMLFormElement.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -249,7 +249,7 @@ // 1-4 of // https://html.spec.whatwg.org/multipage/forms.html#concept-form-submit - Document* doc = GetComposedDoc(); + RefPtr doc = GetComposedDoc(); if (mIsConstructingEntryList || !doc || (doc->GetSandboxFlags() & SANDBOXED_FORMS)) { return; diff -Nru firefox-esr-140.9.1esr/dom/html/HTMLMediaElement.cpp firefox-esr-140.10.0esr/dom/html/HTMLMediaElement.cpp --- firefox-esr-140.9.1esr/dom/html/HTMLMediaElement.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/html/HTMLMediaElement.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -2161,6 +2161,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK(mMediaKeys) NS_IMPL_CYCLE_COLLECTION_UNLINK(mIncomingMediaKeys) NS_IMPL_CYCLE_COLLECTION_UNLINK(mSelectedVideoStreamTrack) + tmp->mSelectedVideoStreamTrackGraph = nullptr; NS_IMPL_CYCLE_COLLECTION_UNLINK(mPendingPlayPromises) NS_IMPL_CYCLE_COLLECTION_UNLINK(mSeekDOMPromise) NS_IMPL_CYCLE_COLLECTION_UNLINK(mSetMediaKeysDOMPromise) @@ -2882,17 +2883,24 @@ mSelectedVideoStreamTrack = t->GetVideoStreamTrack(); mSelectedVideoStreamTrack->AddPrincipalChangeObserver(this); - if (mMediaStreamRenderer) { - mMediaStreamRenderer->AddTrack(mSelectedVideoStreamTrack); - } - if (mSecondaryMediaStreamRenderer) { - mSecondaryMediaStreamRenderer->AddTrack(mSelectedVideoStreamTrack); + if (!mSelectedVideoStreamTrackGraph) { + mSelectedVideoStreamTrackGraph = mSelectedVideoStreamTrack->Graph(); } - if (mMediaInfo.HasVideo()) { - mMediaInfo.mVideo.SetAlpha(mSelectedVideoStreamTrack->HasAlpha()); + if (mSelectedVideoStreamTrackGraph == + mSelectedVideoStreamTrack->Graph()) { + if (mMediaStreamRenderer) { + mMediaStreamRenderer->AddTrack(mSelectedVideoStreamTrack); + } + if (mSecondaryMediaStreamRenderer) { + mSecondaryMediaStreamRenderer->AddTrack(mSelectedVideoStreamTrack); + } + if (mMediaInfo.HasVideo()) { + mMediaInfo.mVideo.SetAlpha(mSelectedVideoStreamTrack->HasAlpha()); + } + nsContentUtils::CombineResourcePrincipals( + &mSrcStreamVideoPrincipal, + mSelectedVideoStreamTrack->GetPrincipal()); } - nsContentUtils::CombineResourcePrincipals( - &mSrcStreamVideoPrincipal, mSelectedVideoStreamTrack->GetPrincipal()); } } @@ -5484,6 +5492,7 @@ mSelectedVideoStreamTrack->RemovePrincipalChangeObserver(this); } mSelectedVideoStreamTrack = nullptr; + mSelectedVideoStreamTrackGraph = nullptr; MOZ_ASSERT_IF(mSecondaryMediaStreamRenderer, !mMediaStreamRenderer == !mSecondaryMediaStreamRenderer); diff -Nru firefox-esr-140.9.1esr/dom/html/HTMLMediaElement.h firefox-esr-140.10.0esr/dom/html/HTMLMediaElement.h --- firefox-esr-140.9.1esr/dom/html/HTMLMediaElement.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/html/HTMLMediaElement.h 2026-04-15 01:59:49.000000000 +0000 @@ -1490,6 +1490,7 @@ // The currently selected video stream track. RefPtr mSelectedVideoStreamTrack; + MediaTrackGraph* mSelectedVideoStreamTrackGraph = nullptr; const RefPtr mShutdownObserver; diff -Nru firefox-esr-140.9.1esr/dom/html/HTMLSlotElement.cpp firefox-esr-140.10.0esr/dom/html/HTMLSlotElement.cpp --- firefox-esr-140.9.1esr/dom/html/HTMLSlotElement.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/html/HTMLSlotElement.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -231,7 +231,9 @@ if (!mAssignedNodes.IsEmpty()) { changedSlots.EnsureInserted(this); if (root) { - root->InvalidateStyleAndLayoutOnSubtree(this); + // If not in a shadow tree, the flat tree is not really changing, so no + // need to invalidate layout. Same applies to other callers here. + ShadowRoot::InvalidateStyleAndLayoutOnSubtree(this); } ClearAssignedNodes(); } @@ -252,29 +254,27 @@ // XXXsmaug Should we have a helper for // https://infra.spec.whatwg.org/#ordered-set? if (content->GetManualSlotAssignment() != this) { - if (HTMLSlotElement* oldSlot = content->GetAssignedSlot()) { - if (changedSlots.EnsureInserted(oldSlot)) { - if (root) { - MOZ_ASSERT(oldSlot->GetContainingShadow() == root); - root->InvalidateStyleAndLayoutOnSubtree(oldSlot); - } + // Step 3.1: If content's manual slot assignment refers to a slot, + // then remove node from that slot's manually assigned nodes. + if (HTMLSlotElement* prevSlot = content->GetManualSlotAssignment()) { + ShadowRoot* prevSlotRoot = prevSlot->GetContainingShadow(); + const bool wasAssigned = content->GetAssignedSlot() == prevSlot; + if (wasAssigned && prevSlotRoot && + changedSlots.EnsureInserted(prevSlot)) { + ShadowRoot::InvalidateStyleAndLayoutOnSubtree(prevSlot); } + prevSlot->RemoveManuallyAssignedNode(*content); } - if (changedSlots.EnsureInserted(this)) { - if (root) { - root->InvalidateStyleAndLayoutOnSubtree(this); - } - } - // 3.1 (HTML Spec) If content's manual slot assignment refers to a slot, - // then remove node from that slot's manually assigned nodes. 3.2 (HTML - // Spec) Set content's manual slot assignment to this. - if (HTMLSlotElement* oldSlot = content->GetManualSlotAssignment()) { - oldSlot->RemoveManuallyAssignedNode(*content); - } + // Step 3.2: Set content's manual slot assignment to this. content->SetManualSlotAssignment(this); + // Step 3.3: Append content to nodesSet. mManuallyAssignedNodes.AppendElement(content); + if (changedSlots.EnsureInserted(this) && root) { + ShadowRoot::InvalidateStyleAndLayoutOnSubtree(this); + } + if (root && host && content->GetParent() == host) { // Equivalent to 4.2.2.4.3 (DOM Spec) `Set slot's assigned nodes to // slottables` @@ -295,7 +295,11 @@ } } } - MOZ_ASSERT(changedSlots.IsEmpty()); + } + // Fire slotchange for any remaining slots that are in a different shadow + // tree (cross-root case). The spec doesn't define an ordering here. + for (const auto& slot : changedSlots) { + slot->EnqueueSlotChangeEvent(); } } diff -Nru firefox-esr-140.9.1esr/dom/html/TextTrackManager.cpp firefox-esr-140.10.0esr/dom/html/TextTrackManager.cpp --- firefox-esr-140.9.1esr/dom/html/TextTrackManager.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/html/TextTrackManager.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -202,6 +202,7 @@ for (uint32_t i = 0; i < cueList->Length(); ++i) { mNewCues->AddCue(*cueList->IndexedGetter(i, dummy)); } + RefPtr kungFuDeathGrip(this); MaybeRunTimeMarchesOn(); } } @@ -226,6 +227,7 @@ for (uint32_t i = 0; i < removeCueList->Length(); ++i) { mNewCues->RemoveCue(*((*removeCueList)[i])); } + RefPtr kungFuDeathGrip(this); MaybeRunTimeMarchesOn(); } } @@ -288,6 +290,7 @@ if (mNewCues) { mNewCues->AddCue(aCue); } + RefPtr kungFuDeathGrip(this); MaybeRunTimeMarchesOn(); } @@ -296,6 +299,7 @@ if (mNewCues) { mNewCues->RemoveCue(aCue); } + RefPtr kungFuDeathGrip(this); MaybeRunTimeMarchesOn(); DispatchUpdateCueDisplay(); } @@ -342,7 +346,7 @@ // Step 4: Set all TextTracks with a kind of metadata that are disabled // to hidden. for (uint32_t i = 0; i < mTextTracks->Length(); i++) { - TextTrack* track = (*mTextTracks)[i]; + RefPtr track = (*mTextTracks)[i]; if (track->Kind() == TextTrackKind::Metadata && TrackIsDefault(track) && track->Mode() == TextTrackMode::Disabled) { track->SetMode(TextTrackMode::Hidden); @@ -383,11 +387,11 @@ // first TextTrack in candidates with a default attribute to showing. // TODO: Bug 981691 - Honor user preferences for text track selection. for (uint32_t i = 0; i < candidates.Length(); i++) { - if (TrackIsDefault(candidates[i]) && - candidates[i]->Mode() == TextTrackMode::Disabled) { - candidates[i]->SetMode(TextTrackMode::Showing); + RefPtr track = candidates[i]; + if (TrackIsDefault(track) && track->Mode() == TextTrackMode::Disabled) { + track->SetMode(TextTrackMode::Showing); WEBVTT_LOGV("PerformTrackSelection set Showing kind %d", - static_cast(candidates[i]->Kind())); + static_cast(track->Kind())); return; } } @@ -831,6 +835,7 @@ void TextTrackManager::NotifyCueUpdated(TextTrackCue* aCue) { // TODO: Add/Reorder the cue to mNewCues if we have some optimization? WEBVTT_LOG("NotifyCueUpdated, cue=%p", aCue); + RefPtr kungFuDeathGrip(this); MaybeRunTimeMarchesOn(); // For the case "Texttrack.mode = hidden/showing", if the mode // changing between showing and hidden, TimeMarchesOn diff -Nru firefox-esr-140.9.1esr/dom/indexedDB/ActorsParent.cpp firefox-esr-140.10.0esr/dom/indexedDB/ActorsParent.cpp --- firefox-esr-140.9.1esr/dom/indexedDB/ActorsParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/indexedDB/ActorsParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -17028,6 +17028,8 @@ if (HasFailed()) { mResolver(ClampResultCode(ResultCode())); } else { + std::sort(mDatabaseMetadataArray.begin(), mDatabaseMetadataArray.end(), + [](const auto& a, const auto& b) { return a.name() < b.name(); }); mResolver(mDatabaseMetadataArray); } diff -Nru firefox-esr-140.9.1esr/dom/indexedDB/IDBObjectStore.cpp firefox-esr-140.10.0esr/dom/indexedDB/IDBObjectStore.cpp --- firefox-esr-140.9.1esr/dom/indexedDB/IDBObjectStore.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/indexedDB/IDBObjectStore.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -454,9 +454,15 @@ RefPtr blob = fileChild.BlobPtr(); MOZ_ASSERT(blob->IsFile()); - RefPtr file = blob->ToFile(); + RefPtr file; + if (blob->HasExpandos()) { + const RefPtr clonedBlob = blob->Clone(); + file = clonedBlob->ToFile(); + } else { + file = blob->ToFile(); + } if (!file) { - MOZ_ASSERT(false, "Could not convert blob to file!"); + MOZ_ASSERT(false, "Could not create file!"); return nullptr; } @@ -489,11 +495,29 @@ StructuredCloneFileChild& file = cloneInfo->mFiles[aData]; switch (static_cast(aTag)) { - case SCTAG_DOM_BLOB: + case SCTAG_DOM_BLOB: { MOZ_ASSERT(file.Type() == StructuredCloneFileBase::eBlob); MOZ_ASSERT(!file.Blob().IsFile()); - return WrapAsJSObject(aCx, file.MutableBlob()); + JS::Rooted result(aCx); + if (file.Blob().HasExpandos()) { + const RefPtr newBlob = file.Blob().Clone(); + MOZ_ASSERT(newBlob); + + if (!WrapAsJSObject(aCx, newBlob, &result)) { + return nullptr; + } + } else { + // If the blob has no expandos, we can return the existing wrapper + // directly. This is an optimization over step 10 of + // https://w3c.github.io/IndexedDB/#add-or-put since the result is + // observably equivalent when there are no user-added properties. + if (!WrapAsJSObject(aCx, file.MutableBlob(), &result)) { + return nullptr; + } + } + return result; + } case SCTAG_DOM_FILE: { MOZ_ASSERT(file.Type() == StructuredCloneFileBase::eBlob); @@ -502,15 +526,30 @@ { // Create a scope so ~RefPtr fires before returning an unwrapped - // JS::Value. + // JSObject*. Otherwise ~JS::Rooted will unroot the object, then + // ~RefPtr will trigger GC before the value is returned and rooted + // again by the caller. + // See bug 1480640 for details. const RefPtr blob = file.BlobPtr(); MOZ_ASSERT(blob->IsFile()); - const RefPtr file = blob->ToFile(); - MOZ_ASSERT(file); - - if (!WrapAsJSObject(aCx, file, &result)) { - return nullptr; + // Same logic as blob above: clone only if necessary + if (blob->HasExpandos()) { + const RefPtr clonedBlob = blob->Clone(); + MOZ_ASSERT(clonedBlob); + const RefPtr file = clonedBlob->ToFile(); + MOZ_ASSERT(file); + + if (!WrapAsJSObject(aCx, file, &result)) { + return nullptr; + } + } else { + const RefPtr file = blob->ToFile(); + MOZ_ASSERT(file); + + if (!WrapAsJSObject(aCx, file, &result)) { + return nullptr; + } } } diff -Nru firefox-esr-140.9.1esr/dom/indexedDB/Key.cpp firefox-esr-140.10.0esr/dom/indexedDB/Key.cpp --- firefox-esr-140.9.1esr/dom/indexedDB/Key.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/indexedDB/Key.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -940,6 +940,12 @@ return Err(NS_ERROR_DOM_INDEXEDDB_DATA_ERR); } + JSObject* obj = aArrayBufferOrView.asObjectUnbarriered(); + if (JS::IsSharedArrayBufferObject(obj) || + (JS_IsArrayBufferViewObject(obj) && JS::IsArrayBufferViewShared(obj))) { + return Err(NS_ERROR_DOM_INDEXEDDB_DATA_ERR); + } + // 1. Let aData be the result of getting the bytes held by the buffer source // input. // 2. Return a new key with type binary and value aData. diff -Nru firefox-esr-140.9.1esr/dom/interfaces/base/nsIDOMWindowUtils.idl firefox-esr-140.10.0esr/dom/interfaces/base/nsIDOMWindowUtils.idl --- firefox-esr-140.9.1esr/dom/interfaces/base/nsIDOMWindowUtils.idl 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/interfaces/base/nsIDOMWindowUtils.idl 2026-04-15 01:59:48.000000000 +0000 @@ -2193,7 +2193,7 @@ /** * Start capturing each WebRender frame to disk. * - * |aPath| is the name of a new directory to be created to hold the captures. + * a new directory with name "wr-capture" is created to hold the captures. * it is relative to: * - the |PUBLIC_STORAGE| environment variable, if set, else * - the |MOZ_UPLOAD_DIR| environment variable, if set, else @@ -2201,15 +2201,14 @@ * the current directory. * * If there is already a directory with the given name, a numeric suffix is - * added to ensure a fresh directory is created. This means that you can't - * be sure your capture directory is actually named |aPath|. + * added to ensure a fresh directory is created. * * |aFlags| is a set of flags from |webrender::render_api::CaptureBits|. * * If there is already a sequence capture in progress, stop it and start a new * one, with the new path and flags. */ - void wrStartCaptureSequence(in ACString aPath, in uint32_t aFlags); + void wrStartCaptureSequence(in uint32_t aFlags); /** * Stop a capture begun with |wrStartCaptureSequence|. diff -Nru firefox-esr-140.9.1esr/dom/ipc/BrowserBridgeParent.cpp firefox-esr-140.10.0esr/dom/ipc/BrowserBridgeParent.cpp --- firefox-esr-140.9.1esr/dom/ipc/BrowserBridgeParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/ipc/BrowserBridgeParent.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -287,6 +287,9 @@ return IPC_FAIL(this, "Embedder doc shouldn't change from one doc to another"); } + if (aDoc && aDoc->Manager() != Manager()) { + return IPC_FAIL(this, "Embedder doc not managed by our PBrowser"); + } if (!aDoc && mEmbedderAccessibleDoc && !mEmbedderAccessibleDoc->IsShutdown()) { // We're clearing the embedder doc, so remove the pending child doc addition diff -Nru firefox-esr-140.9.1esr/dom/ipc/BrowserParent.cpp firefox-esr-140.10.0esr/dom/ipc/BrowserParent.cpp --- firefox-esr-140.9.1esr/dom/ipc/BrowserParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/ipc/BrowserParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -2287,6 +2287,12 @@ } } } + // SetFocus may have run script (blur handlers) that destroyed this + // actor. Callers hold a strong reference to us to reading + // mIsDestroyed is safe, but do not send an IPC message in that case. + if (mIsDestroyed) { + return false; + } } return Manager()->IsInputPriorityEventEnabled() ? PBrowserParent::SendHandleTap( diff -Nru firefox-esr-140.9.1esr/dom/ipc/BrowserParent.h firefox-esr-140.10.0esr/dom/ipc/BrowserParent.h --- firefox-esr-140.9.1esr/dom/ipc/BrowserParent.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/ipc/BrowserParent.h 2026-04-15 01:59:49.000000000 +0000 @@ -590,6 +590,9 @@ bool SendSelectionEvent(mozilla::WidgetSelectionEvent& aEvent); + // TODO(bug 2028623): Mark this function and callers as MOZ_CAN_RUN_SCRIPT. + // Current callers hold a strong reference to `this` but MOZ_CAN_RUN_SCRIPT + // would enforce that via static analysis. MOZ_CAN_RUN_SCRIPT_BOUNDARY bool SendHandleTap( TapType aType, const LayoutDevicePoint& aPoint, Modifiers aModifiers, const ScrollableLayerGuid& aGuid, uint64_t aInputBlockId, diff -Nru firefox-esr-140.9.1esr/dom/ipc/ClonedErrorHolder.cpp firefox-esr-140.10.0esr/dom/ipc/ClonedErrorHolder.cpp --- firefox-esr-140.9.1esr/dom/ipc/ClonedErrorHolder.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/ipc/ClonedErrorHolder.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -174,7 +174,12 @@ bool ClonedErrorHolder::WriteStructuredClone(JSContext* aCx, JSStructuredCloneWriter* aWriter, StructuredCloneHolder* aHolder) { - auto& data = mStack.BufferData(); + const auto& data = mStack.BufferData(); + CheckedUint32 dataSize(data.Size()); + if (!dataSize.isValid()) { + return false; + } + return JS_WriteUint32Pair(aWriter, SCTAG_DOM_CLONED_ERROR_OBJECT, 0) && WriteStringPair(aWriter, mName, mMessage) && WriteStringPair(aWriter, mFilename, mSourceLine) && @@ -183,7 +188,7 @@ JS_WriteUint32Pair(aWriter, mTokenOffset, mErrorNumber) && JS_WriteUint32Pair(aWriter, uint32_t(mType), uint32_t(mExnType)) && JS_WriteUint32Pair(aWriter, mCode, uint32_t(mResult)) && - JS_WriteUint32Pair(aWriter, data.Size(), + JS_WriteUint32Pair(aWriter, dataSize.value(), JS_STRUCTURED_CLONE_VERSION) && data.ForEachDataChunk([&](const char* aData, size_t aSize) { return JS_WriteBytes(aWriter, aData, aSize); diff -Nru firefox-esr-140.9.1esr/dom/ipc/ContentParent.cpp firefox-esr-140.10.0esr/dom/ipc/ContentParent.cpp --- firefox-esr-140.9.1esr/dom/ipc/ContentParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/ipc/ContentParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -4413,22 +4413,21 @@ const bool& aMinimizeMemoryUsage, const Maybe& aDMDFile) { // This automatically cancels the previous request. mMemoryReportRequest = MakeUnique(aGeneration); - // If we run the callback in response to a reply, then by definition |this| - // is still alive, so the ref pointer is redundant, but it seems easier - // to hold a strong reference than to worry about that. RefPtr self(this); - PContentParent::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [&, self](const uint32_t& aGeneration2) { - if (self->mMemoryReportRequest) { - self->mMemoryReportRequest->Finish(aGeneration2); - self->mMemoryReportRequest = nullptr; - } - }, - [&, self](mozilla::ipc::ResponseRejectReason) { - self->mMemoryReportRequest = nullptr; - }); - return IPC_OK(); + PContentParent::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [self](uint32_t aGeneration2) { + if (self->mMemoryReportRequest) { + self->mMemoryReportRequest->Finish(aGeneration2); + self->mMemoryReportRequest = nullptr; + } + }, + [self](mozilla::ipc::ResponseRejectReason) { + self->mMemoryReportRequest = nullptr; + }); + return true; } mozilla::ipc::IPCResult ContentParent::RecvAddMemoryReport( diff -Nru firefox-esr-140.9.1esr/dom/ipc/PBrowser.ipdl firefox-esr-140.10.0esr/dom/ipc/PBrowser.ipdl --- firefox-esr-140.9.1esr/dom/ipc/PBrowser.ipdl 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/ipc/PBrowser.ipdl 2026-04-15 01:59:49.000000000 +0000 @@ -30,6 +30,7 @@ include PBackgroundSharedTypes; include "mozilla/AntiTrackingIPCUtils.h"; +include "mozilla/EnumSet.h"; include "mozilla/dom/BindingIPCUtils.h"; include "mozilla/dom/CSPMessageUtils.h"; include "mozilla/dom/DocShellMessageUtils.h"; @@ -62,7 +63,7 @@ using mozilla::WindowsHandle from "mozilla/ipc/IPCTypes.h"; using class mozilla::WidgetCompositionEvent from "ipc/nsGUIEventIPC.h"; using struct mozilla::widget::IMENotification from "mozilla/widget/IMEData.h"; -using struct mozilla::widget::IMENotificationRequests from "mozilla/widget/IMEData.h"; +using mozilla::widget::IMENotificationRequests from "mozilla/widget/IMEData.h"; using struct mozilla::widget::IMEState from "mozilla/widget/IMEData.h"; using struct mozilla::widget::InputContext from "mozilla/widget/IMEData.h"; using struct mozilla::widget::InputContextAction from "mozilla/widget/IMEData.h"; diff -Nru firefox-esr-140.9.1esr/dom/ipc/RefMessageBodyService.cpp firefox-esr-140.10.0esr/dom/ipc/RefMessageBodyService.cpp --- firefox-esr-140.9.1esr/dom/ipc/RefMessageBodyService.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/ipc/RefMessageBodyService.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -45,12 +45,28 @@ MOZ_DIAGNOSTIC_ASSERT(sService == nullptr); } -RefMessageBodyService::~RefMessageBodyService() { +MozExternalRefCountType RefMessageBodyService::AddRef() { + MOZ_ASSERT(int32_t(mRefCnt) >= 0, "illegal refcnt"); + nsrefcnt cnt = ++mRefCnt; + NS_LOG_ADDREF(this, cnt, "RefMessageBodyService", sizeof(*this)); + return cnt; +} + +MozExternalRefCountType RefMessageBodyService::Release() { StaticMutexAutoLock lock(sRefMessageBodyServiceMutex); + nsrefcnt cnt = --mRefCnt; + NS_LOG_RELEASE(this, cnt, "RefMessageBodyService"); + if (cnt > 0) { + return cnt; + } MOZ_DIAGNOSTIC_ASSERT(sService == this); sService = nullptr; + delete this; + return 0; } +RefMessageBodyService::~RefMessageBodyService() = default; + const nsID RefMessageBodyService::Register( already_AddRefed aBody, ErrorResult& aRv) { RefPtr body = aBody; diff -Nru firefox-esr-140.9.1esr/dom/ipc/RefMessageBodyService.h firefox-esr-140.10.0esr/dom/ipc/RefMessageBodyService.h --- firefox-esr-140.9.1esr/dom/ipc/RefMessageBodyService.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/ipc/RefMessageBodyService.h 2026-04-15 01:59:49.000000000 +0000 @@ -107,7 +107,9 @@ class RefMessageBodyService final { public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(RefMessageBodyService) + MozExternalRefCountType AddRef(); + MozExternalRefCountType Release(); + using HasThreadSafeRefCnt = std::true_type; static already_AddRefed GetOrCreate(); @@ -125,6 +127,9 @@ explicit RefMessageBodyService(const StaticMutexAutoLock& aProofOfLock); ~RefMessageBodyService(); + protected: + ::mozilla::ThreadSafeAutoRefCnt mRefCnt; + static RefMessageBodyService* GetOrCreateInternal( const StaticMutexAutoLock& aProofOfLock); diff -Nru firefox-esr-140.9.1esr/dom/ipc/VsyncParent.cpp firefox-esr-140.10.0esr/dom/ipc/VsyncParent.cpp --- firefox-esr-140.9.1esr/dom/ipc/VsyncParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/ipc/VsyncParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -8,7 +8,6 @@ #include "mozilla/Unused.h" #include "nsThreadUtils.h" -#include "nsIThread.h" namespace mozilla::dom { diff -Nru firefox-esr-140.9.1esr/dom/ipc/VsyncParent.h firefox-esr-140.10.0esr/dom/ipc/VsyncParent.h --- firefox-esr-140.9.1esr/dom/ipc/VsyncParent.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/ipc/VsyncParent.h 2026-04-15 01:59:48.000000000 +0000 @@ -12,7 +12,7 @@ #include "nsCOMPtr.h" #include "mozilla/RefPtr.h" -class nsIThread; +#include "nsIThread.h" namespace mozilla::dom { @@ -22,7 +22,8 @@ class VsyncParent final : public PVsyncParent, public VsyncObserver { friend class PVsyncParent; - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VsyncParent, override) + NS_INLINE_DECL_THREADSAFE_REFCOUNTING_WITH_DELETE_ON_EVENT_TARGET( + VsyncParent, mInitialThread, override) public: VsyncParent(); diff -Nru firefox-esr-140.9.1esr/dom/locks/LockRequestChild.cpp firefox-esr-140.10.0esr/dom/locks/LockRequestChild.cpp --- firefox-esr-140.9.1esr/dom/locks/LockRequestChild.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/locks/LockRequestChild.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -56,6 +56,7 @@ } void LockRequestChild::ActorDestroy(ActorDestroyReason aReason) { + Unfollow(); CastedManager()->NotifyRequestDestroy(); } @@ -109,7 +110,6 @@ mRequest.mPromise->MaybeReject(reason); } - Unfollow(); Send__delete__(this, true); } diff -Nru firefox-esr-140.9.1esr/dom/media/AsyncLogger.h firefox-esr-140.10.0esr/dom/media/AsyncLogger.h --- firefox-esr-140.9.1esr/dom/media/AsyncLogger.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/AsyncLogger.h 2026-04-15 01:59:48.000000000 +0000 @@ -44,9 +44,15 @@ size_t toCopy = strlen(aString); bool truncated = false; - if (toCopy > Available()) { + size_t availableBytes = Available(); + if (availableBytes == 0) { + // Treat nothing written as truncated + return true; + } + + if (toCopy >= availableBytes) { truncated = true; - toCopy = Available() - 1; + toCopy = availableBytes - 1; } memcpy(&(mMemory[mWriteIndex]), aString, toCopy); @@ -59,7 +65,7 @@ private: size_t Available() { - MOZ_ASSERT(mLength > mWriteIndex); + MOZ_ASSERT(mLength >= mWriteIndex); return mLength - mWriteIndex; } @@ -188,9 +194,10 @@ msg->data.mTimestamp = TimeStamp::Now(); msg->data.mDurationUs = (static_cast(aFrames) / aSampleRate) * 1e6; - size_t len = std::min(strlen(aName), std::size(msg->data.mName)); - memcpy(msg->data.mName, aName, len); - msg->data.mName[len] = 0; + StringWriter writer(msg->data.mName, std::size(msg->data.mName)); + size_t unused; + // Unused since we don't need to know the location of the new index + writer.AppendCString(aName, &unused); mMessageQueueProfiler.Push(msg); } } diff -Nru firefox-esr-140.9.1esr/dom/media/BaseMediaResource.cpp firefox-esr-140.10.0esr/dom/media/BaseMediaResource.cpp --- firefox-esr-140.9.1esr/dom/media/BaseMediaResource.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/BaseMediaResource.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -141,27 +141,30 @@ } nsresult BaseMediaResource::ModifyLoadFlags(nsLoadFlags aFlags) { + RefPtr kungFuDeathGrip(this); + nsCOMPtr channel = mChannel; + nsCOMPtr loadGroup; - nsresult rv = mChannel->GetLoadGroup(getter_AddRefs(loadGroup)); + nsresult rv = channel->GetLoadGroup(getter_AddRefs(loadGroup)); MOZ_ASSERT(NS_SUCCEEDED(rv), "GetLoadGroup() failed!"); bool inLoadGroup = false; if (loadGroup) { nsresult status; - mChannel->GetStatus(&status); + channel->GetStatus(&status); - rv = loadGroup->RemoveRequest(mChannel, nullptr, status); + rv = loadGroup->RemoveRequest(channel, nullptr, status); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } inLoadGroup = true; } - rv = mChannel->SetLoadFlags(aFlags); + rv = channel->SetLoadFlags(aFlags); MOZ_ASSERT(NS_SUCCEEDED(rv), "SetLoadFlags() failed!"); if (inLoadGroup) { - rv = loadGroup->AddRequest(mChannel, nullptr); + rv = loadGroup->AddRequest(channel, nullptr); MOZ_ASSERT(NS_SUCCEEDED(rv), "AddRequest() failed!"); } diff -Nru firefox-esr-140.9.1esr/dom/media/ExternalEngineStateMachine.cpp firefox-esr-140.10.0esr/dom/media/ExternalEngineStateMachine.cpp --- firefox-esr-140.9.1esr/dom/media/ExternalEngineStateMachine.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/ExternalEngineStateMachine.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -1367,6 +1367,13 @@ RefPtr ExternalEngineStateMachine::SetCDMProxy( CDMProxy* aProxy) { + if (!OnTaskQueue()) { + return InvokeAsync(OwnerThread(), __func__, + [self = RefPtr{this}, proxy = RefPtr{aProxy}, this]() { + return SetCDMProxy(proxy); + }); + } + AssertOnTaskQueue(); if (mState.IsShutdownEngine()) { return SetCDMPromise::CreateAndReject(NS_ERROR_FAILURE, __func__); } diff -Nru firefox-esr-140.9.1esr/dom/media/MediaData.cpp firefox-esr-140.10.0esr/dom/media/MediaData.cpp --- firefox-esr-140.9.1esr/dom/media/MediaData.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/MediaData.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -123,8 +123,8 @@ MOZ_DIAGNOSTIC_ASSERT(mDataOffset <= mAudioData.Length(), "Data offset outside original buffer"); int64_t frameCountAfterTrim = (trimAfter - trimBefore).ToTicksAtRate(mRate); - if (frameCountAfterTrim > - AssertedCast(mAudioData.Length() / mChannels)) { + const size_t availFrames = (mAudioData.Length() - mDataOffset) / mChannels; + if (frameCountAfterTrim > AssertedCast(availFrames)) { // Accept rounding error caused by an imprecise time_base in the container, // that can cause a mismatch but not other kind of unexpected frame count. MOZ_RELEASE_ASSERT(!trimBefore.IsBase(mRate)); diff -Nru firefox-esr-140.9.1esr/dom/media/MediaData.h firefox-esr-140.10.0esr/dom/media/MediaData.h --- firefox-esr-140.9.1esr/dom/media/MediaData.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/MediaData.h 2026-04-15 01:59:48.000000000 +0000 @@ -342,13 +342,13 @@ template const ReturnType* As() const { - MOZ_ASSERT(this->mType == ReturnType::sType); + MOZ_RELEASE_ASSERT(this->mType == ReturnType::sType); return static_cast(this); } template ReturnType* As() { - MOZ_ASSERT(this->mType == ReturnType::sType); + MOZ_RELEASE_ASSERT(this->mType == ReturnType::sType); return static_cast(this); } diff -Nru firefox-esr-140.9.1esr/dom/media/MediaDecoderStateMachine.cpp firefox-esr-140.10.0esr/dom/media/MediaDecoderStateMachine.cpp --- firefox-esr-140.9.1esr/dom/media/MediaDecoderStateMachine.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/MediaDecoderStateMachine.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -1129,11 +1129,10 @@ OwnerThread(), __func__, [this, isAudio, master = RefPtr{mMaster}]() mutable -> void { AUTO_PROFILER_LABEL( - nsPrintfCString( - "LoopingDecodingState::RequestDataFromStartPosition(%s)::" - "SeekResolved", - isAudio ? "audio" : "video") - .get(), + isAudio ? "LoopingDecodingState::" + "RequestDataFromStartPosition(audio)::SeekResolved" + : "LoopingDecodingState::" + "RequestDataFromStartPosition(video)::SeekResolved", MEDIA_PLAYBACK); if (auto& state = master->mStateObj; state && @@ -1168,11 +1167,10 @@ [this, isAudio, master = RefPtr{mMaster}]( const SeekRejectValue& aReject) mutable -> void { AUTO_PROFILER_LABEL( - nsPrintfCString("LoopingDecodingState::" - "RequestDataFromStartPosition(%s)::" - "SeekRejected", - isAudio ? "audio" : "video") - .get(), + isAudio ? "LoopingDecodingState::" + "RequestDataFromStartPosition(audio)::SeekRejected" + : "LoopingDecodingState::" + "RequestDataFromStartPosition(video)::SeekRejected", MEDIA_PLAYBACK); if (auto& state = master->mStateObj; state && diff -Nru firefox-esr-140.9.1esr/dom/media/eme/mediafoundation/WMFCDMProxy.cpp firefox-esr-140.10.0esr/dom/media/eme/mediafoundation/WMFCDMProxy.cpp --- firefox-esr-140.9.1esr/dom/media/eme/mediafoundation/WMFCDMProxy.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/eme/mediafoundation/WMFCDMProxy.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -103,10 +103,12 @@ mCDM->Init(params)->Then( mMainThread, __func__, [self = RefPtr{this}, this, aPromiseId](const bool) { + RETURN_IF_SHUTDOWN(); MOZ_ASSERT(mCDM->Id() > 0); mKeys->OnCDMCreated(aPromiseId, mCDM->Id()); }, [self = RefPtr{this}, this, aPromiseId](const nsresult rv) { + RETURN_IF_SHUTDOWN(); RejectPromiseWithStateError( aPromiseId, nsLiteralCString("WMFCDMProxy::Init: WMFCDM init error")); @@ -315,6 +317,7 @@ mProxyCallback = nullptr; } mIsShutdown = true; + mKeys.Clear(); } void WMFCDMProxy::OnSessionMessage(const nsAString& aSessionId, diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMCallback.h firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMCallback.h --- firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMCallback.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMCallback.h 2026-04-15 01:59:49.000000000 +0000 @@ -26,7 +26,7 @@ bool aSuccessful) = 0; virtual void ResolvePromiseWithKeyStatus(uint32_t aPromiseId, - uint32_t aKeyStatus) = 0; + cdm::KeyStatus aKeyStatus) = 0; virtual void ResolvePromise(uint32_t aPromiseId) = 0; @@ -34,7 +34,7 @@ const nsCString& aErrorMessage) = 0; virtual void SessionMessage(const nsACString& aSessionId, - uint32_t aMessageType, + cdm::MessageType aMessageType, nsTArray&& aMessage) = 0; virtual void SessionKeysChange( diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMCallbackProxy.cpp firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMCallbackProxy.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -55,8 +55,9 @@ std::move(aException), aErrorMessage); } -static dom::MediaKeyMessageType ToDOMMessageType(uint32_t aMessageType) { - switch (static_cast(aMessageType)) { +static dom::MediaKeyMessageType ToDOMMessageType( + cdm::MessageType aMessageType) { + switch (aMessageType) { case cdm::kLicenseRequest: return dom::MediaKeyMessageType::License_request; case cdm::kLicenseRenewal: @@ -71,7 +72,7 @@ } void ChromiumCDMCallbackProxy::SessionMessage(const nsACString& aSessionId, - uint32_t aMessageType, + cdm::MessageType aMessageType, nsTArray&& aMessage) { DispatchToMainThread("ChromiumCDMProxy::OnSessionMessage", &ChromiumCDMProxy::OnSessionMessage, @@ -79,8 +80,8 @@ ToDOMMessageType(aMessageType), std::move(aMessage)); } -static dom::MediaKeyStatus ToDOMMediaKeyStatus(uint32_t aStatus) { - switch (static_cast(aStatus)) { +static dom::MediaKeyStatus ToDOMMediaKeyStatus(cdm::KeyStatus aStatus) { + switch (aStatus) { case cdm::kUsable: return dom::MediaKeyStatus::Usable; case cdm::kInternalError: @@ -101,7 +102,7 @@ } void ChromiumCDMCallbackProxy::ResolvePromiseWithKeyStatus( - uint32_t aPromiseId, uint32_t aKeyStatus) { + uint32_t aPromiseId, cdm::KeyStatus aKeyStatus) { DispatchToMainThread("ChromiumCDMProxy::OnResolvePromiseWithKeyStatus", &ChromiumCDMProxy::OnResolvePromiseWithKeyStatus, aPromiseId, ToDOMMediaKeyStatus(aKeyStatus)); diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMCallbackProxy.h firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.h --- firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMCallbackProxy.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.h 2026-04-15 01:59:48.000000000 +0000 @@ -12,7 +12,7 @@ namespace mozilla { -class ChromiumCDMCallbackProxy : public ChromiumCDMCallback { +class ChromiumCDMCallbackProxy final : public ChromiumCDMCallback { public: ChromiumCDMCallbackProxy(ChromiumCDMProxy* aProxy, nsIEventTarget* aMainThread) @@ -24,14 +24,15 @@ bool aSuccessful) override; void ResolvePromiseWithKeyStatus(uint32_t aPromiseId, - uint32_t aKeyStatus) override; + cdm::KeyStatus aKeyStatus) override; void ResolvePromise(uint32_t aPromiseId) override; void RejectPromise(uint32_t aPromiseId, ErrorResult&& aException, const nsCString& aErrorMessage) override; - void SessionMessage(const nsACString& aSessionId, uint32_t aMessageType, + void SessionMessage(const nsACString& aSessionId, + cdm::MessageType aMessageType, nsTArray&& aMessage) override; void SessionKeysChange( diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMChild.cpp firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMChild.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMChild.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMChild.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -9,6 +9,7 @@ #include "WidevineFileIO.h" #include "WidevineVideoFrame.h" #include "GMPLog.h" +#include "GMPMessageUtils.h" #include "GMPPlatform.h" #include "mozilla/Unused.h" #include "nsPrintfCString.h" @@ -28,6 +29,35 @@ GMP_LOG_DEBUG("ChromiumCDMChild:: ctor this=%p", this); } +cdm::Exception ChromiumCDMChild::ClampException(cdm::Exception aValue) const { + if (NS_WARN_IF(!IPC::CDMExceptionEnumValidator::IsLegalValue(aValue))) { + GMP_LOG_DEBUG("ChromiumCDMChild::ClampException: unhandled %" PRIu32, + aValue); + return cdm::Exception::kExceptionInvalidStateError; + } + return aValue; +} + +cdm::Status ChromiumCDMChild::ClampStatus(cdm::Status aValue, + cdm::Status aFallback) const { + if (NS_WARN_IF(!IPC::CDMStatusEnumValidator::IsLegalValue(aValue))) { + GMP_LOG_DEBUG("ChromiumCDMChild::ClampStatus: unhandled %" PRIu32, aValue); + return aFallback; + } + return aValue; +} + +cdm::KeyStatus ChromiumCDMChild::ClampKeyStatus(cdm::KeyStatus aValue) const { + if (NS_WARN_IF(!IPC::CDMKeyStatusEnumValidator::IsLegalValue(aValue))) { + // TODO(aosmond): When we switch to Host_12/KeyStatus_2, we should return + // cdm::KeyStatus_2::kUsableInFuture. + GMP_LOG_DEBUG("ChromiumCDMChild::ClampKeyStatus: unhandled %" PRIu32, + aValue); + return cdm::KeyStatus::kInternalError; + } + return aValue; +} + void ChromiumCDMChild::Init(cdm::ContentDecryptionModule_11* aCDM, const nsACString& aStorageId) { MOZ_ASSERT(IsOnMessageLoopThread()); @@ -200,7 +230,7 @@ aPromiseId, aKeyStatus); CallOnMessageLoopThread("gmp::ChromiumCDMChild::OnResolveKeyStatusPromise", &ChromiumCDMChild::SendOnResolvePromiseWithKeyStatus, - aPromiseId, static_cast(aKeyStatus)); + aPromiseId, ClampKeyStatus(aKeyStatus)); } bool ChromiumCDMChild::OnResolveNewSessionPromiseInternal( @@ -252,7 +282,7 @@ aPromiseId, aException, aSystemCode, aErrorMessage); CallOnMessageLoopThread("gmp::ChromiumCDMChild::OnRejectPromise", &ChromiumCDMChild::SendOnRejectPromise, aPromiseId, - static_cast(aException), aSystemCode, + ClampException(aException), aSystemCode, nsCString(aErrorMessage, aErrorMessageSize)); } @@ -264,12 +294,19 @@ GMP_LOG_DEBUG("ChromiumCDMChild::OnSessionMessage(sid=%s, type=%" PRIu32 " size=%" PRIu32 ")", aSessionId, aMessageType, aMessageSize); + if (NS_WARN_IF( + !IPC::CDMMessageTypeEnumValidator::IsLegalValue(aMessageType))) { + GMP_LOG_DEBUG( + "ChromiumCDMChild::OnSessionMessage: unhandled message %" PRIu32, + aMessageType); + return; + } CopyableTArray message; message.AppendElements(aMessage, aMessageSize); CallOnMessageLoopThread("gmp::ChromiumCDMChild::OnSessionMessage", &ChromiumCDMChild::SendOnSessionMessage, - nsCString(aSessionId, aSessionIdSize), - static_cast(aMessageType), message); + nsCString(aSessionId, aSessionIdSize), aMessageType, + message); } static auto ToString(const cdm::KeyInformation* aKeysInfo, @@ -294,6 +331,15 @@ keys.SetCapacity(aKeysInfoCount); for (uint32_t i = 0; i < aKeysInfoCount; i++) { const cdm::KeyInformation& key = aKeysInfo[i]; + if (NS_WARN_IF(!IPC::CDMKeyStatusEnumValidator::IsLegalValue(key.status))) { + // TODO(aosmond): When we switch to Host_12/KeyStatus_2, we should use + // cdm::KeyStatus_2::kUsableInFuture. + GMP_LOG_DEBUG( + "ChromiumCDMChild::OnSessionKeysChange: unhandled key status " + "%" PRIu32, + key.status); + continue; + } nsTArray kid; kid.AppendElements(key.key_id, key.key_id_size); keys.AppendElement(CDMKeyInformation(kid, key.status, key.system_code)); @@ -383,7 +429,15 @@ } void ChromiumCDMChild::ActorDestroy(ActorDestroyReason aReason) { + mInitPromise.RejectIfExists(NS_ERROR_ABORT, __func__); + + if (mCDM) { + mCDM->Destroy(); + mCDM = nullptr; + } + mPlugin = nullptr; + mDestroyed = true; } void ChromiumCDMChild::PurgeShmems() { @@ -557,33 +611,41 @@ return IPC_OK(); } -static void InitInputBuffer(const CDMInputBuffer& aBuffer, +static bool InitInputBuffer(const CDMInputBuffer& aBuffer, nsTArray& aSubSamples, cdm::InputBuffer_2& aInputBuffer) { aInputBuffer.data = aBuffer.mData().get(); aInputBuffer.data_size = aBuffer.mData().Size(); - if (aBuffer.mEncryptionScheme() != cdm::EncryptionScheme::kUnencrypted) { - MOZ_ASSERT(aBuffer.mEncryptionScheme() == cdm::EncryptionScheme::kCenc || - aBuffer.mEncryptionScheme() == cdm::EncryptionScheme::kCbcs); - aInputBuffer.key_id = aBuffer.mKeyId().Elements(); - aInputBuffer.key_id_size = aBuffer.mKeyId().Length(); - - aInputBuffer.iv = aBuffer.mIV().Elements(); - aInputBuffer.iv_size = aBuffer.mIV().Length(); - - aSubSamples.SetCapacity(aBuffer.mClearBytes().Length()); - for (size_t i = 0; i < aBuffer.mCipherBytes().Length(); i++) { - aSubSamples.AppendElement(cdm::SubsampleEntry{aBuffer.mClearBytes()[i], - aBuffer.mCipherBytes()[i]}); - } - aInputBuffer.subsamples = aSubSamples.Elements(); - aInputBuffer.num_subsamples = aSubSamples.Length(); - aInputBuffer.encryption_scheme = aBuffer.mEncryptionScheme(); + switch (aBuffer.mEncryptionScheme()) { + case cdm::EncryptionScheme::kCenc: + case cdm::EncryptionScheme::kCbcs: + aInputBuffer.key_id = aBuffer.mKeyId().Elements(); + aInputBuffer.key_id_size = aBuffer.mKeyId().Length(); + + aInputBuffer.iv = aBuffer.mIV().Elements(); + aInputBuffer.iv_size = aBuffer.mIV().Length(); + + aSubSamples.SetCapacity(aBuffer.mClearBytes().Length()); + for (size_t i = 0; i < aBuffer.mCipherBytes().Length(); i++) { + aSubSamples.AppendElement(cdm::SubsampleEntry{ + aBuffer.mClearBytes()[i], aBuffer.mCipherBytes()[i]}); + } + aInputBuffer.subsamples = aSubSamples.Elements(); + aInputBuffer.num_subsamples = aSubSamples.Length(); + break; + case cdm::EncryptionScheme::kUnencrypted: + break; + default: + GMP_LOG_ERROR("InitInputBuffer: Unhandled encryption scheme %" PRIu32, + static_cast(aBuffer.mEncryptionScheme())); + return false; } + aInputBuffer.encryption_scheme = aBuffer.mEncryptionScheme(); aInputBuffer.pattern.crypt_byte_block = aBuffer.mCryptByteBlock(); aInputBuffer.pattern.skip_byte_block = aBuffer.mSkipByteBlock(); aInputBuffer.timestamp = aBuffer.mTimestamp(); + return true; } bool ChromiumCDMChild::HasShmemOfSize(size_t aSize) const { @@ -638,14 +700,17 @@ cdm::InputBuffer_2 input = {}; nsTArray subsamples; - InitInputBuffer(aBuffer, subsamples, input); + if (!InitInputBuffer(aBuffer, subsamples, input)) { + (void)SendDecryptFailed(aId, cdm::kDecryptError); + return IPC_OK(); + } WidevineDecryptedBlock output; cdm::Status status = mCDM->Decrypt(input, &output); // CDM should have allocated a cdm::Buffer for output. if (status != cdm::kSuccess || !output.DecryptedBuffer()) { - Unused << SendDecryptFailed(aId, status); + Unused << SendDecryptFailed(aId, ClampStatus(status, cdm::kDecryptError)); return IPC_OK(); } @@ -695,7 +760,8 @@ cdm::Status status = mCDM->InitializeVideoDecoder(config); GMP_LOG_DEBUG("ChromiumCDMChild::RecvInitializeVideoDecoder() status=%u", status); - Unused << SendOnDecoderInitDone(status); + Unused << SendOnDecoderInitDone( + ClampStatus(status, cdm::Status::kInitializationError)); mDecoderInitialized = status == cdm::kSuccess; return IPC_OK(); } @@ -729,15 +795,22 @@ aBuffer.mTimestamp()); MOZ_ASSERT(mDecoderInitialized); + RefPtr self = this; + auto autoDeallocateShmem = + MakeScopeExit([&, self] { self->DeallocShmem(aBuffer.mData()); }); + if (!mCDM) { GMP_LOG_DEBUG("ChromiumCDMChild::RecvDecryptAndDecodeFrame() no CDM"); Unused << SendDecodeFailed(cdm::kDecodeError); return IPC_OK(); } - RefPtr self = this; - auto autoDeallocateShmem = - MakeScopeExit([&, self] { self->DeallocShmem(aBuffer.mData()); }); + cdm::InputBuffer_2 input = {}; + nsTArray subsamples; + if (!InitInputBuffer(aBuffer, subsamples, input)) { + (void)SendDecodeFailed(cdm::kDecodeError); + return IPC_OK(); + } // The output frame may not have the same timestamp as the frame we put in. // We may need to input a number of frames before we receive output. The @@ -746,10 +819,6 @@ // on output. mFrameDurations.Insert(aBuffer.mTimestamp(), aBuffer.mDuration()); - cdm::InputBuffer_2 input = {}; - nsTArray subsamples; - InitInputBuffer(aBuffer, subsamples, input); - WidevineVideoFrame frame; cdm::Status rv = mCDM->DecryptAndDecodeFrame(input, &frame); GMP_LOG_DEBUG("ChromiumCDMChild::RecvDecryptAndDecodeFrame() t=%" PRId64 @@ -783,7 +852,7 @@ // CDM didn't set a frame buffer on the sample, report it as an error. [[fallthrough]]; default: - Unused << SendDecodeFailed(rv); + Unused << SendDecodeFailed(ClampStatus(rv, cdm::kDecodeError)); break; } @@ -852,14 +921,6 @@ MOZ_ASSERT(!mDecoderInitialized); - mInitPromise.RejectIfExists(NS_ERROR_ABORT, __func__); - - if (mCDM) { - mCDM->Destroy(); - mCDM = nullptr; - } - mDestroyed = true; - Unused << Send__delete__(this); return IPC_OK(); diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMChild.h firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMChild.h --- firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMChild.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMChild.h 2026-04-15 01:59:48.000000000 +0000 @@ -71,6 +71,10 @@ protected: ~ChromiumCDMChild(); + cdm::Exception ClampException(cdm::Exception aValue) const; + cdm::Status ClampStatus(cdm::Status aValue, cdm::Status aFallback) const; + cdm::KeyStatus ClampKeyStatus(cdm::KeyStatus aValue) const; + bool OnResolveNewSessionPromiseInternal(uint32_t aPromiseId, const nsACString& aSessionId); diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMParent.cpp firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMParent.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMParent.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMParent.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -78,6 +78,9 @@ ->Then( GetCurrentSerialEventTarget(), __func__, [self, aCDMCallback](bool aSuccess) { + if (self->mIsShutdown) { + return; + } if (!aSuccess) { GMP_LOG_DEBUG( "ChromiumCDMParent::Init() failed with callback from " @@ -424,7 +427,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvOnResolvePromiseWithKeyStatus( - const uint32_t& aPromiseId, const uint32_t& aKeyStatus) { + const uint32_t& aPromiseId, const cdm::KeyStatus& aKeyStatus) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG( "ChromiumCDMParent::RecvOnResolvePromiseWithKeyStatus(this=%p, " @@ -532,12 +535,12 @@ RejectPromise(aPromiseId, std::move(rv), aErrorMessage); } -static ErrorResult ToErrorResult(uint32_t aException, +static ErrorResult ToErrorResult(cdm::Exception aException, const nsCString& aErrorMessage) { // XXXbz could we have a CopyableErrorResult sent to us with a better error // message? ErrorResult rv; - switch (static_cast(aException)) { + switch (aException) { case cdm::Exception::kExceptionNotSupportedError: rv.ThrowNotSupportedError(aErrorMessage); break; @@ -559,7 +562,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvOnRejectPromise( - const uint32_t& aPromiseId, const uint32_t& aException, + const uint32_t& aPromiseId, const cdm::Exception& aException, const uint32_t& aSystemCode, const nsCString& aErrorMessage) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); RejectPromise(aPromiseId, ToErrorResult(aException, aErrorMessage), @@ -568,7 +571,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvOnSessionMessage( - const nsCString& aSessionId, const uint32_t& aMessageType, + const nsCString& aSessionId, const cdm::MessageType& aMessageType, nsTArray&& aMessage) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG("ChromiumCDMParent::RecvOnSessionMessage(this=%p, sid=%s)", @@ -653,8 +656,8 @@ return IPC_OK(); } -DecryptStatus ToDecryptStatus(uint32_t aStatus) { - switch (static_cast(aStatus)) { +DecryptStatus ToDecryptStatus(cdm::Status aStatus) { + switch (aStatus) { case cdm::kSuccess: return DecryptStatus::Ok; case cdm::kNoKey: @@ -664,8 +667,8 @@ } } -ipc::IPCResult ChromiumCDMParent::RecvDecryptFailed(const uint32_t& aId, - const uint32_t& aStatus) { +ipc::IPCResult ChromiumCDMParent::RecvDecryptFailed( + const uint32_t& aId, const cdm::Status& aStatus) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG("ChromiumCDMParent::RecvDecryptFailed(this=%p, id=%" PRIu32 ", status=%" PRIu32 ")", @@ -687,7 +690,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvDecryptedShmem(const uint32_t& aId, - const uint32_t& aStatus, + const cdm::Status& aStatus, ipc::Shmem&& aShmem) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG("ChromiumCDMParent::RecvDecryptedShmem(this=%p, id=%" PRIu32 @@ -717,7 +720,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvDecryptedData(const uint32_t& aId, - const uint32_t& aStatus, + const cdm::Status& aStatus, nsTArray&& aData) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG("ChromiumCDMParent::RecvDecryptedData(this=%p, id=%" PRIu32 @@ -1093,7 +1096,7 @@ return v.forget(); } -ipc::IPCResult ChromiumCDMParent::RecvDecodeFailed(const uint32_t& aStatus) { +ipc::IPCResult ChromiumCDMParent::RecvDecodeFailed(const cdm::Status& aStatus) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG("ChromiumCDMParent::RecvDecodeFailed(this=%p status=%" PRIu32 ")", @@ -1114,7 +1117,7 @@ RESULT_DETAIL( "ChromiumCDMParent::RecvDecodeFailed with status %s (%" PRIu32 ")", - cdm::EnumValueToString(cdm::Status(aStatus)), aStatus)), + cdm::EnumValueToString(aStatus), aStatus)), __func__); return IPC_OK(); } @@ -1211,7 +1214,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvOnDecoderInitDone( - const uint32_t& aStatus) { + const cdm::Status& aStatus) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG( "ChromiumCDMParent::RecvOnDecoderInitDone(this=%p, status=%" PRIu32 ")", @@ -1220,15 +1223,15 @@ MOZ_ASSERT(mInitVideoDecoderPromise.IsEmpty()); return IPC_OK(); } - if (aStatus == static_cast(cdm::kSuccess)) { + if (aStatus == cdm::kSuccess) { mInitVideoDecoderPromise.ResolveIfExists(TrackInfo::kVideoTrack, __func__); } else { mVideoDecoderInitialized = false; mInitVideoDecoderPromise.RejectIfExists( - MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, - RESULT_DETAIL( - "CDM init decode failed with status %s (%" PRIu32 ")", - cdm::EnumValueToString(cdm::Status(aStatus)), aStatus)), + MediaResult( + NS_ERROR_DOM_MEDIA_FATAL_ERR, + RESULT_DETAIL("CDM init decode failed with status %s (%" PRIu32 ")", + cdm::EnumValueToString(aStatus), aStatus)), __func__); } return IPC_OK(); diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMParent.h firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMParent.h --- firefox-esr-140.9.1esr/dom/media/gmp/ChromiumCDMParent.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/ChromiumCDMParent.h 2026-04-15 01:59:48.000000000 +0000 @@ -106,19 +106,19 @@ ~ChromiumCDMParent() = default; ipc::IPCResult Recv__delete__() override; - ipc::IPCResult RecvOnResolvePromiseWithKeyStatus(const uint32_t& aPromiseId, - const uint32_t& aKeyStatus); + ipc::IPCResult RecvOnResolvePromiseWithKeyStatus( + const uint32_t& aPromiseId, const cdm::KeyStatus& aKeyStatus); ipc::IPCResult RecvOnResolveNewSessionPromise(const uint32_t& aPromiseId, const nsCString& aSessionId); ipc::IPCResult RecvResolveLoadSessionPromise(const uint32_t& aPromiseId, const bool& aSuccessful); ipc::IPCResult RecvOnResolvePromise(const uint32_t& aPromiseId); ipc::IPCResult RecvOnRejectPromise(const uint32_t& aPromiseId, - const uint32_t& aError, + const cdm::Exception& aError, const uint32_t& aSystemCode, const nsCString& aErrorMessage); ipc::IPCResult RecvOnSessionMessage(const nsCString& aSessionId, - const uint32_t& aMessageType, + const cdm::MessageType& aMessageType, nsTArray&& aMessage); ipc::IPCResult RecvOnSessionKeysChange( const nsCString& aSessionId, nsTArray&& aKeysInfo); @@ -127,18 +127,19 @@ ipc::IPCResult RecvOnSessionClosed(const nsCString& aSessionId); ipc::IPCResult RecvOnQueryOutputProtectionStatus(); ipc::IPCResult RecvDecryptedShmem(const uint32_t& aId, - const uint32_t& aStatus, + const cdm::Status& aStatus, ipc::Shmem&& aData); - ipc::IPCResult RecvDecryptedData(const uint32_t& aId, const uint32_t& aStatus, + ipc::IPCResult RecvDecryptedData(const uint32_t& aId, + const cdm::Status& aStatus, nsTArray&& aData); ipc::IPCResult RecvDecryptFailed(const uint32_t& aId, - const uint32_t& aStatus); - ipc::IPCResult RecvOnDecoderInitDone(const uint32_t& aStatus); + const cdm::Status& aStatus); + ipc::IPCResult RecvOnDecoderInitDone(const cdm::Status& aStatus); ipc::IPCResult RecvDecodedShmem(const CDMVideoFrame& aFrame, ipc::Shmem&& aShmem); ipc::IPCResult RecvDecodedData(const CDMVideoFrame& aFrame, nsTArray&& aData); - ipc::IPCResult RecvDecodeFailed(const uint32_t& aStatus); + ipc::IPCResult RecvDecodeFailed(const cdm::Status& aStatus); ipc::IPCResult RecvShutdown(); ipc::IPCResult RecvResetVideoDecoderComplete(); ipc::IPCResult RecvDrainComplete(); diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPChild.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPChild.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -71,6 +71,7 @@ GMPChild::GMPChild() : mGMPMessageLoop(MessageLoop::current()), mGMPLoader(nullptr) { + MOZ_ASSERT(NS_IsMainThread()); GMP_CHILD_LOG_DEBUG("GMPChild ctor"); nsDebugImpl::SetMultiprocessMode("GMP"); } @@ -584,8 +585,6 @@ mGMPLoader->Shutdown(); } - ShutdownPlatformAPI(); - if (AbnormalShutdown == aWhy) { NS_WARNING("Abnormal shutdown of GMP process!"); ProcessChild::QuickExit(); diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPContentChild.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPContentChild.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPContentChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPContentChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -57,7 +57,8 @@ auto vdc = static_cast(aActor); void* vd = nullptr; - GMPErr err = mGMPChild->GetAPI(GMP_API_VIDEO_DECODER, &vdc->Host(), &vd); + GMPErr err = mGMPChild->GetAPI(GMP_API_VIDEO_DECODER, + static_cast(vdc), &vd); if (err != GMPNoErr || !vd) { return IPC_FAIL(this, "GMPGetAPI call failed trying to construct decoder."); } @@ -72,7 +73,8 @@ auto vec = static_cast(aActor); void* ve = nullptr; - GMPErr err = mGMPChild->GetAPI(GMP_API_VIDEO_ENCODER, &vec->Host(), &ve); + GMPErr err = mGMPChild->GetAPI(GMP_API_VIDEO_ENCODER, + static_cast(vec), &ve); if (err != GMPNoErr || !ve) { return IPC_FAIL(this, "GMPGetAPI call failed trying to construct encoder."); } diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPMessageUtils.h firefox-esr-140.10.0esr/dom/media/gmp/GMPMessageUtils.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPMessageUtils.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPMessageUtils.h 2026-04-15 01:59:49.000000000 +0000 @@ -92,6 +92,34 @@ cdm::HdcpVersion, cdm::HdcpVersion::kHdcpVersionNone, cdm::HdcpVersion::kHdcpVersion2_3> {}; +using CDMStatusEnumValidator = + ContiguousEnumValidatorInclusive; +template <> +struct ParamTraits + : public EnumSerializer {}; + +using CDMExceptionEnumValidator = ContiguousEnumValidatorInclusive< + cdm::Exception, cdm::Exception::kExceptionTypeError, + cdm::Exception::kExceptionQuotaExceededError>; +template <> +struct ParamTraits + : public EnumSerializer {}; + +using CDMKeyStatusEnumValidator = + ContiguousEnumValidatorInclusive; +template <> +struct ParamTraits + : public EnumSerializer {}; + +using CDMMessageTypeEnumValidator = ContiguousEnumValidatorInclusive< + cdm::MessageType, cdm::MessageType::kLicenseRequest, + cdm::MessageType::kIndividualizationRequest>; +template <> +struct ParamTraits + : public EnumSerializer {}; + template <> struct ParamTraits { typedef GMPSimulcastStream paramType; diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPPlatform.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPPlatform.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPPlatform.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPPlatform.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -10,8 +10,6 @@ #include "GMPChild.h" #include "mozilla/Mutex.h" #include "mozilla/ReentrantMonitor.h" -#include "mozilla/StaticMonitor.h" -#include "nsTArray.h" #include "nsThreadUtils.h" #include "base/task.h" #include "base/thread.h" @@ -25,18 +23,8 @@ namespace mozilla::gmp { -static MessageLoop* sMainLoop = nullptr; static GMPChild* sChild = nullptr; -static StaticMonitor sMainLoopMonitor; -static nsTArray>* sMainLoopPendingEvents - MOZ_GUARDED_BY(sMainLoopMonitor) = nullptr; -static bool sMainLoopHasPendingProcess MOZ_GUARDED_BY(sMainLoopMonitor) = false; - -static bool IsOnChildMainThread() { - return sMainLoop && sMainLoop == MessageLoop::current(); -} - // We just need a refcounted wrapper for GMPTask objects. class GMPRunnable final : public Runnable { public: @@ -58,11 +46,8 @@ class GMPSyncRunnable final : public Runnable { public: - GMPSyncRunnable(GMPTask* aTask, MessageLoop* aMessageLoop) - : Runnable("mozilla::gmp::GMPSyncRunnable"), - mDone(false), - mTask(aTask), - mMonitor("GMPSyncRunnable") { + explicit GMPSyncRunnable(GMPTask* aTask) + : Runnable("mozilla::gmp::GMPSyncRunnable"), mTask(aTask) { MOZ_ASSERT(mTask); } @@ -71,7 +56,7 @@ // 1) Nobody should be blocking the main thread. // 2) This prevents deadlocks when doing sync calls to main which if the // main thread tries to do a sync call back to the calling thread. - MOZ_ASSERT(!IsOnChildMainThread()); + MOZ_ASSERT(!NS_IsMainThread()); MonitorAutoLock lock(mMonitor); while (!mDone) { @@ -90,9 +75,9 @@ } private: - bool mDone MOZ_GUARDED_BY(mMonitor); + bool mDone MOZ_GUARDED_BY(mMonitor) = false; GMPTask* mTask; - Monitor mMonitor; + Monitor mMonitor{"GMPSyncRunnable"}; }; class GMPThreadImpl final : public GMPThread { @@ -105,8 +90,8 @@ void Join() override; private: - Mutex mMutex MOZ_UNANNOTATED; - base::Thread mThread MOZ_GUARDED_BY(mMutex); + Mutex mMutex{"GMPThreadImpl"}; + base::Thread mThread MOZ_GUARDED_BY(mMutex){"GMPThread"}; }; GMPErr CreateThread(GMPThread** aThread) { @@ -119,77 +104,29 @@ return GMPNoErr; } -bool SpinPendingGmpEventsUntil(const SpinPendingPredicate& aPred, - uint32_t aTimeoutMs) { - MOZ_ASSERT(IsOnChildMainThread()); - - auto timeout = TimeDuration::FromMilliseconds(aTimeoutMs); - - while (!aPred()) { - nsTArray> pendingEvents; - { - StaticMonitorAutoLock lock(sMainLoopMonitor); - while (sMainLoopPendingEvents->IsEmpty()) { - if (lock.Wait(timeout) == CVStatus::Timeout) { - return false; - } - } - pendingEvents = std::move(*sMainLoopPendingEvents); - } - - for (auto& event : pendingEvents) { - event->Run(); - } - } - - return true; -} - -static void ProcessPendingGmpEvents() { - MOZ_ASSERT(IsOnChildMainThread()); - - nsTArray> pendingEvents; - { - StaticMonitorAutoLock lock(sMainLoopMonitor); - pendingEvents = std::move(*sMainLoopPendingEvents); - sMainLoopHasPendingProcess = false; - } - - for (auto& event : pendingEvents) { - event->Run(); - } -} - -static void QueueForMainThread(RefPtr&& aRunnable) { - StaticMonitorAutoLock lock(sMainLoopMonitor); - sMainLoopPendingEvents->AppendElement(std::move(aRunnable)); - if (!sMainLoopHasPendingProcess) { - sMainLoop->PostTask(NewRunnableFunction( - "mozilla::gmp::ProcessPendingGmpEvents", &ProcessPendingGmpEvents)); - sMainLoopHasPendingProcess = true; +GMPErr RunOnMainThread(GMPTask* aTask) { + if (!aTask) { + return GMPGenericErr; } - lock.Notify(); -} -GMPErr RunOnMainThread(GMPTask* aTask) { - if (!aTask || !sMainLoop) { + if (NS_FAILED(NS_DispatchToMainThread(MakeAndAddRef(aTask)))) { return GMPGenericErr; } - RefPtr r = new GMPRunnable(aTask); - QueueForMainThread(std::move(r)); return GMPNoErr; } GMPErr SyncRunOnMainThread(GMPTask* aTask) { - if (!aTask || !sMainLoop || IsOnChildMainThread()) { + if (!aTask || NS_IsMainThread()) { return GMPGenericErr; } - RefPtr r = new GMPSyncRunnable(aTask, sMainLoop); - QueueForMainThread(RefPtr{r}); - r->WaitUntilDone(); + RefPtr r = new GMPSyncRunnable(aTask); + if (NS_FAILED(NS_DispatchToMainThread(r))) { + return GMPGenericErr; + } + r->WaitUntilDone(); return GMPNoErr; } @@ -204,7 +141,7 @@ void Destroy() override; private: - ReentrantMonitor mMonitor MOZ_UNANNOTATED; + ReentrantMonitor mMonitor{"gmp-mutex"}; }; GMPErr CreateMutex(GMPMutex** aMutex) { @@ -233,7 +170,7 @@ } GMPErr SetTimerOnMainThread(GMPTask* aTask, int64_t aTimeoutMS) { - if (!aTask || !sMainLoop || !IsOnChildMainThread()) { + if (!aTask || !NS_IsMainThread()) { return GMPGenericErr; } GMPTimerChild* timers = sChild->GetGMPTimers(); @@ -250,20 +187,10 @@ } void InitPlatformAPI(GMPPlatformAPI& aPlatformAPI, GMPChild* aChild) { - if (!sMainLoop) { - sMainLoop = MessageLoop::current(); - } if (!sChild) { sChild = aChild; } - { - StaticMonitorAutoLock lock(sMainLoopMonitor); - if (!sMainLoopPendingEvents) { - sMainLoopPendingEvents = new nsTArray>(); - } - } - aPlatformAPI.version = 0; aPlatformAPI.createthread = &CreateThread; aPlatformAPI.runonmainthread = &RunOnMainThread; @@ -274,14 +201,6 @@ aPlatformAPI.getcurrenttime = &GetClock; } -void ShutdownPlatformAPI() { - StaticMonitorAutoLock lock(sMainLoopMonitor); - if (sMainLoopPendingEvents) { - delete sMainLoopPendingEvents; - sMainLoopPendingEvents = nullptr; - } -} - void SendFOGData(ipc::ByteBuf&& buf) { if (sChild) { sChild->SendFOGData(std::move(buf)); @@ -299,9 +218,7 @@ } #endif -GMPThreadImpl::GMPThreadImpl() : mMutex("GMPThreadImpl"), mThread("GMPThread") { - MOZ_COUNT_CTOR(GMPThread); -} +GMPThreadImpl::GMPThreadImpl() { MOZ_COUNT_CTOR(GMPThread); } GMPThreadImpl::~GMPThreadImpl() { MOZ_COUNT_DTOR(GMPThread); } @@ -331,9 +248,7 @@ delete this; } -GMPMutexImpl::GMPMutexImpl() : mMonitor("gmp-mutex") { - MOZ_COUNT_CTOR(GMPMutexImpl); -} +GMPMutexImpl::GMPMutexImpl() { MOZ_COUNT_CTOR(GMPMutexImpl); } GMPMutexImpl::~GMPMutexImpl() { MOZ_COUNT_DTOR(GMPMutexImpl); } diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPPlatform.h firefox-esr-140.10.0esr/dom/media/gmp/GMPPlatform.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPPlatform.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPPlatform.h 2026-04-15 01:59:49.000000000 +0000 @@ -6,9 +6,8 @@ #ifndef GMPPlatform_h_ #define GMPPlatform_h_ -#include "mozilla/RefPtr.h" #include "gmp-platform.h" -#include +#include "mozilla/RefPtr.h" #include "mozilla/gmp/PGMPChild.h" namespace mozilla { @@ -25,7 +24,6 @@ class GMPChild; void InitPlatformAPI(GMPPlatformAPI& aPlatformAPI, GMPChild* aChild); -void ShutdownPlatformAPI(); GMPErr RunOnMainThread(GMPTask* aTask); @@ -33,24 +31,6 @@ GMPErr SetTimerOnMainThread(GMPTask* aTask, int64_t aTimeoutMS); -/** - * This is intended to be used by encoders/decoders that will make a GMP call - * that is a synchronous post to the GMP worker thread. Because the GMP worker - * threads can synchronously callback to the main thread, this has the potential - * for a deadlock. If the encoder/decoder tracks any outstanding requests that - * will result in a synchronous callback to the main thread, we can simply spin - * the event loop on those callbacks until they are completed. Then we can - * safefully make our own synchronous call to the GMP worker thread without fear - * of a deadlock. - * - * Note that each encoder/decoder has its own worker thread, so assuming we - * drain the synchronous events for that specific encoder/decoder, we know there - * are no more forthcoming to cause us to deadlock. - */ -using SpinPendingPredicate = std::function; -bool SpinPendingGmpEventsUntil(const SpinPendingPredicate& aPred, - uint32_t aTimeoutMs); - void SendFOGData(ipc::ByteBuf&& buf); #ifdef XP_WIN diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPService.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPService.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPService.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPService.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -459,12 +459,10 @@ RefPtr parent = wrapper->mParent; UniquePtr callback(rawCallback); GMPVideoDecoderParent* actor = nullptr; - GMPVideoHostImpl* host = nullptr; if (parent && NS_SUCCEEDED(parent->GetGMPVideoDecoder(&actor))) { - host = &(actor->Host()); actor->SetCrashHelper(helper); } - callback->Done(actor, host); + callback->Done(actor, actor); }, [rawCallback] { UniquePtr callback(rawCallback); @@ -499,12 +497,10 @@ RefPtr parent = wrapper->mParent; UniquePtr callback(rawCallback); GMPVideoEncoderParent* actor = nullptr; - GMPVideoHostImpl* host = nullptr; if (parent && NS_SUCCEEDED(parent->GetGMPVideoEncoder(&actor))) { - host = &(actor->Host()); actor->SetCrashHelper(helper); } - callback->Done(actor, host); + callback->Done(actor, actor); }, [rawCallback] { UniquePtr callback(rawCallback); diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPSharedMemManager.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPSharedMemManager.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPSharedMemManager.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPSharedMemManager.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -63,7 +63,9 @@ ipc::Shmem&& aMem) { MOZ_ASSERT(MgrIsOnOwningThread()); - if (!aMem.IsWritable()) { + if (!aMem.IsWritable() || !MgrCanSend()) { + // Either the shmem is not allocated, or the actor is already dead and it + // will get freed when the Shmem reference goes away. return; } diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPSharedMemManager.h firefox-esr-140.10.0esr/dom/media/gmp/GMPSharedMemManager.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPSharedMemManager.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPSharedMemManager.h 2026-04-15 01:59:49.000000000 +0000 @@ -33,6 +33,7 @@ protected: virtual bool MgrIsOnOwningThread() const = 0; + virtual bool MgrCanSend() const = 0; static constexpr size_t kMaxPools = 2; diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPStorageChild.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPStorageChild.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPStorageChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPStorageChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -33,57 +33,117 @@ GMPRecordClient* aClient) : mName(aName), mClient(aClient), mOwner(aOwner) {} -GMPErr GMPRecordImpl::Open() { return mOwner->Open(this); } +RefPtr GMPRecordImpl::GetOwner() { + RecursiveMutexAutoLock lock(mMutex); + return RefPtr{mOwner}; +} + +GMPErr GMPRecordImpl::Open() { + // The IPDL actor might be destroyed on another thread, releasing the owner, + // so take a strong reference to ensure it stays alive long enough. + if (auto owner = GetOwner()) { + return owner->Open(this); + } + return GMPClosedErr; +} void GMPRecordImpl::OpenComplete(GMPErr aStatus) { - mClient->OpenComplete(aStatus); + // While we know mClient is not yet destroyed if the pointer is still valid + // while holding the lock, be careful to note that it may be destroyed by the + // plugin after the callback returns. + RecursiveMutexAutoLock lock(mMutex); + if (mClient) { + mClient->OpenComplete(aStatus); + } } -GMPErr GMPRecordImpl::Read() { return mOwner->Read(this); } +GMPErr GMPRecordImpl::Read() { + // The IPDL actor might be destroyed on another thread, releasing the owner, + // so take a strong reference to ensure it stays alive long enough. + if (auto owner = GetOwner()) { + return owner->Read(this); + } + return GMPClosedErr; +} void GMPRecordImpl::ReadComplete(GMPErr aStatus, const uint8_t* aBytes, uint32_t aLength) { - mClient->ReadComplete(aStatus, aBytes, aLength); + // While we know mClient is not yet destroyed if the pointer is still valid + // while holding the lock, be careful to note that it may be destroyed by the + // plugin after the callback returns. + RecursiveMutexAutoLock lock(mMutex); + if (mClient) { + mClient->ReadComplete(aStatus, aBytes, aLength); + } } GMPErr GMPRecordImpl::Write(const uint8_t* aData, uint32_t aDataSize) { - return mOwner->Write(this, aData, aDataSize); + // The IPDL actor might be destroyed on another thread, releasing the owner, + // so take a strong reference to ensure it stays alive long enough. + if (auto owner = GetOwner()) { + return owner->Write(this, aData, aDataSize); + } + return GMPClosedErr; } void GMPRecordImpl::WriteComplete(GMPErr aStatus) { - mClient->WriteComplete(aStatus); + // While we know mClient is not yet destroyed if the pointer is still valid + // while holding the lock, be careful to note that it may be destroyed by the + // plugin after the callback returns. + RecursiveMutexAutoLock lock(mMutex); + if (mClient) { + mClient->WriteComplete(aStatus); + } } GMPErr GMPRecordImpl::Close() { RefPtr kungfuDeathGrip(this); // Delete our self reference. Release(); - mOwner->Close(this->Name()); + + // We need to only clear mClient within the lock to avoid destroying it while + // a callback is in progress. Since we have no control over the plugins on + // when they choose to call Close, we must support this being re-entrant (e.g. + // call Close from the OpenComplete, ReadComplete or WriteComplete callbacks). + RefPtr owner; + { + RecursiveMutexAutoLock lock(mMutex); + owner = RefPtr{mOwner}; + mClient = nullptr; + } + + if (owner) { + owner->Close(this->Name()); + } return GMPNoErr; } -GMPStorageChild::GMPStorageChild(GMPChild* aPlugin) - : mMonitor("GMPStorageChild"), mPlugin(aPlugin), mShutdown(false) { +void GMPRecordImpl::DestroyOwner() { + RecursiveMutexAutoLock lock(mMutex); + mOwner = nullptr; +} + +GMPStorageChild::GMPStorageChild(GMPChild* aPlugin) : mPlugin(aPlugin) { MOZ_ASSERT(ON_GMP_THREAD()); } GMPErr GMPStorageChild::CreateRecord(const nsCString& aRecordName, GMPRecord** aOutRecord, GMPRecordClient* aClient) { - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); - if (mShutdown) { - NS_WARNING("GMPStorage used after it's been shutdown!"); + if (NS_WARN_IF(mShutdown)) { return GMPClosedErr; } - MOZ_ASSERT(aRecordName.Length() && aOutRecord); + MOZ_ASSERT(!aRecordName.IsEmpty()); + MOZ_ASSERT(aOutRecord); if (HasRecord(aRecordName)) { return GMPRecordInUse; } - RefPtr record(new GMPRecordImpl(this, aRecordName, aClient)); + auto record = MakeRefPtr(this, aRecordName, aClient); mRecords.InsertOrUpdate(aRecordName, RefPtr{record}); // Addrefs // The GMPRecord holds a self reference until the GMP calls Close() on @@ -95,23 +155,24 @@ } bool GMPStorageChild::HasRecord(const nsCString& aRecordName) { - mMonitor.AssertCurrentThreadOwns(); return mRecords.Contains(aRecordName); } already_AddRefed GMPStorageChild::GetRecord( const nsCString& aRecordName) { - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); + if (NS_WARN_IF(mShutdown)) { + return nullptr; + } RefPtr record; mRecords.Get(aRecordName, getter_AddRefs(record)); return record.forget(); } GMPErr GMPStorageChild::Open(GMPRecordImpl* aRecord) { - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); - if (mShutdown) { - NS_WARNING("GMPStorage used after it's been shutdown!"); + if (NS_WARN_IF(mShutdown)) { return GMPClosedErr; } @@ -126,10 +187,9 @@ } GMPErr GMPStorageChild::Read(GMPRecordImpl* aRecord) { - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); - if (mShutdown) { - NS_WARNING("GMPStorage used after it's been shutdown!"); + if (NS_WARN_IF(mShutdown)) { return GMPClosedErr; } @@ -149,10 +209,9 @@ return GMPQuotaExceededErr; } - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); - if (mShutdown) { - NS_WARNING("GMPStorage used after it's been shutdown!"); + if (NS_WARN_IF(mShutdown)) { return GMPClosedErr; } @@ -167,15 +226,13 @@ } GMPErr GMPStorageChild::Close(const nsCString& aRecordName) { - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); - if (!HasRecord(aRecordName)) { + if (!mRecords.Remove(aRecordName)) { // Already closed. return GMPClosedErr; } - mRecords.Remove(aRecordName); - if (!mShutdown) { CALL_ON_GMP_THREAD(SendClose, aRecordName); } @@ -185,46 +242,26 @@ mozilla::ipc::IPCResult GMPStorageChild::RecvOpenComplete( const nsCString& aRecordName, const GMPErr& aStatus) { - // We don't need a lock to read |mShutdown| since it is only changed in - // the GMP thread. - if (mShutdown) { - return IPC_OK(); - } - RefPtr record = GetRecord(aRecordName); - if (!record) { - // Not fatal. - return IPC_OK(); + if (RefPtr record = GetRecord(aRecordName)) { + record->OpenComplete(aStatus); } - record->OpenComplete(aStatus); return IPC_OK(); } mozilla::ipc::IPCResult GMPStorageChild::RecvReadComplete( const nsCString& aRecordName, const GMPErr& aStatus, nsTArray&& aBytes) { - if (mShutdown) { - return IPC_OK(); - } - RefPtr record = GetRecord(aRecordName); - if (!record) { - // Not fatal. - return IPC_OK(); + if (RefPtr record = GetRecord(aRecordName)) { + record->ReadComplete(aStatus, aBytes.Elements(), aBytes.Length()); } - record->ReadComplete(aStatus, aBytes.Elements(), aBytes.Length()); return IPC_OK(); } mozilla::ipc::IPCResult GMPStorageChild::RecvWriteComplete( const nsCString& aRecordName, const GMPErr& aStatus) { - if (mShutdown) { - return IPC_OK(); + if (RefPtr record = GetRecord(aRecordName)) { + record->WriteComplete(aStatus); } - RefPtr record = GetRecord(aRecordName); - if (!record) { - // Not fatal. - return IPC_OK(); - } - record->WriteComplete(aStatus); return IPC_OK(); } @@ -232,11 +269,26 @@ // Block any new storage requests, and thus any messages back to the // parent. We don't delete any objects here, as that may invalidate // GMPRecord pointers held by the GMP. - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); mShutdown = true; return IPC_OK(); } +void GMPStorageChild::ActorDestroy(ActorDestroyReason aWhy) { + nsRefPtrHashtable records; + { + MutexAutoLock lock(mMutex); + mShutdown = true; + records = std::move(mRecords); + } + + // We know that any other thread that may be using the owner has a strong + // reference to it, so it is safe to clear our own reference here. + for (auto& record : records) { + record.GetData()->DestroyOwner(); + } +} + } // namespace mozilla::gmp // avoid redefined macro in unified build diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPStorageChild.h firefox-esr-140.10.0esr/dom/media/gmp/GMPStorageChild.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPStorageChild.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPStorageChild.h 2026-04-15 01:59:49.000000000 +0000 @@ -7,6 +7,8 @@ #define GMPStorageChild_h_ #include "mozilla/gmp/PGMPStorageChild.h" +#include "mozilla/Mutex.h" +#include "mozilla/RecursiveMutex.h" #include "gmp-storage.h" #include "nsTHashtable.h" #include "nsRefPtrHashtable.h" @@ -19,13 +21,15 @@ class GMPChild; class GMPStorageChild; -class GMPRecordImpl : public GMPRecord { +class GMPRecordImpl final : public GMPRecord { public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPRecordImpl) GMPRecordImpl(GMPStorageChild* aOwner, const nsCString& aName, GMPRecordClient* aClient); + void DestroyOwner(); + // GMPRecord. GMPErr Open() override; GMPErr Read() override; @@ -39,13 +43,16 @@ void WriteComplete(GMPErr aStatus); private: + RefPtr GetOwner(); + ~GMPRecordImpl() = default; + RecursiveMutex mMutex{"GMPRecordImpl"}; const nsCString mName; - GMPRecordClient* const mClient; - GMPStorageChild* const mOwner; + GMPRecordClient* mClient MOZ_GUARDED_BY(mMutex); + GMPStorageChild* mOwner MOZ_GUARDED_BY(mMutex); }; -class GMPStorageChild : public PGMPStorageChild { +class GMPStorageChild final : public PGMPStorageChild { friend class PGMPStorageChild; public: @@ -65,8 +72,10 @@ GMPErr Close(const nsCString& aRecordName); + void ActorDestroy(ActorDestroyReason aWhy) override; + private: - bool HasRecord(const nsCString& aRecordName); + bool HasRecord(const nsCString& aRecordName) MOZ_REQUIRES(mMutex); already_AddRefed GetRecord(const nsCString& aRecordName); protected: @@ -83,10 +92,11 @@ mozilla::ipc::IPCResult RecvShutdown(); private: - Monitor mMonitor MOZ_UNANNOTATED; - nsRefPtrHashtable mRecords; + Mutex mMutex{"GMPStorageChild"}; + nsRefPtrHashtable mRecords + MOZ_GUARDED_BY(mMutex); GMPChild* mPlugin; - bool mShutdown; + bool mShutdown MOZ_GUARDED_BY(mMutex) = false; }; } // namespace mozilla::gmp diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPTypes.ipdlh firefox-esr-140.10.0esr/dom/media/gmp/GMPTypes.ipdlh --- firefox-esr-140.9.1esr/dom/media/gmp/GMPTypes.ipdlh 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPTypes.ipdlh 2026-04-15 01:59:48.000000000 +0000 @@ -6,6 +6,7 @@ include "GMPMessageUtils.h"; using cdm::EncryptionScheme from "GMPSanitizedExports.h"; +using cdm::KeyStatus from "GMPSanitizedExports.h"; using GMPBufferType from "gmp-video-codec.h"; namespace mozilla { @@ -92,7 +93,7 @@ struct CDMKeyInformation { uint8_t[] mKeyId; - uint32_t mStatus; + KeyStatus mStatus; uint32_t mSystemCode; }; diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPUtils.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPUtils.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPUtils.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPUtils.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -256,30 +256,23 @@ } } -bool AdjustOpenH264NALUSequence(GMPVideoEncodedFrame* aEncodedFrame) { - MOZ_ASSERT(aEncodedFrame); - MOZ_ASSERT(IsOnGMPThread()); - - uint8_t* encodedBuffer = aEncodedFrame->Buffer(); - uint32_t encodedSize = aEncodedFrame->Size(); - GMPBufferType encodedType = aEncodedFrame->BufferType(); - - if (NS_WARN_IF(!encodedBuffer)) { - GMP_LOG_ERROR("GMP plugin returned null buffer"); - return false; - } - +bool AdjustOpenH264NALUSequence(uint8_t* aBuffer, uint32_t aSize, + GMPBufferType aType) { // Libwebrtc's RtpPacketizerH264 expects a 3- or 4-byte NALU start sequence // before the start of the NALU payload. {0,0,1} or {0,0,0,1}. We set this // in-place. Any other length of the length field we reject. - - const int sizeNumBytes = SizeNumBytes(encodedType); + const uint32_t sizeNumBytes = static_cast(SizeNumBytes(aType)); + if (sizeNumBytes > aSize) { + return false; + } uint32_t unitOffset = 0; uint32_t unitSize = 0; - // Make sure we don't read past the end of the buffer getting the size - while (unitOffset + sizeNumBytes < encodedSize) { - uint8_t* unitBuffer = encodedBuffer + unitOffset; - switch (encodedType) { + // Make sure we don't read past the end of the buffer getting the size. + // Subtraction form avoids uint32_t wraparound: aSize - sizeNumBytes + // cannot underflow (checked above). + while (unitOffset < aSize - sizeNumBytes) { + uint8_t* unitBuffer = aBuffer + unitOffset; + switch (aType) { case GMP_BufferLength24: { #if MOZ_LITTLE_ENDIAN() unitSize = (static_cast(*unitBuffer)) | @@ -296,7 +289,7 @@ // sequence to the NALU size per the GMP protocol. We mitigate this by // letting it through as this is what libwebrtc already expects and // scans for. - unitSize = encodedSize - 3; + unitSize = aSize - 3; break; } memcpy(unitBuffer, startSequence, 3); @@ -314,41 +307,54 @@ // sequence to the NALU size per the GMP protocol. We mitigate this by // letting it through as this is what libwebrtc already expects and // scans for. - unitSize = encodedSize - 4; + unitSize = aSize - 4; break; } memcpy(unitBuffer, startSequence, 4); break; } default: - GMP_LOG_ERROR("GMP plugin returned type we cannot handle (%d)", - encodedType); + GMP_LOG_ERROR("GMP plugin returned type we cannot handle (%d)", aType); return false; } - MOZ_ASSERT(unitSize != 0); - MOZ_ASSERT(unitOffset + sizeNumBytes + unitSize <= encodedSize); - if (unitSize == 0 || unitOffset + sizeNumBytes + unitSize > encodedSize) { + // Loop invariant: unitOffset + sizeNumBytes <= aSize, so + // aSize - unitOffset - sizeNumBytes cannot underflow. + const uint32_t remaining = aSize - unitOffset - sizeNumBytes; + if (unitSize == 0 || unitSize > remaining) { // XXX Should we kill the plugin for returning extra bytes? Probably GMP_LOG_ERROR( "GMP plugin returned badly formatted encoded data: " - "unitOffset=%u, sizeNumBytes=%d, unitSize=%u, size=%u", - unitOffset, sizeNumBytes, unitSize, encodedSize); + "unitOffset=%u, sizeNumBytes=%u, unitSize=%u, size=%u", + unitOffset, sizeNumBytes, unitSize, aSize); return false; } unitOffset += sizeNumBytes + unitSize; } - if (unitOffset != encodedSize) { + if (unitOffset != aSize) { // At most 3 bytes can be left over, depending on buffertype - GMP_LOG_DEBUG("GMP plugin returned %u extra bytes", - encodedSize - unitOffset); + GMP_LOG_DEBUG("GMP plugin returned %u extra bytes", aSize - unitOffset); } return true; } +bool AdjustOpenH264NALUSequence(GMPVideoEncodedFrame* aEncodedFrame) { + MOZ_ASSERT(aEncodedFrame); + MOZ_ASSERT(IsOnGMPThread()); + + uint8_t* encodedBuffer = aEncodedFrame->Buffer(); + if (NS_WARN_IF(!encodedBuffer)) { + GMP_LOG_ERROR("GMP plugin returned null buffer"); + return false; + } + + return AdjustOpenH264NALUSequence(encodedBuffer, aEncodedFrame->Size(), + aEncodedFrame->BufferType()); +} + MediaResult ToMediaResult(GMPErr aErr, const nsACString& aMessage) { nsPrintfCString msg("%s (GMPErr:%x)", aMessage.Data(), aErr); switch (aErr) { diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPUtils.h firefox-esr-140.10.0esr/dom/media/gmp/GMPUtils.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPUtils.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPUtils.h 2026-04-15 01:59:49.000000000 +0000 @@ -7,6 +7,7 @@ #define GMPUtils_h_ #include "gmp-errors.h" +#include "gmp-video-codec.h" #include "MediaResult.h" #include "mozilla/AbstractThread.h" #include "mozilla/RefPtr.h" @@ -83,6 +84,9 @@ // I420 format, padded so that the width and height are multiples of 16. size_t I420FrameBufferSizePadded(int32_t aWidth, int32_t aHeight); +bool AdjustOpenH264NALUSequence(uint8_t* aBuffer, uint32_t aSize, + GMPBufferType aType); + bool AdjustOpenH264NALUSequence(GMPVideoEncodedFrame* aEncodedFrame); MediaResult ToMediaResult(GMPErr aErr, const nsACString& aMessage); diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoDecoderChild.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoDecoderChild.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoDecoderChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoDecoderChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -4,23 +4,34 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "GMPVideoDecoderChild.h" -#include "GMPVideoi420FrameImpl.h" + #include "GMPContentChild.h" #include #include "mozilla/Unused.h" -#include "mozilla/StaticPrefs_media.h" #include "GMPPlatform.h" #include "GMPVideoEncodedFrameImpl.h" +#include "GMPVideoi420FrameImpl.h" +#include "mozilla/StaticPrefs_media.h" +#include "nsProxyRelease.h" +#include "nsThreadUtils.h" #include "runnable_utils.h" namespace mozilla::gmp { GMPVideoDecoderChild::GMPVideoDecoderChild(GMPContentChild* aPlugin) - : mPlugin(aPlugin), mVideoDecoder(nullptr), mVideoHost(this) { + : mPlugin(aPlugin), mVideoDecoder(nullptr) { MOZ_ASSERT(mPlugin); } -GMPVideoDecoderChild::~GMPVideoDecoderChild() = default; +GMPVideoDecoderChild::~GMPVideoDecoderChild() { + // Since any outstanding synchronous runnables require a strong reference to + // ourselves, we know that when we are freed, they must have all successfully + // dispatched. As such, it should now be safe to free the plugin and join with + // the worker thread. + if (mVideoDecoder) { + mVideoDecoder->DecodingComplete(); + } +} bool GMPVideoDecoderChild::MgrIsOnOwningThread() const { return !mPlugin || mPlugin->GMPMessageLoop() == MessageLoop::current(); @@ -32,8 +43,6 @@ mVideoDecoder = aDecoder; } -GMPVideoHostImpl& GMPVideoDecoderChild::Host() { return mVideoHost; } - void GMPVideoDecoderChild::Decoded(GMPVideoi420Frame* aDecodedFrame) { if (!aDecodedFrame) { MOZ_CRASH("Not given a decoded frame!"); @@ -48,11 +57,9 @@ auto df = static_cast(aDecodedFrame); - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - ipc::Shmem inputShmem; - if (memMgr->MgrTakeShmem(GMPSharedMemClass::Encoded, &inputShmem)) { - Unused << SendReturnShmem(std::move(inputShmem)); - } + ipc::Shmem inputShmem; + if (MgrTakeShmem(GMPSharedMemClass::Encoded, &inputShmem)) { + Unused << SendReturnShmem(std::move(inputShmem)); } GMPVideoi420FrameData frameData; @@ -102,8 +109,17 @@ } void GMPVideoDecoderChild::DrainComplete() { - MOZ_ASSERT(mOutstandingDrain, "DrainComplete without Drain!"); - mOutstandingDrain = false; + if (!mDrainSelfRef) { + MOZ_ASSERT_UNREACHABLE("DrainComplete without Drain!"); + return; + } + + // Proxy release to ensure that any synchronous runnables from the plugin can + // first unblock the worker thread. If we destroy the plugin once this + // reference is freed, we won't be blocked trying to join the worker thread. + NS_ProxyRelease("GMPVideoDecoderChild::DrainComplete", + GetMainThreadSerialEventTarget(), mDrainSelfRef.forget(), + /* aAlwaysProxy */ true); if (NS_WARN_IF(!mPlugin)) { return; @@ -115,8 +131,17 @@ } void GMPVideoDecoderChild::ResetComplete() { - MOZ_ASSERT(mOutstandingReset, "ResetComplete without Reset!"); - mOutstandingReset = false; + if (!mResetSelfRef) { + MOZ_ASSERT_UNREACHABLE("ResetComplete without Reset!"); + return; + } + + // Proxy release to ensure that any synchronous runnables from the plugin can + // first unblock the worker thread. If we destroy the plugin once this + // reference is freed, we won't be blocked trying to join the worker thread. + NS_ProxyRelease("GMPVideoDecoderChild::ResetComplete", + GetMainThreadSerialEventTarget(), mResetSelfRef.forget(), + /* aAlwaysProxy */ true); if (NS_WARN_IF(!mPlugin)) { return; @@ -153,12 +178,7 @@ mozilla::ipc::IPCResult GMPVideoDecoderChild::RecvGiveShmem( ipc::Shmem&& aOutputShmem) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - memMgr->MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(aOutputShmem)); - } else { - DeallocShmem(aOutputShmem); - } - + MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(aOutputShmem)); return IPC_OK(); } @@ -171,8 +191,8 @@ return IPC_FAIL(this, "!mVideoDecoder"); } - auto* f = new GMPVideoEncodedFrameImpl(aInputFrame, std::move(aInputShmem), - &mVideoHost); + auto* f = + new GMPVideoEncodedFrameImpl(aInputFrame, std::move(aInputShmem), this); // Ignore any return code. It is OK for this to fail without killing the // process. @@ -187,14 +207,14 @@ return IPC_FAIL(this, "!mVideoDecoder"); } - if (mOutstandingReset) { + if (mResetSelfRef) { MOZ_ASSERT_UNREACHABLE("Already has outstanding reset!"); return IPC_OK(); } // Ignore any return code. It is OK for this to fail without killing the // process. - mOutstandingReset = true; + mResetSelfRef = this; mVideoDecoder->Reset(); return IPC_OK(); @@ -205,42 +225,24 @@ return IPC_FAIL(this, "!mVideoDecoder"); } - if (mOutstandingDrain) { + if (mDrainSelfRef) { MOZ_ASSERT_UNREACHABLE("Already has outstanding drain!"); return IPC_OK(); } // Ignore any return code. It is OK for this to fail without killing the // process. - mOutstandingDrain = true; + mDrainSelfRef = this; mVideoDecoder->Drain(); return IPC_OK(); } void GMPVideoDecoderChild::ActorDestroy(ActorDestroyReason why) { - // If there are no encoded frames, then we know that OpenH264 has destroyed - // any outstanding references to its pending decode frames. This means it - // should be safe to destroy the decoder since there should not be any pending - // sync callbacks. - if (!SpinPendingGmpEventsUntil( - [&]() -> bool { - return mOutstandingDrain || mOutstandingReset || - mVideoHost.IsEncodedFramesEmpty(); - }, - StaticPrefs::media_gmp_coder_shutdown_timeout_ms())) { - NS_WARNING("Timed out waiting for synchronous events!"); - } - - if (mVideoDecoder) { - // Ignore any return code. It is OK for this to fail without killing the - // process. - mVideoDecoder->DecodingComplete(); - mVideoDecoder = nullptr; - } - - mVideoHost.DoneWithAPI(); - + // We don't destroy the video decoder from the plugin here because there may + // be outstanding synchronous runnables. They hold a strong reference to + // ourselves, so we can wait for our destructor to be called first. + MgrPurgeShmems(); mPlugin = nullptr; } diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoDecoderChild.h firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoDecoderChild.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoDecoderChild.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoDecoderChild.h 2026-04-15 01:59:49.000000000 +0000 @@ -19,7 +19,7 @@ class GMPVideoDecoderChild final : public PGMPVideoDecoderChild, public GMPVideoDecoderCallback, - public GMPSharedMemManager { + public GMPVideoHostImpl { friend class PGMPVideoDecoderChild; public: @@ -30,7 +30,6 @@ explicit GMPVideoDecoderChild(GMPContentChild* aPlugin); void Init(GMPVideoDecoder* aDecoder); - GMPVideoHostImpl& Host(); // GMPVideoDecoderCallback void Decoded(GMPVideoi420Frame* decodedFrame) override; @@ -42,8 +41,13 @@ void Error(GMPErr aError) override; // GMPSharedMemManager + bool MgrCanSend() const override { return CanSend(); } bool MgrIsOnOwningThread() const override; - void MgrDeallocShmem(Shmem& aMem) override { DeallocShmem(aMem); } + void MgrDeallocShmem(Shmem& aMem) override { + if (CanSend()) { + DeallocShmem(aMem); + } + } private: virtual ~GMPVideoDecoderChild(); @@ -63,9 +67,8 @@ GMPContentChild* mPlugin; GMPVideoDecoder* mVideoDecoder; - GMPVideoHostImpl mVideoHost; - bool mOutstandingDrain = false; - bool mOutstandingReset = false; + RefPtr mDrainSelfRef; + RefPtr mResetSelfRef; }; } // namespace mozilla::gmp diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoDecoderParent.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoDecoderParent.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoDecoderParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoDecoderParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -37,7 +37,6 @@ mIsAwaitingDrainComplete(false), mPlugin(aPlugin), mCallback(nullptr), - mVideoHost(this), mPluginId(aPlugin->GetPluginId()), mPluginType(aPlugin->GetPluginType()), mFrameCount(0) { @@ -50,8 +49,6 @@ return !mPlugin || mPlugin->GMPEventTarget()->IsOnCurrentThread(); } -GMPVideoHostImpl& GMPVideoDecoderParent::Host() { return mVideoHost; } - // Note: may be called via Terminated() void GMPVideoDecoderParent::Close() { GMP_LOG_DEBUG("GMPVideoDecoderParent[%p]::Close()", this); @@ -133,12 +130,10 @@ } if (mDecodedShmemSize > 0) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - ipc::Shmem outputShmem; - if (memMgr->MgrTakeShmem(GMPSharedMemClass::Decoded, mDecodedShmemSize, - &outputShmem)) { - Unused << SendGiveShmem(std::move(outputShmem)); - } + ipc::Shmem outputShmem; + if (MgrTakeShmem(GMPSharedMemClass::Decoded, mDecodedShmemSize, + &outputShmem)) { + Unused << SendGiveShmem(std::move(outputShmem)); } } @@ -280,7 +275,7 @@ mPlugin->VideoDecoderDestroyed(this); mPlugin = nullptr; } - mVideoHost.ActorDestroyed(); + MgrPurgeShmems(); MaybeDisconnect(aWhy == AbnormalShutdown); } @@ -319,12 +314,7 @@ mozilla::ipc::IPCResult GMPVideoDecoderParent::RecvReturnShmem( ipc::Shmem&& aInputShmem) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - memMgr->MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(aInputShmem)); - } else { - DeallocShmem(aInputShmem); - } - + MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(aInputShmem)); return IPC_OK(); } @@ -332,7 +322,7 @@ const GMPVideoi420FrameData& aDecodedFrame, ipc::Shmem&& aDecodedShmem) { if (HandleDecoded(aDecodedFrame, aDecodedShmem.Size())) { auto* f = new GMPVideoi420FrameImpl(aDecodedFrame, std::move(aDecodedShmem), - &mVideoHost); + this); mCallback->Decoded(f); } else { DeallocShmem(aDecodedShmem); @@ -346,7 +336,7 @@ if (HandleDecoded(aDecodedFrame, aDecodedArray.Length())) { mDecodedShmemSize = std::max(mDecodedShmemSize, aDecodedArray.Length()); auto* f = new GMPVideoi420FrameImpl(aDecodedFrame, std::move(aDecodedArray), - &mVideoHost); + this); mCallback->Decoded(f); } diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoDecoderParent.h firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoDecoderParent.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoDecoderParent.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoDecoderParent.h 2026-04-15 01:59:49.000000000 +0000 @@ -23,7 +23,7 @@ class GMPVideoDecoderParent final : public PGMPVideoDecoderParent, public GMPVideoDecoderProxy, - public GMPSharedMemManager, + public GMPVideoHostImpl, public GMPCrashHelperHolder { friend class PGMPVideoDecoderParent; @@ -34,7 +34,6 @@ explicit GMPVideoDecoderParent(GMPContentParent* aPlugin); - GMPVideoHostImpl& Host(); nsresult Shutdown(); // GMPVideoDecoder @@ -58,9 +57,14 @@ return AllocShmem(aSize, aMem); } - void MgrDeallocShmem(Shmem& aMem) override { DeallocShmem(aMem); } + void MgrDeallocShmem(Shmem& aMem) override { + if (CanSend()) { + DeallocShmem(aMem); + } + } protected: + bool MgrCanSend() const override { return CanSend(); } bool MgrIsOnOwningThread() const override; private: @@ -99,7 +103,6 @@ bool mIsAwaitingDrainComplete; RefPtr mPlugin; RefPtr mCallback; - GMPVideoHostImpl mVideoHost; const uint32_t mPluginId; GMPPluginType mPluginType = GMPPluginType::Unknown; int32_t mFrameCount; diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -7,7 +7,9 @@ #include "GMPVideoHost.h" #include "mozilla/gmp/GMPTypes.h" #include "mozilla/Unused.h" -#include "GMPSharedMemManager.h" +#include "nsProxyRelease.h" +#include "nsThreadUtils.h" +#include "nsXULAppAPI.h" namespace mozilla::gmp { @@ -23,7 +25,6 @@ mHost(aHost), mBufferType(GMP_BufferSingle) { MOZ_ASSERT(aHost); - aHost->EncodedFrameCreated(this); } GMPVideoEncodedFrameImpl::GMPVideoEncodedFrameImpl( @@ -41,7 +42,6 @@ mShmemBuffer(std::move(aShmemBuffer)), mBufferType(aFrameData.mBufferType()) { MOZ_ASSERT(aHost); - aHost->EncodedFrameCreated(this); } GMPVideoEncodedFrameImpl::GMPVideoEncodedFrameImpl( @@ -59,13 +59,17 @@ mArrayBuffer(std::move(aArrayBuffer)), mBufferType(aFrameData.mBufferType()) { MOZ_ASSERT(aHost); - aHost->EncodedFrameCreated(this); } GMPVideoEncodedFrameImpl::~GMPVideoEncodedFrameImpl() { DestroyBuffer(); - if (mHost) { - mHost->EncodedFrameDestroyed(this); + // Proxy release to ensure that any synchronous runnables from the plugin can + // first unblock the worker thread. If we destroy the plugin once this + // reference is freed, we won't be blocked trying to join the worker thread. + if (XRE_IsGMPluginProcess()) { + NS_ProxyRelease("GMPVideoEncodedFrameImpl::~GMPVideoEncodedFrameImpl", + GetMainThreadSerialEventTarget(), mHost.forget(), + /* aAlwaysProxy */ true); } } @@ -73,18 +77,20 @@ return kGMPEncodedVideoFrame; } -void GMPVideoEncodedFrameImpl::DoneWithAPI() { - DestroyBuffer(); - - // Do this after destroying the buffer because destruction - // involves deallocation, which requires a host. - mHost = nullptr; -} - /* static */ bool GMPVideoEncodedFrameImpl::CheckFrameData( const GMPVideoEncodedFrameData& aFrameData, size_t aBufferSize) { - return aFrameData.mSize() <= aBufferSize; + if (aFrameData.mTemporalLayerId() < -1 || + aFrameData.mTemporalLayerId() >= 4) { + // Valid temporal layer IDs are -1 which denotes that no layer ID was set, + // and 0-3 to denote up to the max number of layers supported for sending by + // libwebrtc (4), see webrtc::kMaxTemporalStreams. + return false; + } + // 100 MB is far beyond any legitimate single encoded video frame. + static constexpr uint32_t kMaxFrameSize = 100u * 1024u * 1024u; + return aFrameData.mSize() <= aBufferSize && + aFrameData.mSize() <= kMaxFrameSize; } void GMPVideoEncodedFrameImpl::RelinquishFrameData( @@ -129,9 +135,8 @@ } void GMPVideoEncodedFrameImpl::DestroyBuffer() { - if (mHost && mShmemBuffer.IsWritable()) { - mHost->SharedMemMgr()->MgrGiveShmem(GMPSharedMemClass::Encoded, - std::move(mShmemBuffer)); + if (mShmemBuffer.IsWritable()) { + mHost->MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(mShmemBuffer)); } mShmemBuffer = ipc::Shmem(); mArrayBuffer.Clear(); @@ -142,8 +147,8 @@ DestroyBuffer(); } else if (aSize > AllocatedSize()) { DestroyBuffer(); - if (!mHost->SharedMemMgr()->MgrTakeShmem(GMPSharedMemClass::Encoded, aSize, - &mShmemBuffer) && + if (!mHost->MgrTakeShmem(GMPSharedMemClass::Encoded, aSize, + &mShmemBuffer) && !mArrayBuffer.SetLength(aSize, fallible)) { return GMPAllocErr; } @@ -212,18 +217,13 @@ return; } - if (!mHost) { - return; - } - if (!mArrayBuffer.IsEmpty()) { Unused << mArrayBuffer.SetLength(aNewSize, fallible); return; } ipc::Shmem new_mem; - if (!mHost->SharedMemMgr()->MgrTakeShmem(GMPSharedMemClass::Encoded, aNewSize, - &new_mem) && + if (!mHost->MgrTakeShmem(GMPSharedMemClass::Encoded, aNewSize, &new_mem) && !mArrayBuffer.SetLength(aNewSize, fallible)) { return; } @@ -232,8 +232,7 @@ if (new_mem.IsWritable()) { memcpy(new_mem.get(), mShmemBuffer.get(), mSize); } - mHost->SharedMemMgr()->MgrGiveShmem(GMPSharedMemClass::Encoded, - std::move(mShmemBuffer)); + mHost->MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(mShmemBuffer)); } mShmemBuffer = new_mem; diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncodedFrameImpl.h firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncodedFrameImpl.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.h 2026-04-15 01:59:49.000000000 +0000 @@ -57,10 +57,6 @@ GMPVideoHostImpl* aHost); virtual ~GMPVideoEncodedFrameImpl(); - // This is called during a normal destroy sequence, which is - // when a consumer is finished or during XPCOM shutdown. - void DoneWithAPI(); - static bool CheckFrameData(const GMPVideoEncodedFrameData& aFrameData, size_t aBufferSize); @@ -116,7 +112,7 @@ uint32_t mSize; int32_t mTemporalLayerId = -1; bool mCompleteFrame; - GMPVideoHostImpl* mHost; + RefPtr mHost; nsTArray mArrayBuffer; ipc::Shmem mShmemBuffer; GMPBufferType mBufferType; diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncoderChild.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncoderChild.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncoderChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncoderChild.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -15,11 +15,19 @@ namespace mozilla::gmp { GMPVideoEncoderChild::GMPVideoEncoderChild(GMPContentChild* aPlugin) - : mPlugin(aPlugin), mVideoEncoder(nullptr), mVideoHost(this) { + : mPlugin(aPlugin), mVideoEncoder(nullptr) { MOZ_ASSERT(mPlugin); } -GMPVideoEncoderChild::~GMPVideoEncoderChild() = default; +GMPVideoEncoderChild::~GMPVideoEncoderChild() { + // Since any outstanding synchronous runnables require a strong reference to + // ourselves, we know that when we are freed, they must have all successfully + // dispatched. As such, it should now be safe to free the plugin and join with + // the worker thread. + if (mVideoEncoder) { + mVideoEncoder->EncodingComplete(); + } +} bool GMPVideoEncoderChild::MgrIsOnOwningThread() const { return !mPlugin || mPlugin->GMPMessageLoop() == MessageLoop::current(); @@ -31,8 +39,6 @@ mVideoEncoder = aEncoder; } -GMPVideoHostImpl& GMPVideoEncoderChild::Host() { return mVideoHost; } - void GMPVideoEncoderChild::Encoded(GMPVideoEncodedFrame* aEncodedFrame, const uint8_t* aCodecSpecificInfo, uint32_t aCodecSpecificInfoLength) { @@ -45,11 +51,9 @@ auto ef = static_cast(aEncodedFrame); - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - ipc::Shmem inputShmem; - if (memMgr->MgrTakeShmem(GMPSharedMemClass::Decoded, &inputShmem)) { - Unused << SendReturnShmem(std::move(inputShmem)); - } + ipc::Shmem inputShmem; + if (MgrTakeShmem(GMPSharedMemClass::Decoded, &inputShmem)) { + Unused << SendReturnShmem(std::move(inputShmem)); } nsTArray codecSpecific; @@ -114,12 +118,7 @@ mozilla::ipc::IPCResult GMPVideoEncoderChild::RecvGiveShmem( ipc::Shmem&& aOutputShmem) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - memMgr->MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(aOutputShmem)); - } else { - DeallocShmem(aOutputShmem); - } - + MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(aOutputShmem)); return IPC_OK(); } @@ -134,8 +133,8 @@ // The `this` destroyed callback outlives the frame, because `mVideoEncoder` // is responsible for destroying the frame, and we outlive `mVideoEncoder`. - auto* f = new GMPVideoi420FrameImpl(aInputFrame, std::move(aInputShmem), - &mVideoHost, HostReportPolicy::Destroyed); + auto* f = new GMPVideoi420FrameImpl(aInputFrame, std::move(aInputShmem), this, + HostReportPolicy::Destroyed); // Ignore any return code. It is OK for this to fail without killing the // process. @@ -186,25 +185,10 @@ } void GMPVideoEncoderChild::ActorDestroy(ActorDestroyReason why) { - // If there are no decoded frames, then we know that OpenH264 has destroyed - // any outstanding references to its pending encode frames. This means it - // should be safe to destroy the encoder since there should not be any pending - // sync callbacks. - if (!SpinPendingGmpEventsUntil( - [&]() -> bool { return mVideoHost.IsDecodedFramesEmpty(); }, - StaticPrefs::media_gmp_coder_shutdown_timeout_ms())) { - NS_WARNING("Timed out waiting for synchronous events!"); - } - - if (mVideoEncoder) { - // Ignore any return code. It is OK for this to fail without killing the - // process. - mVideoEncoder->EncodingComplete(); - mVideoEncoder = nullptr; - } - - mVideoHost.DoneWithAPI(); - + // We don't destroy the video encoder from the plugin here because there may + // be outstanding synchronous runnables. They hold a strong reference to + // ourselves, so we can wait for our destructor to be called first. + MgrPurgeShmems(); mPlugin = nullptr; } diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncoderChild.h firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncoderChild.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncoderChild.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncoderChild.h 2026-04-15 01:59:48.000000000 +0000 @@ -19,7 +19,7 @@ class GMPVideoEncoderChild final : public PGMPVideoEncoderChild, public GMPVideoEncoderCallback, - public GMPSharedMemManager { + public GMPVideoHostImpl { friend class PGMPVideoEncoderChild; public: @@ -30,7 +30,6 @@ explicit GMPVideoEncoderChild(GMPContentChild* aPlugin); void Init(GMPVideoEncoder* aEncoder); - GMPVideoHostImpl& Host(); // GMPVideoEncoderCallback void Encoded(GMPVideoEncodedFrame* aEncodedFrame, @@ -39,10 +38,15 @@ void Error(GMPErr aError) override; // GMPSharedMemManager - void MgrDeallocShmem(Shmem& aMem) override { DeallocShmem(aMem); } + void MgrDeallocShmem(Shmem& aMem) override { + if (CanSend()) { + DeallocShmem(aMem); + } + } void MgrDecodedFrameDestroyed(GMPVideoi420FrameImpl* aFrame) override; protected: + bool MgrCanSend() const override { return CanSend(); } bool MgrIsOnOwningThread() const override; private: @@ -67,7 +71,6 @@ GMPContentChild* mPlugin; GMPVideoEncoder* mVideoEncoder; - GMPVideoHostImpl mVideoHost; uint64_t mLatestEncodedTimestamp = 0; }; diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncoderParent.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncoderParent.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncoderParent.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncoderParent.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -41,7 +41,6 @@ mActorDestroyed(false), mPlugin(aPlugin), mCallback(nullptr), - mVideoHost(this), mPluginId(aPlugin->GetPluginId()) { MOZ_ASSERT(mPlugin); } @@ -50,8 +49,6 @@ return !mPlugin || mPlugin->GMPEventTarget()->IsOnCurrentThread(); } -GMPVideoHostImpl& GMPVideoEncoderParent::Host() { return mVideoHost; } - // Note: may be called via Terminated() void GMPVideoEncoderParent::Close() { GMP_LOG_DEBUG("%s::%s: %p", __CLASS__, __FUNCTION__, this); @@ -77,7 +74,6 @@ if (mIsOpen) { NS_WARNING("Trying to re-init an in-use GMP video encoder!"); return GMPGenericErr; - ; } MOZ_ASSERT(mPlugin->GMPEventTarget()->IsOnCurrentThread()); @@ -120,12 +116,10 @@ } if (mEncodedShmemSize > 0) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - ipc::Shmem outputShmem; - if (memMgr->MgrTakeShmem(GMPSharedMemClass::Encoded, mEncodedShmemSize, - &outputShmem)) { - Unused << SendGiveShmem(std::move(outputShmem)); - } + ipc::Shmem outputShmem; + if (MgrTakeShmem(GMPSharedMemClass::Encoded, mEncodedShmemSize, + &outputShmem)) { + Unused << SendGiveShmem(std::move(outputShmem)); } } @@ -227,18 +221,13 @@ mPlugin->VideoEncoderDestroyed(this); mPlugin = nullptr; } - mVideoHost.ActorDestroyed(); // same as DoneWithAPI + MgrPurgeShmems(); MaybeDisconnect(aWhy == AbnormalShutdown); } mozilla::ipc::IPCResult GMPVideoEncoderParent::RecvReturnShmem( ipc::Shmem&& aInputShmem) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - memMgr->MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(aInputShmem)); - } else { - DeallocShmem(aInputShmem); - } - + MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(aInputShmem)); return IPC_OK(); } @@ -247,8 +236,8 @@ nsTArray&& aCodecSpecificInfo) { if (mCallback && GMPVideoEncodedFrameImpl::CheckFrameData( aEncodedFrame, aEncodedShmem.Size())) { - auto* f = new GMPVideoEncodedFrameImpl( - aEncodedFrame, std::move(aEncodedShmem), &mVideoHost); + auto* f = new GMPVideoEncodedFrameImpl(aEncodedFrame, + std::move(aEncodedShmem), this); mCallback->Encoded(f, aCodecSpecificInfo); f->Destroy(); } else { @@ -263,8 +252,8 @@ if (mCallback && GMPVideoEncodedFrameImpl::CheckFrameData( aEncodedFrame, aEncodedData.Length())) { mEncodedShmemSize = std::max(mEncodedShmemSize, aEncodedData.Length()); - auto* f = new GMPVideoEncodedFrameImpl( - aEncodedFrame, std::move(aEncodedData), &mVideoHost); + auto* f = new GMPVideoEncodedFrameImpl(aEncodedFrame, + std::move(aEncodedData), this); mCallback->Encoded(f, aCodecSpecificInfo); f->Destroy(); } diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncoderParent.h firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncoderParent.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoEncoderParent.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoEncoderParent.h 2026-04-15 01:59:48.000000000 +0000 @@ -22,7 +22,7 @@ class GMPVideoEncoderParent final : public GMPVideoEncoderProxy, public PGMPVideoEncoderParent, - public GMPSharedMemManager, + public GMPVideoHostImpl, public GMPCrashHelperHolder { friend class PGMPVideoEncoderParent; @@ -33,7 +33,6 @@ explicit GMPVideoEncoderParent(GMPContentParent* aPlugin); - GMPVideoHostImpl& Host(); void Shutdown(); // GMPVideoEncoderProxy @@ -55,9 +54,14 @@ return AllocShmem(aSize, aMem); } - void MgrDeallocShmem(Shmem& aMem) override { DeallocShmem(aMem); } + void MgrDeallocShmem(Shmem& aMem) override { + if (CanSend()) { + DeallocShmem(aMem); + } + } protected: + bool MgrCanSend() const override { return CanSend(); } bool MgrIsOnOwningThread() const override; private: @@ -83,7 +87,6 @@ bool mActorDestroyed; RefPtr mPlugin; RefPtr mCallback; - GMPVideoHostImpl mVideoHost; const uint32_t mPluginId; }; diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoHost.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoHost.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoHost.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoHost.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -12,17 +12,12 @@ namespace mozilla::gmp { -GMPVideoHostImpl::GMPVideoHostImpl(GMPSharedMemManager* aSharedMemMgr) - : mSharedMemMgr(aSharedMemMgr) {} +GMPVideoHostImpl::GMPVideoHostImpl() = default; GMPVideoHostImpl::~GMPVideoHostImpl() = default; GMPErr GMPVideoHostImpl::CreateFrame(GMPVideoFrameFormat aFormat, GMPVideoFrame** aFrame) { - if (!mSharedMemMgr) { - return GMPGenericErr; - } - if (!aFrame) { return GMPGenericErr; } @@ -43,10 +38,6 @@ } GMPErr GMPVideoHostImpl::CreatePlane(GMPPlane** aPlane) { - if (!mSharedMemMgr) { - return GMPGenericErr; - } - if (!aPlane) { return GMPGenericErr; } @@ -59,43 +50,4 @@ return GMPNoErr; } -GMPSharedMemManager* GMPVideoHostImpl::SharedMemMgr() { return mSharedMemMgr; } - -// XXX This should merge with ActorDestroyed -void GMPVideoHostImpl::DoneWithAPI() { ActorDestroyed(); } - -void GMPVideoHostImpl::ActorDestroyed() { - for (uint32_t i = mEncodedFrames.Length(); i > 0; i--) { - mEncodedFrames[i - 1]->DoneWithAPI(); - mEncodedFrames.RemoveElementAt(i - 1); - } - for (uint32_t i = mDecodedFrames.Length(); i > 0; i--) { - mDecodedFrames[i - 1]->DoneWithAPI(); - mDecodedFrames.RemoveElementAt(i - 1); - } - mSharedMemMgr->MgrPurgeShmems(); - mSharedMemMgr = nullptr; -} - -void GMPVideoHostImpl::EncodedFrameCreated( - GMPVideoEncodedFrameImpl* aEncodedFrame) { - mEncodedFrames.AppendElement(aEncodedFrame); -} - -void GMPVideoHostImpl::EncodedFrameDestroyed(GMPVideoEncodedFrameImpl* aFrame) { - MOZ_ALWAYS_TRUE(mEncodedFrames.RemoveElement(aFrame)); -} - -void GMPVideoHostImpl::DecodedFrameCreated( - GMPVideoi420FrameImpl* aDecodedFrame) { - mDecodedFrames.AppendElement(aDecodedFrame); -} - -void GMPVideoHostImpl::DecodedFrameDestroyed(GMPVideoi420FrameImpl* aFrame) { - MOZ_ALWAYS_TRUE(mDecodedFrames.RemoveElement(aFrame)); - if (mSharedMemMgr && aFrame->mReportPolicy == HostReportPolicy::Destroyed) { - mSharedMemMgr->MgrDecodedFrameDestroyed(aFrame); - } -} - } // namespace mozilla::gmp diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoHost.h firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoHost.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoHost.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoHost.h 2026-04-15 01:59:48.000000000 +0000 @@ -6,51 +6,29 @@ #ifndef GMPVideoHost_h_ #define GMPVideoHost_h_ +#include "GMPSharedMemManager.h" +#include "gmp-video-frame.h" #include "gmp-video-host.h" #include "gmp-video-plane.h" -#include "gmp-video-frame.h" #include "nsTArray.h" namespace mozilla::gmp { -class GMPSharedMemManager; class GMPVideoEncodedFrameImpl; class GMPVideoi420FrameImpl; -class GMPVideoHostImpl : public GMPVideoHost { +class GMPVideoHostImpl : public GMPVideoHost, public GMPSharedMemManager { public: - explicit GMPVideoHostImpl(GMPSharedMemManager* aSharedMemMgr); - virtual ~GMPVideoHostImpl(); - - // Used for shared memory allocation and deallocation. - GMPSharedMemManager* SharedMemMgr(); - void DoneWithAPI(); - void ActorDestroyed(); - void EncodedFrameCreated(GMPVideoEncodedFrameImpl* aEncodedFrame); - void EncodedFrameDestroyed(GMPVideoEncodedFrameImpl* aFrame); - void DecodedFrameCreated(GMPVideoi420FrameImpl* aDecodedFrame); - void DecodedFrameDestroyed(GMPVideoi420FrameImpl* aFrame); - - bool IsEncodedFramesEmpty() const { return mEncodedFrames.IsEmpty(); } - - bool IsDecodedFramesEmpty() const { return mDecodedFrames.IsEmpty(); } + NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING // GMPVideoHost GMPErr CreateFrame(GMPVideoFrameFormat aFormat, GMPVideoFrame** aFrame) override; GMPErr CreatePlane(GMPPlane** aPlane) override; - private: - // All shared memory allocations have to be made by an IPDL actor. - // This is a reference to the owning actor. If this reference is - // null then the actor has died and all allocations must fail. - GMPSharedMemManager* mSharedMemMgr; - - // We track all of these things because they need to handle further - // allocations through us and we need to notify them when they - // can't use us any more. - nsTArray mEncodedFrames; - nsTArray mDecodedFrames; + protected: + GMPVideoHostImpl(); + virtual ~GMPVideoHostImpl(); }; } // namespace mozilla::gmp diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoi420FrameImpl.cpp firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoi420FrameImpl.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoi420FrameImpl.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoi420FrameImpl.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -8,7 +8,9 @@ #include "mozilla/gmp/GMPTypes.h" #include "mozilla/CheckedInt.h" #include "GMPVideoHost.h" -#include "GMPSharedMemManager.h" +#include "nsProxyRelease.h" +#include "nsThreadUtils.h" +#include "nsXULAppAPI.h" namespace mozilla::gmp { @@ -48,7 +50,6 @@ mTimestamp(0ll), mDuration(0ll) { MOZ_ASSERT(aHost); - aHost->DecodedFrameCreated(this); } GMPVideoi420FrameImpl::GMPVideoi420FrameImpl( @@ -67,7 +68,6 @@ mUpdatedTimestamp(aFrameData.mUpdatedTimestamp()), mDuration(aFrameData.mDuration()) { MOZ_ASSERT(aHost); - aHost->DecodedFrameCreated(this); } GMPVideoi420FrameImpl::GMPVideoi420FrameImpl( @@ -86,22 +86,23 @@ mUpdatedTimestamp(aFrameData.mUpdatedTimestamp()), mDuration(aFrameData.mDuration()) { MOZ_ASSERT(aHost); - aHost->DecodedFrameCreated(this); } GMPVideoi420FrameImpl::~GMPVideoi420FrameImpl() { - DestroyBuffer(); - if (mHost) { - mHost->DecodedFrameDestroyed(this); + if (mReportPolicy == HostReportPolicy::Destroyed) { + mHost->MgrDecodedFrameDestroyed(this); + } + if (mShmemBuffer.IsWritable()) { + mHost->MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(mShmemBuffer)); + } + // Proxy release to ensure that any synchronous runnables from the plugin can + // first unblock the worker thread. If we destroy the plugin once this + // reference is freed, we won't be blocked trying to join the worker thread. + if (XRE_IsGMPluginProcess()) { + NS_ProxyRelease("GMPVideoi420FrameImpl::~GMPVideoi420FrameImpl", + GetMainThreadSerialEventTarget(), mHost.forget(), + /* aAlwaysProxy */ true); } -} - -void GMPVideoi420FrameImpl::DoneWithAPI() { - DestroyBuffer(); - - // Do this after destroying the buffer because destruction - // involves deallocation, which requires a host. - mHost = nullptr; } void GMPVideoi420FrameImpl::InitFrameData(GMPVideoi420FrameData& aFrameData) { @@ -156,6 +157,9 @@ // This implies a bug or serious error on the child size. Ignore this frame // if so. Note: Size() greater than expected is also an error, but with no // negative consequences + if (aFrameData.mWidth() <= 0 || aFrameData.mHeight() <= 0) { + return false; + } int32_t half_width = (aFrameData.mWidth() + 1) / 2; int32_t half_height = (aFrameData.mHeight() + 1) / 2; @@ -309,10 +313,6 @@ return GMPNoErr; } - if (!mHost) { - return GMPGenericErr; - } - if (!mArrayBuffer.IsEmpty()) { if (!mArrayBuffer.SetLength(aNewSize, fallible)) { return GMPAllocErr; @@ -321,8 +321,7 @@ } ipc::Shmem new_mem; - if (!mHost->SharedMemMgr()->MgrTakeShmem(GMPSharedMemClass::Decoded, aNewSize, - &new_mem) && + if (!mHost->MgrTakeShmem(GMPSharedMemClass::Decoded, aNewSize, &new_mem) && !mArrayBuffer.SetLength(aNewSize, fallible)) { return GMPAllocErr; } @@ -331,8 +330,7 @@ if (new_mem.IsWritable()) { memcpy(new_mem.get(), mShmemBuffer.get(), aNewSize); } - mHost->SharedMemMgr()->MgrGiveShmem(GMPSharedMemClass::Decoded, - std::move(mShmemBuffer)); + mHost->MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(mShmemBuffer)); } mShmemBuffer = new_mem; @@ -340,15 +338,6 @@ return GMPNoErr; } -void GMPVideoi420FrameImpl::DestroyBuffer() { - if (mHost && mShmemBuffer.IsWritable()) { - mHost->SharedMemMgr()->MgrGiveShmem(GMPSharedMemClass::Decoded, - std::move(mShmemBuffer)); - } - mShmemBuffer = ipc::Shmem(); - mArrayBuffer.Clear(); -} - GMPErr GMPVideoi420FrameImpl::CreateEmptyFrame(int32_t aWidth, int32_t aHeight, int32_t aStride_y, int32_t aStride_u, diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoi420FrameImpl.h firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoi420FrameImpl.h --- firefox-esr-140.9.1esr/dom/media/gmp/GMPVideoi420FrameImpl.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/GMPVideoi420FrameImpl.h 2026-04-15 01:59:49.000000000 +0000 @@ -37,10 +37,6 @@ HostReportPolicy aReportPolicy = HostReportPolicy::None); virtual ~GMPVideoi420FrameImpl(); - // This is called during a normal destroy sequence, which is - // when a consumer is finished or during XPCOM shutdown. - void DoneWithAPI(); - static bool CheckFrameData(const GMPVideoi420FrameData& aFrameData, size_t aBufferSize); @@ -106,13 +102,12 @@ bool CheckDimensions(int32_t aWidth, int32_t aHeight, int32_t aStride_y, int32_t aStride_u, int32_t aStride_v); GMPErr MaybeResize(int32_t aNewSize); - void DestroyBuffer(); public: const HostReportPolicy mReportPolicy; protected: - GMPVideoHostImpl* mHost; + RefPtr mHost; nsTArray mArrayBuffer; ipc::Shmem mShmemBuffer; GMPFramePlane mYPlane; diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/PChromiumCDM.ipdl firefox-esr-140.10.0esr/dom/media/gmp/PChromiumCDM.ipdl --- firefox-esr-140.9.1esr/dom/media/gmp/PChromiumCDM.ipdl 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/PChromiumCDM.ipdl 2026-04-15 01:59:49.000000000 +0000 @@ -9,7 +9,11 @@ include "GMPMessageUtils.h"; include "ChromiumCDMParent.h"; +using cdm::Exception from "GMPSanitizedExports.h"; +using cdm::KeyStatus from "GMPSanitizedExports.h"; using cdm::HdcpVersion from "GMPSanitizedExports.h"; +using cdm::MessageType from "GMPSanitizedExports.h"; +using cdm::Status from "GMPSanitizedExports.h"; namespace mozilla { namespace gmp { @@ -78,19 +82,19 @@ async __delete__(); // cdm::Host_11 - async OnResolvePromiseWithKeyStatus(uint32_t aPromiseId, uint32_t aKeyStatus); + async OnResolvePromiseWithKeyStatus(uint32_t aPromiseId, KeyStatus aKeyStatus); async OnResolveNewSessionPromise(uint32_t aPromiseId, nsCString aSessionId); async OnResolvePromise(uint32_t aPromiseId); async OnRejectPromise(uint32_t aPromiseId, - uint32_t aException, + Exception aException, uint32_t aSystemCode, nsCString aErrorMessage); async OnSessionMessage(nsCString aSessionId, - uint32_t aMessageType, + MessageType aMessageType, uint8_t[] aMessage); async OnSessionKeysChange(nsCString aSessionId, @@ -106,16 +110,16 @@ async ResolveLoadSessionPromise(uint32_t aPromiseId, bool aSuccessful); // Return values of cdm::ContentDecryptionModule_10::Decrypt - async DecryptedShmem(uint32_t aId, uint32_t aStatus, Shmem aData); - async DecryptedData(uint32_t aId, uint32_t aStatus, uint8_t[] aData); - async DecryptFailed(uint32_t aId, uint32_t aStatus); + async DecryptedShmem(uint32_t aId, Status aStatus, Shmem aData); + async DecryptedData(uint32_t aId, Status aStatus, uint8_t[] aData); + async DecryptFailed(uint32_t aId, Status aStatus); - async OnDecoderInitDone(uint32_t aStatus); + async OnDecoderInitDone(Status aStatus); // Return values of cdm::ContentDecryptionModule_10::DecryptAndDecodeFrame async DecodedShmem(CDMVideoFrame aFrame, Shmem aData); async DecodedData(CDMVideoFrame aFrame, uint8_t[] aData); - async DecodeFailed(uint32_t aStatus); + async DecodeFailed(Status aStatus); async ResetVideoDecoderComplete(); diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp firefox-esr-140.10.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp --- firefox-esr-140.9.1esr/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -16,25 +16,27 @@ namespace mozilla { void WidevineFileIO::Open(const char* aFilename, uint32_t aFilenameLength) { + DestroyRecord(); + mName = std::string(aFilename, aFilename + aFilenameLength); - GMPRecord* record = nullptr; - GMPErr err = sPlatform->createrecord(aFilename, aFilenameLength, &record, + GMPErr err = sPlatform->createrecord(aFilename, aFilenameLength, &mRecord, static_cast(this)); if (GMP_FAILED(err)) { GMP_LOG_DEBUG("WidevineFileIO::Open() '%s' GMPCreateRecord failed", mName.c_str()); + DestroyRecord(); mClient->OnOpenComplete(cdm::FileIOClient::Status::kError); return; } - if (GMP_FAILED(record->Open())) { + if (GMP_FAILED(mRecord->Open())) { GMP_LOG_DEBUG("WidevineFileIO::Open() '%s' record open failed", mName.c_str()); + DestroyRecord(); mClient->OnOpenComplete(cdm::FileIOClient::Status::kError); return; } GMP_LOG_DEBUG("WidevineFileIO::Open() '%s'", mName.c_str()); - mRecord = record; } void WidevineFileIO::Read() { @@ -58,12 +60,16 @@ mRecord->Write(aData, aDataSize); } -void WidevineFileIO::Close() { - GMP_LOG_DEBUG("WidevineFileIO::Close() '%s'", mName.c_str()); +void WidevineFileIO::DestroyRecord() { if (mRecord) { mRecord->Close(); mRecord = nullptr; } +} + +void WidevineFileIO::Close() { + GMP_LOG_DEBUG("WidevineFileIO::Close() '%s'", mName.c_str()); + DestroyRecord(); delete this; } diff -Nru firefox-esr-140.9.1esr/dom/media/gmp/widevine-adapter/WidevineFileIO.h firefox-esr-140.10.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.h --- firefox-esr-140.9.1esr/dom/media/gmp/widevine-adapter/WidevineFileIO.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.h 2026-04-15 01:59:48.000000000 +0000 @@ -13,10 +13,9 @@ namespace mozilla { -class WidevineFileIO : public cdm::FileIO, public GMPRecordClient { +class WidevineFileIO final : public cdm::FileIO, public GMPRecordClient { public: - explicit WidevineFileIO(cdm::FileIOClient* aClient) - : mClient(aClient), mRecord(nullptr) {} + explicit WidevineFileIO(cdm::FileIOClient* aClient) : mClient(aClient) {} // cdm::FileIO void Open(const char* aFilename, uint32_t aFilenameLength) override; @@ -31,8 +30,10 @@ void WriteComplete(GMPErr aStatus) override; private: + void DestroyRecord(); + cdm::FileIOClient* mClient; - GMPRecord* mRecord; + GMPRecord* mRecord = nullptr; std::string mName; }; diff -Nru firefox-esr-140.9.1esr/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp firefox-esr-140.10.0esr/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp --- firefox-esr-140.9.1esr/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -392,9 +392,9 @@ callback_->Decoded(frame); } - void Reset() override {} + void Reset() override { callback_->ResetComplete(); } - void Drain() override {} + void Drain() override { callback_->DrainComplete(); } void DecodingComplete() override { delete this; } diff -Nru firefox-esr-140.9.1esr/dom/media/gtest/TestCDMStorage.cpp firefox-esr-140.10.0esr/dom/media/gtest/TestCDMStorage.cpp --- firefox-esr-140.9.1esr/dom/media/gtest/TestCDMStorage.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/gtest/TestCDMStorage.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -1109,7 +1109,8 @@ SchedulerGroup::Dispatch(task.forget()); } - void SessionMessage(const nsACString& aSessionId, uint32_t aMessageType, + void SessionMessage(const nsACString& aSessionId, + cdm::MessageType aMessageType, const nsTArray& aMessage) { MonitorAutoLock mon(mMonitor); @@ -1162,14 +1163,15 @@ bool aSuccessful) override {} void ResolvePromiseWithKeyStatus(uint32_t aPromiseId, - uint32_t aKeyStatus) override {} + cdm::KeyStatus aKeyStatus) override {} void ResolvePromise(uint32_t aPromiseId) override {} void RejectPromise(uint32_t aPromiseId, ErrorResult&& aError, const nsCString& aErrorMessage) override {} - void SessionMessage(const nsACString& aSessionId, uint32_t aMessageType, + void SessionMessage(const nsACString& aSessionId, + cdm::MessageType aMessageType, nsTArray&& aMessage) override { mRunner->SessionMessage(aSessionId, aMessageType, std::move(aMessage)); } diff -Nru firefox-esr-140.9.1esr/dom/media/ipc/RDDChild.cpp firefox-esr-140.10.0esr/dom/media/ipc/RDDChild.cpp --- firefox-esr-140.9.1esr/dom/media/ipc/RDDChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/ipc/RDDChild.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -86,25 +86,27 @@ const Maybe& aDMDFile) { mMemoryReportRequest = MakeUnique(aGeneration); - PRDDChild::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [&](const uint32_t& aGeneration2) { - if (RDDProcessManager* rddpm = RDDProcessManager::Get()) { - if (RDDChild* child = rddpm->GetRDDChild()) { - if (child->mMemoryReportRequest) { - child->mMemoryReportRequest->Finish(aGeneration2); - child->mMemoryReportRequest = nullptr; + PRDDChild::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [](uint32_t aGeneration2) { + if (RDDProcessManager* rddpm = RDDProcessManager::Get()) { + if (RDDChild* child = rddpm->GetRDDChild()) { + if (child->mMemoryReportRequest) { + child->mMemoryReportRequest->Finish(aGeneration2); + child->mMemoryReportRequest = nullptr; + } + } } - } - } - }, - [&](mozilla::ipc::ResponseRejectReason) { - if (RDDProcessManager* rddpm = RDDProcessManager::Get()) { - if (RDDChild* child = rddpm->GetRDDChild()) { - child->mMemoryReportRequest = nullptr; - } - } - }); + }, + [](mozilla::ipc::ResponseRejectReason) { + if (RDDProcessManager* rddpm = RDDProcessManager::Get()) { + if (RDDChild* child = rddpm->GetRDDChild()) { + child->mMemoryReportRequest = nullptr; + } + } + }); return true; } diff -Nru firefox-esr-140.9.1esr/dom/media/ipc/RemoteAudioDecoder.cpp firefox-esr-140.10.0esr/dom/media/ipc/RemoteAudioDecoder.cpp --- firefox-esr-140.9.1esr/dom/media/ipc/RemoteAudioDecoder.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/ipc/RemoteAudioDecoder.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -72,6 +72,11 @@ IPCResult RemoteAudioDecoderParent::RecvConstruct( ConstructResolver&& aResolver) { + if (mDecoder || mShutdown) { + aResolver(MediaResult(NS_ERROR_ALREADY_INITIALIZED, __func__)); + return IPC_OK(); + } + auto params = CreateDecoderParams{ mAudioInfo, mOptions, CreateDecoderParams::WrapperSet({/* No wrapper */}), mMediaEngineId, mTrackingId}; @@ -86,6 +91,11 @@ return; } MOZ_ASSERT(aValue.ResolveValue()); + if (self->mDecoder || self->mShutdown) { + aValue.ResolveValue()->Shutdown(); + resolver(MediaResult(NS_ERROR_ALREADY_INITIALIZED, __func__)); + return; + } self->mDecoder = new MediaDataDecoderProxy(aValue.ResolveValue().forget(), do_AddRef(self->mDecodeTaskQueue.get())); diff -Nru firefox-esr-140.9.1esr/dom/media/ipc/RemoteDecoderManagerChild.cpp firefox-esr-140.10.0esr/dom/media/ipc/RemoteDecoderManagerChild.cpp --- firefox-esr-140.9.1esr/dom/media/ipc/RemoteDecoderManagerChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/ipc/RemoteDecoderManagerChild.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -27,6 +27,7 @@ #include "mozilla/MozPromise.h" #include "mozilla/StaticPrefs_media.h" #include "mozilla/StaticPtr.h" +#include "mozilla/layers/ImageDataSerializer.h" #include "nsContentUtils.h" #include "nsIObserver.h" #include "nsPrintfCString.h" @@ -43,6 +44,8 @@ #define LOG(msg, ...) \ MOZ_LOG(gRemoteDecodeLog, LogLevel::Debug, (msg, ##__VA_ARGS__)) +#define LOGE(msg, ...) \ + MOZ_LOG(gRemoteDecodeLog, LogLevel::Error, (msg, ##__VA_ARGS__)) using namespace layers; using namespace gfx; @@ -840,6 +843,31 @@ return PRemoteDecoderManagerChild::DeallocShmem(aShmem); } +static already_AddRefed GetSurfaceForDescriptor( + const SurfaceDescriptor& aDescriptor) { + const auto& sdb = aDescriptor.get_SurfaceDescriptorBuffer(); + const auto& shmem = sdb.data().get_Shmem(); + const auto& rgb = sdb.desc().get_RGBDescriptor(); + const uint32_t stride = ImageDataSerializer::GetRGBStride(rgb); + const size_t requiredSize = + ImageDataSerializer::ComputeRGBBufferSize(rgb.size(), rgb.format()); + if (shmem.Size() < requiredSize) { + LOGE("Shmem too small for required buffer size"); + return nullptr; + } + + return gfx::Factory::CreateWrappingDataSourceSurface( + shmem.get(), stride, rgb.size(), rgb.format()); +} + +static void DestroySurfaceDescriptor(ipc::IShmemAllocator* aAllocator, + SurfaceDescriptor* aSurface) { + MOZ_ASSERT(aSurface); + const SurfaceDescriptorBuffer& desc = aSurface->get_SurfaceDescriptorBuffer(); + aAllocator->DeallocShmem(desc.data().get_Shmem()); + *aSurface = SurfaceDescriptor(); +} + struct SurfaceDescriptorUserData { SurfaceDescriptorUserData(RemoteDecoderManagerChild* aAllocator, SurfaceDescriptor& aSD) @@ -875,14 +903,20 @@ }); SyncRunnable::DispatchToThread(managerThread, task); - if (!IsSurfaceDescriptorValid(sd)) { + if (sd.type() != SurfaceDescriptor::TSurfaceDescriptorBuffer) { + LOGE("Unexpected SurfaceDescriptor type in Readback"); + return nullptr; + } + auto& sdb = sd.get_SurfaceDescriptorBuffer(); + if (sdb.data().type() != MemoryOrShmem::TShmem) { + LOGE("Unexpected SurfaceDescriptorBuffer data type in Readback"); return nullptr; } RefPtr source = GetSurfaceForDescriptor(sd); if (!source) { DestroySurfaceDescriptor(this, &sd); - NS_WARNING("Failed to map SurfaceDescriptor in Readback"); + LOGE("Failed to map SurfaceDescriptor in Readback"); return nullptr; } @@ -932,5 +966,6 @@ } #undef LOG +#undef LOGE } // namespace mozilla diff -Nru firefox-esr-140.9.1esr/dom/media/ipc/RemoteDecoderParent.cpp firefox-esr-140.10.0esr/dom/media/ipc/RemoteDecoderParent.cpp --- firefox-esr-140.9.1esr/dom/media/ipc/RemoteDecoderParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/ipc/RemoteDecoderParent.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -43,6 +43,11 @@ mozilla::ipc::IPCResult RemoteDecoderParent::RecvInit( InitResolver&& aResolver) { MOZ_ASSERT(OnManagerThread()); + if (!mDecoder) { + aResolver(MediaResult(NS_ERROR_ABORT, __func__)); + return IPC_OK(); + } + RefPtr self = this; mDecoder->Init()->Then( mManagerThread, __func__, @@ -143,6 +148,11 @@ mozilla::ipc::IPCResult RemoteDecoderParent::RecvFlush( FlushResolver&& aResolver) { MOZ_ASSERT(OnManagerThread()); + if (!mDecoder) { + aResolver(MediaResult(NS_ERROR_ABORT, __func__)); + return IPC_OK(); + } + RefPtr self = this; mDecoder->Flush()->Then( mManagerThread, __func__, @@ -162,6 +172,11 @@ mozilla::ipc::IPCResult RemoteDecoderParent::RecvDrain( DrainResolver&& aResolver) { MOZ_ASSERT(OnManagerThread()); + if (!mDecoder) { + aResolver(MediaResult(NS_ERROR_ABORT, __func__)); + return IPC_OK(); + } + RefPtr self = this; mDecoder->Drain()->Then( mManagerThread, __func__, @@ -203,13 +218,16 @@ }); } mDecoder = nullptr; + mShutdown = true; return IPC_OK(); } mozilla::ipc::IPCResult RemoteDecoderParent::RecvSetSeekThreshold( const TimeUnit& aTime) { MOZ_ASSERT(OnManagerThread()); - mDecoder->SetSeekThreshold(aTime); + if (mDecoder) { + mDecoder->SetSeekThreshold(aTime); + } return IPC_OK(); } diff -Nru firefox-esr-140.9.1esr/dom/media/ipc/RemoteDecoderParent.h firefox-esr-140.10.0esr/dom/media/ipc/RemoteDecoderParent.h --- firefox-esr-140.9.1esr/dom/media/ipc/RemoteDecoderParent.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/ipc/RemoteDecoderParent.h 2026-04-15 01:59:49.000000000 +0000 @@ -61,6 +61,8 @@ // Only be used on Windows when the media engine playback is enabled. const Maybe mMediaEngineId; + bool mShutdown = false; + private: void DecodeNextSample(const RefPtr& aData, size_t aIndex, MediaDataDecoder::DecodedData&& aOutput, diff -Nru firefox-esr-140.9.1esr/dom/media/ipc/RemoteMediaData.cpp firefox-esr-140.10.0esr/dom/media/ipc/RemoteMediaData.cpp --- firefox-esr-140.9.1esr/dom/media/ipc/RemoteMediaData.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/ipc/RemoteMediaData.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -312,6 +312,14 @@ audioData->mDuration = sample.mBase.duration(); audioData->mOriginalTime = sample.mOriginalTime; audioData->mTrimWindow = sample.mTrimWindow; + CheckedInt requiredLen = + CheckedInt(sample.mDataOffset) + + CheckedInt(sample.mFrames) * CheckedInt(sample.mChannels); + if (!requiredLen.isValid() || + requiredLen.value() > audioData->mAudioData.Length()) { + NS_WARNING("Malformed RemoteAudioData"); + return nullptr; + } audioData->mFrames = sample.mFrames; audioData->mDataOffset = sample.mDataOffset; return audioData.forget(); diff -Nru firefox-esr-140.9.1esr/dom/media/ipc/RemoteVideoDecoder.cpp firefox-esr-140.10.0esr/dom/media/ipc/RemoteVideoDecoder.cpp --- firefox-esr-140.9.1esr/dom/media/ipc/RemoteVideoDecoder.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/ipc/RemoteVideoDecoder.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -32,18 +32,18 @@ using namespace ipc; using namespace gfx; -layers::TextureForwarder* KnowsCompositorVideo::GetTextureForwarder() { - auto* vbc = VideoBridgeChild::GetSingleton(); +RefPtr KnowsCompositorVideo::GetTextureForwarder() { + auto vbc = VideoBridgeChild::GetSingleton(); return (vbc && vbc->CanSend()) ? vbc : nullptr; } layers::LayersIPCActor* KnowsCompositorVideo::GetLayersIPCActor() { - return GetTextureForwarder(); + return GetTextureForwarder().get(); } /* static */ already_AddRefed KnowsCompositorVideo::TryCreateForIdentifier( const layers::TextureFactoryIdentifier& aIdentifier) { - VideoBridgeChild* child = VideoBridgeChild::GetSingleton(); + auto child = VideoBridgeChild::GetSingleton(); if (!child) { return nullptr; } @@ -151,6 +151,11 @@ IPCResult RemoteVideoDecoderParent::RecvConstruct( ConstructResolver&& aResolver) { + if (mDecoder || mShutdown) { + aResolver(MediaResult(NS_ERROR_ALREADY_INITIALIZED, __func__)); + return IPC_OK(); + } + auto imageContainer = MakeRefPtr( layers::ImageUsageType::RemoteVideoDecoder, layers::ImageContainer::SYNCHRONOUS); @@ -175,6 +180,11 @@ return; } MOZ_ASSERT(aValue.ResolveValue()); + if (self->mDecoder || self->mShutdown) { + aValue.ResolveValue()->Shutdown(); + resolver(MediaResult(NS_ERROR_ALREADY_INITIALIZED, __func__)); + return; + } self->mDecoder = new MediaDataDecoderProxy(aValue.ResolveValue().forget(), do_AddRef(self->mDecodeTaskQueue.get())); diff -Nru firefox-esr-140.9.1esr/dom/media/ipc/RemoteVideoDecoder.h firefox-esr-140.10.0esr/dom/media/ipc/RemoteVideoDecoder.h --- firefox-esr-140.9.1esr/dom/media/ipc/RemoteVideoDecoder.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/ipc/RemoteVideoDecoder.h 2026-04-15 01:59:49.000000000 +0000 @@ -19,7 +19,7 @@ public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(KnowsCompositorVideo, override) - layers::TextureForwarder* GetTextureForwarder() override; + RefPtr GetTextureForwarder() override; layers::LayersIPCActor* GetLayersIPCActor() override; static already_AddRefed TryCreateForIdentifier( diff -Nru firefox-esr-140.9.1esr/dom/media/platforms/MediaCodecsSupport.cpp firefox-esr-140.10.0esr/dom/media/platforms/MediaCodecsSupport.cpp --- firefox-esr-140.9.1esr/dom/media/platforms/MediaCodecsSupport.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/platforms/MediaCodecsSupport.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -22,15 +22,14 @@ namespace mozilla::media { static StaticAutoPtr sInstance; -static StaticMutex sInitMutex; -static StaticMutex sUpdateMutex; +static StaticMutex sMutex; #define CODEC_SUPPORT_LOG(msg, ...) \ MOZ_LOG(sPDMLog, LogLevel::Debug, ("MediaCodecsSupport, " msg, ##__VA_ARGS__)) void MCSInfo::AddSupport(const MediaCodecsSupported& aSupport) { - StaticMutexAutoLock lock(sUpdateMutex); - MCSInfo* instance = GetInstance(); + StaticMutexAutoLock lock(sMutex); + MCSInfo* instance = GetInstance(lock); if (!instance) { CODEC_SUPPORT_LOG("Can't add codec support without a MCSInfo instance!"); return; @@ -39,8 +38,8 @@ } MediaCodecsSupported MCSInfo::GetSupport() { - StaticMutexAutoLock lock(sUpdateMutex); - MCSInfo* instance = GetInstance(); + StaticMutexAutoLock lock(sMutex); + MCSInfo* instance = GetInstance(lock); if (!instance) { CODEC_SUPPORT_LOG("Can't get codec support without a MCSInfo instance!"); return MediaCodecsSupported{}; @@ -49,8 +48,8 @@ } void MCSInfo::ResetSupport() { - StaticMutexAutoLock lock(sUpdateMutex); - MCSInfo* instance = GetInstance(); + StaticMutexAutoLock lock(sMutex); + MCSInfo* instance = GetInstance(lock); if (!instance) { CODEC_SUPPORT_LOG("Can't reset codec support without a MCSInfo instance!"); return; @@ -103,7 +102,8 @@ nsCString& aSupportString, const MediaCodecsSupported& aSupportedCodecs) { CodecDefinition supportInfo; aSupportString = ""_ns; - MCSInfo* instance = GetInstance(); + StaticMutexAutoLock lock(sMutex); + MCSInfo* instance = GetInstance(lock); if (!instance) { CODEC_SUPPORT_LOG("Can't get codec support string w/o a MCSInfo instance!"); return; @@ -142,8 +142,7 @@ } } -MCSInfo* MCSInfo::GetInstance() { - StaticMutexAutoLock lock(sInitMutex); +MCSInfo* MCSInfo::GetInstance(const StaticMutexAutoLock& /* unused */) { if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { CODEC_SUPPORT_LOG("In XPCOM shutdown - not returning MCSInfo instance!"); return nullptr; @@ -168,13 +167,10 @@ } GetMainThreadSerialEventTarget()->Dispatch( - NS_NewRunnableFunction("MCSInfo::MCSInfo", [&] { - // Ensure hash tables freed on shutdown + NS_NewRunnableFunction("MCSInfo::MCSInfo", [] { RunOnShutdown( - [&] { - mHashTableMCS.reset(); - mHashTableString.reset(); - mHashTableCodec.reset(); + [] { + StaticMutexAutoLock lock(sMutex); sInstance = nullptr; }, ShutdownPhase::XPCOMShutdown); @@ -183,7 +179,8 @@ CodecDefinition MCSInfo::GetCodecDefinition(const MediaCodec& aCodec) { CodecDefinition info; - MCSInfo* instance = GetInstance(); + StaticMutexAutoLock lock(sMutex); + MCSInfo* instance = GetInstance(lock); if (!instance) { CODEC_SUPPORT_LOG("Can't get codec definition without a MCSInfo instance!"); } else if (!instance->mHashTableCodec->Get(aCodec, &info)) { diff -Nru firefox-esr-140.9.1esr/dom/media/platforms/MediaCodecsSupport.h firefox-esr-140.10.0esr/dom/media/platforms/MediaCodecsSupport.h --- firefox-esr-140.9.1esr/dom/media/platforms/MediaCodecsSupport.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/platforms/MediaCodecsSupport.h 2026-04-15 01:59:48.000000000 +0000 @@ -196,7 +196,7 @@ private: MCSInfo(); - static MCSInfo* GetInstance(); + static MCSInfo* GetInstance(const StaticMutexAutoLock& /* unused */); // Returns a codec definition by MIME type name ("media/vp9") // or "common" name ("VP9") diff -Nru firefox-esr-140.9.1esr/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp firefox-esr-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp --- firefox-esr-140.9.1esr/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -162,7 +162,8 @@ } else if (aFrame->format == AV_SAMPLE_FMT_FLTP) { // Planar audio data. Pack it into something we can understand. AudioDataValue* tmp = audio.get(); - AudioDataValue** data = reinterpret_cast(aFrame->data); + AudioDataValue** data = + reinterpret_cast(aFrame->extended_data); for (uint32_t frame = 0; frame < aNumAFrames; frame++) { for (uint32_t channel = 0; channel < aNumChannels; channel++) { *tmp++ = data[channel][frame]; @@ -181,7 +182,7 @@ // Planar audio data. Convert it from S16 to 32 bits float // and pack it into something we can understand. AudioDataValue* tmp = audio.get(); - int16_t** data = reinterpret_cast(aFrame->data); + int16_t** data = reinterpret_cast(aFrame->extended_data); for (uint32_t frame = 0; frame < aNumAFrames; frame++) { for (uint32_t channel = 0; channel < aNumChannels; channel++) { *tmp++ = ConvertAudioSample(data[channel][frame]); @@ -200,7 +201,7 @@ // Planar audio data. Convert it from S32 to 32 bits float // and pack it into something we can understand. AudioDataValue* tmp = audio.get(); - int32_t** data = reinterpret_cast(aFrame->data); + int32_t** data = reinterpret_cast(aFrame->extended_data); for (uint32_t frame = 0; frame < aNumAFrames; frame++) { for (uint32_t channel = 0; channel < aNumChannels; channel++) { *tmp++ = ConvertAudioSample(data[channel][frame]); @@ -219,7 +220,7 @@ // Planar audio data. Convert it from u8 to the expected sample-format // and pack it into something we can understand. AudioDataValue* tmp = audio.get(); - uint8_t** data = reinterpret_cast(aFrame->data); + uint8_t** data = reinterpret_cast(aFrame->extended_data); for (uint32_t frame = 0; frame < aNumAFrames; frame++) { for (uint32_t channel = 0; channel < aNumChannels; channel++) { *tmp++ = ConvertAudioSample(data[channel][frame]); diff -Nru firefox-esr-140.9.1esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp firefox-esr-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp --- firefox-esr-140.9.1esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -12,6 +12,7 @@ namespace mozilla { +StaticMutex FFmpegRuntimeLinker::sMutex; FFmpegRuntimeLinker::LinkStatus FFmpegRuntimeLinker::sLinkStatus = LinkStatus_INIT; const char* FFmpegRuntimeLinker::sLinkStatusLibraryName = ""; @@ -65,6 +66,7 @@ /* static */ bool FFmpegRuntimeLinker::Init() { + StaticMutexAutoLock lock(sMutex); if (sLinkStatus != LinkStatus_INIT) { return sLinkStatus == LinkStatus_SUCCEEDED; } @@ -248,6 +250,7 @@ } /* static */ const char* FFmpegRuntimeLinker::LinkStatusString() { + StaticMutexAutoLock lock(sMutex); switch (sLinkStatus) { case LinkStatus_INIT: return "Libavcodec not initialized yet"; diff -Nru firefox-esr-140.9.1esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h firefox-esr-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h --- firefox-esr-140.9.1esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h 2026-04-15 01:59:49.000000000 +0000 @@ -9,12 +9,13 @@ #include "PlatformDecoderModule.h" #include "PlatformEncoderModule.h" +#include "mozilla/StaticMutex.h" namespace mozilla { class FFmpegRuntimeLinker { public: - static bool Init(); + static bool Init() MOZ_EXCLUDES(sMutex); static already_AddRefed CreateDecoder(); static already_AddRefed CreateEncoder(); enum LinkStatus { @@ -32,14 +33,21 @@ LinkStatus_INVALID_CANDIDATE, // Found some lib with unexpected contents. LinkStatus_NOT_FOUND, // Haven't found any library with an expected name. }; - static LinkStatus LinkStatusCode() { return sLinkStatus; } + static LinkStatus LinkStatusCode() { + StaticMutexAutoLock lock(sMutex); + return sLinkStatus; + } static const char* LinkStatusString(); // Library name to which the sLinkStatus applies, or "" if not applicable. - static const char* LinkStatusLibraryName() { return sLinkStatusLibraryName; } + static const char* LinkStatusLibraryName() { + StaticMutexAutoLock lock(sMutex); + return sLinkStatusLibraryName; + } private: - static LinkStatus sLinkStatus; - static const char* sLinkStatusLibraryName; + static StaticMutex sMutex; + static LinkStatus sLinkStatus MOZ_GUARDED_BY(sMutex); + static const char* sLinkStatusLibraryName MOZ_GUARDED_BY(sMutex); }; } // namespace mozilla diff -Nru firefox-esr-140.9.1esr/dom/media/platforms/ffmpeg/VALibWrapper.cpp firefox-esr-140.10.0esr/dom/media/platforms/ffmpeg/VALibWrapper.cpp --- firefox-esr-140.9.1esr/dom/media/platforms/ffmpeg/VALibWrapper.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/platforms/ffmpeg/VALibWrapper.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -7,6 +7,7 @@ #include "FFmpegLog.h" #include "PlatformDecoderModule.h" #include "prlink.h" +#include "mozilla/DataMutex.h" #include "mozilla/gfx/gfxVars.h" #include "mozilla/widget/DMABufDevice.h" @@ -17,8 +18,8 @@ static int (*vaTerminate)(void* dpy); static void* (*vaGetDisplayDRM)(int fd); -static VADisplayHolder* sDisplayHolder; -static StaticMutex sDisplayHolderMutex; +MOZ_RUNINIT static StaticDataMutex> + sDisplayHolder("VADisplayHolder::sDisplayHolder"); void VALibWrapper::Link() { #define VA_FUNC_OPTION_SILENT(func) \ @@ -102,10 +103,11 @@ /* static */ RefPtr VADisplayHolder::GetSingleton() { - StaticMutexAutoLock lock(sDisplayHolderMutex); + auto weakInstance = sDisplayHolder.Lock(); - if (sDisplayHolder) { - return RefPtr{sDisplayHolder}; + RefPtr instance(*weakInstance); + if (instance) { + return instance; } UniqueFileHandle drmFd{widget::GetDMABufDevice()->OpenDRMFd()}; @@ -125,21 +127,9 @@ return nullptr; } - RefPtr displayHolder = - new VADisplayHolder(std::move(display), std::move(drmFd)); - sDisplayHolder = displayHolder; - - return displayHolder; -} - -void VADisplayHolder::MaybeDestroy() { - StaticMutexAutoLock lock(sDisplayHolderMutex); - MOZ_ASSERT(int32_t(mRefCnt) >= 0, "dup release"); - if (mRefCnt == 0) { - // No new reference added before the lock was taken. - sDisplayHolder = nullptr; - delete this; - } + instance = new VADisplayHolder(std::move(display), std::move(drmFd)); + *weakInstance = instance; + return instance; } void VADisplayHolder::VADisplayDeleter::operator()(VADisplay aDisplay) { diff -Nru firefox-esr-140.9.1esr/dom/media/platforms/ffmpeg/VALibWrapper.h firefox-esr-140.10.0esr/dom/media/platforms/ffmpeg/VALibWrapper.h --- firefox-esr-140.9.1esr/dom/media/platforms/ffmpeg/VALibWrapper.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/platforms/ffmpeg/VALibWrapper.h 2026-04-15 01:59:49.000000000 +0000 @@ -6,6 +6,7 @@ #define DOM_MEDIA_PLATFORMS_FFMPEG_VALIBWRAPPER_H_ #include "mozilla/Attributes.h" +#include "mozilla/ThreadSafeWeakPtr.h" #include "mozilla/Types.h" #include "mozilla/UniquePtrExtensions.h" #include "nsISupportsImpl.h" @@ -55,14 +56,15 @@ PRLibrary* mVALibDrm; }; -class VADisplayHolder { +class VADisplayHolder final + : public SupportsThreadSafeWeakPtr { public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING_WITH_DESTROY(VADisplayHolder, - MaybeDestroy()) + MOZ_DECLARE_REFCOUNTED_TYPENAME(VADisplayHolder) static RefPtr GetSingleton(); VADisplay Display() const { return mDisplay.get(); } + ~VADisplayHolder(); private: struct VADisplayDeleter { @@ -72,9 +74,6 @@ using UniqueVADisplay = std::unique_ptr; VADisplayHolder(UniqueVADisplay aDisplay, UniqueFileHandle aDRMFd); - ~VADisplayHolder(); - - void MaybeDestroy(); // mDRMFd is declared before mDisplay, so that mDRMFd is closed after // mDisplay is terminated. diff -Nru firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceManager.cpp firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceManager.cpp --- firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceManager.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceManager.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -81,43 +81,35 @@ } } -MediaSystemResourceManager::MediaSystemResourceManager() - : mReentrantMonitor("MediaSystemResourceManager.mReentrantMonitor"), - mShutDown(false), - mChild(nullptr) { +MediaSystemResourceManager::MediaSystemResourceManager() { MOZ_ASSERT(InImageBridgeChildThread()); - OpenIPC(); + if (auto imageBridge = ImageBridgeChild::GetSingleton()) { + if (auto* child = + imageBridge->SendPMediaSystemResourceManagerConstructor()) { + mChild = static_cast(child); + mChild->SetManager(this); + } + } } MediaSystemResourceManager::~MediaSystemResourceManager() { - MOZ_ASSERT(IsIpcClosed()); -} - -void MediaSystemResourceManager::OpenIPC() { - MOZ_ASSERT(InImageBridgeChildThread()); MOZ_ASSERT(!mChild); - - media::PMediaSystemResourceManagerChild* child = - ImageBridgeChild::GetSingleton() - ->SendPMediaSystemResourceManagerConstructor(); - mChild = static_cast(child); - mChild->SetManager(this); } void MediaSystemResourceManager::CloseIPC() { MOZ_ASSERT(InImageBridgeChildThread()); - if (!mChild) { - return; + if (mChild) { + mChild->Destroy(); + mChild = nullptr; } - mChild->Destroy(); - mChild = nullptr; - mShutDown = true; } -void MediaSystemResourceManager::OnIpcClosed() { mChild = nullptr; } +void MediaSystemResourceManager::OnIpcClosed() { + MOZ_ASSERT(InImageBridgeChildThread()); -bool MediaSystemResourceManager::IsIpcClosed() { return mChild ? true : false; } + mChild = nullptr; +} void MediaSystemResourceManager::Register(MediaSystemResourceClient* aClient) { ReentrantMonitorAutoEnter mon(mReentrantMonitor); @@ -245,7 +237,7 @@ void MediaSystemResourceManager::DoAcquire(uint32_t aId) { MOZ_ASSERT(InImageBridgeChildThread()); - if (mShutDown || !mChild) { + if (!mChild) { HandleAcquireResult(aId, false); return; } @@ -294,10 +286,9 @@ void MediaSystemResourceManager::DoRelease(uint32_t aId) { MOZ_ASSERT(InImageBridgeChildThread()); - if (mShutDown || !mChild) { - return; + if (mChild) { + mChild->SendRelease(aId); } - mChild->SendRelease(aId); } void MediaSystemResourceManager::RecvResponse(uint32_t aId, bool aSuccess) { diff -Nru firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceManager.h firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceManager.h --- firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceManager.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceManager.h 2026-04-15 01:59:49.000000000 +0000 @@ -55,9 +55,7 @@ MediaSystemResourceManager(); virtual ~MediaSystemResourceManager(); - void OpenIPC(); void CloseIPC(); - bool IsIpcClosed(); void DoAcquire(uint32_t aId); @@ -65,13 +63,13 @@ void HandleAcquireResult(uint32_t aId, bool aSuccess); - ReentrantMonitor mReentrantMonitor MOZ_UNANNOTATED; + ReentrantMonitor mReentrantMonitor{ + "MediaSystemResourceManager.mReentrantMonitor"}; - bool mShutDown; + media::MediaSystemResourceManagerChild* mChild = nullptr; - media::MediaSystemResourceManagerChild* mChild; - - nsTHashMap mResourceClients; + nsTHashMap mResourceClients + MOZ_GUARDED_BY(mReentrantMonitor); static StaticRefPtr sSingleton; }; diff -Nru firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceManagerChild.cpp firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerChild.cpp --- firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceManagerChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -27,6 +27,7 @@ MOZ_ASSERT(!mDestroyed); if (mManager) { mManager->OnIpcClosed(); + mManager = nullptr; } mDestroyed = true; } @@ -35,7 +36,7 @@ if (mDestroyed) { return; } - SendRemoveResourceManager(); + Send__delete__(this); // WARNING: |this| is dead, hands off } diff -Nru firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceManagerParent.cpp firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.cpp --- firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceManagerParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -52,15 +52,6 @@ return IPC_OK(); } -mozilla::ipc::IPCResult -MediaSystemResourceManagerParent::RecvRemoveResourceManager() { - IProtocol* mgr = Manager(); - if (!PMediaSystemResourceManagerParent::Send__delete__(this)) { - return IPC_FAIL_NO_REASON(mgr); - } - return IPC_OK(); -} - void MediaSystemResourceManagerParent::ActorDestroy( ActorDestroyReason aReason) { MOZ_ASSERT(!mDestroyed); diff -Nru firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceManagerParent.h firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.h --- firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceManagerParent.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.h 2026-04-15 01:59:49.000000000 +0000 @@ -31,8 +31,6 @@ mozilla::ipc::IPCResult RecvRelease(const uint32_t& aId); - mozilla::ipc::IPCResult RecvRemoveResourceManager(); - private: void ActorDestroy(ActorDestroyReason aActorDestroyReason) override; diff -Nru firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceService.cpp firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceService.cpp --- firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceService.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceService.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -18,12 +18,11 @@ StaticRefPtr MediaSystemResourceService::sSingleton; /* static */ -MediaSystemResourceService* MediaSystemResourceService::Get() { - if (sSingleton) { - return sSingleton; +already_AddRefed MediaSystemResourceService::Get() { + if (!sSingleton) { + Init(); } - Init(); - return sSingleton; + return do_AddRef(sSingleton); } /* static */ @@ -35,6 +34,7 @@ /* static */ void MediaSystemResourceService::Shutdown() { + MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread()); if (sSingleton) { sSingleton->Destroy(); sSingleton = nullptr; diff -Nru firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceService.h firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceService.h --- firefox-esr-140.9.1esr/dom/media/systemservices/MediaSystemResourceService.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/systemservices/MediaSystemResourceService.h 2026-04-15 01:59:49.000000000 +0000 @@ -26,7 +26,7 @@ public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaSystemResourceService) - static MediaSystemResourceService* Get(); + static already_AddRefed Get(); static void Init(); static void Shutdown(); diff -Nru firefox-esr-140.9.1esr/dom/media/systemservices/PMediaSystemResourceManager.ipdl firefox-esr-140.10.0esr/dom/media/systemservices/PMediaSystemResourceManager.ipdl --- firefox-esr-140.9.1esr/dom/media/systemservices/PMediaSystemResourceManager.ipdl 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/systemservices/PMediaSystemResourceManager.ipdl 2026-04-15 01:59:49.000000000 +0000 @@ -21,16 +21,11 @@ child: async Response(uint32_t aId, bool aSuccess); - async __delete__(); parent: async Acquire(uint32_t aId, MediaSystemResourceType aResourceType, bool aWillWait); async Release(uint32_t aId); - - /** - * Asynchronously tell the parent side to remove the PMediaSystemResourceManager. - */ - async RemoveResourceManager(); + async __delete__(); }; } // namespace media diff -Nru firefox-esr-140.9.1esr/dom/media/webaudio/AudioBufferSourceNode.cpp firefox-esr-140.10.0esr/dom/media/webaudio/AudioBufferSourceNode.cpp --- firefox-esr-140.9.1esr/dom/media/webaudio/AudioBufferSourceNode.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webaudio/AudioBufferSourceNode.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -169,10 +169,14 @@ if (mResamplerOutRate == aOutRate) { return; } - if (speex_resampler_set_rate(mResampler, mBufferSampleRate, aOutRate) != - RESAMPLER_ERR_SUCCESS) { - NS_ASSERTION(false, "speex_resampler_set_rate failed"); - return; + int result = + speex_resampler_set_rate(mResampler, mBufferSampleRate, aOutRate); + if (result != RESAMPLER_ERR_SUCCESS) { + WEB_AUDIO_API_LOG("speex_resampler_set_rate failed: %i", result); + // mResampler den_rate and num_rate might have been updated, despite + // the error, in which case the resampler will output zeros but + // still consume input. Continue below to update mBeginProcessing + // for any change in resampler behavior. } } diff -Nru firefox-esr-140.9.1esr/dom/media/webcodecs/AudioData.cpp firefox-esr-140.10.0esr/dom/media/webcodecs/AudioData.cpp --- firefox-esr-140.9.1esr/dom/media/webcodecs/AudioData.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webcodecs/AudioData.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -401,6 +401,7 @@ template void CopySamples(Span aSource, Span aDest, uint32_t aSourceChannelCount, + uint32_t aSourceFramesPerChannel, const AudioSampleFormat aSourceFormat, const CopyToSpec& aCopyToSpec) { if (IsInterleaved(aSourceFormat) && IsInterleaved(aCopyToSpec.mFormat)) { @@ -409,12 +410,12 @@ MOZ_ASSERT(aSource.Length() - aCopyToSpec.mFrameOffset >= aCopyToSpec.mFrameCount); // This turns into a regular memcpy if the types are in fact equal - ConvertAudioSamples(aSource.data() + aCopyToSpec.mFrameOffset, aDest.data(), - aCopyToSpec.mFrameCount * aSourceChannelCount); + ConvertAudioSamples( + aSource.data() + aCopyToSpec.mFrameOffset * aSourceChannelCount, + aDest.data(), aCopyToSpec.mFrameCount * aSourceChannelCount); return; } if (IsInterleaved(aSourceFormat) && !IsInterleaved(aCopyToSpec.mFormat)) { - DebugOnly sourceFrameCount = aSource.Length() / aSourceChannelCount; MOZ_ASSERT(aDest.Length() >= aCopyToSpec.mFrameCount); MOZ_ASSERT(aSource.Length() - aCopyToSpec.mFrameOffset >= aCopyToSpec.mFrameCount); @@ -438,11 +439,10 @@ aCopyToSpec.mFrameOffset * aSourceChannelCount >= aCopyToSpec.mFrameCount * aSourceChannelCount); size_t writeIndex = 0; - // Scan the source linearly and put each sample at the right position in the - // destination interleaved buffer. - size_t readIndex = 0; for (size_t channel = 0; channel < aSourceChannelCount; channel++) { writeIndex = channel; + size_t readIndex = + channel * aSourceFramesPerChannel + aCopyToSpec.mFrameOffset; for (size_t i = 0; i < aCopyToSpec.mFrameCount; i++) { aDest[writeIndex] = ConvertAudioSample(aSource[readIndex]); readIndex++; @@ -453,8 +453,7 @@ } if (!IsInterleaved(aSourceFormat) && !IsInterleaved(aCopyToSpec.mFormat)) { // Planar to Planar / convert + copy from the right index in the source. - size_t framePerPlane = aSource.Length() / aSourceChannelCount; - size_t offset = aCopyToSpec.mPlaneIndex * framePerPlane; + size_t offset = aCopyToSpec.mPlaneIndex * aSourceFramesPerChannel; MOZ_ASSERT(aDest.Length() >= aCopyToSpec.mFrameCount, "Destination buffer too small"); MOZ_ASSERT(aSource.Length() >= offset + aCopyToSpec.mFrameCount, @@ -516,22 +515,26 @@ void CopySamples(DataSpanType& aSource, DataSpanType& aDest, uint32_t aSourceChannelCount, + uint32_t aSourceFramesPerChannel, const AudioSampleFormat aSourceFormat, const CopyToSpec& aCopyToSpec) { aSource.match([&](auto& src) { aDest.match([&](auto& dst) { - CopySamples(src, dst, aSourceChannelCount, aSourceFormat, aCopyToSpec); + CopySamples(src, dst, aSourceChannelCount, aSourceFramesPerChannel, + aSourceFormat, aCopyToSpec); }); }); } void DoCopy(Span aSource, Span aDest, const uint32_t aSourceChannelCount, + uint32_t aSourceFramesPerChannel, const AudioSampleFormat aSourceFormat, const CopyToSpec& aCopyToSpec) { DataSpanType source = GetDataSpan(aSource, aSourceFormat); DataSpanType dest = GetDataSpan(aDest, aCopyToSpec.mFormat); - CopySamples(source, dest, aSourceChannelCount, aSourceFormat, aCopyToSpec); + CopySamples(source, dest, aSourceChannelCount, aSourceFramesPerChannel, + aSourceFormat, aCopyToSpec); } // https://w3c.github.io/webcodecs/#dom-audiodata-copyto @@ -588,7 +591,7 @@ // Now a couple layers of macros to type the pointers and perform the actual // copy. ProcessTypedArraysFixed(aDestination, [&](const Span& aData) { - DoCopy(mResource->Data(), aData, mNumberOfChannels, + DoCopy(mResource->Data(), aData, mNumberOfChannels, mNumberOfFrames, mAudioSampleFormat.value(), copyToSpec); }); } @@ -714,7 +717,8 @@ CopyToSpec spec(mNumberOfFrames, 0, 0, AudioSampleFormat::F32); - DoCopy(data, storage, mNumberOfChannels, mAudioSampleFormat.value(), spec); + DoCopy(data, storage, mNumberOfChannels, mNumberOfFrames, + mAudioSampleFormat.value(), spec); return MakeRefPtr( 0, media::TimeUnit::FromMicroseconds(mTimestamp), std::move(buf), diff -Nru firefox-esr-140.9.1esr/dom/media/webcodecs/ImageDecoder.cpp firefox-esr-140.10.0esr/dom/media/webcodecs/ImageDecoder.cpp --- firefox-esr-140.9.1esr/dom/media/webcodecs/ImageDecoder.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webcodecs/ImageDecoder.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -1009,6 +1009,10 @@ RefPtr kungFuDeathGrip(this); MOZ_LOG(gWebCodecsLog, LogLevel::Debug, ("ImageDecoder %p Close", this)); + if (mClosed) { + return; + } + // 10.2.5. Algorithms - Close ImageDecoder (with exception) mClosed = true; mTypeNotSupported = aResult.Code() == NS_ERROR_DOM_NOT_SUPPORTED_ERR; diff -Nru firefox-esr-140.9.1esr/dom/media/webcodecs/ImageDecoderReadRequest.cpp firefox-esr-140.10.0esr/dom/media/webcodecs/ImageDecoderReadRequest.cpp --- firefox-esr-140.9.1esr/dom/media/webcodecs/ImageDecoderReadRequest.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webcodecs/ImageDecoderReadRequest.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -60,6 +60,7 @@ MOZ_LOG(gWebCodecsLog, LogLevel::Debug, ("ImageDecoderReadRequest %p Destroy", this)); + RefPtr self(this); if (aCancel) { // Ensure we stop reading from the ReadableStream. Cancel(); @@ -160,8 +161,6 @@ return; } - RefPtr self(this); - AutoJSAPI jsapi; if (!jsapi.Init(mDecoder->GetParentObject())) { MOZ_LOG(gWebCodecsLog, LogLevel::Debug, diff -Nru firefox-esr-140.9.1esr/dom/media/webcodecs/VideoFrame.cpp firefox-esr-140.10.0esr/dom/media/webcodecs/VideoFrame.cpp --- firefox-esr-140.9.1esr/dom/media/webcodecs/VideoFrame.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webcodecs/VideoFrame.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -2793,11 +2793,11 @@ return false; } - auto copyPlane = [&](const uint8_t* aPlaneData) { + auto copyPlane = [&](const uint8_t* aPlaneData, int32_t aSourceStride) { MOZ_ASSERT(aPlaneData); CheckedInt offset(aRect.Y()); - offset *= Stride(aPlane); + offset *= aSourceStride; offset += aRect.X() * mFormat->SampleBytes(aPlane); if (!offset.isValid()) { return false; @@ -2812,37 +2812,38 @@ aPlaneData += offset.value(); for (int32_t row = 0; row < aRect.Height(); ++row) { PodCopy(aPlaneDest.data(), aPlaneData, elementsBytes.value()); - aPlaneData += Stride(aPlane); + aPlaneData += aSourceStride; // Spec asks to move `aDestinationStride` bytes instead of - // `Stride(aPlane)` forward. + // `aSourceStride` forward. aPlaneDest = aPlaneDest.From(aDestinationStride); } return true; }; if (mImage->GetFormat() == ImageFormat::PLANAR_YCBCR) { + const auto* data = mImage->AsPlanarYCbCrImage()->GetData(); switch (aPlane) { case Format::Plane::Y: - return copyPlane(mImage->AsPlanarYCbCrImage()->GetData()->mYChannel); + return copyPlane(data->mYChannel, data->mYStride); case Format::Plane::U: - return copyPlane(mImage->AsPlanarYCbCrImage()->GetData()->mCbChannel); + return copyPlane(data->mCbChannel, data->mCbCrStride); case Format::Plane::V: - return copyPlane(mImage->AsPlanarYCbCrImage()->GetData()->mCrChannel); + return copyPlane(data->mCrChannel, data->mCbCrStride); case Format::Plane::A: MOZ_ASSERT(mFormat->PixelFormat() == VideoPixelFormat::I420A); - MOZ_ASSERT(mImage->AsPlanarYCbCrImage()->GetData()->mAlpha); - return copyPlane( - mImage->AsPlanarYCbCrImage()->GetData()->mAlpha->mChannel); + MOZ_ASSERT(data->mAlpha); + return copyPlane(data->mAlpha->mChannel, data->mYStride); } MOZ_ASSERT_UNREACHABLE("invalid plane"); } if (mImage->GetFormat() == ImageFormat::NV_IMAGE) { + const auto* data = mImage->AsNVImage()->GetData(); switch (aPlane) { case Format::Plane::Y: - return copyPlane(mImage->AsNVImage()->GetData()->mYChannel); + return copyPlane(data->mYChannel, data->mYStride); case Format::Plane::UV: - return copyPlane(mImage->AsNVImage()->GetData()->mCbChannel); + return copyPlane(data->mCbChannel, data->mCbCrStride); case Format::Plane::V: case Format::Plane::A: MOZ_ASSERT_UNREACHABLE("invalid plane"); @@ -2916,7 +2917,7 @@ return false; } - return copyPlane(tempMap.GetData()); + return copyPlane(tempMap.GetData(), tempMap.GetStride()); } #undef LOGW diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp --- firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -1868,7 +1868,11 @@ } nsresult PeerConnectionImpl::OnAlpnNegotiated(bool aPrivacyRequested) { - PC_AUTO_ENTER_API_CALL(false); + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread"); + RefPtr kungFuDeathGrip(this); + if (IsClosed()) { + return NS_OK; // Nod and smile + } MOZ_DIAGNOSTIC_ASSERT(!mRequestedPrivacy || (*mRequestedPrivacy == PrincipalPrivacy::Private) == aPrivacyRequested); @@ -1885,6 +1889,12 @@ void PeerConnectionImpl::OnDtlsStateChange(const std::string& aTransportId, TransportLayer::State aState) { + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread"); + RefPtr kungFuDeathGrip(this); + if (IsClosed()) { + return; + } + nsCString key(aTransportId.data(), aTransportId.size()); RefPtr dtlsTransport = mTransportIdToRTCDtlsTransport.Get(key); @@ -3314,8 +3324,16 @@ void PeerConnectionImpl::IceConnectionStateChange( const std::string& aTransportId, dom::RTCIceTransportState domState) { + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread"); + + // Let connection be the RTCPeerConnection object associated with this ICE + // Agent. + RefPtr connection(this); + // If connection.[[IsClosed]] is true, abort these steps. - PC_AUTO_ENTER_API_CALL_VOID_RETURN(false); + if (IsClosed()) { + return; + } CSFLogDebug(LOGTAG, "IceConnectionStateChange: %s %d (%p)", aTransportId.c_str(), static_cast(domState), this); @@ -3475,6 +3493,9 @@ void PeerConnectionImpl::OnCandidateFound(const std::string& aTransportId, const CandidateInfo& aCandidateInfo) { + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread"); + RefPtr kungFuDeathGrip(this); + if (mStunAddrsRequest && !aCandidateInfo.mMDNSAddress.empty()) { MOZ_ASSERT(!aCandidateInfo.mActualAddress.empty()); @@ -3507,8 +3528,13 @@ void PeerConnectionImpl::IceGatheringStateChange( const std::string& aTransportId, dom::RTCIceGathererState state) { + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread"); + RefPtr kungFuDeathGrip(this); + // If connection.[[IsClosed]] is true, abort these steps. - PC_AUTO_ENTER_API_CALL_VOID_RETURN(false); + if (IsClosed()) { + return; + } CSFLogWarn(LOGTAG, "IceGatheringStateChange: %s %d (%p)", aTransportId.c_str(), static_cast(state), this); diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp --- firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -17,9 +17,6 @@ #include "jsapi/RTCRtpScriptTransform.h" #include "mozilla/dom/RTCRtpScriptTransformer.h" #include "mozilla/dom/RTCEncodedAudioFrameBinding.h" -#include "nsWrapperCache.h" -#include "nsISupports.h" -#include "nsCycleCollectionParticipant.h" #include "nsIGlobalObject.h" #include "nsContentUtils.h" #include "mozilla/HoldDropJSObjects.h" @@ -30,21 +27,11 @@ namespace mozilla::dom { -NS_IMPL_CYCLE_COLLECTION_INHERITED(RTCEncodedAudioFrame, RTCEncodedFrameBase, - mOwner) -NS_IMPL_ADDREF_INHERITED(RTCEncodedAudioFrame, RTCEncodedFrameBase) -NS_IMPL_RELEASE_INHERITED(RTCEncodedAudioFrame, RTCEncodedFrameBase) - -NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCEncodedAudioFrame) - NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY -NS_INTERFACE_MAP_END_INHERITING(RTCEncodedFrameBase) - RTCEncodedAudioFrame::RTCEncodedAudioFrame( nsIGlobalObject* aGlobal, std::unique_ptr aFrame, uint64_t aCounter, RTCRtpScriptTransformer* aOwner) - : RTCEncodedFrameBase(aGlobal, std::move(aFrame), aCounter), - mOwner(aOwner) { + : RTCEncodedFrameBase(aGlobal, std::move(aFrame), aCounter, aOwner) { mMetadata.mSynchronizationSource.Construct(mFrame->GetSsrc()); mMetadata.mPayloadType.Construct(mFrame->GetPayloadType()); // send frames are derived directly from TransformableFrameInterface, not @@ -64,16 +51,6 @@ mMetadata.mSequenceNumber.Construct(*optionalSeqNum); } } - - // Base class needs this, but can't do it itself because of an assertion in - // the cycle-collector. - mozilla::HoldJSObjects(this); -} - -RTCEncodedAudioFrame::~RTCEncodedAudioFrame() { - // Base class needs this, but can't do it itself because of an assertion in - // the cycle-collector. - mozilla::DropJSObjects(this); } JSObject* RTCEncodedAudioFrame::WrapObject(JSContext* aCx, @@ -81,10 +58,6 @@ return RTCEncodedAudioFrame_Binding::Wrap(aCx, this, aGivenProto); } -nsIGlobalObject* RTCEncodedAudioFrame::GetParentObject() const { - return mGlobal; -} - void RTCEncodedAudioFrame::GetMetadata( RTCEncodedAudioFrameMetadata& aMetadata) const { aMetadata = mMetadata; diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h --- firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h 2026-04-15 01:59:48.000000000 +0000 @@ -25,17 +25,10 @@ std::unique_ptr aFrame, uint64_t aCounter, RTCRtpScriptTransformer* aOwner); - // nsISupports - NS_DECL_ISUPPORTS_INHERITED - NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(RTCEncodedAudioFrame, - RTCEncodedFrameBase) - // webidl (timestamp and data accessors live in base class) JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; - nsIGlobalObject* GetParentObject() const; - void GetMetadata(RTCEncodedAudioFrameMetadata& aMetadata) const; bool CheckOwner(RTCRtpScriptTransformer* aOwner) const override; @@ -43,8 +36,7 @@ bool IsVideo() const override { return false; } private: - virtual ~RTCEncodedAudioFrame(); - RefPtr mOwner; + virtual ~RTCEncodedAudioFrame() = default; RTCEncodedAudioFrameMetadata mMetadata; }; diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp --- firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -7,8 +7,10 @@ #include "jsapi/RTCEncodedFrameBase.h" #include "js/GCAPI.h" +#include "mozilla/HoldDropJSObjects.h" #include "nsIGlobalObject.h" #include "mozilla/dom/ScriptSettings.h" +#include "mozilla/dom/RTCRtpScriptTransformer.h" #include "js/ArrayBuffer.h" namespace mozilla::dom { @@ -17,46 +19,57 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(RTCEncodedFrameBase) using ::ImplCycleCollectionUnlink; tmp->DetachData(); - NS_IMPL_CYCLE_COLLECTION_UNLINK(mGlobal) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwner, mGlobal) NS_IMPL_CYCLE_COLLECTION_UNLINK(mData) + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(RTCEncodedFrameBase) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner, mGlobal) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(RTCEncodedFrameBase) NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBERS(mData) + NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCEncodedFrameBase) NS_IMPL_CYCLE_COLLECTING_RELEASE(RTCEncodedFrameBase) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCEncodedFrameBase) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END RTCEncodedFrameBase::RTCEncodedFrameBase( nsIGlobalObject* aGlobal, std::unique_ptr aFrame, - uint64_t aCounter) + uint64_t aCounter, + RTCRtpScriptTransformer* aOwner) : mGlobal(aGlobal), mFrame(std::move(aFrame)), mCounter(aCounter), - mTimestamp(mFrame->GetTimestamp()) { + mTimestamp(mFrame->GetTimestamp()), + mOwner(aOwner) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mGlobal))) { return; } + mozilla::HoldJSObjects(this); + // Avoid a copy mData = JS::NewArrayBufferWithUserOwnedContents( jsapi.cx(), mFrame->GetData().size(), (void*)(mFrame->GetData().data())); } -RTCEncodedFrameBase::~RTCEncodedFrameBase() { DetachData(); } +RTCEncodedFrameBase::~RTCEncodedFrameBase() { + DetachData(); + mData = nullptr; + mozilla::DropJSObjects(this); +} void RTCEncodedFrameBase::DetachData() { // We might have handled this in unlink already - if (mGlobal) { + if (mGlobal && mData) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mGlobal))) { return; @@ -69,6 +82,10 @@ } } +nsIGlobalObject* RTCEncodedFrameBase::GetParentObject() const { + return mGlobal; +} + unsigned long RTCEncodedFrameBase::Timestamp() const { return mTimestamp; } void RTCEncodedFrameBase::SetData(const ArrayBuffer& aData) { diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h --- firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h 2026-04-15 01:59:48.000000000 +0000 @@ -24,12 +24,15 @@ explicit RTCEncodedFrameBase( nsIGlobalObject* aGlobal, std::unique_ptr aFrame, - uint64_t aCounter); + uint64_t aCounter, + RTCRtpScriptTransformer* aOwner); // nsISupports NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(RTCEncodedFrameBase) + nsIGlobalObject* GetParentObject() const; + // Common webidl for RTCEncodedVideoFrame/RTCEncodedAudioFrame unsigned long Timestamp() const; @@ -53,6 +56,7 @@ std::unique_ptr mFrame; const uint64_t mCounter = 0; const unsigned long mTimestamp = 0; + RefPtr mOwner; JS::Heap mData; }; diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp --- firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -16,9 +16,6 @@ #include "jsapi/RTCEncodedFrameBase.h" #include "mozilla/dom/RTCEncodedVideoFrameBinding.h" #include "mozilla/dom/RTCRtpScriptTransformer.h" -#include "nsWrapperCache.h" -#include "nsISupports.h" -#include "nsCycleCollectionParticipant.h" #include "nsIGlobalObject.h" #include "nsContentUtils.h" #include "mozilla/RefPtr.h" @@ -29,21 +26,11 @@ namespace mozilla::dom { -NS_IMPL_CYCLE_COLLECTION_INHERITED(RTCEncodedVideoFrame, RTCEncodedFrameBase, - mOwner) -NS_IMPL_ADDREF_INHERITED(RTCEncodedVideoFrame, RTCEncodedFrameBase) -NS_IMPL_RELEASE_INHERITED(RTCEncodedVideoFrame, RTCEncodedFrameBase) - -NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCEncodedVideoFrame) - NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY -NS_INTERFACE_MAP_END_INHERITING(RTCEncodedFrameBase) - RTCEncodedVideoFrame::RTCEncodedVideoFrame( nsIGlobalObject* aGlobal, std::unique_ptr aFrame, uint64_t aCounter, RTCRtpScriptTransformer* aOwner) - : RTCEncodedFrameBase(aGlobal, std::move(aFrame), aCounter), - mOwner(aOwner) { + : RTCEncodedFrameBase(aGlobal, std::move(aFrame), aCounter, aOwner) { const auto& videoFrame( static_cast(*mFrame)); mType = videoFrame.IsKeyFrame() ? RTCEncodedVideoFrameType::Key @@ -85,21 +72,11 @@ mozilla::HoldJSObjects(this); } -RTCEncodedVideoFrame::~RTCEncodedVideoFrame() { - // Base class needs this, but can't do it itself because of an assertion in - // the cycle-collector. - mozilla::DropJSObjects(this); -} - JSObject* RTCEncodedVideoFrame::WrapObject(JSContext* aCx, JS::Handle aGivenProto) { return RTCEncodedVideoFrame_Binding::Wrap(aCx, this, aGivenProto); } -nsIGlobalObject* RTCEncodedVideoFrame::GetParentObject() const { - return mGlobal; -} - RTCEncodedVideoFrameType RTCEncodedVideoFrame::Type() const { return mType; } void RTCEncodedVideoFrame::GetMetadata( diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h --- firefox-esr-140.9.1esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h 2026-04-15 01:59:49.000000000 +0000 @@ -7,7 +7,6 @@ #ifndef MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDVIDEOFRAME_H_ #define MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDVIDEOFRAME_H_ -#include "mozilla/RefPtr.h" #include "nsIGlobalObject.h" #include "jsapi/RTCEncodedFrameBase.h" #include "mozilla/dom/RTCEncodedVideoFrameBinding.h" @@ -26,17 +25,10 @@ std::unique_ptr aFrame, uint64_t aCounter, RTCRtpScriptTransformer* aOwner); - // nsISupports - NS_DECL_ISUPPORTS_INHERITED - NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(RTCEncodedVideoFrame, - RTCEncodedFrameBase) - // webidl (timestamp and data accessors live in base class) JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; - nsIGlobalObject* GetParentObject() const; - RTCEncodedVideoFrameType Type() const; void GetMetadata(RTCEncodedVideoFrameMetadata& aMetadata); @@ -50,8 +42,7 @@ Maybe Rid() const; private: - virtual ~RTCEncodedVideoFrame(); - RefPtr mOwner; + virtual ~RTCEncodedVideoFrame() = default; RTCEncodedVideoFrameType mType; RTCEncodedVideoFrameMetadata mMetadata; Maybe mRid; diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp --- firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -1385,13 +1385,13 @@ } mCall->UnregisterConduit(this); - mDecoderFactory->DisconnectAll(); - mEncoderFactory->DisconnectAll(); { MutexAutoLock lock(mMutex); DeleteSendStream(); DeleteRecvStream(); } + mDecoderFactory->DisconnectAll(); + mEncoderFactory->DisconnectAll(); return GenericPromise::CreateAndResolve(true, __func__); }); diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp --- firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -672,7 +672,8 @@ } if (mCodecParams.mTemporalLayerNum > 1) { - int temporalIdx = std::max(0, aEncodedFrame->GetTemporalLayerId()); + int temporalIdx = std::clamp(aEncodedFrame->GetTemporalLayerId(), 0, + mCodecParams.mTemporalLayerNum - 1); unit.SetTemporalIndex(temporalIdx); info.codecSpecific.H264.temporal_idx = temporalIdx; info.scalability_mode = GmpCodecParamsToScalabilityMode(mCodecParams); @@ -1047,9 +1048,10 @@ CheckedInt32 length = (CheckedInt32(aDecodedFrame->Stride(kGMPYPlane)) * aDecodedFrame->Height()) + - (aDecodedFrame->Stride(kGMPVPlane) + aDecodedFrame->Stride(kGMPUPlane)) * - ((aDecodedFrame->Height() + 1) / 2); - int32_t size = length.value(); + (CheckedInt32(aDecodedFrame->Stride(kGMPVPlane)) + + aDecodedFrame->Stride(kGMPUPlane)) * + ((aDecodedFrame->Height() + 1) / 2); + int32_t size = length.isValid() ? length.value() : 0; MOZ_RELEASE_ASSERT(length.isValid() && size > 0); // Don't use MakeUniqueFallible here, because UniquePtr isn't copyable, and diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.cpp firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.cpp --- firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.cpp 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -474,8 +474,8 @@ CheckedInt64 time = TimeUnitToFrames(frame->mTime, cricket::kVideoCodecClockrate); if (!time.isValid()) { - self->mError = MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, - "invalid timestamp from encoder"); + mError = MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, + "invalid timestamp from encoder"); break; } image.SetRtpTimestamp(time.value()); @@ -487,11 +487,12 @@ frame->mKeyframe); LOG_V("Send encoded image"); - self->mCallback->OnEncodedImage(image, &mCodecSpecific); - self->mBitrateAdjuster.Update(image.size()); + mCallback->OnEncodedImage(image, &mCodecSpecific); + mBitrateAdjuster.Update(image.size()); } }, [self = RefPtr(this)](const MediaResult& aError) { + MutexAutoLock lock(self->mCallbackMutex); self->mError = aError; }); return WEBRTC_VIDEO_CODEC_OK; diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.h firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.h --- firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.h 2026-04-03 15:52:19.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.h 2026-04-15 01:59:48.000000000 +0000 @@ -60,9 +60,10 @@ const RefPtr mFactory; RefPtr mEncoder; - Mutex mCallbackMutex MOZ_UNANNOTATED; // Protects mCallback and mError. - webrtc::EncodedImageCallback* mCallback = nullptr; - MediaResult mError = NS_OK; + Mutex mCallbackMutex; + webrtc::EncodedImageCallback* mCallback MOZ_GUARDED_BY(mCallbackMutex) = + nullptr; + MediaResult mError MOZ_GUARDED_BY(mCallbackMutex) = NS_OK; VideoInfo mInfo; webrtc::CodecParameterMap mFormatParams; diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.cpp firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.cpp --- firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -38,8 +38,11 @@ // Get an external decoder auto gmpDecoder = WrapUnique(GmpVideoCodec::CreateDecoder(mPCHandle, mTrackingId)); - mCreatedGmpPluginEvent.Forward(*gmpDecoder->InitPluginEvent()); - mReleasedGmpPluginEvent.Forward(*gmpDecoder->ReleasePluginEvent()); + { + MutexAutoLock lock(mGmpPluginMutex); + mCreatedGmpPluginEvent.Forward(*gmpDecoder->InitPluginEvent()); + mReleasedGmpPluginEvent.Forward(*gmpDecoder->ReleasePluginEvent()); + } decoder.reset(gmpDecoder.release()); break; } @@ -132,8 +135,11 @@ // get an external encoder auto gmpEncoder = WrapUnique(GmpVideoCodec::CreateEncoder(aFormat, mPCHandle)); - mCreatedGmpPluginEvent.Forward(*gmpEncoder->InitPluginEvent()); - mReleasedGmpPluginEvent.Forward(*gmpEncoder->ReleasePluginEvent()); + { + MutexAutoLock lock(mGmpPluginMutex); + mCreatedGmpPluginEvent.Forward(*gmpEncoder->InitPluginEvent()); + mReleasedGmpPluginEvent.Forward(*gmpEncoder->ReleasePluginEvent()); + } encoder.reset(gmpEncoder.release()); break; } diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.h firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.h --- firefox-esr-140.9.1esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.h 2026-04-15 01:59:49.000000000 +0000 @@ -22,6 +22,7 @@ public: explicit GmpPluginNotifier(nsCOMPtr aOwningThread) : mOwningThread(std::move(aOwningThread)), + mGmpPluginMutex("GmpPluginNotifier::mGmpPluginMutex"), mCreatedGmpPluginEvent(mOwningThread), mReleasedGmpPluginEvent(mOwningThread) {} @@ -29,6 +30,7 @@ void DisconnectAll() override { MOZ_ASSERT(mOwningThread->IsOnCurrentThread()); + MutexAutoLock lock(mGmpPluginMutex); mCreatedGmpPluginEvent.DisconnectAll(); mReleasedGmpPluginEvent.DisconnectAll(); } @@ -43,6 +45,7 @@ protected: const nsCOMPtr mOwningThread; + Mutex mGmpPluginMutex MOZ_UNANNOTATED; MediaEventForwarder mCreatedGmpPluginEvent; MediaEventForwarder mReleasedGmpPluginEvent; }; diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/transport/nr_socket_prsock.cpp firefox-esr-140.10.0esr/dom/media/webrtc/transport/nr_socket_prsock.cpp --- firefox-esr-140.9.1esr/dom/media/webrtc/transport/nr_socket_prsock.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/transport/nr_socket_prsock.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -532,7 +532,7 @@ int nr_transport_addr_get_addrstring_and_port(const nr_transport_addr* addr, nsACString* host, int32_t* port) { int r, _status; - char addr_string[64]; + char addr_string[256]; // We cannot directly use |nr_transport_addr.as_string| because it contains // more than ip address, therefore, we need to explicity convert it diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/transport/third_party/nICEr/src/ice/ice_parser.c firefox-esr-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/ice/ice_parser.c --- firefox-esr-140.9.1esr/dom/media/webrtc/transport/third_party/nICEr/src/ice/ice_parser.c 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/ice/ice_parser.c 2026-04-15 01:59:49.000000000 +0000 @@ -94,8 +94,10 @@ len = c - *str; tmp = RMALLOC(len + 1); - if (!tmp) + if (!tmp) { + *out = 0; ABORT(R_NO_MEMORY); + } memcpy(tmp, *str, len); tmp[len] = '\0'; diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/transport/third_party/nICEr/src/net/transport_addr.c firefox-esr-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/net/transport_addr.c --- firefox-esr-140.9.1esr/dom/media/webrtc/transport/third_party/nICEr/src/net/transport_addr.c 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/net/transport_addr.c 2026-04-15 01:59:48.000000000 +0000 @@ -281,6 +281,9 @@ int _status; if (addr->fqdn[0]) { + if (maxlen <= (int)(strlen(addr->fqdn))) { + ABORT(R_BAD_ARGS); + } strncpy(str, addr->fqdn, maxlen); } else { const char* res; diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.c firefox-esr-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.c --- firefox-esr-140.9.1esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.c 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.c 2026-04-15 01:59:48.000000000 +0000 @@ -832,6 +832,16 @@ return(_status); } +static void nr_stun_client_ctx_destroy_final(NR_SOCKET s, int b, void *cb_arg) + { + nr_stun_client_ctx *ctx=(nr_stun_client_ctx*)cb_arg; + RFREE(ctx->nonce); + RFREE(ctx->realm); + + RFREE(ctx->label); + RFREE(ctx); + } + int nr_stun_client_ctx_destroy(nr_stun_client_ctx **ctxp) { nr_stun_client_ctx *ctx; @@ -843,13 +853,7 @@ *ctxp=0; nr_stun_client_reset(ctx); - - RFREE(ctx->nonce); - RFREE(ctx->realm); - - RFREE(ctx->label); - RFREE(ctx); - + NR_ASYNC_TIMER_SET(0, nr_stun_client_ctx_destroy_final, ctx, &ctx->destroy_timer_handle); return(0); } diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.h firefox-esr-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.h --- firefox-esr-140.9.1esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.h 2026-04-15 01:59:49.000000000 +0000 @@ -176,6 +176,7 @@ UINT4 mapped_addr_check_mask; /* What checks to run on mapped addresses */ int timeout_ms; struct timeval timer_set; + void *destroy_timer_handle; NR_async_cb finished_cb; void *cb_arg; nr_stun_message *request; diff -Nru firefox-esr-140.9.1esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_proc.c firefox-esr-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_proc.c --- firefox-esr-140.9.1esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_proc.c 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_proc.c 2026-04-15 01:59:49.000000000 +0000 @@ -156,7 +156,7 @@ /* unrecognized attribute */ /* should never happen, but truncate if it ever were to occur */ - if (unknown_attributes.num_attributes > NR_STUN_MAX_UNKNOWN_ATTRIBUTES) + if (unknown_attributes.num_attributes >= NR_STUN_MAX_UNKNOWN_ATTRIBUTES) break; unknown_attributes.attribute[unknown_attributes.num_attributes++] = attr->type; diff -Nru firefox-esr-140.9.1esr/dom/media/webvtt/TextTrack.cpp firefox-esr-140.10.0esr/dom/media/webvtt/TextTrack.cpp --- firefox-esr-140.9.1esr/dom/media/webvtt/TextTrack.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/media/webvtt/TextTrack.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -79,6 +79,7 @@ } void TextTrack::SetMode(TextTrackMode aValue) { + RefPtr kungFuDeathGrip = this; if (mMode == aValue) { return; } diff -Nru firefox-esr-140.9.1esr/dom/network/TCPServerSocketParent.cpp firefox-esr-140.10.0esr/dom/network/TCPServerSocketParent.cpp --- firefox-esr-140.9.1esr/dom/network/TCPServerSocketParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/network/TCPServerSocketParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -25,6 +25,11 @@ void TCPServerSocketParent::ReleaseIPDLReference() { MOZ_ASSERT(mIPCOpen); + NS_ASSERTION(mIPCOpen, + "ReleaseIPDLReference called without matching AddIPDLReference"); + if (!mIPCOpen) { + return; + } mIPCOpen = false; this->Release(); } @@ -70,8 +75,9 @@ if (mNeckoParent) { if (mNeckoParent->SendPTCPSocketConstructor(socket, host, port)) { - // Call |AddIPDLReference| after the consructor message is sent - // successfully, otherwise |socket| could be leaked. + // Call |AddIPDLReference| only on success; on failure IPDL calls + // DeallocPTCPSocketParent which calls ReleaseIPDLReference, guarded + // against the unbalanced case. socket->AddIPDLReference(); mozilla::Unused << PTCPServerSocketParent::SendCallbackAccept( diff -Nru firefox-esr-140.9.1esr/dom/network/TCPSocket.cpp firefox-esr-140.10.0esr/dom/network/TCPSocket.cpp --- firefox-esr-140.9.1esr/dom/network/TCPSocket.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/network/TCPSocket.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -10,6 +10,7 @@ #include "TCPSocketParent.h" #include "mozilla/BasePrincipal.h" #include "mozilla/ErrorResult.h" +#include "mozilla/StaticPrefs_dom.h" #include "mozilla/SyncRunnable.h" #include "mozilla/dom/RootedDictionary.h" #include "mozilla/dom/ScriptSettings.h" @@ -1163,6 +1164,10 @@ /* static */ bool TCPSocket::ShouldTCPSocketExist(JSContext* aCx, JSObject* aGlobal) { + if (XRE_IsContentProcess() && + !StaticPrefs::dom_tcpsocket_in_child_enabled()) { + return false; + } JS::Rooted global(aCx, aGlobal); return nsContentUtils::ObjectPrincipal(global)->IsSystemPrincipal(); } diff -Nru firefox-esr-140.9.1esr/dom/network/TCPSocketParent.cpp firefox-esr-140.10.0esr/dom/network/TCPSocketParent.cpp --- firefox-esr-140.9.1esr/dom/network/TCPSocketParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/network/TCPSocketParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -56,6 +56,11 @@ void TCPSocketParentBase::ReleaseIPDLReference() { MOZ_ASSERT(mIPCOpen); + NS_ASSERTION(mIPCOpen, + "ReleaseIPDLReference called without matching AddIPDLReference"); + if (!mIPCOpen) { + return; + } mIPCOpen = false; this->Release(); } @@ -78,6 +83,9 @@ mozilla::ipc::IPCResult TCPSocketParent::RecvOpen( const nsString& aHost, const uint16_t& aPort, const bool& aUseSSL, const bool& aUseArrayBuffers) { + if (!StaticPrefs::dom_tcpsocket_in_child_enabled()) { + return IPC_FAIL(this, "tcp socket not enabled"); + } mSocket = new TCPSocket(nullptr, aHost, aPort, aUseSSL, aUseArrayBuffers); mSocket->SetSocketBridgeParent(this); NS_ENSURE_SUCCESS(mSocket->Init(nullptr), IPC_OK()); diff -Nru firefox-esr-140.9.1esr/dom/network/UDPSocket.cpp firefox-esr-140.10.0esr/dom/network/UDPSocket.cpp --- firefox-esr-140.9.1esr/dom/network/UDPSocket.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/network/UDPSocket.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -159,6 +159,8 @@ return; } + RefPtr kungFuDeathGrip(this); + if (mOpened) { if (mReadyState == SocketReadyState::Opening) { // reject openedPromise with AbortError if socket is closed without error diff -Nru firefox-esr-140.9.1esr/dom/network/UDPSocketParent.cpp firefox-esr-140.10.0esr/dom/network/UDPSocketParent.cpp --- firefox-esr-140.9.1esr/dom/network/UDPSocketParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/network/UDPSocketParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -307,6 +307,10 @@ return IPC_OK(); } + if (!mFilter && aData.type() == UDPData::TIPCStream) { + return IPC_FAIL(this, "IPCStream payload requires a filter"); + } + nsresult rv; if (mFilter) { if (aAddr.type() != UDPSocketAddr::TNetAddr) { diff -Nru firefox-esr-140.9.1esr/dom/network/tests/chrome.toml firefox-esr-140.10.0esr/dom/network/tests/chrome.toml --- firefox-esr-140.9.1esr/dom/network/tests/chrome.toml 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/network/tests/chrome.toml 2026-04-15 01:59:48.000000000 +0000 @@ -1,4 +1,5 @@ [DEFAULT] +prefs = ["dom.tcpsocket_in_child.enabled=true"] support-files = [ "tcpsocket_test.sys.mjs", "test_tcpsocket_client_and_server_basics.js", diff -Nru firefox-esr-140.9.1esr/dom/reporting/ReportingHeader.cpp firefox-esr-140.10.0esr/dom/reporting/ReportingHeader.cpp --- firefox-esr-140.9.1esr/dom/reporting/ReportingHeader.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/reporting/ReportingHeader.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -8,6 +8,7 @@ #include #include "js/Array.h" // JS::GetArrayLength, JS::IsArrayObject +#include "js/GCAPI.h" #include "js/JSON.h" #include "js/PropertyAndElement.h" // JS_GetElement #include "mozilla/dom/ReportingBinding.h" @@ -345,7 +346,7 @@ return nullptr; } - dom::ReportingHeaderValue data; + RootedDictionary data(cx); if (!data.Init(cx, jsonValue)) { LogToConsoleInvalidJSON(aChannel, aURI); return nullptr; diff -Nru firefox-esr-140.9.1esr/dom/security/nsCSPUtils.cpp firefox-esr-140.10.0esr/dom/security/nsCSPUtils.cpp --- firefox-esr-140.9.1esr/dom/security/nsCSPUtils.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/security/nsCSPUtils.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -1333,10 +1333,14 @@ // Step 1.4. If directive’s value contains a source expression that is an // ASCII case-insensitive match for the "'strict-dynamic'" keyword-source: + if (hasStrictDynamicKeyword) { + // GetParserCreatedScript() isn't set for XSLT. + if (aLoadInfo->InternalContentPolicyType() == + nsIContentPolicy::TYPE_XSLT) { + CSPUTILSLOG((" Blocked XSLT by default with 'strict-dynamic'")); + return false; + } - // XXX I don't think we should apply strict-dynamic to XSLT. - if (hasStrictDynamicKeyword && aLoadInfo->InternalContentPolicyType() != - nsIContentPolicy::TYPE_XSLT) { // Step 1.4.1 If the request’s parser metadata is "parser-inserted", // return "Blocked". Otherwise, return "Allowed". if (aLoadInfo->GetParserCreatedScript()) { diff -Nru firefox-esr-140.9.1esr/dom/serviceworkers/ServiceWorkerOp.cpp firefox-esr-140.10.0esr/dom/serviceworkers/ServiceWorkerOp.cpp --- firefox-esr-140.9.1esr/dom/serviceworkers/ServiceWorkerOp.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/serviceworkers/ServiceWorkerOp.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -1694,10 +1694,10 @@ // https://w3c.github.io/ServiceWorker/#on-fetch-request-algorithm Step 26: If // eventHandled is not null, then resolve eventHandled. // - // mRespondWithPromiseHolder will resolve a MozPromise that will resolve on - // the worker owner's thread, so it's fine to resolve the mHandled promise now - // because content will not interfere with respondWith getting the Response to - // where it's going. + // Take an immutable snapshot of the headers now, while still on the worker + // thread. + ir->SnapshotUnfilteredHeaders(); + mHandled->MaybeResolveWithUndefined(); mRespondWithPromiseHolder.Resolve( FetchEventRespondWithResult(std::make_tuple( diff -Nru firefox-esr-140.9.1esr/dom/serviceworkers/ServiceWorkerRegistrationChild.cpp firefox-esr-140.10.0esr/dom/serviceworkers/ServiceWorkerRegistrationChild.cpp --- firefox-esr-140.9.1esr/dom/serviceworkers/ServiceWorkerRegistrationChild.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/serviceworkers/ServiceWorkerRegistrationChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -18,7 +18,8 @@ mIPCWorkerRef = nullptr; if (mOwner) { - mOwner->RevokeActor(this); + RefPtr owner = mOwner; + owner->RevokeActor(this); MOZ_DIAGNOSTIC_ASSERT(!mOwner); } } diff -Nru firefox-esr-140.9.1esr/dom/smil/SMILCSSValueType.cpp firefox-esr-140.10.0esr/dom/smil/SMILCSSValueType.cpp --- firefox-esr-140.9.1esr/dom/smil/SMILCSSValueType.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/smil/SMILCSSValueType.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -438,7 +438,7 @@ } RefPtr computedStyle = - nsComputedDOMStyle::GetComputedStyle(aTargetElement); + nsComputedDOMStyle::GetComputedStyleNoFlush(aTargetElement); if (!computedStyle) { return; } diff -Nru firefox-esr-140.9.1esr/dom/streams/QueueWithSizes.h firefox-esr-140.10.0esr/dom/streams/QueueWithSizes.h --- firefox-esr-140.9.1esr/dom/streams/QueueWithSizes.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/QueueWithSizes.h 2026-04-15 01:59:49.000000000 +0000 @@ -8,8 +8,8 @@ #define mozilla_dom_QueueWithSizes_h #include -#include "js/TypeDecls.h" -#include "js/Value.h" + +#include "jsapi.h" #include "mozilla/ErrorResult.h" #include "mozilla/UniquePtr.h" #include "nsTArray.h" @@ -83,8 +83,9 @@ // https://streams.spec.whatwg.org/#dequeue-value template -inline void DequeueValue(QueueContainingClass aContainer, - JS::MutableHandle aResultValue) { +inline void DequeueValue(JSContext* aCx, QueueContainingClass aContainer, + JS::MutableHandle aResultValue, + ErrorResult& aRv) { // Step 1. Implicit via template instantiation. // Step 2. MOZ_ASSERT(!aContainer->Queue().isEmpty()); @@ -104,12 +105,18 @@ // Step 7. aResultValue.set(valueWithSize->mValue); + valueWithSize.reset(); + if (!JS_WrapValue(aCx, aResultValue)) { + aResultValue.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } } // https://streams.spec.whatwg.org/#peek-queue-value template -inline void PeekQueueValue(QueueContainingClass aContainer, - JS::MutableHandle aResultValue) { +inline void PeekQueueValue(JSContext* aCx, QueueContainingClass aContainer, + JS::MutableHandle aResultValue, + ErrorResult& aRv) { // Step 1. Assert: container has [[queue]] and [[queueTotalSize]] internal // slots. // Step 2. Assert: container.[[queue]] is not empty. @@ -120,6 +127,11 @@ // Step 4. Return valueWithSize’s value. aResultValue.set(valueWithSize->mValue); + valueWithSize = nullptr; + if (!JS_WrapValue(aCx, aResultValue)) { + aResultValue.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } } // https://streams.spec.whatwg.org/#reset-queue diff -Nru firefox-esr-140.9.1esr/dom/streams/ReadableStream.cpp firefox-esr-140.10.0esr/dom/streams/ReadableStream.cpp --- firefox-esr-140.9.1esr/dom/streams/ReadableStream.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/ReadableStream.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -112,6 +112,16 @@ return ReadableStream_Binding::Wrap(aCx, this, aGivenProto); } +void ReadableStream::GetStoredError(JSContext* aCx, + JS::MutableHandle aStoredError, + ErrorResult& aRv) const { + aStoredError.set(mStoredError); + if (!JS_WrapValue(aCx, aStoredError)) { + aStoredError.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } +} + ReadableStreamDefaultReader* ReadableStream::GetDefaultReader() { return mReader->AsDefault(); } @@ -586,7 +596,12 @@ // Step 3. if (aStream->State() == ReadableStream::ReaderState::Errored) { - JS::Rooted storedError(aCx, aStream->StoredError()); + JS::Rooted storedError(aCx); + aStream->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return nullptr; + } + return Promise::CreateRejected(aStream->GetParentObject(), storedError, aRv); } @@ -892,13 +907,21 @@ return nullptr; } - JS::Rooted reason1(aCx, mTeeState->Reason1()); + JS::Rooted reason1(aCx); + mTeeState->GetReason1(aCx, &reason1, aRv); + if (aRv.Failed()) { + return nullptr; + } if (!JS_SetElement(aCx, compositeReason, 0, reason1)) { aRv.StealExceptionFromJSContext(aCx); return nullptr; } - JS::Rooted reason2(aCx, mTeeState->Reason2()); + JS::Rooted reason2(aCx); + mTeeState->GetReason2(aCx, &reason2, aRv); + if (aRv.Failed()) { + return nullptr; + } if (!JS_SetElement(aCx, compositeReason, 1, reason2)) { aRv.StealExceptionFromJSContext(aCx); return nullptr; diff -Nru firefox-esr-140.9.1esr/dom/streams/ReadableStream.h firefox-esr-140.10.0esr/dom/streams/ReadableStream.h --- firefox-esr-140.9.1esr/dom/streams/ReadableStream.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/ReadableStream.h 2026-04-15 01:59:49.000000000 +0000 @@ -103,7 +103,9 @@ ReaderState State() const { return mState; } void SetState(const ReaderState& aState) { mState = aState; } - JS::Value StoredError() const { return mStoredError; } + void GetStoredError(JSContext* aCx, JS::MutableHandle aStoredError, + ErrorResult& aRv) const; + JS::Value UnsafeStoredError() const { return mStoredError; } void SetStoredError(JS::Handle aStoredError) { mStoredError = aStoredError; } diff -Nru firefox-esr-140.9.1esr/dom/streams/ReadableStreamBYOBReader.cpp firefox-esr-140.10.0esr/dom/streams/ReadableStreamBYOBReader.cpp --- firefox-esr-140.9.1esr/dom/streams/ReadableStreamBYOBReader.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/ReadableStreamBYOBReader.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -188,7 +188,11 @@ // Step 4. If stream.[[state]] is "errored", perform readIntoRequest’s error // steps given stream.[[storedError]]. if (stream->State() == ReadableStream::ReaderState::Errored) { - JS::Rooted error(aCx, stream->StoredError()); + JS::Rooted error(aCx); + stream->GetStoredError(aCx, &error, aRv); + if (aRv.Failed()) { + return; + } aReadIntoRequest->ErrorSteps(aCx, error, aRv); return; diff -Nru firefox-esr-140.9.1esr/dom/streams/ReadableStreamDefaultController.cpp firefox-esr-140.10.0esr/dom/streams/ReadableStreamDefaultController.cpp --- firefox-esr-140.9.1esr/dom/streams/ReadableStreamDefaultController.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/ReadableStreamDefaultController.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -616,7 +616,10 @@ if (!mQueue.isEmpty()) { // Step 2.1 JS::Rooted chunk(aCx); - DequeueValue(this, &chunk); + DequeueValue(aCx, this, &chunk, aRv); + if (aRv.Failed()) { + return; + } // Step 2.2 if (CloseRequested() && mQueue.isEmpty()) { diff -Nru firefox-esr-140.9.1esr/dom/streams/ReadableStreamDefaultReader.cpp firefox-esr-140.10.0esr/dom/streams/ReadableStreamDefaultReader.cpp --- firefox-esr-140.9.1esr/dom/streams/ReadableStreamDefaultReader.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/ReadableStreamDefaultReader.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -89,7 +89,8 @@ // Step 5.1 Implicit // Step 5.2 JS::RootingContext* rcx = RootingCx(); - JS::Rooted rootedError(rcx, aStream->StoredError()); + // MaybeReject will wrap the value for us. + JS::Rooted rootedError(rcx, aStream->UnsafeStoredError()); aReader->ClosedPromise()->MaybeReject(rootedError); // Step 5.3 @@ -224,7 +225,11 @@ } case ReadableStream::ReaderState::Errored: { - JS::Rooted storedError(aCx, stream->StoredError()); + JS::Rooted storedError(aCx); + stream->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return; + } aRequest->ErrorSteps(aCx, storedError, aRv); return; } diff -Nru firefox-esr-140.9.1esr/dom/streams/ReadableStreamPipeTo.cpp firefox-esr-140.10.0esr/dom/streams/ReadableStreamPipeTo.cpp --- firefox-esr-140.9.1esr/dom/streams/ReadableStreamPipeTo.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/ReadableStreamPipeTo.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -259,7 +259,8 @@ // Step 1. Errors must be propagated forward: if source.[[state]] is or // becomes "errored", then if (source->State() == ReadableStream::ReaderState::Errored) { - JS::Rooted storedError(aCx, source->StoredError()); + JS::Rooted storedError(aCx); + source->GetStoredError(aCx, &storedError, IgnoredErrorResult()); OnSourceErrored(aCx, storedError); return true; } @@ -267,7 +268,8 @@ // Step 2. Errors must be propagated backward: if dest.[[state]] is or becomes // "errored", then if (dest->State() == WritableStream::WriterState::Errored) { - JS::Rooted storedError(aCx, dest->StoredError()); + JS::Rooted storedError(aCx); + dest->GetStoredError(aCx, &storedError, IgnoredErrorResult()); OnDestErrored(aCx, storedError); return true; } @@ -457,15 +459,20 @@ } void ResolvedCallback(JSContext* aCx, JS::Handle aValue, - ErrorResult&) override { + ErrorResult& aRv) override { // https://streams.spec.whatwg.org/#rs-pipeTo-shutdown-with-action // Step 5. Upon fulfillment of p, finalize, passing along originalError if // it was given. - JS::Rooted> error(aCx); + JS::Rooted> maybeError(aCx); if (mHasError) { - error = Some(mError); + JS::Rooted error(aCx, mError); + if (!JS_WrapValue(aCx, &error)) { + aRv.StealExceptionFromJSContext(aCx); + return; + } + maybeError = Some(error.get()); } - mPipeToPump->Finalize(aCx, error); + mPipeToPump->Finalize(aCx, maybeError); } void RejectedCallback(JSContext* aCx, JS::Handle aReason, diff -Nru firefox-esr-140.9.1esr/dom/streams/ReadableStreamTee.cpp firefox-esr-140.10.0esr/dom/streams/ReadableStreamTee.cpp --- firefox-esr-140.9.1esr/dom/streams/ReadableStreamTee.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/ReadableStreamTee.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -292,13 +292,21 @@ return nullptr; } - JS::Rooted reason1(aCx, mTeeState->Reason1()); + JS::Rooted reason1(aCx); + mTeeState->GetReason1(aCx, &reason1, aRv); + if (aRv.Failed()) { + return nullptr; + } if (!JS_SetElement(aCx, compositeReason, 0, reason1)) { aRv.StealExceptionFromJSContext(aCx); return nullptr; } - JS::Rooted reason2(aCx, mTeeState->Reason2()); + JS::Rooted reason2(aCx); + mTeeState->GetReason2(aCx, &reason2, aRv); + if (aRv.Failed()) { + return nullptr; + } if (!JS_SetElement(aCx, compositeReason, 1, reason2)) { aRv.StealExceptionFromJSContext(aCx); return nullptr; diff -Nru firefox-esr-140.9.1esr/dom/streams/TeeState.cpp firefox-esr-140.10.0esr/dom/streams/TeeState.cpp --- firefox-esr-140.9.1esr/dom/streams/TeeState.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/TeeState.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -36,6 +36,24 @@ "cloneForBranch2 path is not implemented."); } +void TeeState::GetReason1(JSContext* aCx, JS::MutableHandle aReason, + ErrorResult& aRv) const { + aReason.set(mReason1); + if (!JS_WrapValue(aCx, aReason)) { + aReason.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } +} + +void TeeState::GetReason2(JSContext* aCx, JS::MutableHandle aReason, + ErrorResult& aRv) const { + aReason.set(mReason2); + if (!JS_WrapValue(aCx, aReason)) { + aReason.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } +} + already_AddRefed TeeState::Create(ReadableStream* aStream, bool aCloneForBranch2, ErrorResult& aRv) { diff -Nru firefox-esr-140.9.1esr/dom/streams/TeeState.h firefox-esr-140.10.0esr/dom/streams/TeeState.h --- firefox-esr-140.9.1esr/dom/streams/TeeState.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/TeeState.h 2026-04-15 01:59:49.000000000 +0000 @@ -82,10 +82,12 @@ return aBranch == TeeBranch::Branch1 ? Canceled1() : Canceled2(); } - JS::Value Reason1() const { return mReason1; } + void GetReason1(JSContext* aCx, JS::MutableHandle aReason, + ErrorResult& aRv) const; void SetReason1(JS::Handle aReason1) { mReason1 = aReason1; } - JS::Value Reason2() const { return mReason2; } + void GetReason2(JSContext* aCx, JS::MutableHandle aReason, + ErrorResult& aRv) const; void SetReason2(JS::Handle aReason2) { mReason2 = aReason2; } void SetReason(TeeBranch aBranch, JS::Handle aReason) { diff -Nru firefox-esr-140.9.1esr/dom/streams/TransformStream.cpp firefox-esr-140.10.0esr/dom/streams/TransformStream.cpp --- firefox-esr-140.9.1esr/dom/streams/TransformStream.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/TransformStream.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -265,8 +265,12 @@ // Step 3: If state is "erroring", throw // writable.[[storedError]]. if (state == WritableStream::WriterState::Erroring) { - JS::Rooted storedError(aCx, - writable->StoredError()); + JS::Rooted storedError(aCx); + writable->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return nullptr; + } + aRv.MightThrowJSException(); aRv.ThrowJSException(aCx, storedError); return nullptr; @@ -361,8 +365,12 @@ // readable.[[storedError]]. if (aReadable->State() == ReadableStream::ReaderState::Errored) { - JS::Rooted storedError(aCx, - aReadable->StoredError()); + JS::Rooted storedError(aCx); + aReadable->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return nullptr; + } + aRv.MightThrowJSException(); aRv.ThrowJSException(aCx, storedError); return nullptr; @@ -389,8 +397,12 @@ } // Step 5.2.2: Throw readable.[[storedError]]. - JS::Rooted storedError(aCx, - aReadable->StoredError()); + JS::Rooted storedError(aCx); + aReadable->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return nullptr; + } + aRv.MightThrowJSException(); aRv.ThrowJSException(aCx, storedError); return nullptr; diff -Nru firefox-esr-140.9.1esr/dom/streams/TransformStreamDefaultController.cpp firefox-esr-140.10.0esr/dom/streams/TransformStreamDefaultController.cpp --- firefox-esr-140.9.1esr/dom/streams/TransformStreamDefaultController.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/TransformStreamDefaultController.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -125,7 +125,12 @@ TransformStreamErrorWritableAndUnblockWrite(aCx, stream, error, aRv); // Step 5.2: Throw stream.[[readable]].[[storedError]]. - JS::Rooted storedError(aCx, stream->Readable()->StoredError()); + JS::Rooted storedError(aCx); + stream->Readable()->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return; + } + aRv.MightThrowJSException(); aRv.ThrowJSException(aCx, storedError); return; diff -Nru firefox-esr-140.9.1esr/dom/streams/UnderlyingSourceCallbackHelpers.cpp firefox-esr-140.10.0esr/dom/streams/UnderlyingSourceCallbackHelpers.cpp --- firefox-esr-140.9.1esr/dom/streams/UnderlyingSourceCallbackHelpers.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/UnderlyingSourceCallbackHelpers.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -222,10 +222,10 @@ NS_IMETHODIMP InputStreamHolder::OnInputStreamReady( nsIAsyncInputStream* aStream) { mAsyncWaitWorkerRef = nullptr; - mAsyncWaitAlgorithms = nullptr; // We may get called back after ::Shutdown() - if (mCallback) { - return mCallback->OnInputStreamReady(aStream); + if (RefPtr callback = + mAsyncWaitAlgorithms.forget()) { + return callback->OnInputStreamReady(aStream); } return NS_ERROR_FAILURE; } diff -Nru firefox-esr-140.9.1esr/dom/streams/WritableStream.cpp firefox-esr-140.10.0esr/dom/streams/WritableStream.cpp --- firefox-esr-140.9.1esr/dom/streams/WritableStream.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/WritableStream.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -79,6 +79,16 @@ return WritableStream_Binding::Wrap(aCx, this, aGivenProto); } +void WritableStream::GetStoredError(JSContext* aCx, + JS::MutableHandle aStoredError, + ErrorResult& aRv) const { + aStoredError.set(mStoredError); + if (!JS_WrapValue(aCx, aStoredError)) { + aStoredError.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } +} + // https://streams.spec.whatwg.org/#writable-stream-deal-with-rejection void WritableStream::DealWithRejection(JSContext* aCx, JS::Handle aError, @@ -140,6 +150,10 @@ // Step 9. Let abortRequest be stream.[[pendingAbortRequest]]. RefPtr abortPromise = mPendingAbortRequestPromise; JS::Rooted abortReason(aCx, mPendingAbortRequestReason); + if (!JS_WrapValue(aCx, &abortReason)) { + aRv.StealExceptionFromJSContext(aCx); + return; + } bool abortWasAlreadyErroring = mPendingAbortRequestWasAlreadyErroring; // Step 10. Set stream.[[pendingAbortRequest]] to undefined. diff -Nru firefox-esr-140.9.1esr/dom/streams/WritableStream.h firefox-esr-140.10.0esr/dom/streams/WritableStream.h --- firefox-esr-140.9.1esr/dom/streams/WritableStream.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/WritableStream.h 2026-04-15 01:59:49.000000000 +0000 @@ -89,7 +89,9 @@ WriterState State() const { return mState; } void SetState(const WriterState& aState) { mState = aState; } - JS::Value StoredError() const { return mStoredError; } + void GetStoredError(JSContext* aCx, JS::MutableHandle aStoredError, + ErrorResult& aRv) const; + JS::Value UnsafeStoredError() const { return mStoredError; } void SetStoredError(JS::Handle aStoredError) { mStoredError = aStoredError; } diff -Nru firefox-esr-140.9.1esr/dom/streams/WritableStreamDefaultController.cpp firefox-esr-140.10.0esr/dom/streams/WritableStreamDefaultController.cpp --- firefox-esr-140.9.1esr/dom/streams/WritableStreamDefaultController.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/WritableStreamDefaultController.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -256,7 +256,10 @@ // Step 3. Perform ! DequeueValue(controller). JS::Rooted value(aCx); - DequeueValue(aController, &value); + DequeueValue(aCx, aController, &value, aRv); + if (aRv.Failed()) { + return; + } // Step 4. Assert: controller.[[queue]] is empty. MOZ_ASSERT(aController->Queue().isEmpty()); @@ -334,7 +337,10 @@ // Step 4.4. Perform ! DequeueValue(controller). JS::Rooted value(aCx); - DequeueValue(aController, &value); + DequeueValue(aCx, aController, &value, aRv); + if (aRv.Failed()) { + return; + } // Step 4.5. If ! WritableStreamCloseQueuedOrInFlight(stream) is // false and state is "writable", @@ -417,7 +423,10 @@ // Step 8. Let value be ! PeekQueueValue(controller). JS::Rooted value(aCx); - PeekQueueValue(aController, &value); + PeekQueueValue(aCx, aController, &value, aRv); + if (aRv.Failed()) { + return; + } // Step 9. If value is the close sentinel, perform ! // WritableStreamDefaultControllerProcessClose(controller). diff -Nru firefox-esr-140.9.1esr/dom/streams/WritableStreamDefaultWriter.cpp firefox-esr-140.10.0esr/dom/streams/WritableStreamDefaultWriter.cpp --- firefox-esr-140.9.1esr/dom/streams/WritableStreamDefaultWriter.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/streams/WritableStreamDefaultWriter.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -302,7 +302,11 @@ // Step 7. If state is "errored", return a promise rejected with // stream.[[storedError]]. if (state == WritableStream::WriterState::Errored) { - JS::Rooted error(aCx, stream->StoredError()); + JS::Rooted error(aCx); + stream->GetStoredError(aCx, &error, aRv); + if (aRv.Failed()) { + return nullptr; + } return Promise::CreateRejected(aWriter->GetParentObject(), error, aRv); } @@ -318,7 +322,11 @@ // Step 9. If state is "erroring", return a promise rejected with // stream.[[storedError]]. if (state == WritableStream::WriterState::Erroring) { - JS::Rooted error(aCx, stream->StoredError()); + JS::Rooted error(aCx); + stream->GetStoredError(aCx, &error, aRv); + if (aRv.Failed()) { + return nullptr; + } return Promise::CreateRejected(aWriter->GetParentObject(), error, aRv); } @@ -402,7 +410,9 @@ // Step 6.1. Set writer.[[readyPromise]] to a promise rejected with // stream.[[storedError]]. - JS::Rooted storedError(RootingCx(), aStream->StoredError()); + // MaybeReject will wrap the value. + JS::Rooted storedError(RootingCx(), + aStream->UnsafeStoredError()); RefPtr readyPromise = Promise::CreateInfallible(aWriter->GetParentObject()); readyPromise->MaybeReject(storedError); @@ -440,7 +450,9 @@ MOZ_ASSERT(state == WritableStream::WriterState::Errored); // Step 8.2. Step Let storedError be stream.[[storedError]]. - JS::Rooted storedError(RootingCx(), aStream->StoredError()); + // MaybeReject will wrap the value. + JS::Rooted storedError(RootingCx(), + aStream->UnsafeStoredError()); // Step 8.3. Set writer.[[readyPromise]] to a promise rejected with // storedError. @@ -527,7 +539,11 @@ // Step 5. If state is "errored", // return a promise rejected with stream.[[storedError]]. if (state == WritableStream::WriterState::Errored) { - JS::Rooted error(aCx, stream->StoredError()); + JS::Rooted error(aCx); + stream->GetStoredError(aCx, &error, aRv); + if (aRv.Failed()) { + return nullptr; + } return Promise::CreateRejected(aWriter->GetParentObject(), error, aRv); } diff -Nru firefox-esr-140.9.1esr/dom/svg/DOMSVGLength.cpp firefox-esr-140.10.0esr/dom/svg/DOMSVGLength.cpp --- firefox-esr-140.9.1esr/dom/svg/DOMSVGLength.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/DOMSVGLength.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -84,8 +84,8 @@ // cycle collected), so we that don't leave behind a pointer to // free / soon-to-be-free memory. if (nsCOMPtr lengthList = do_QueryInterface(mOwner)) { - MOZ_ASSERT(lengthList->mItems[mListIndex] == this, - "Clearing out the wrong list index...?"); + MOZ_RELEASE_ASSERT(lengthList->mItems[mListIndex] == this, + "Clearing out the wrong list index...?"); lengthList->mItems[mListIndex] = nullptr; } diff -Nru firefox-esr-140.9.1esr/dom/svg/DOMSVGLength.h firefox-esr-140.10.0esr/dom/svg/DOMSVGLength.h --- firefox-esr-140.9.1esr/dom/svg/DOMSVGLength.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/DOMSVGLength.h 2026-04-15 01:59:48.000000000 +0000 @@ -133,7 +133,10 @@ } /// This method is called to notify this object that its list index changed. - void UpdateListIndex(uint32_t aListIndex) { mListIndex = aListIndex; } + void UpdateListIndex(uint32_t aListIndex) { + MOZ_RELEASE_ASSERT(aListIndex <= MaxListIndex()); + mListIndex = aListIndex; + } /** * This method is called to notify this DOM object that it is about to be diff -Nru firefox-esr-140.9.1esr/dom/svg/DOMSVGLengthList.cpp firefox-esr-140.10.0esr/dom/svg/DOMSVGLengthList.cpp --- firefox-esr-140.9.1esr/dom/svg/DOMSVGLengthList.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/DOMSVGLengthList.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -197,9 +197,8 @@ return nullptr; } - index = std::min(index, LengthNoFlush()); - if (index >= DOMSVGLength::MaxListIndex()) { - aRv.ThrowIndexSizeError("Index out of range"); + if (LengthNoFlush() >= DOMSVGLength::MaxListIndex()) { + aRv.ThrowIndexSizeError("List too long"); return nullptr; } @@ -222,6 +221,8 @@ } } + index = std::min(index, LengthNoFlush()); + AutoChangeLengthListNotifier notifier(this); // Now that we know we're inserting, keep animVal list in sync as necessary. MaybeInsertNullInAnimValListAt(index); diff -Nru firefox-esr-140.9.1esr/dom/svg/DOMSVGNumber.h firefox-esr-140.10.0esr/dom/svg/DOMSVGNumber.h --- firefox-esr-140.9.1esr/dom/svg/DOMSVGNumber.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/DOMSVGNumber.h 2026-04-15 01:59:49.000000000 +0000 @@ -109,7 +109,10 @@ } /// This method is called to notify this object that its list index changed. - void UpdateListIndex(uint32_t aListIndex) { mListIndex = aListIndex; } + void UpdateListIndex(uint32_t aListIndex) { + MOZ_RELEASE_ASSERT(aListIndex <= MaxListIndex()); + mListIndex = aListIndex; + } /** * This method is called to notify this DOM object that it is about to be diff -Nru firefox-esr-140.9.1esr/dom/svg/DOMSVGNumberList.cpp firefox-esr-140.10.0esr/dom/svg/DOMSVGNumberList.cpp --- firefox-esr-140.9.1esr/dom/svg/DOMSVGNumberList.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/DOMSVGNumberList.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -185,9 +185,8 @@ return nullptr; } - index = std::min(index, LengthNoFlush()); - if (index >= DOMSVGNumber::MaxListIndex()) { - aRv.ThrowIndexSizeError("Index out of range"); + if (LengthNoFlush() >= DOMSVGNumber::MaxListIndex()) { + aRv.ThrowIndexSizeError("List too long"); return nullptr; } @@ -208,6 +207,8 @@ } } + index = std::min(index, LengthNoFlush()); + AutoChangeNumberListNotifier notifier(this); // Now that we know we're inserting, keep animVal list in sync as necessary. MaybeInsertNullInAnimValListAt(index); diff -Nru firefox-esr-140.9.1esr/dom/svg/DOMSVGPoint.cpp firefox-esr-140.10.0esr/dom/svg/DOMSVGPoint.cpp --- firefox-esr-140.9.1esr/dom/svg/DOMSVGPoint.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/DOMSVGPoint.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -200,8 +200,8 @@ // cycle collected), so we that don't leave behind a pointer to // free / soon-to-be-free memory. if (nsCOMPtr pointList = do_QueryInterface(mOwner)) { - MOZ_ASSERT(pointList->mItems[mListIndex] == this, - "Clearing out the wrong list index...?"); + MOZ_RELEASE_ASSERT(pointList->mItems[mListIndex] == this, + "Clearing out the wrong list index...?"); pointList->mItems[mListIndex] = nullptr; } diff -Nru firefox-esr-140.9.1esr/dom/svg/DOMSVGPoint.h firefox-esr-140.10.0esr/dom/svg/DOMSVGPoint.h --- firefox-esr-140.9.1esr/dom/svg/DOMSVGPoint.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/DOMSVGPoint.h 2026-04-15 01:59:49.000000000 +0000 @@ -118,7 +118,10 @@ } /// This method is called to notify this object that its list index changed. - void UpdateListIndex(uint32_t aListIndex) { mListIndex = aListIndex; } + void UpdateListIndex(uint32_t aListIndex) { + MOZ_RELEASE_ASSERT(aListIndex <= MaxListIndex()); + mListIndex = aListIndex; + } /** * This method is called to notify this DOM object that it is about to be diff -Nru firefox-esr-140.9.1esr/dom/svg/DOMSVGPointList.cpp firefox-esr-140.10.0esr/dom/svg/DOMSVGPointList.cpp --- firefox-esr-140.9.1esr/dom/svg/DOMSVGPointList.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/DOMSVGPointList.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -253,9 +253,8 @@ return nullptr; } - aIndex = std::min(aIndex, LengthNoFlush()); - if (aIndex >= DOMSVGPoint::MaxListIndex()) { - aRv.ThrowIndexSizeError("Index out of range"); + if (LengthNoFlush() >= DOMSVGPoint::MaxListIndex()) { + aRv.ThrowIndexSizeError("List too long"); return nullptr; } @@ -280,6 +279,8 @@ } } + aIndex = std::min(aIndex, LengthNoFlush()); + AutoChangePointListNotifier notifier(this); // Now that we know we're inserting, keep animVal list in sync as necessary. MaybeInsertNullInAnimValListAt(aIndex); diff -Nru firefox-esr-140.9.1esr/dom/svg/DOMSVGTransform.h firefox-esr-140.10.0esr/dom/svg/DOMSVGTransform.h --- firefox-esr-140.9.1esr/dom/svg/DOMSVGTransform.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/DOMSVGTransform.h 2026-04-15 01:59:49.000000000 +0000 @@ -99,7 +99,10 @@ } /// This method is called to notify this object that its list index changed. - void UpdateListIndex(uint32_t aListIndex) { mListIndex = aListIndex; } + void UpdateListIndex(uint32_t aListIndex) { + MOZ_RELEASE_ASSERT(aListIndex <= MaxListIndex()); + mListIndex = aListIndex; + } /** * This method is called to notify this DOM object that it is about to be diff -Nru firefox-esr-140.9.1esr/dom/svg/DOMSVGTransformList.cpp firefox-esr-140.10.0esr/dom/svg/DOMSVGTransformList.cpp --- firefox-esr-140.9.1esr/dom/svg/DOMSVGTransformList.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/DOMSVGTransformList.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -190,9 +190,8 @@ return nullptr; } - index = std::min(index, LengthNoFlush()); - if (index >= DOMSVGTransform::MaxListIndex()) { - error.ThrowIndexSizeError("Index out of range"); + if (LengthNoFlush() >= DOMSVGTransform::MaxListIndex()) { + error.ThrowIndexSizeError("List too long"); return nullptr; } @@ -215,6 +214,8 @@ } } + index = std::min(index, LengthNoFlush()); + AutoChangeTransformListNotifier notifier(this); // Now that we know we're inserting, keep animVal list in sync as necessary. MaybeInsertNullInAnimValListAt(index); diff -Nru firefox-esr-140.9.1esr/dom/svg/SVGFEBlendElement.cpp firefox-esr-140.10.0esr/dom/svg/SVGFEBlendElement.cpp --- firefox-esr-140.9.1esr/dom/svg/SVGFEBlendElement.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/SVGFEBlendElement.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -21,26 +21,26 @@ } SVGEnumMapping SVGFEBlendElement::sModeMap[] = { - {nsGkAtoms::normal, SVG_FEBLEND_MODE_NORMAL}, - {nsGkAtoms::multiply, SVG_FEBLEND_MODE_MULTIPLY}, - {nsGkAtoms::screen, SVG_FEBLEND_MODE_SCREEN}, - {nsGkAtoms::darken, SVG_FEBLEND_MODE_DARKEN}, - {nsGkAtoms::lighten, SVG_FEBLEND_MODE_LIGHTEN}, - {nsGkAtoms::overlay, SVG_FEBLEND_MODE_OVERLAY}, - {nsGkAtoms::colorDodge, SVG_FEBLEND_MODE_COLOR_DODGE}, - {nsGkAtoms::colorBurn, SVG_FEBLEND_MODE_COLOR_BURN}, - {nsGkAtoms::hardLight, SVG_FEBLEND_MODE_HARD_LIGHT}, - {nsGkAtoms::softLight, SVG_FEBLEND_MODE_SOFT_LIGHT}, - {nsGkAtoms::difference, SVG_FEBLEND_MODE_DIFFERENCE}, - {nsGkAtoms::exclusion, SVG_FEBLEND_MODE_EXCLUSION}, - {nsGkAtoms::hue, SVG_FEBLEND_MODE_HUE}, - {nsGkAtoms::saturation, SVG_FEBLEND_MODE_SATURATION}, - {nsGkAtoms::color, SVG_FEBLEND_MODE_COLOR}, - {nsGkAtoms::luminosity, SVG_FEBLEND_MODE_LUMINOSITY}, + {nsGkAtoms::normal, uint8_t(SVGFEBlendMode::Normal)}, + {nsGkAtoms::multiply, uint8_t(SVGFEBlendMode::Multiply)}, + {nsGkAtoms::screen, uint8_t(SVGFEBlendMode::Screen)}, + {nsGkAtoms::darken, uint8_t(SVGFEBlendMode::Darken)}, + {nsGkAtoms::lighten, uint8_t(SVGFEBlendMode::Lighten)}, + {nsGkAtoms::overlay, uint8_t(SVGFEBlendMode::Overlay)}, + {nsGkAtoms::colorDodge, uint8_t(SVGFEBlendMode::ColorDodge)}, + {nsGkAtoms::colorBurn, uint8_t(SVGFEBlendMode::ColorBurn)}, + {nsGkAtoms::hardLight, uint8_t(SVGFEBlendMode::HardLight)}, + {nsGkAtoms::softLight, uint8_t(SVGFEBlendMode::SoftLight)}, + {nsGkAtoms::difference, uint8_t(SVGFEBlendMode::Difference)}, + {nsGkAtoms::exclusion, uint8_t(SVGFEBlendMode::Exclusion)}, + {nsGkAtoms::hue, uint8_t(SVGFEBlendMode::Hue)}, + {nsGkAtoms::saturation, uint8_t(SVGFEBlendMode::Saturation)}, + {nsGkAtoms::color, uint8_t(SVGFEBlendMode::Color)}, + {nsGkAtoms::luminosity, uint8_t(SVGFEBlendMode::Luminosity)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFEBlendElement::sEnumInfo[1] = { - {nsGkAtoms::mode, sModeMap, SVG_FEBLEND_MODE_NORMAL}}; + {nsGkAtoms::mode, sModeMap, uint8_t(SVGFEBlendMode::Normal)}}; SVGElement::StringInfo SVGFEBlendElement::sStringInfo[3] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -71,9 +71,8 @@ SVGFilterInstance* aInstance, const IntRect& aFilterSubregion, const nsTArray& aInputsAreTainted, nsTArray>& aInputImages) { - uint32_t mode = mEnumAttributes[MODE].GetAnimValue(); BlendAttributes attributes; - attributes.mBlendMode = mode; + attributes.mBlendMode = SVGFEBlendMode(mEnumAttributes[MODE].GetAnimValue()); return FilterPrimitiveDescription(AsVariant(std::move(attributes))); } diff -Nru firefox-esr-140.9.1esr/dom/svg/SVGFEColorMatrixElement.cpp firefox-esr-140.10.0esr/dom/svg/SVGFEColorMatrixElement.cpp --- firefox-esr-140.9.1esr/dom/svg/SVGFEColorMatrixElement.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/SVGFEColorMatrixElement.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -25,14 +25,15 @@ } SVGEnumMapping SVGFEColorMatrixElement::sTypeMap[] = { - {nsGkAtoms::matrix, SVG_FECOLORMATRIX_TYPE_MATRIX}, - {nsGkAtoms::saturate, SVG_FECOLORMATRIX_TYPE_SATURATE}, - {nsGkAtoms::hueRotate, SVG_FECOLORMATRIX_TYPE_HUE_ROTATE}, - {nsGkAtoms::luminanceToAlpha, SVG_FECOLORMATRIX_TYPE_LUMINANCE_TO_ALPHA}, + {nsGkAtoms::matrix, uint8_t(SVGFEColorMatrixType::Matrix)}, + {nsGkAtoms::saturate, uint8_t(SVGFEColorMatrixType::Saturate)}, + {nsGkAtoms::hueRotate, uint8_t(SVGFEColorMatrixType::HueRotate)}, + {nsGkAtoms::luminanceToAlpha, + uint8_t(SVGFEColorMatrixType::LuminanceToAlpha)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFEColorMatrixElement::sEnumInfo[1] = { - {nsGkAtoms::type, sTypeMap, SVG_FECOLORMATRIX_TYPE_MATRIX}}; + {nsGkAtoms::type, sTypeMap, uint8_t(SVGFEColorMatrixType::Matrix)}}; SVGElement::StringInfo SVGFEColorMatrixElement::sStringInfo[2] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -70,15 +71,16 @@ SVGFilterInstance* aInstance, const IntRect& aFilterSubregion, const nsTArray& aInputsAreTainted, nsTArray>& aInputImages) { - uint32_t type = mEnumAttributes[TYPE].GetAnimValue(); + SVGFEColorMatrixType type = + SVGFEColorMatrixType(mEnumAttributes[TYPE].GetAnimValue()); const SVGNumberList& values = mNumberListAttributes[VALUES].GetAnimValue(); ColorMatrixAttributes atts; if (!mNumberListAttributes[VALUES].IsExplicitlySet() && - (type == SVG_FECOLORMATRIX_TYPE_MATRIX || - type == SVG_FECOLORMATRIX_TYPE_SATURATE || - type == SVG_FECOLORMATRIX_TYPE_HUE_ROTATE)) { - atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_MATRIX; + (type == SVGFEColorMatrixType::Matrix || + type == SVGFEColorMatrixType::Saturate || + type == SVGFEColorMatrixType::HueRotate)) { + atts.mType = SVGFEColorMatrixType::Matrix; static const auto identityMatrix = std::array{ // clang-format off 1, 0, 0, 0, 0, diff -Nru firefox-esr-140.9.1esr/dom/svg/SVGFEComponentTransferElement.cpp firefox-esr-140.10.0esr/dom/svg/SVGFEComponentTransferElement.cpp --- firefox-esr-140.9.1esr/dom/svg/SVGFEComponentTransferElement.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/SVGFEComponentTransferElement.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -68,7 +68,7 @@ if (childForChannel[i]) { childForChannel[i]->ComputeAttributes(i, atts); } else { - atts.mTypes[i] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + atts.mTypes[i] = SVGFEComponentTransferType::Identity; } } return FilterPrimitiveDescription(AsVariant(std::move(atts))); diff -Nru firefox-esr-140.9.1esr/dom/svg/SVGFECompositeElement.cpp firefox-esr-140.10.0esr/dom/svg/SVGFECompositeElement.cpp --- firefox-esr-140.9.1esr/dom/svg/SVGFECompositeElement.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/SVGFECompositeElement.cpp 2026-04-15 01:59:48.000000000 +0000 @@ -27,17 +27,18 @@ {nsGkAtoms::k4, 0}}; SVGEnumMapping SVGFECompositeElement::sOperatorMap[] = { - {nsGkAtoms::over, SVG_FECOMPOSITE_OPERATOR_OVER}, - {nsGkAtoms::in, SVG_FECOMPOSITE_OPERATOR_IN}, - {nsGkAtoms::out, SVG_FECOMPOSITE_OPERATOR_OUT}, - {nsGkAtoms::atop, SVG_FECOMPOSITE_OPERATOR_ATOP}, - {nsGkAtoms::xor_, SVG_FECOMPOSITE_OPERATOR_XOR}, - {nsGkAtoms::arithmetic, SVG_FECOMPOSITE_OPERATOR_ARITHMETIC}, - {nsGkAtoms::lighter, SVG_FECOMPOSITE_OPERATOR_LIGHTER}, + {nsGkAtoms::over, uint8_t(SVGFECompositeOperator::Over)}, + {nsGkAtoms::in, uint8_t(SVGFECompositeOperator::In)}, + {nsGkAtoms::out, uint8_t(SVGFECompositeOperator::Out)}, + {nsGkAtoms::atop, uint8_t(SVGFECompositeOperator::Atop)}, + {nsGkAtoms::xor_, uint8_t(SVGFECompositeOperator::Xor)}, + {nsGkAtoms::arithmetic, uint8_t(SVGFECompositeOperator::Arithmetic)}, + {nsGkAtoms::lighter, uint8_t(SVGFECompositeOperator::Lighter)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFECompositeElement::sEnumInfo[1] = { - {nsGkAtoms::_operator, sOperatorMap, SVG_FECOMPOSITE_OPERATOR_OVER}}; + {nsGkAtoms::_operator, sOperatorMap, + uint8_t(SVGFECompositeOperator::Over)}}; SVGElement::StringInfo SVGFECompositeElement::sStringInfo[3] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -89,10 +90,10 @@ const nsTArray& aInputsAreTainted, nsTArray>& aInputImages) { CompositeAttributes atts; - uint32_t op = mEnumAttributes[OPERATOR].GetAnimValue(); - atts.mOperator = op; + atts.mOperator = + SVGFECompositeOperator(mEnumAttributes[OPERATOR].GetAnimValue()); - if (op == SVG_FECOMPOSITE_OPERATOR_ARITHMETIC) { + if (atts.mOperator == SVGFECompositeOperator::Arithmetic) { std::array k; GetAnimatedNumberValues(&k[0], &k[1], &k[2], &k[3], nullptr); atts.mCoefficients.AppendElements(Span(k)); diff -Nru firefox-esr-140.9.1esr/dom/svg/SVGFEConvolveMatrixElement.cpp firefox-esr-140.10.0esr/dom/svg/SVGFEConvolveMatrixElement.cpp --- firefox-esr-140.9.1esr/dom/svg/SVGFEConvolveMatrixElement.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/SVGFEConvolveMatrixElement.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -42,13 +42,13 @@ {nsGkAtoms::preserveAlpha, false}}; SVGEnumMapping SVGFEConvolveMatrixElement::sEdgeModeMap[] = { - {nsGkAtoms::duplicate, SVG_EDGEMODE_DUPLICATE}, - {nsGkAtoms::wrap, SVG_EDGEMODE_WRAP}, - {nsGkAtoms::none, SVG_EDGEMODE_NONE}, + {nsGkAtoms::duplicate, uint8_t(SVGEdgeMode::Duplicate)}, + {nsGkAtoms::wrap, uint8_t(SVGEdgeMode::Wrap)}, + {nsGkAtoms::none, uint8_t(SVGEdgeMode::None)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFEConvolveMatrixElement::sEnumInfo[1] = { - {nsGkAtoms::edgeMode, sEdgeModeMap, SVG_EDGEMODE_DUPLICATE}}; + {nsGkAtoms::edgeMode, sEdgeModeMap, uint8_t(SVGEdgeMode::Duplicate)}}; SVGElement::StringInfo SVGFEConvolveMatrixElement::sStringInfo[2] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -174,7 +174,7 @@ if (divisor == 0) divisor = 1; } - uint32_t edgeMode = mEnumAttributes[EDGEMODE].GetAnimValue(); + SVGEdgeMode edgeMode = SVGEdgeMode(mEnumAttributes[EDGEMODE].GetAnimValue()); bool preserveAlpha = mBooleanAttributes[PRESERVEALPHA].GetAnimValue(); float bias = mNumberAttributes[BIAS].GetAnimValue(); diff -Nru firefox-esr-140.9.1esr/dom/svg/SVGFEDisplacementMapElement.cpp firefox-esr-140.10.0esr/dom/svg/SVGFEDisplacementMapElement.cpp --- firefox-esr-140.9.1esr/dom/svg/SVGFEDisplacementMapElement.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/SVGFEDisplacementMapElement.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -26,15 +26,15 @@ }; SVGEnumMapping SVGFEDisplacementMapElement::sChannelMap[] = { - {nsGkAtoms::R, SVG_CHANNEL_R}, - {nsGkAtoms::G, SVG_CHANNEL_G}, - {nsGkAtoms::B, SVG_CHANNEL_B}, - {nsGkAtoms::A, SVG_CHANNEL_A}, + {nsGkAtoms::R, uint8_t(SVGChannel::R)}, + {nsGkAtoms::G, uint8_t(SVGChannel::G)}, + {nsGkAtoms::B, uint8_t(SVGChannel::B)}, + {nsGkAtoms::A, uint8_t(SVGChannel::A)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFEDisplacementMapElement::sEnumInfo[2] = { - {nsGkAtoms::xChannelSelector, sChannelMap, SVG_CHANNEL_A}, - {nsGkAtoms::yChannelSelector, sChannelMap, SVG_CHANNEL_A}}; + {nsGkAtoms::xChannelSelector, sChannelMap, uint8_t(SVGChannel::A)}, + {nsGkAtoms::yChannelSelector, sChannelMap, uint8_t(SVGChannel::A)}}; SVGElement::StringInfo SVGFEDisplacementMapElement::sStringInfo[3] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -84,12 +84,10 @@ float scale = aInstance->GetPrimitiveNumber(SVGContentUtils::XY, &mNumberAttributes[SCALE]); - uint32_t xChannel = mEnumAttributes[CHANNEL_X].GetAnimValue(); - uint32_t yChannel = mEnumAttributes[CHANNEL_Y].GetAnimValue(); DisplacementMapAttributes atts; atts.mScale = scale; - atts.mXChannel = xChannel; - atts.mYChannel = yChannel; + atts.mXChannel = SVGChannel(mEnumAttributes[CHANNEL_X].GetAnimValue()); + atts.mYChannel = SVGChannel(mEnumAttributes[CHANNEL_Y].GetAnimValue()); return FilterPrimitiveDescription(AsVariant(std::move(atts))); } diff -Nru firefox-esr-140.9.1esr/dom/svg/SVGFEMorphologyElement.cpp firefox-esr-140.10.0esr/dom/svg/SVGFEMorphologyElement.cpp --- firefox-esr-140.9.1esr/dom/svg/SVGFEMorphologyElement.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/SVGFEMorphologyElement.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -25,12 +25,13 @@ {nsGkAtoms::radius, 0, 0}}; SVGEnumMapping SVGFEMorphologyElement::sOperatorMap[] = { - {nsGkAtoms::erode, SVG_OPERATOR_ERODE}, - {nsGkAtoms::dilate, SVG_OPERATOR_DILATE}, + {nsGkAtoms::erode, uint8_t(SVGMorphologyOperator::Erode)}, + {nsGkAtoms::dilate, uint8_t(SVGMorphologyOperator::Dilate)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFEMorphologyElement::sEnumInfo[1] = { - {nsGkAtoms::_operator, sOperatorMap, SVG_OPERATOR_ERODE}}; + {nsGkAtoms::_operator, sOperatorMap, + uint8_t(SVGMorphologyOperator::Erode)}}; SVGElement::StringInfo SVGFEMorphologyElement::sStringInfo[2] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -97,7 +98,8 @@ GetRXY(&rx, &ry, *aInstance); MorphologyAttributes atts; atts.mRadii = Size(rx, ry); - atts.mOperator = (uint32_t)mEnumAttributes[OPERATOR].GetAnimValue(); + atts.mOperator = + SVGMorphologyOperator(mEnumAttributes[OPERATOR].GetAnimValue()); return FilterPrimitiveDescription(AsVariant(std::move(atts))); } diff -Nru firefox-esr-140.9.1esr/dom/svg/SVGFETurbulenceElement.cpp firefox-esr-140.10.0esr/dom/svg/SVGFETurbulenceElement.cpp --- firefox-esr-140.9.1esr/dom/svg/SVGFETurbulenceElement.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/SVGFETurbulenceElement.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -37,8 +37,8 @@ {nsGkAtoms::numOctaves, 1}}; SVGEnumMapping SVGFETurbulenceElement::sTypeMap[] = { - {nsGkAtoms::fractalNoise, SVG_TURBULENCE_TYPE_FRACTALNOISE}, - {nsGkAtoms::turbulence, SVG_TURBULENCE_TYPE_TURBULENCE}, + {nsGkAtoms::fractalNoise, uint8_t(SVGTurbulenceType::FractalNoise)}, + {nsGkAtoms::turbulence, uint8_t(SVGTurbulenceType::Turbulence)}, {nullptr, 0}}; SVGEnumMapping SVGFETurbulenceElement::sStitchTilesMap[] = { @@ -47,7 +47,7 @@ {nullptr, 0}}; SVGElement::EnumInfo SVGFETurbulenceElement::sEnumInfo[2] = { - {nsGkAtoms::type, sTypeMap, SVG_TURBULENCE_TYPE_TURBULENCE}, + {nsGkAtoms::type, sTypeMap, uint8_t(SVGTurbulenceType::Turbulence)}, {nsGkAtoms::stitchTiles, sStitchTilesMap, SVG_STITCHTYPE_NOSTITCH}}; SVGElement::StringInfo SVGFETurbulenceElement::sStringInfo[1] = { @@ -100,13 +100,14 @@ float seed = mNumberAttributes[OCTAVES].GetAnimValue(); uint32_t octaves = std::clamp(mIntegerAttributes[OCTAVES].GetAnimValue(), 0, MAX_OCTAVES); - uint32_t type = mEnumAttributes[TYPE].GetAnimValue(); + SVGTurbulenceType type = + SVGTurbulenceType(mEnumAttributes[TYPE].GetAnimValue()); uint16_t stitch = mEnumAttributes[STITCHTILES].GetAnimValue(); if (fX == 0 && fY == 0) { // A base frequency of zero results in transparent black for // type="turbulence" and in 50% alpha 50% gray for type="fractalNoise". - if (type == SVG_TURBULENCE_TYPE_TURBULENCE) { + if (type == SVGTurbulenceType::Turbulence) { return FilterPrimitiveDescription(); } FloodAttributes atts; diff -Nru firefox-esr-140.9.1esr/dom/svg/SVGFilters.cpp firefox-esr-140.10.0esr/dom/svg/SVGFilters.cpp --- firefox-esr-140.9.1esr/dom/svg/SVGFilters.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/svg/SVGFilters.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -146,15 +146,15 @@ {nsGkAtoms::offset, 0}}; SVGEnumMapping SVGComponentTransferFunctionElement::sTypeMap[] = { - {nsGkAtoms::identity, SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY}, - {nsGkAtoms::table, SVG_FECOMPONENTTRANSFER_TYPE_TABLE}, - {nsGkAtoms::discrete, SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE}, - {nsGkAtoms::linear, SVG_FECOMPONENTTRANSFER_TYPE_LINEAR}, - {nsGkAtoms::gamma, SVG_FECOMPONENTTRANSFER_TYPE_GAMMA}, + {nsGkAtoms::identity, uint8_t(SVGFEComponentTransferType::Identity)}, + {nsGkAtoms::table, uint8_t(SVGFEComponentTransferType::Table)}, + {nsGkAtoms::discrete, uint8_t(SVGFEComponentTransferType::Discrete)}, + {nsGkAtoms::linear, uint8_t(SVGFEComponentTransferType::Linear)}, + {nsGkAtoms::gamma, uint8_t(SVGFEComponentTransferType::Gamma)}, {nullptr, 0}}; SVGElement::EnumInfo SVGComponentTransferFunctionElement::sEnumInfo[1] = { - {nsGkAtoms::type, sTypeMap, SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY}}; + {nsGkAtoms::type, sTypeMap, uint8_t(SVGFEComponentTransferType::Identity)}}; //---------------------------------------------------------------------- // nsSVGFilterPrimitiveChildElement methods @@ -210,7 +210,8 @@ void SVGComponentTransferFunctionElement::ComputeAttributes( int32_t aChannel, ComponentTransferAttributes& aAttributes) { - uint32_t type = mEnumAttributes[TYPE].GetAnimValue(); + SVGFEComponentTransferType type = + SVGFEComponentTransferType(mEnumAttributes[TYPE].GetAnimValue()); float slope, intercept, amplitude, exponent, offset; GetAnimatedNumberValues(&slope, &intercept, &litude, &exponent, &offset, @@ -219,16 +220,16 @@ const SVGNumberList& tableValues = mNumberListAttributes[TABLEVALUES].GetAnimValue(); - aAttributes.mTypes[aChannel] = (uint8_t)type; + aAttributes.mTypes[aChannel] = type; switch (type) { - case SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: { + case SVGFEComponentTransferType::Linear: { aAttributes.mValues[aChannel].SetLength(2); aAttributes.mValues[aChannel][kComponentTransferSlopeIndex] = slope; aAttributes.mValues[aChannel][kComponentTransferInterceptIndex] = intercept; break; } - case SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: { + case SVGFEComponentTransferType::Gamma: { aAttributes.mValues[aChannel].SetLength(3); aAttributes.mValues[aChannel][kComponentTransferAmplitudeIndex] = amplitude; @@ -236,14 +237,16 @@ aAttributes.mValues[aChannel][kComponentTransferOffsetIndex] = offset; break; } - case SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: - case SVG_FECOMPONENTTRANSFER_TYPE_TABLE: { + case SVGFEComponentTransferType::Discrete: + case SVGFEComponentTransferType::Table: { if (!tableValues.IsEmpty()) { aAttributes.mValues[aChannel].AppendElements(&tableValues[0], tableValues.Length()); } break; } + default: + break; } } diff -Nru firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorAssertionResponse.cpp firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorAssertionResponse.cpp --- firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorAssertionResponse.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorAssertionResponse.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -14,17 +14,11 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(AuthenticatorAssertionResponse) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(AuthenticatorAssertionResponse, AuthenticatorResponse) - tmp->mAuthenticatorDataCachedObj = nullptr; - tmp->mSignatureCachedObj = nullptr; - tmp->mUserHandleCachedObj = nullptr; NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(AuthenticatorAssertionResponse, AuthenticatorResponse) NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mAuthenticatorDataCachedObj) - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mSignatureCachedObj) - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mUserHandleCachedObj) NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED( @@ -39,16 +33,7 @@ AuthenticatorAssertionResponse::AuthenticatorAssertionResponse( nsPIDOMWindowInner* aParent) - : AuthenticatorResponse(aParent), - mAuthenticatorDataCachedObj(nullptr), - mSignatureCachedObj(nullptr), - mUserHandleCachedObj(nullptr) { - mozilla::HoldJSObjects(this); -} - -AuthenticatorAssertionResponse::~AuthenticatorAssertionResponse() { - mozilla::DropJSObjects(this); -} + : AuthenticatorResponse(aParent) {} JSObject* AuthenticatorAssertionResponse::WrapObject( JSContext* aCx, JS::Handle aGivenProto) { @@ -57,14 +42,7 @@ void AuthenticatorAssertionResponse::GetAuthenticatorData( JSContext* aCx, JS::MutableHandle aValue, ErrorResult& aRv) { - if (!mAuthenticatorDataCachedObj) { - mAuthenticatorDataCachedObj = - ArrayBuffer::Create(aCx, mAuthenticatorData, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mAuthenticatorDataCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mAuthenticatorData, aRv)); } void AuthenticatorAssertionResponse::SetAuthenticatorData( @@ -74,13 +52,7 @@ void AuthenticatorAssertionResponse::GetSignature( JSContext* aCx, JS::MutableHandle aValue, ErrorResult& aRv) { - if (!mSignatureCachedObj) { - mSignatureCachedObj = ArrayBuffer::Create(aCx, mSignature, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mSignatureCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mSignature, aRv)); } void AuthenticatorAssertionResponse::SetSignature( @@ -96,13 +68,7 @@ if (mUserHandle.IsEmpty()) { aValue.set(nullptr); } else { - if (!mUserHandleCachedObj) { - mUserHandleCachedObj = ArrayBuffer::Create(aCx, mUserHandle, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mUserHandleCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mUserHandle, aRv)); } } diff -Nru firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorAssertionResponse.h firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorAssertionResponse.h --- firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorAssertionResponse.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorAssertionResponse.h 2026-04-15 01:59:49.000000000 +0000 @@ -26,7 +26,7 @@ explicit AuthenticatorAssertionResponse(nsPIDOMWindowInner* aParent); protected: - ~AuthenticatorAssertionResponse() override; + ~AuthenticatorAssertionResponse() override = default; public: virtual JSObject* WrapObject(JSContext* aCx, @@ -51,11 +51,8 @@ private: nsTArray mAuthenticatorData; - JS::Heap mAuthenticatorDataCachedObj; nsTArray mSignature; - JS::Heap mSignatureCachedObj; nsTArray mUserHandle; - JS::Heap mUserHandleCachedObj; }; } // namespace mozilla::dom diff -Nru firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorAttestationResponse.cpp firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorAttestationResponse.cpp --- firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorAttestationResponse.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorAttestationResponse.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -6,7 +6,6 @@ #include "AuthrsBridge_ffi.h" #include "mozilla/Base64.h" -#include "mozilla/HoldDropJSObjects.h" #include "mozilla/dom/AuthenticatorAttestationResponse.h" #include "mozilla/dom/WebAuthenticationBinding.h" @@ -15,13 +14,11 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(AuthenticatorAttestationResponse) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED( AuthenticatorAttestationResponse, AuthenticatorResponse) - tmp->mAttestationObjectCachedObj = nullptr; NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(AuthenticatorAttestationResponse, AuthenticatorResponse) NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mAttestationObjectCachedObj) NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED( @@ -38,13 +35,7 @@ AuthenticatorAttestationResponse::AuthenticatorAttestationResponse( nsPIDOMWindowInner* aParent) - : AuthenticatorResponse(aParent), mAttestationObjectCachedObj(nullptr) { - mozilla::HoldJSObjects(this); -} - -AuthenticatorAttestationResponse::~AuthenticatorAttestationResponse() { - mozilla::DropJSObjects(this); -} + : AuthenticatorResponse(aParent) {} JSObject* AuthenticatorAttestationResponse::WrapObject( JSContext* aCx, JS::Handle aGivenProto) { @@ -53,14 +44,7 @@ void AuthenticatorAttestationResponse::GetAttestationObject( JSContext* aCx, JS::MutableHandle aValue, ErrorResult& aRv) { - if (!mAttestationObjectCachedObj) { - mAttestationObjectCachedObj = - ArrayBuffer::Create(aCx, mAttestationObject, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mAttestationObjectCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mAttestationObject, aRv)); } void AuthenticatorAttestationResponse::SetAttestationObject( diff -Nru firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorAttestationResponse.h firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorAttestationResponse.h --- firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorAttestationResponse.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorAttestationResponse.h 2026-04-15 01:59:50.000000000 +0000 @@ -27,7 +27,7 @@ explicit AuthenticatorAttestationResponse(nsPIDOMWindowInner* aParent); protected: - ~AuthenticatorAttestationResponse() override; + ~AuthenticatorAttestationResponse() override = default; public: virtual JSObject* WrapObject(JSContext* aCx, @@ -58,7 +58,6 @@ nsTArray mAttestationObject; nsCOMPtr mAttestationObjectParsed; - JS::Heap mAttestationObjectCachedObj; nsTArray mTransports; }; diff -Nru firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorResponse.cpp firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorResponse.cpp --- firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorResponse.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorResponse.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -12,8 +12,7 @@ namespace mozilla::dom { -NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_WITH_JS_MEMBERS( - AuthenticatorResponse, (mParent), (mClientDataJSONCachedObj)) +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(AuthenticatorResponse, mParent) NS_IMPL_CYCLE_COLLECTING_ADDREF(AuthenticatorResponse) NS_IMPL_CYCLE_COLLECTING_RELEASE(AuthenticatorResponse) @@ -24,25 +23,15 @@ NS_INTERFACE_MAP_END AuthenticatorResponse::AuthenticatorResponse(nsPIDOMWindowInner* aParent) - : mParent(aParent), mClientDataJSONCachedObj(nullptr) { - // Call HoldJSObjects() in subclasses. -} + : mParent(aParent) {} -AuthenticatorResponse::~AuthenticatorResponse() { - // Call DropJSObjects() in subclasses. -} +AuthenticatorResponse::~AuthenticatorResponse() = default; nsISupports* AuthenticatorResponse::GetParentObject() const { return mParent; } void AuthenticatorResponse::GetClientDataJSON( JSContext* aCx, JS::MutableHandle aValue, ErrorResult& aRv) { - if (!mClientDataJSONCachedObj) { - mClientDataJSONCachedObj = ArrayBuffer::Create(aCx, mClientDataJSON, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mClientDataJSONCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mClientDataJSON, aRv)); } void AuthenticatorResponse::SetClientDataJSON(const nsCString& aBuffer) { diff -Nru firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorResponse.h firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorResponse.h --- firefox-esr-140.9.1esr/dom/webauthn/AuthenticatorResponse.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/AuthenticatorResponse.h 2026-04-15 01:59:49.000000000 +0000 @@ -21,7 +21,7 @@ class AuthenticatorResponse : public nsISupports, public nsWrapperCache { public: NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(AuthenticatorResponse) + NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(AuthenticatorResponse) explicit AuthenticatorResponse(nsPIDOMWindowInner* aParent); @@ -43,7 +43,6 @@ private: nsCOMPtr mParent; - JS::Heap mClientDataJSONCachedObj; }; } // namespace mozilla::dom diff -Nru firefox-esr-140.9.1esr/dom/webauthn/MacOSWebAuthnService.mm firefox-esr-140.10.0esr/dom/webauthn/MacOSWebAuthnService.mm --- firefox-esr-140.9.1esr/dom/webauthn/MacOSWebAuthnService.mm 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/MacOSWebAuthnService.mm 2026-04-15 01:59:49.000000000 +0000 @@ -319,8 +319,9 @@ } uint32_t count = prfEvalByCredIds.Length(); - NSData* keys[count]; - ASAuthorizationPublicKeyCredentialPRFAssertionInputValues* objects[count]; + NSMutableArray* keys = [NSMutableArray arrayWithCapacity:count]; + NSMutableArray* + objects = [NSMutableArray arrayWithCapacity:count]; for (size_t i = 0; i < count; i++) { NSData* saltInput1 = [NSData dataWithBytes:prfEvalByCredFirsts[i].Elements() length:prfEvalByCredFirsts[i].Length()]; @@ -329,15 +330,15 @@ saltInput2 = [NSData dataWithBytes:prfEvalByCredSeconds[i].Elements() length:prfEvalByCredSeconds[i].Length()]; } - keys[i] = [NSData dataWithBytes:prfEvalByCredIds[i].Elements() - length:prfEvalByCredIds[i].Length()]; - objects[i] = - [[ASAuthorizationPublicKeyCredentialPRFAssertionInputValues alloc] - initWithSaltInput1:saltInput1 - saltInput2:saltInput2]; + [keys addObject:[NSData dataWithBytes:prfEvalByCredIds[i].Elements() + length:prfEvalByCredIds[i].Length()]]; + [objects + addObject:[[ASAuthorizationPublicKeyCredentialPRFAssertionInputValues + alloc] initWithSaltInput1:saltInput1 + saltInput2:saltInput2]]; } - return [NSDictionary dictionaryWithObjects:objects forKeys:keys count:count]; + return [NSDictionary dictionaryWithObjects:objects forKeys:keys]; } @implementation MacOSAuthenticatorRequestDelegate { diff -Nru firefox-esr-140.9.1esr/dom/webauthn/PublicKeyCredential.cpp firefox-esr-140.10.0esr/dom/webauthn/PublicKeyCredential.cpp --- firefox-esr-140.9.1esr/dom/webauthn/PublicKeyCredential.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/PublicKeyCredential.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mozilla/Base64.h" -#include "mozilla/HoldDropJSObjects.h" #include "mozilla/Preferences.h" #include "mozilla/StaticPrefs_security.h" #include "mozilla/dom/AuthenticatorResponse.h" @@ -28,12 +27,12 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(PublicKeyCredential) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PublicKeyCredential, Credential) - tmp->mRawIdCachedObj = nullptr; + NS_IMPL_CYCLE_COLLECTION_UNLINK(mAttestationResponse) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mAssertionResponse) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(PublicKeyCredential, Credential) NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mRawIdCachedObj) NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(PublicKeyCredential, @@ -49,11 +48,7 @@ NS_INTERFACE_MAP_END_INHERITING(Credential) PublicKeyCredential::PublicKeyCredential(nsPIDOMWindowInner* aParent) - : Credential(aParent), mRawIdCachedObj(nullptr) { - mozilla::HoldJSObjects(this); -} - -PublicKeyCredential::~PublicKeyCredential() { mozilla::DropJSObjects(this); } + : Credential(aParent) {} JSObject* PublicKeyCredential::WrapObject(JSContext* aCx, JS::Handle aGivenProto) { @@ -63,13 +58,7 @@ void PublicKeyCredential::GetRawId(JSContext* aCx, JS::MutableHandle aValue, ErrorResult& aRv) { - if (!mRawIdCachedObj) { - mRawIdCachedObj = ArrayBuffer::Create(aCx, mRawId, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mRawIdCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mRawId, aRv)); } void PublicKeyCredential::GetAuthenticatorAttachment( diff -Nru firefox-esr-140.9.1esr/dom/webauthn/PublicKeyCredential.h firefox-esr-140.10.0esr/dom/webauthn/PublicKeyCredential.h --- firefox-esr-140.9.1esr/dom/webauthn/PublicKeyCredential.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/PublicKeyCredential.h 2026-04-15 01:59:49.000000000 +0000 @@ -27,7 +27,7 @@ explicit PublicKeyCredential(nsPIDOMWindowInner* aParent); protected: - ~PublicKeyCredential() override; + ~PublicKeyCredential() override = default; public: virtual JSObject* WrapObject(JSContext* aCx, @@ -97,7 +97,6 @@ private: nsTArray mRawId; - JS::Heap mRawIdCachedObj; Maybe mAuthenticatorAttachment; RefPtr mAttestationResponse; RefPtr mAssertionResponse; diff -Nru firefox-esr-140.9.1esr/dom/webauthn/WebAuthnHandler.cpp firefox-esr-140.10.0esr/dom/webauthn/WebAuthnHandler.cpp --- firefox-esr-140.9.1esr/dom/webauthn/WebAuthnHandler.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/WebAuthnHandler.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -430,8 +430,6 @@ return promise.forget(); } -const size_t MAX_ALLOWED_CREDENTIALS = 20; - already_AddRefed WebAuthnHandler::GetAssertion( const PublicKeyCredentialRequestOptions& aOptions, const bool aConditionallyMediated, @@ -494,7 +492,7 @@ } // Abort the request if the allowCredentials set is too large - if (aOptions.mAllowCredentials.Length() > MAX_ALLOWED_CREDENTIALS) { + if (aOptions.mAllowCredentials.Length() > kWebAuthnMaxAllowedCredentials) { promise->MaybeReject(NS_ERROR_DOM_SECURITY_ERR); return promise.forget(); } diff -Nru firefox-esr-140.9.1esr/dom/webauthn/WebAuthnTransactionParent.cpp firefox-esr-140.10.0esr/dom/webauthn/WebAuthnTransactionParent.cpp --- firefox-esr-140.9.1esr/dom/webauthn/WebAuthnTransactionParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/WebAuthnTransactionParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -386,6 +386,16 @@ return IPC_OK(); } + for (const WebAuthnExtension& ext : aTransactionInfo.Extensions()) { + if (ext.type() == WebAuthnExtension::TWebAuthnExtensionPrf) { + if (ext.get_WebAuthnExtensionPrf().evalByCredential().Length() > + kWebAuthnMaxAllowedCredentials) { + aResolver(NS_ERROR_DOM_NOT_ALLOWED_ERR); + return IPC_OK(); + } + } + } + nsCString clientDataJSON; rv = AssembleClientData(manager, "webauthn.get"_ns, aTransactionInfo.Challenge(), clientDataJSON); diff -Nru firefox-esr-140.9.1esr/dom/webauthn/WebAuthnUtil.h firefox-esr-140.10.0esr/dom/webauthn/WebAuthnUtil.h --- firefox-esr-140.9.1esr/dom/webauthn/WebAuthnUtil.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webauthn/WebAuthnUtil.h 2026-04-15 01:59:49.000000000 +0000 @@ -12,6 +12,8 @@ namespace mozilla::dom { +static const size_t kWebAuthnMaxAllowedCredentials = 20; + bool IsValidAppId(const nsCOMPtr& aPrincipal, const nsCString& aAppId); diff -Nru firefox-esr-140.9.1esr/dom/webbrowserpersist/WebBrowserPersistSerializeParent.cpp firefox-esr-140.10.0esr/dom/webbrowserpersist/WebBrowserPersistSerializeParent.cpp --- firefox-esr-140.9.1esr/dom/webbrowserpersist/WebBrowserPersistSerializeParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webbrowserpersist/WebBrowserPersistSerializeParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -51,11 +51,14 @@ mozilla::ipc::IPCResult WebBrowserPersistSerializeParent::Recv__delete__( const nsACString& aContentType, const nsresult& aStatus) { + nsCOMPtr finish = std::move(mFinish); + if (!finish) { + return IPC_FAIL(this, "missing finish callback"); + } if (NS_SUCCEEDED(mOutputError)) { mOutputError = aStatus; } - mFinish->OnFinish(mDocument, mStream, aContentType, mOutputError); - mFinish = nullptr; + finish->OnFinish(mDocument, mStream, aContentType, mOutputError); return IPC_OK(); } diff -Nru firefox-esr-140.9.1esr/dom/webidl/WebAuthentication.webidl firefox-esr-140.10.0esr/dom/webidl/WebAuthentication.webidl --- firefox-esr-140.9.1esr/dom/webidl/WebAuthentication.webidl 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webidl/WebAuthentication.webidl 2026-04-15 01:59:50.000000000 +0000 @@ -12,9 +12,9 @@ [SecureContext, Pref="security.webauth.webauthn", Exposed=Window] interface PublicKeyCredential : Credential { - [SameObject, Throws] readonly attribute ArrayBuffer rawId; - [SameObject] readonly attribute AuthenticatorResponse response; - readonly attribute DOMString? authenticatorAttachment; + [SameObject, Throws, Cached] readonly attribute ArrayBuffer rawId; + [SameObject] readonly attribute AuthenticatorResponse response; + readonly attribute DOMString? authenticatorAttachment; AuthenticationExtensionsClientOutputs getClientExtensionResults(); [NewObject] static Promise isConditionalMediationAvailable(); [Throws, Pref="security.webauthn.enable_json_serialization_methods"] object toJSON(); @@ -140,25 +140,25 @@ [SecureContext, Pref="security.webauth.webauthn", Exposed=Window] interface AuthenticatorResponse { - [SameObject, Throws] readonly attribute ArrayBuffer clientDataJSON; + [SameObject, Throws, Cached] readonly attribute ArrayBuffer clientDataJSON; }; [SecureContext, Pref="security.webauth.webauthn", Exposed=Window] interface AuthenticatorAttestationResponse : AuthenticatorResponse { - [SameObject, Throws] readonly attribute ArrayBuffer attestationObject; - sequence getTransports(); - [Throws] ArrayBuffer getAuthenticatorData(); - [Throws] ArrayBuffer? getPublicKey(); - [Throws] COSEAlgorithmIdentifier getPublicKeyAlgorithm(); + [SameObject, Throws, Cached] readonly attribute ArrayBuffer attestationObject; + sequence getTransports(); + [Throws] ArrayBuffer getAuthenticatorData(); + [Throws] ArrayBuffer? getPublicKey(); + [Throws] COSEAlgorithmIdentifier getPublicKeyAlgorithm(); }; [SecureContext, Pref="security.webauth.webauthn", Exposed=Window] interface AuthenticatorAssertionResponse : AuthenticatorResponse { - [SameObject, Throws] readonly attribute ArrayBuffer authenticatorData; - [SameObject, Throws] readonly attribute ArrayBuffer signature; - [SameObject, Throws] readonly attribute ArrayBuffer? userHandle; + [SameObject, Throws, Cached] readonly attribute ArrayBuffer authenticatorData; + [SameObject, Throws, Cached] readonly attribute ArrayBuffer signature; + [SameObject, Throws, Cached] readonly attribute ArrayBuffer? userHandle; }; dictionary PublicKeyCredentialParameters { diff -Nru firefox-esr-140.9.1esr/dom/webtransport/parent/WebTransportParent.cpp firefox-esr-140.10.0esr/dom/webtransport/parent/WebTransportParent.cpp --- firefox-esr-140.9.1esr/dom/webtransport/parent/WebTransportParent.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/webtransport/parent/WebTransportParent.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -166,6 +166,9 @@ const nsACString& aReason) { LOG(("Close for %p received, code = %u, reason = %s", this, aCode, PromiseFlatCString(aReason).get())); + if (!mSessionReady) { + return IPC_FAIL(this, "Close received before session was ready"); + } { MutexAutoLock lock(mMutex); MOZ_ASSERT(!mClosed); diff -Nru firefox-esr-140.9.1esr/dom/workers/MessageEventRunnable.cpp firefox-esr-140.10.0esr/dom/workers/MessageEventRunnable.cpp --- firefox-esr-140.9.1esr/dom/workers/MessageEventRunnable.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/workers/MessageEventRunnable.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -19,10 +19,9 @@ StructuredCloneHolder(CloningSupported, TransferringSupported, StructuredCloneScope::SameProcess) {} -bool MessageEventRunnable::DispatchDOMEvent(JSContext* aCx, - WorkerPrivate* aWorkerPrivate, - DOMEventTargetHelper* aTarget, - bool aIsMainThread) { +bool MessageEventRunnable::DispatchDOMEvent( + JSContext* aCx, WorkerPrivate* aWorkerPrivate, + RefPtr aTarget, bool aIsMainThread) { nsCOMPtr parent = aTarget->GetParentObject(); // For some workers without window, parent is null and we try to find it @@ -117,7 +116,7 @@ bool MessageEventToParentRunnable::DispatchDOMEvent( JSContext* aCx, WorkerPrivate* aWorkerPrivate, - DOMEventTargetHelper* aTarget, bool aIsMainThread) { + RefPtr aTarget, bool aIsMainThread) { nsCOMPtr parent = aTarget->GetParentObject(); // For some workers without window, parent is null and we try to find it diff -Nru firefox-esr-140.9.1esr/dom/workers/MessageEventRunnable.h firefox-esr-140.10.0esr/dom/workers/MessageEventRunnable.h --- firefox-esr-140.9.1esr/dom/workers/MessageEventRunnable.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/workers/MessageEventRunnable.h 2026-04-15 01:59:49.000000000 +0000 @@ -23,7 +23,8 @@ explicit MessageEventRunnable(WorkerPrivate* aWorkerPrivate); bool DispatchDOMEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate, - DOMEventTargetHelper* aTarget, bool aIsMainThread); + RefPtr aTarget, + bool aIsMainThread); private: bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override; @@ -37,7 +38,8 @@ explicit MessageEventToParentRunnable(WorkerPrivate* aWorkerPrivate); bool DispatchDOMEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate, - DOMEventTargetHelper* aTarget, bool aIsMainThread); + RefPtr aTarget, + bool aIsMainThread); private: bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override; diff -Nru firefox-esr-140.9.1esr/dom/workers/RuntimeService.cpp firefox-esr-140.10.0esr/dom/workers/RuntimeService.cpp --- firefox-esr-140.9.1esr/dom/workers/RuntimeService.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/workers/RuntimeService.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -1258,6 +1258,8 @@ } } else { if (!mNavigatorPropertiesLoaded) { + MutexAutoLock lock(mMutex); + if (NS_FAILED(Navigator::GetAppVersion( mNavigatorProperties.mAppVersion, aWorkerPrivate.GetDocument(), false /* aUsePrefOverriddenValue */)) || @@ -1692,6 +1694,11 @@ void RuntimeService::Cleanup() { AssertIsOnMainThread(); + if (mCleanedUp) { + return; + } + mCleanedUp = true; + if (!mShuttingDown) { Shutdown(); } @@ -1786,9 +1793,9 @@ obs->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID); mObserved = false; } - } - nsLayoutStatics::Release(); + nsLayoutStatics::Release(); + } } void RuntimeService::AddAllTopLevelWorkersToArray( @@ -1923,11 +1930,13 @@ void RuntimeService::UpdateAppVersionOverridePreference( const nsAString& aValue) { AssertIsOnMainThread(); + MutexAutoLock lock(mMutex); mNavigatorProperties.mAppVersionOverridden = aValue; } void RuntimeService::UpdatePlatformOverridePreference(const nsAString& aValue) { AssertIsOnMainThread(); + MutexAutoLock lock(mMutex); mNavigatorProperties.mPlatformOverridden = aValue; } @@ -1935,7 +1944,10 @@ const nsTArray& aLanguages) { MOZ_ASSERT(NS_IsMainThread()); - mNavigatorProperties.mLanguages = aLanguages.Clone(); + { + MutexAutoLock lock(mMutex); + mNavigatorProperties.mLanguages = aLanguages.Clone(); + } BroadcastAllWorkers( [&aLanguages](auto& worker) { worker.UpdateLanguages(aLanguages); }); } diff -Nru firefox-esr-140.9.1esr/dom/workers/RuntimeService.h firefox-esr-140.10.0esr/dom/workers/RuntimeService.h --- firefox-esr-140.9.1esr/dom/workers/RuntimeService.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/workers/RuntimeService.h 2026-04-15 01:59:50.000000000 +0000 @@ -54,7 +54,7 @@ } }; - mozilla::Mutex mMutex; + mutable mozilla::Mutex mMutex; // Protected by mMutex. nsClassHashtable mDomainMap @@ -77,12 +77,13 @@ }; private: - NavigatorProperties mNavigatorProperties; + NavigatorProperties mNavigatorProperties MOZ_GUARDED_BY(mMutex); // True when the observer service holds a reference to this object. bool mObserved; bool mShuttingDown; bool mNavigatorPropertiesLoaded; + bool mCleanedUp{false}; public: NS_DECL_ISUPPORTS @@ -112,7 +113,8 @@ void PropagateStorageAccessPermissionGranted( const nsPIDOMWindowInner& aWindow); - const NavigatorProperties& GetNavigatorProperties() const { + NavigatorProperties GetNavigatorProperties() const { + MutexAutoLock lock(mMutex); return mNavigatorProperties; } diff -Nru firefox-esr-140.9.1esr/dom/workers/WorkerError.cpp firefox-esr-140.10.0esr/dom/workers/WorkerError.cpp --- firefox-esr-140.9.1esr/dom/workers/WorkerError.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/workers/WorkerError.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -242,7 +242,7 @@ /* static */ void WorkerErrorReport::ReportError( JSContext* aCx, WorkerPrivate* aWorkerPrivate, bool aFireAtScope, - DOMEventTargetHelper* aTarget, UniquePtr aReport, + RefPtr aTarget, UniquePtr aReport, uint64_t aInnerWindowId, JS::Handle aException) { if (aWorkerPrivate) { aWorkerPrivate->AssertIsOnWorkerThread(); @@ -324,7 +324,7 @@ MOZ_ASSERT(globalScope->GetWrapperPreserveColor() == global); RefPtr event = ErrorEvent::Constructor( - aTarget ? aTarget : globalScope, u"error"_ns, init); + aTarget ? aTarget.get() : globalScope, u"error"_ns, init); event->SetTrusted(true); if (NS_FAILED(EventDispatcher::DispatchDOMEvent( diff -Nru firefox-esr-140.9.1esr/dom/workers/WorkerError.h firefox-esr-140.10.0esr/dom/workers/WorkerError.h --- firefox-esr-140.9.1esr/dom/workers/WorkerError.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/workers/WorkerError.h 2026-04-15 01:59:50.000000000 +0000 @@ -57,8 +57,8 @@ // TODO: Convert this to MOZ_CAN_RUN_SCRIPT (bug 1743443) MOZ_CAN_RUN_SCRIPT_BOUNDARY static void ReportError( JSContext* aCx, WorkerPrivate* aWorkerPrivate, bool aFireAtScope, - DOMEventTargetHelper* aTarget, UniquePtr aReport, - uint64_t aInnerWindowId, + RefPtr aTarget, + UniquePtr aReport, uint64_t aInnerWindowId, JS::Handle aException = JS::NullHandleValue); static void LogErrorToConsole(JSContext* aCx, WorkerErrorReport& aReport, diff -Nru firefox-esr-140.9.1esr/dom/workers/WorkerNavigator.cpp firefox-esr-140.10.0esr/dom/workers/WorkerNavigator.cpp --- firefox-esr-140.9.1esr/dom/workers/WorkerNavigator.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/workers/WorkerNavigator.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -67,7 +67,7 @@ RuntimeService* rts = RuntimeService::GetService(); MOZ_ASSERT(rts); - const RuntimeService::NavigatorProperties& properties = + RuntimeService::NavigatorProperties properties = rts->GetNavigatorProperties(); RefPtr navigator = new WorkerNavigator(properties, aOnLine); diff -Nru firefox-esr-140.9.1esr/dom/xhr/XMLHttpRequestMainThread.cpp firefox-esr-140.10.0esr/dom/xhr/XMLHttpRequestMainThread.cpp --- firefox-esr-140.9.1esr/dom/xhr/XMLHttpRequestMainThread.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/xhr/XMLHttpRequestMainThread.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -2504,6 +2504,7 @@ void XMLHttpRequestMainThread::ChangeStateToDoneInternal() { DEBUG_WORKERREFS; + RefPtr kungfuDeathGrip(this); DisconnectDoneNotifier(); StopProgressEventTimer(); diff -Nru firefox-esr-140.9.1esr/dom/xml/nsXMLPrettyPrinter.cpp firefox-esr-140.10.0esr/dom/xml/nsXMLPrettyPrinter.cpp --- firefox-esr-140.9.1esr/dom/xml/nsXMLPrettyPrinter.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/xml/nsXMLPrettyPrinter.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -179,6 +179,8 @@ } void nsXMLPrettyPrinter::NodeWillBeDestroyed(nsINode* aNode) { + MOZ_DIAGNOSTIC_ASSERT(mDocument == aNode); + mDocument->RemoveMutationObserver(this); mDocument = nullptr; NS_RELEASE_THIS(); } diff -Nru firefox-esr-140.9.1esr/dom/xslt/xpath/txForwardContext.h firefox-esr-140.10.0esr/dom/xslt/xpath/txForwardContext.h --- firefox-esr-140.9.1esr/dom/xslt/xpath/txForwardContext.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/xslt/xpath/txForwardContext.h 2026-04-15 01:59:50.000000000 +0000 @@ -21,7 +21,7 @@ private: txIMatchContext* mInner; - const txXPathNode& mContextNode; + txXPathNode mContextNode; RefPtr mContextSet; }; diff -Nru firefox-esr-140.9.1esr/dom/xslt/xpath/txPathExpr.cpp firefox-esr-140.10.0esr/dom/xslt/xpath/txPathExpr.cpp --- firefox-esr-140.9.1esr/dom/xslt/xpath/txPathExpr.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/xslt/xpath/txPathExpr.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -148,10 +148,10 @@ resNodes->addAndTransfer(newSet); bool filterWS; - rv = aContext->isStripSpaceAllowed(aNode, filterWS); + rv = aContext->isStripSpaceAllowed(eContext.getContextNode(), filterWS); NS_ENSURE_SUCCESS(rv, rv); - txXPathTreeWalker walker(aNode); + txXPathTreeWalker walker(eContext.getContextNode()); if (!walker.moveToFirstChild()) { return NS_OK; } diff -Nru firefox-esr-140.9.1esr/dom/xslt/xslt/txInstructions.cpp firefox-esr-140.10.0esr/dom/xslt/xslt/txInstructions.cpp --- firefox-esr-140.9.1esr/dom/xslt/xslt/txInstructions.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/xslt/xslt/txInstructions.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -47,26 +47,26 @@ } nsresult txApplyImportsStart::execute(txExecutionState& aEs) { - txExecutionState::TemplateRule* rule = aEs.getCurrentTemplateRule(); + txExecutionState::TemplateRule rule = *aEs.getCurrentTemplateRule(); // The frame is set to null when there is no current template rule, or // when the current template rule is a default template. However this // instruction isn't used in default templates. - if (!rule->mFrame) { + if (!rule.mFrame) { // XXX ErrorReport: apply-imports instantiated without a current rule return NS_ERROR_XSLT_EXECUTION_FAILURE; } - aEs.pushParamMap(rule->mParams); + aEs.pushParamMap(rule.mParams); txStylesheet::ImportFrame* frame = 0; - txExpandedName mode(rule->mModeNsId, rule->mModeLocalName); + txExpandedName mode(rule.mModeNsId, rule.mModeLocalName); txInstruction* templ; nsresult rv = aEs.mStylesheet->findTemplate(aEs.getEvalContext()->getContextNode(), - mode, &aEs, rule->mFrame, &templ, &frame); + mode, &aEs, rule.mFrame, &templ, &frame); NS_ENSURE_SUCCESS(rv, rv); - aEs.pushTemplateRule(frame, mode, rule->mParams); + aEs.pushTemplateRule(frame, mode, rule.mParams); rv = aEs.runTemplate(templ); if (NS_FAILED(rv)) { diff -Nru firefox-esr-140.9.1esr/dom/xslt/xslt/txKey.h firefox-esr-140.10.0esr/dom/xslt/xslt/txKey.h --- firefox-esr-140.9.1esr/dom/xslt/xslt/txKey.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/xslt/xslt/txKey.h 2026-04-15 01:59:50.000000000 +0000 @@ -69,11 +69,12 @@ using KeyType = const txIndexedKeyHashKey&; using KeyTypePointer = const txIndexedKeyHashKey*; - explicit txIndexedKeyHashEntry(KeyTypePointer aKey) - : mKey(*aKey), mIndexed(false) {} + explicit txIndexedKeyHashEntry(KeyTypePointer aKey) : mKey(*aKey) {} txIndexedKeyHashEntry(const txIndexedKeyHashEntry& entry) - : mKey(entry.mKey), mIndexed(entry.mIndexed) {} + : mKey(entry.mKey), + mIndexed(entry.mIndexed), + mIsBeingIndexed(entry.mIsBeingIndexed) {} bool KeyEquals(KeyTypePointer aKey) const; @@ -84,7 +85,8 @@ enum { ALLOW_MEMMOVE = true }; txIndexedKeyHashKey mKey; - bool mIndexed; + bool mIndexed = false; + bool mIsBeingIndexed = false; }; using txIndexedKeyHash = nsTHashtable; diff -Nru firefox-esr-140.9.1esr/dom/xslt/xslt/txKeyFunctionCall.cpp firefox-esr-140.10.0esr/dom/xslt/xslt/txKeyFunctionCall.cpp --- firefox-esr-140.9.1esr/dom/xslt/xslt/txKeyFunctionCall.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/xslt/xslt/txKeyFunctionCall.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -183,6 +183,13 @@ return NS_OK; } + // This means an xsl:key's match or use expression is (indirectly) + // looking up the same key. + // XSLT allows for recursion but prohibits circularity. + if (indexEntry->mIsBeingIndexed) { + return NS_ERROR_XSLT_BAD_RECURSION; + } + // The key needs to be indexed. txXSLKey* xslKey = mKeys.get(aKeyName); if (!xslKey) { @@ -190,10 +197,15 @@ return NS_ERROR_INVALID_ARG; } + indexEntry->mIsBeingIndexed = true; nsresult rv = xslKey->indexSubtreeRoot(aRoot, mKeyValues, aEs); NS_ENSURE_SUCCESS(rv, rv); + indexEntry = mIndexedKeys.GetEntry(indexKey); - indexEntry->mIndexed = true; + if (MOZ_LIKELY(indexEntry)) { + indexEntry->mIsBeingIndexed = false; + indexEntry->mIndexed = true; + } // Now that the key is indexed we can get its value. valueEntry = mKeyValues.GetEntry(valueKey); diff -Nru firefox-esr-140.9.1esr/dom/xslt/xslt/txXSLTNumber.cpp firefox-esr-140.10.0esr/dom/xslt/xslt/txXSLTNumber.cpp --- firefox-esr-140.9.1esr/dom/xslt/xslt/txXSLTNumber.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/dom/xslt/xslt/txXSLTNumber.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -107,7 +107,7 @@ txPattern* countPattern = aCountPattern; UniquePtr newCountPattern; - const txXPathNode& currNode = aContext->getContextNode(); + txXPathNode currNode(aContext->getContextNode()); // Parse count- and from-attributes diff -Nru firefox-esr-140.9.1esr/editor/libeditor/HTMLEditorDeleteHandler.cpp firefox-esr-140.10.0esr/editor/libeditor/HTMLEditorDeleteHandler.cpp --- firefox-esr-140.9.1esr/editor/libeditor/HTMLEditorDeleteHandler.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/editor/libeditor/HTMLEditorDeleteHandler.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -3356,8 +3356,8 @@ return EditActionResult::HandledResult(); } - EditorRawDOMPoint newCaretPosition = - HTMLEditUtils::GetGoodCaretPointFor( + EditorDOMPoint newCaretPosition = + HTMLEditUtils::GetGoodCaretPointFor( *mLeafContentInOtherBlock, aDirectionAndAmount); if (MOZ_UNLIKELY(!newCaretPosition.IsInContentNode())) { NS_WARNING("HTMLEditUtils::GetGoodCaretPointFor() failed"); @@ -3381,6 +3381,8 @@ BlockInlineCheck::UseComputedDisplayOutsideStyle); } if (nextThingOfCaretPoint.ReachedBlockBoundary()) { + AutoTrackDOMPoint trackNewCaretPosition(aHTMLEditor.RangeUpdaterRef(), + &newCaretPosition); const EditorDOMPoint atBlockBoundary = nextThingOfCaretPoint.ReachedCurrentBlockBoundary() ? EditorDOMPoint::AtEndOf(*nextThingOfCaretPoint.ElementPtr()) @@ -3394,6 +3396,10 @@ "failed"); return afterLastVisibleThingOrError.propagateErr(); } + trackNewCaretPosition.Flush(StopTracking::Yes); + if (NS_WARN_IF(!newCaretPosition.IsSetAndValidInComposedDoc())) { + return Err(NS_ERROR_EDITOR_UNEXPECTED_DOM_TREE); + } } } rv = aHTMLEditor.CollapseSelectionTo(newCaretPosition); diff -Nru firefox-esr-140.9.1esr/extensions/permissions/test/unit/test_permmanager_expiration.js firefox-esr-140.10.0esr/extensions/permissions/test/unit/test_permmanager_expiration.js --- firefox-esr-140.9.1esr/extensions/permissions/test/unit/test_permmanager_expiration.js 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/extensions/permissions/test/unit/test_permmanager_expiration.js 2026-04-15 01:59:49.000000000 +0000 @@ -23,20 +23,21 @@ let now = Number(Date.now()); - // add a permission with *now* expiration + // add a permission with *now* expiration (minus 10ms to ensure timing doesn't + // treat them as still valid) pm.addFromPrincipal( principal, "test/expiration-perm-exp", 1, pm.EXPIRE_TIME, - now + now - 10 ); pm.addFromPrincipal( principal, "test/expiration-session-exp", 1, pm.EXPIRE_SESSION, - now + now - 10 ); // add a permission with future expiration (100 milliseconds) diff -Nru firefox-esr-140.9.1esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.cpp firefox-esr-140.10.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.cpp --- firefox-esr-140.9.1esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -14,7 +14,17 @@ RemoteSpellcheckEngineChild::~RemoteSpellcheckEngineChild() { // null out the owner's SpellcheckEngineChild to prevent state corruption // during shutdown - mOwner->DeleteRemoteEngine(); + if (mOwner) { + mOwner->DeleteRemoteEngine(); + } +} + +void RemoteSpellcheckEngineChild::Destroy() { + if (mOwner) { + mOwner->DeleteRemoteEngine(); + mOwner = nullptr; + } + (void)RemoteSpellcheckEngineChild::Send__delete__(this); } RefPtr RemoteSpellcheckEngineChild::SetCurrentDictionaries( diff -Nru firefox-esr-140.9.1esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.h firefox-esr-140.10.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.h --- firefox-esr-140.9.1esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.h 2026-04-15 01:59:49.000000000 +0000 @@ -17,8 +17,11 @@ : public mozilla::PRemoteSpellcheckEngineChild { public: explicit RemoteSpellcheckEngineChild(mozSpellChecker* aOwner); + RemoteSpellcheckEngineChild() = delete; virtual ~RemoteSpellcheckEngineChild(); + void Destroy(); + RefPtr SetCurrentDictionaries( const nsTArray& aDictionaries); diff -Nru firefox-esr-140.9.1esr/extensions/spellcheck/src/mozSpellChecker.cpp firefox-esr-140.10.0esr/extensions/spellcheck/src/mozSpellChecker.cpp --- firefox-esr-140.9.1esr/extensions/spellcheck/src/mozSpellChecker.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/extensions/spellcheck/src/mozSpellChecker.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -42,7 +42,7 @@ if (mEngine) { MOZ_ASSERT(XRE_IsContentProcess()); - RemoteSpellcheckEngineChild::Send__delete__(mEngine); + mEngine->Destroy(); MOZ_ASSERT(!mEngine); } } diff -Nru firefox-esr-140.9.1esr/gfx/2d/2D.h firefox-esr-140.10.0esr/gfx/2d/2D.h --- firefox-esr-140.9.1esr/gfx/2d/2D.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/2d/2D.h 2026-04-15 01:59:49.000000000 +0000 @@ -1195,6 +1195,7 @@ explicit FTUserFontData(const char* aFilename) : mFilename(aFilename) {} const uint8_t* FontData() const { return mFontData; } + uint32_t FontDataLength() const { return mLength; } already_AddRefed CloneFace( int aFaceIndex = 0) override; diff -Nru firefox-esr-140.9.1esr/gfx/2d/DrawTargetSkia.cpp firefox-esr-140.10.0esr/gfx/2d/DrawTargetSkia.cpp --- firefox-esr-140.9.1esr/gfx/2d/DrawTargetSkia.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/2d/DrawTargetSkia.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -260,6 +260,14 @@ return nullptr; } + // Wrapper surfaces (e.g. SourceSurfaceOffset) can hand back the inner + // SourceSurfaceSkia here; route it through GetImage so copy-on-write + // snapshots are detached/locked rather than borrowing a raw pixel pointer + // that can outlive the originating SkSurface. + if (dataSurface->GetType() == SurfaceType::SKIA) { + return static_cast(dataSurface.get())->GetImage(aLock); + } + DataSourceSurface::MappedSurface map; void (*releaseProc)(const void*, void*); if (dataSurface->GetType() == SurfaceType::DATA_SHARED_WRAPPER) { diff -Nru firefox-esr-140.9.1esr/gfx/2d/FilterNodeSoftware.cpp firefox-esr-140.10.0esr/gfx/2d/FilterNodeSoftware.cpp --- firefox-esr-140.9.1esr/gfx/2d/FilterNodeSoftware.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/2d/FilterNodeSoftware.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -3475,7 +3475,8 @@ uint8_t colorC[4]; }; - Float dot = -aVectorToLight.DotProduct(mVectorFromFocusPointToLight); + Float dot = std::clamp( + -aVectorToLight.DotProduct(mVectorFromFocusPointToLight), 0.0f, 1.0f); if (!mPowCache.HasPowerTable()) { dot *= (dot >= mLimitingConeCos); color = aLightColor; @@ -3484,7 +3485,7 @@ colorC[B8G8R8A8_COMPONENT_BYTEOFFSET_B] *= dot; } else { color = aLightColor; - uint16_t doti = dot * (dot >= 0) * (1 << PowCache::sInputIntPrecisionBits); + uint16_t doti = dot * (1 << PowCache::sInputIntPrecisionBits); uint32_t tmp = mPowCache.Pow(doti) * (dot >= mLimitingConeCos); MOZ_ASSERT(tmp <= (1 << PowCache::sOutputIntPrecisionBits), "pow() result must not exceed 1.0"); @@ -3757,9 +3758,8 @@ if (halfwayLength > 0) { halfwayVector /= halfwayLength; } - Float dotNH = aNormal.DotProduct(halfwayVector); - uint16_t dotNHi = - uint16_t(dotNH * (dotNH >= 0) * (1 << PowCache::sInputIntPrecisionBits)); + Float dotNH = std::clamp(aNormal.DotProduct(halfwayVector), 0.0f, 1.0f); + uint16_t dotNHi = uint16_t(dotNH * (1 << PowCache::sInputIntPrecisionBits)); // The exponent for specular is in [1,128] range, so we don't need to check // and optimize for the "default power table" scenario here. MOZ_ASSERT(mPowCache.HasPowerTable()); diff -Nru firefox-esr-140.9.1esr/gfx/2d/FilterProcessingScalar.cpp firefox-esr-140.10.0esr/gfx/2d/FilterProcessingScalar.cpp --- firefox-esr-140.9.1esr/gfx/2d/FilterProcessingScalar.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/2d/FilterProcessingScalar.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -267,8 +267,8 @@ uint8_t alpha = uint8_t(255.f * aValue); for (int32_t y = 0; y < aSize.height; y++) { for (int32_t x = 0; x < aSize.width; x++) { - int32_t inputIndex = y * aSourceStride; - int32_t targetIndex = y * aTargetStride; + int32_t inputIndex = y * aSourceStride + x; + int32_t targetIndex = y * aTargetStride + x; aTargetData[targetIndex] = FastDivideBy255(aSourceData[inputIndex] * alpha); } diff -Nru firefox-esr-140.9.1esr/gfx/angle/checkout/include/GLSLANG/ShaderVars.h firefox-esr-140.10.0esr/gfx/angle/checkout/include/GLSLANG/ShaderVars.h --- firefox-esr-140.9.1esr/gfx/angle/checkout/include/GLSLANG/ShaderVars.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/angle/checkout/include/GLSLANG/ShaderVars.h 2026-04-15 01:59:49.000000000 +0000 @@ -12,6 +12,7 @@ #include #include +#include #include #include diff -Nru firefox-esr-140.9.1esr/gfx/angle/checkout/out/gen/angle/angle_commit.h firefox-esr-140.10.0esr/gfx/angle/checkout/out/gen/angle/angle_commit.h --- firefox-esr-140.9.1esr/gfx/angle/checkout/out/gen/angle/angle_commit.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/angle/checkout/out/gen/angle/angle_commit.h 2026-04-15 01:59:49.000000000 +0000 @@ -1,5 +1,5 @@ -#define ANGLE_COMMIT_HASH "419cd2c3213b" +#define ANGLE_COMMIT_HASH "b0098a1ebdb0" #define ANGLE_COMMIT_HASH_SIZE 12 -#define ANGLE_COMMIT_DATE "2024-07-29 14:40:59 -0700" -#define ANGLE_COMMIT_POSITION 19739 +#define ANGLE_COMMIT_DATE "2026-04-09 15:03:30 +0200" +#define ANGLE_COMMIT_POSITION 19751 #define ANGLE_HAS_BINARY_LOADING diff -Nru firefox-esr-140.9.1esr/gfx/angle/checkout/src/compiler/translator/BaseTypes.h firefox-esr-140.10.0esr/gfx/angle/checkout/src/compiler/translator/BaseTypes.h --- firefox-esr-140.9.1esr/gfx/angle/checkout/src/compiler/translator/BaseTypes.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/angle/checkout/src/compiler/translator/BaseTypes.h 2026-04-15 01:59:50.000000000 +0000 @@ -1591,6 +1591,9 @@ case EvqLocalInvocationIndex: return "LocalInvocationIndex"; case EvqReadOnly: return "readonly"; case EvqWriteOnly: return "writeonly"; + case EvqCoherent: return "coherent"; + case EvqRestrict: return "restrict"; + case EvqVolatile: return "volatile"; case EvqGeometryIn: return "in"; case EvqGeometryOut: return "out"; case EvqPerVertexIn: return "gl_in"; diff -Nru firefox-esr-140.9.1esr/gfx/angle/checkout/src/compiler/translator/Compiler.cpp firefox-esr-140.10.0esr/gfx/angle/checkout/src/compiler/translator/Compiler.cpp --- firefox-esr-140.9.1esr/gfx/angle/checkout/src/compiler/translator/Compiler.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/angle/checkout/src/compiler/translator/Compiler.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -686,6 +686,14 @@ // Desktop GLSL shaders don't have precision, so don't expect them to be specified. mValidateASTOptions.validatePrecision = !IsDesktopGLSpec(mShaderSpec); + // Disallow expressions deemed too complex. + // This needs to be checked before other functions that will traverse the AST + // to prevent potential stack overflow crashes. + if (compileOptions.limitExpressionComplexity && !limitExpressionComplexity(root)) + { + return false; + } + if (!validateAST(root)) { return false; @@ -709,12 +717,6 @@ } } - // Disallow expressions deemed too complex. - if (compileOptions.limitExpressionComplexity && !limitExpressionComplexity(root)) - { - return false; - } - if (shouldRunLoopAndIndexingValidation(compileOptions) && !ValidateLimitations(root, mShaderType, &mSymbolTable, &mDiagnostics)) { diff -Nru firefox-esr-140.9.1esr/gfx/angle/checkout/src/compiler/translator/ParseContext.cpp firefox-esr-140.10.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.cpp --- firefox-esr-140.9.1esr/gfx/angle/checkout/src/compiler/translator/ParseContext.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -790,6 +790,14 @@ return true; } +void TParseContext::checkIsValidExpressionStatement(const TSourceLoc &line, TIntermTyped *expr) +{ + if (expr->isInterfaceBlock()) + { + error(line, "expression statement is not allowed for interface blocks", ""); + } +} + // ESSL 3.00.5 sections 3.8 and 3.9. // If it starts "gl_" or contains two consecutive underscores, it's reserved. // Also checks for "webgl_" and "_webgl_" reserved identifiers if parsing a webgl shader. @@ -950,6 +958,13 @@ "constructor"); return false; } + if (argTyped->getBasicType() == EbtInterfaceBlock) + { + error(line, + "an interface block cannot be used as a constructor argument for this type", + "constructor"); + return false; + } if (argTyped->getType().isArray()) { error(line, "constructing from a non-dereferenced array", "constructor"); @@ -1335,9 +1350,6 @@ (*variable) = new TVariable(&symbolTable, identifier, type, symbolType); - ASSERT(type->getLayoutQualifier().index == -1 || - (isExtensionEnabled(TExtension::EXT_blend_func_extended) && - mShaderType == GL_FRAGMENT_SHADER && mShaderVersion >= 300)); if (type->getQualifier() == EvqFragmentOut) { if (type->getLayoutQualifier().index != -1 && type->getLayoutQualifier().location == -1) @@ -3377,7 +3389,10 @@ typeQualifier.line); checkMemoryQualifierIsNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line); - symbolTable.addInvariantVarying(*variable); + if (typeQualifier.invariant) + { + symbolTable.addInvariantVarying(*variable); + } TIntermSymbol *intermSymbol = new TIntermSymbol(variable); intermSymbol->setLine(identifierLoc); @@ -4458,6 +4473,11 @@ { const TIntermTyped *element = arg->getAsTyped(); ASSERT(element); + if (element->getType().isUnsizedArray()) + { + error(line, "constructing from an unsized array", "constructor"); + return false; + } size_t dimensionalityFromElement = element->getType().getNumArraySizes() + 1u; if (dimensionalityFromElement > type.getNumArraySizes()) { @@ -5197,14 +5217,12 @@ int TParseContext::checkIndexLessThan(bool outOfRangeIndexIsError, const TSourceLoc &location, int index, - int arraySize, + unsigned int arraySize, const char *reason) { - // Should not reach here with an unsized / runtime-sized array. - ASSERT(arraySize > 0); // A negative index should already have been checked. ASSERT(index >= 0); - if (index >= arraySize) + if (static_cast(index) >= arraySize) { std::stringstream reasonStream = sh::InitializeStream(); reasonStream << reason << " '" << index << "'"; @@ -6396,6 +6414,11 @@ TIntermTyped *right, const TSourceLoc &loc) { + if (left->getBasicType() == EbtVoid || right->getBasicType() == EbtVoid) + { + error(loc, "operation with void operands", GetOperatorString(op)); + return false; + } // Check opaque types are not allowed to be operands in expressions other than array indexing // and structure member selection. if (IsOpaqueType(left->getBasicType()) || IsOpaqueType(right->getBasicType())) @@ -6842,6 +6865,10 @@ "sequence operator is not allowed for void, arrays, or structs containing arrays", ","); } + if (left->isInterfaceBlock() || right->isInterfaceBlock()) + { + error(loc, "sequence operator is not allowed for interface blocks", ","); + } TIntermBinary *commaNode = TIntermBinary::CreateComma(left, right, mShaderVersion); markStaticReadIfSymbol(left); @@ -7345,8 +7372,8 @@ return CreateZeroNode(TType(EbtInt, EbpUndefined, EvqConst)); } -TIntermTyped *TParseContext::addNonConstructorFunctionCall(TFunctionLookup *fnCall, - const TSourceLoc &loc) +TIntermTyped *TParseContext::addNonConstructorFunctionCallImpl(TFunctionLookup *fnCall, + const TSourceLoc &loc) { // First check whether the function has been hidden by a variable name or struct typename by // using the symbol looked up in the lexical phase. If the function is not hidden, look for one @@ -7408,10 +7435,7 @@ { // Treat it like a built-in unary operator. TIntermNode *unaryParamNode = fnCall->arguments().front(); - TIntermTyped *callNode = - createUnaryMath(op, unaryParamNode->getAsTyped(), loc, fnCandidate); - ASSERT(callNode != nullptr); - return callNode; + return createUnaryMath(op, unaryParamNode->getAsTyped(), loc, fnCandidate); } TIntermAggregate *callNode = @@ -7436,7 +7460,17 @@ error(loc, "no matching overloaded function found", fnCall->name()); } } + return nullptr; +} +TIntermTyped *TParseContext::addNonConstructorFunctionCall(TFunctionLookup *fnCall, + const TSourceLoc &loc) +{ + TIntermTyped *result = addNonConstructorFunctionCallImpl(fnCall, loc); + if (result != nullptr) + { + return result; + } // Error message was already written. Put on an unused node for error recovery. return CreateZeroNode(TType(EbtFloat, EbpMedium, EvqConst)); } diff -Nru firefox-esr-140.9.1esr/gfx/angle/checkout/src/compiler/translator/ParseContext.h firefox-esr-140.10.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.h --- firefox-esr-140.9.1esr/gfx/angle/checkout/src/compiler/translator/ParseContext.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.h 2026-04-15 01:59:50.000000000 +0000 @@ -129,6 +129,7 @@ // Check functions - the ones that return bool return false if an error was generated. + void checkIsValidExpressionStatement(const TSourceLoc &line, TIntermTyped *expr); bool checkIsNotReserved(const TSourceLoc &line, const ImmutableString &identifier); void checkPrecisionSpecified(const TSourceLoc &line, TPrecision precision, TBasicType type); bool checkCanBeLValue(const TSourceLoc &line, const char *op, TIntermTyped *node); @@ -538,7 +539,7 @@ int checkIndexLessThan(bool outOfRangeIndexIsError, const TSourceLoc &location, int index, - int arraySize, + unsigned int arraySize, const char *reason); bool declareVariable(const TSourceLoc &line, @@ -651,6 +652,7 @@ TIntermTyped *addMethod(TFunctionLookup *fnCall, const TSourceLoc &loc); TIntermTyped *addConstructor(TFunctionLookup *fnCall, const TSourceLoc &line); + TIntermTyped *addNonConstructorFunctionCallImpl(TFunctionLookup *fnCall, const TSourceLoc &loc); TIntermTyped *addNonConstructorFunctionCall(TFunctionLookup *fnCall, const TSourceLoc &loc); // Return either the original expression or the folded version of the expression in case the diff -Nru firefox-esr-140.9.1esr/gfx/angle/checkout/src/compiler/translator/glslang_tab_autogen.cpp firefox-esr-140.10.0esr/gfx/angle/checkout/src/compiler/translator/glslang_tab_autogen.cpp --- firefox-esr-140.9.1esr/gfx/angle/checkout/src/compiler/translator/glslang_tab_autogen.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/angle/checkout/src/compiler/translator/glslang_tab_autogen.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -862,9 +862,9 @@ 1330, 1333, 1336, 1339, 1342, 1350, 1358, 1366, 1374, 1382, 1390, 1400, 1410, 1420, 1423, 1430, 1437, 1444, 1447, 1455, 1455, 1458, 1458, 1464, 1467, 1473, 1476, 1483, 1487, 1493, 1496, 1502, 1506, 1510, 1511, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1527, 1531, 1531, 1531, 1538, 1539, - 1543, 1543, 1544, 1544, 1549, 1553, 1560, 1564, 1571, 1572, 1576, 1582, 1586, 1595, 1595, 1602, - 1605, 1611, 1615, 1621, 1621, 1626, 1626, 1630, 1630, 1638, 1641, 1647, 1650, 1656, 1660, 1667, - 1670, 1673, 1676, 1679, 1687, 1693, 1699, 1702, 1708, 1708}; + 1543, 1543, 1544, 1544, 1549, 1553, 1560, 1564, 1571, 1572, 1579, 1585, 1589, 1598, 1598, 1605, + 1608, 1614, 1618, 1624, 1624, 1629, 1629, 1633, 1633, 1641, 1644, 1650, 1653, 1659, 1663, 1670, + 1673, 1676, 1679, 1682, 1690, 1696, 1702, 1705, 1711, 1711}; #endif /** Accessing symbol of state STATE. */ @@ -4483,6 +4483,7 @@ case 297: /* expression_statement: expression SEMICOLON */ { + context->checkIsValidExpressionStatement((yyloc), (yyvsp[-1].interm.intermTypedNode)); (yyval.interm.intermNode) = (yyvsp[-1].interm.intermTypedNode); } break; diff -Nru firefox-esr-140.9.1esr/gfx/angle/cherry_picks.txt firefox-esr-140.10.0esr/gfx/angle/cherry_picks.txt --- firefox-esr-140.9.1esr/gfx/angle/cherry_picks.txt 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/angle/cherry_picks.txt 2026-04-15 01:59:50.000000000 +0000 @@ -1,4 +1,10 @@ -commit 419cd2c3213b594f8e2488bf48034fed20ace81d +commit b0098a1ebdb0400b515ff7a662685bda111e9e87 +Author: Emilio Cobos Álvarez +Date: Thu Apr 9 15:03:30 2026 +0200 + + Add a missing change to 7918168436578718b234bfd56da152e34a85af1d that is in Gecko. + +commit 442302a3b7ae7cca7f85524e6bb3d774a10b6fbc Author: Shahbaz Youssefi Date: Mon Mar 27 13:05:36 2023 -0400 @@ -15,6 +21,198 @@ Reviewed-by: Kenneth Russell Commit-Queue: Shahbaz Youssefi +commit 4f5c3dbc01f70efbaaed41743893ed2c8a7653cd +Author: Emilio Cobos Álvarez +Date: Thu Apr 9 13:40:10 2026 +0200 + + Add missing codegen from #27. + +commit be5a7593658365659dfc6384a95c44406e4e5d9e +Author: Kimmo Kinnunen +Date: Thu Oct 24 11:46:54 2024 +0300 + + Disallow discarded uniform block references + + Uniform block instances cannot be used by themselves, as there + is no way to refer to their type. Disallow the only typeless + access pattern, discarding via expression statement: + + uniform MyBlock { int x; } b; + void main() { + b; + 0, b; + } + + Explained as disallowed in newer GLSL 300: + https://github.com/KhronosGroup/WebGL/issues/3644 + + The comma expression form would ASSERT in CollectVariables. + + Bug: angleproject:42267026 + Change-Id: I6c8b835482fd551bd97576c1bd24f005874da6af + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5961498 + Reviewed-by: Alexey Knyazev + Reviewed-by: Geoff Lang + Reviewed-by: Shahbaz Youssefi + Commit-Queue: Kimmo Kinnunen + Auto-Submit: Kimmo Kinnunen + +commit 329044148ea14623910a1b33a4f1fd81445fd21e +Author: Scott Marcy +Date: Thu May 30 11:36:58 2024 -0600 + + Fix stack overflow crash by traversing a too-deep AST + + This simply moves the check for a too-deep AST before the first attempts + to traverse the AST (i.e., `validateAST()`). + + Bug: angleproject:343505104 + Change-Id: Iafb658a30f74a666beab8c69745ca53d17d70dd3 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5585186 + Reviewed-by: Shahbaz Youssefi + Reviewed-by: Kimmo Kinnunen + Commit-Queue: Kimmo Kinnunen + Auto-Submit: Scott M + +commit 28669be7c0129fa7ed117f730484db302a39bcb2 +Author: Nisha Jain +Date: Thu Mar 7 14:19:58 2024 +0200 + + Avoid asserts when const folding binary ops on void variables + + Fix asserts for example with / and % during constant folding when + the operands might be voids. + + Bug: angleproject:8592 + Change-Id: I22275642dbcdf9066940d3a94114e8daa5cbbe41 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5416376 + Auto-Submit: Kimmo Kinnunen + Commit-Queue: Geoff Lang + Reviewed-by: Geoff Lang + Reviewed-by: Kimmo Kinnunen + +commit ebaab5cd66b66183175f8c5d5f72210afcba38ca +Author: Kimmo Kinnunen +Date: Fri Mar 8 14:26:56 2024 +0200 + + Check array index against unsigned array size + + Fix an assert during GLSL parsing when a very + large array (~1U) type is indexed. + + Bug: angleproject:8596 + Change-Id: I219ac5c8f3fa58aa4c7d679eade6f32b59eb1103 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5352653 + Auto-Submit: Kimmo Kinnunen + Reviewed-by: Shahbaz Youssefi + Commit-Queue: Kimmo Kinnunen + +commit 5a3f53d8bff0709e94e9b5c2a97684c9a012f6f6 +Author: Erica Li +Date: Fri Mar 8 12:40:09 2024 +0200 + + Avoid assert with multiple memory qualifiers + + Add missing qualifier strings. + + Bug: angleproject:8593 + Change-Id: I484571c33effd85d52712b4876f6a3a5c73d8fde + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5352255 + Reviewed-by: Shahbaz Youssefi + Auto-Submit: Kimmo Kinnunen + Commit-Queue: Shahbaz Youssefi + +commit f95d411e7d0c5cfb4b0dfef2ecadb952cc92b06a +Author: Kimmo Kinnunen +Date: Tue Mar 5 21:42:32 2024 +0200 + + Ensure unary math op parse to an node on error + + Return the error node for ops like radians(). + The math op parse can fail in multiple ways. + + Fixed: angleproject:8583 + Change-Id: Ief7e150dffefe711f567d95c62d1023fc7fa1c91 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5344716 + Reviewed-by: Kenneth Russell + Auto-Submit: Kimmo Kinnunen + Commit-Queue: Kenneth Russell + +commit 386e3783a143a5268df86bdf93cd10892419f395 +Author: Kimmo Kinnunen +Date: Mon Mar 4 14:43:10 2024 +0200 + + Fix layout(index=) parse assert on es 100 shaders + + Remove invalid assert about layout index qualifier being present only if + EXT_blend_func_extended is present. + + The layout qualifier gets parsed to support EXT_shader_framebuffer_fetch + in ES 100 shaders to support + "layout(incoherent) mediump vec4 gl_FragData[gl_MaxDrawBuffers]" + + Fixed: angleproject:8570 + Change-Id: I0d0d99bcc882a0befd97c2510dec4a8ccf1690bd + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5340249 + Reviewed-by: Kenneth Russell + Commit-Queue: Kenneth Russell + Auto-Submit: Kimmo Kinnunen + +commit abe9de5edc89a3db4188c8ddf52e61f6820ecebd +Author: Kimmo Kinnunen +Date: Fri Feb 16 22:28:18 2024 +0200 + + Fix ASSERT in non-global precise var decls + + Precise was treated as invariant. Precise can be + declared for non-global variables. + + Bug: angleproject:8550 + Change-Id: Ia0d00d67d0d1504b78294ee2256785fe3da3e399 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5300976 + Commit-Queue: Shahbaz Youssefi + Auto-Submit: Kimmo Kinnunen + Reviewed-by: Shahbaz Youssefi + Reviewed-by: Kenneth Russell + +commit 718164d445a82bd24da61ff670deb5f1702fbfc3 +Author: Kimmo Kinnunen +Date: Tue Feb 13 17:54:12 2024 +0200 + + Uniform block reference in constuctors crash + + Passing uniform block instance name to a built-in constructor would + cause type confusion. Block this by failing to parse. + + Bug: angleproject:8533 + Change-Id: I5a676b41e2f3d766ece4ed472debc1c874753293 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5290897 + Commit-Queue: Shahbaz Youssefi + Reviewed-by: Shahbaz Youssefi + Commit-Queue: Kimmo Kinnunen + Auto-Submit: Kimmo Kinnunen + +commit a7ce496eaa3ac8f108190ca544e00024edead840 +Author: Kimmo Kinnunen +Date: Wed Feb 7 14:25:32 2024 +0200 + + Fix an assert on multidim array constructors + + Fail early instead of asserting when trying to parse a + multidimensional array constructor call with unsized + argument array argument. + + int A[]; + int B[int[][](A)]; + + Bug: angleproject:8519 + Change-Id: Iee2c70318eebd2def57ffab8db709d1076692922 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5272434 + Reviewed-by: Shahbaz Youssefi + Auto-Submit: Kimmo Kinnunen + Commit-Queue: Kimmo Kinnunen + Commit-Queue: Shahbaz Youssefi + commit 7918168436578718b234bfd56da152e34a85af1d Author: Kelsey Gilbert Date: Tue Jun 4 15:37:29 2024 -0700 diff -Nru firefox-esr-140.9.1esr/gfx/cairo/cairo/src/cairo-cff-subset.c firefox-esr-140.10.0esr/gfx/cairo/cairo/src/cairo-cff-subset.c --- firefox-esr-140.9.1esr/gfx/cairo/cairo/src/cairo-cff-subset.c 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/cairo/cairo/src/cairo-cff-subset.c 2026-04-15 01:59:50.000000000 +0000 @@ -930,6 +930,8 @@ if (operand) { decode_integer (operand, &offset); p = ptr + offset; + if (unlikely (p < font->data || p > font->data_end)) + return CAIRO_INT_STATUS_UNSUPPORTED; status = cff_index_read (local_sub_index, &p, font->data_end); if (unlikely (status)) return status; @@ -1866,6 +1868,10 @@ } fd = font->fdselect[gid]; + if (fd < 0 || (unsigned int) fd >= font->num_fontdicts) { + free (reverse_map); + return CAIRO_INT_STATUS_UNSUPPORTED; + } if (reverse_map[fd] < 0) { font->fd_subset_map[font->num_subset_fontdicts] = fd; reverse_map[fd] = font->num_subset_fontdicts++; diff -Nru firefox-esr-140.9.1esr/gfx/gl/GLBlitHelper.cpp firefox-esr-140.10.0esr/gfx/gl/GLBlitHelper.cpp --- firefox-esr-140.9.1esr/gfx/gl/GLBlitHelper.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/gl/GLBlitHelper.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -359,7 +359,7 @@ mTexUnits(texUnits), mTexTarget(texTarget), mOldTexUnit(mGL.GetIntAs(LOCAL_GL_ACTIVE_TEXTURE)) { - MOZ_RELEASE_ASSERT(texUnits >= 1); + MOZ_RELEASE_ASSERT(texUnits >= 1 && texUnits <= std::size(mOldTex)); GLenum texBinding; switch (mTexTarget) { @@ -944,6 +944,9 @@ case layers::SurfaceDescriptor::TSurfaceDescriptorDMABuf: { const auto& sd = asd.get_SurfaceDescriptorDMABuf(); RefPtr surface = DMABufSurface::CreateDMABufSurface(sd); + if (!surface) { + return false; + } return Blit(surface, destSize, destOrigin); } #endif @@ -1544,6 +1547,12 @@ const DrawBlitProg::YUVArgs* pYuvArgs = nullptr; const auto planes = surface->GetTextureCount(); + // The shaders used below currently only support 1-3 planes. + if (planes < 1 || planes > 3) { + gfxCriticalError() << "Unexpected DMABuf planes count: " << planes; + return false; + } + // - // Ensure textures for all planes have been created. diff -Nru firefox-esr-140.9.1esr/gfx/gl/GLLibraryEGL.cpp firefox-esr-140.10.0esr/gfx/gl/GLLibraryEGL.cpp --- firefox-esr-140.9.1esr/gfx/gl/GLLibraryEGL.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/gl/GLLibraryEGL.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -810,7 +810,9 @@ const auto ret = std::make_shared(PrivateUseOnly{}, lib, display, isWarp); - lib.mActiveDisplays.insert({display, ret}); + // Insert if there is no existing display entry, or assign if there is an + // expired weak_ptr that failed to lock above and was awaiting removal. + lib.mActiveDisplays.insert_or_assign(display, ret); return ret; } @@ -858,6 +860,13 @@ EglDisplay::~EglDisplay() { StaticMutexAutoLock lock(GLLibraryEGL::sMutex); + // EglDisplay is being destructed, so its weak_ptr should be expired. If there + // is an entry that is still live, it means a new EGLDisplay was subsequently + // created that needs to use this display, so avoid terminating it. + const auto itr = mLib->mActiveDisplays.find(mDisplay); + if (itr != mLib->mActiveDisplays.end() && !itr->second.expired()) { + return; + } fTerminate(); mLib->mActiveDisplays.erase(mDisplay); } diff -Nru firefox-esr-140.9.1esr/gfx/harfbuzz/src/hb-aat-layout-morx-table.hh firefox-esr-140.10.0esr/gfx/harfbuzz/src/hb-aat-layout-morx-table.hh --- firefox-esr-140.9.1esr/gfx/harfbuzz/src/hb-aat-layout-morx-table.hh 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/harfbuzz/src/hb-aat-layout-morx-table.hh 2026-04-15 01:59:49.000000000 +0000 @@ -987,9 +987,16 @@ { unsigned count = chain.get_subtable_count (); - unsigned size = sizeof (hb_aat_layout_chain_accelerator_t) - - HB_VAR_ARRAY * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t) + - count * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t); + unsigned product; + if (unlikely (hb_unsigned_mul_overflows (count, + sizeof (hb_accelerate_subtables_context_t::hb_applicable_t), &product))) + return nullptr; + + unsigned size; + if (unlikely (hb_unsigned_add_overflows (sizeof (hb_aat_layout_chain_accelerator_t) - + HB_VAR_ARRAY * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t), product, &size))) { + return nullptr; + } /* The following is a calloc because when we are collecting subtables, * some of them might be invalid and hence not collect; as a result, diff -Nru firefox-esr-140.9.1esr/gfx/harfbuzz/src/moz.build firefox-esr-140.10.0esr/gfx/harfbuzz/src/moz.build --- firefox-esr-140.9.1esr/gfx/harfbuzz/src/moz.build 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/harfbuzz/src/moz.build 2026-04-15 01:59:50.000000000 +0000 @@ -131,12 +131,13 @@ DEFINES['HB_NO_UCD'] = True DEFINES['HB_NO_UNICODE_FUNCS'] = True -# On Android, we want to use harfbuzz's mmap support for file access, +# We want to use harfbuzz's mmap support for file access, # so we need to set the appropriate configuration flags as we're not # running harfbuzz's own configure script. -if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android': +if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'windows': DEFINES['HAVE_MMAP'] = 1 DEFINES['HAVE_SYS_MMAN_H'] = 1 + DEFINES['HAVE_UNISTD_H'] = 1 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': DEFINES['UNICODE'] = True diff -Nru firefox-esr-140.9.1esr/gfx/ipc/CanvasShutdownManager.cpp firefox-esr-140.10.0esr/gfx/ipc/CanvasShutdownManager.cpp --- firefox-esr-140.9.1esr/gfx/ipc/CanvasShutdownManager.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ipc/CanvasShutdownManager.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -31,10 +31,21 @@ CanvasShutdownManager::CanvasShutdownManager() = default; CanvasShutdownManager::~CanvasShutdownManager() = default; +std::vector> +CanvasShutdownManager::RefActiveCanvas() const { + std::vector> activeCanvas; + activeCanvas.reserve(mActiveCanvas.size()); + for (const auto& canvas : mActiveCanvas) { + activeCanvas.emplace_back(canvas); + } + return activeCanvas; +} + void CanvasShutdownManager::Destroy() { - std::set activeCanvas = std::move(mActiveCanvas); - for (const auto& i : activeCanvas) { - i->OnShutdown(); + auto activeCanvas = RefActiveCanvas(); + mActiveCanvas.clear(); + for (const auto& canvas : activeCanvas) { + canvas->OnShutdown(); } CanvasManagerChild::Shutdown(); @@ -121,17 +132,13 @@ } void CanvasShutdownManager::OnRemoteCanvasLost() { - // Note that the canvas cannot do anything that mutates our state. It will - // dispatch for anything that risks re-entrancy. - for (const auto& canvas : mActiveCanvas) { + for (const auto& canvas : RefActiveCanvas()) { canvas->OnRemoteCanvasLost(); } } void CanvasShutdownManager::OnRemoteCanvasRestored() { - // Note that the canvas cannot do anything that mutates our state. It will - // dispatch for anything that risks re-entrancy. - for (const auto& canvas : mActiveCanvas) { + for (const auto& canvas : RefActiveCanvas()) { canvas->OnRemoteCanvasRestored(); } } @@ -142,7 +149,7 @@ return; } - for (const auto& canvas : mActiveCanvas) { + for (const auto& canvas : RefActiveCanvas()) { auto* bufferProvider = canvas->GetBufferProvider(); if (!bufferProvider) { continue; diff -Nru firefox-esr-140.9.1esr/gfx/ipc/CanvasShutdownManager.h firefox-esr-140.10.0esr/gfx/ipc/CanvasShutdownManager.h --- firefox-esr-140.9.1esr/gfx/ipc/CanvasShutdownManager.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ipc/CanvasShutdownManager.h 2026-04-15 01:59:49.000000000 +0000 @@ -11,6 +11,7 @@ #include "mozilla/ThreadLocal.h" #include "mozilla/layers/LayersTypes.h" #include +#include namespace mozilla { namespace dom { @@ -44,6 +45,8 @@ ~CanvasShutdownManager(); void Destroy(); + std::vector> RefActiveCanvas() const; + static void MaybeRestoreRemoteCanvas(); RefPtr mWorkerRef; diff -Nru firefox-esr-140.9.1esr/gfx/ipc/GPUChild.cpp firefox-esr-140.10.0esr/gfx/ipc/GPUChild.cpp --- firefox-esr-140.9.1esr/gfx/ipc/GPUChild.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ipc/GPUChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -177,7 +177,8 @@ mozilla::ipc::IPCResult GPUChild::RecvCreateVRProcess() { // Make sure create VR process at the main process MOZ_ASSERT(XRE_IsParentProcess()); - if (StaticPrefs::dom_vr_process_enabled_AtStartup()) { + if (StaticPrefs::dom_vr_process_enabled_AtStartup() && + StaticPrefs::dom_vr_enabled()) { VRProcessManager::Initialize(); VRProcessManager* vr = VRProcessManager::Get(); MOZ_ASSERT(vr, "VRProcessManager must be initialized first."); @@ -193,19 +194,20 @@ mozilla::ipc::IPCResult GPUChild::RecvShutdownVRProcess() { // Make sure stopping VR process at the main process MOZ_ASSERT(XRE_IsParentProcess()); - if (StaticPrefs::dom_vr_process_enabled_AtStartup()) { + if (StaticPrefs::dom_vr_process_enabled_AtStartup() && + StaticPrefs::dom_vr_enabled()) { VRProcessManager::Shutdown(); } return IPC_OK(); } -mozilla::ipc::IPCResult GPUChild::RecvNotifyUiObservers( - const nsCString& aTopic) { +mozilla::ipc::IPCResult GPUChild::RecvFlushActiveCheckerboardReportsDone() { nsCOMPtr obsSvc = mozilla::services::GetObserverService(); MOZ_ASSERT(obsSvc); if (obsSvc) { - obsSvc->NotifyObservers(nullptr, aTopic.get(), nullptr); + obsSvc->NotifyObservers(nullptr, "APZ:FlushActiveCheckerboard:Done", + nullptr); } return IPC_OK(); } @@ -288,25 +290,27 @@ const Maybe& aDMDFile) { mMemoryReportRequest = MakeUnique(aGeneration); - PGPUChild::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [&](const uint32_t& aGeneration2) { - if (GPUProcessManager* gpm = GPUProcessManager::Get()) { - if (GPUChild* child = gpm->GetGPUChild()) { - if (child->mMemoryReportRequest) { - child->mMemoryReportRequest->Finish(aGeneration2); - child->mMemoryReportRequest = nullptr; + PGPUChild::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [](uint32_t aGeneration2) { + if (GPUProcessManager* gpm = GPUProcessManager::Get()) { + if (GPUChild* child = gpm->GetGPUChild()) { + if (child->mMemoryReportRequest) { + child->mMemoryReportRequest->Finish(aGeneration2); + child->mMemoryReportRequest = nullptr; + } + } } - } - } - }, - [&](mozilla::ipc::ResponseRejectReason) { - if (GPUProcessManager* gpm = GPUProcessManager::Get()) { - if (GPUChild* child = gpm->GetGPUChild()) { - child->mMemoryReportRequest = nullptr; - } - } - }); + }, + [](mozilla::ipc::ResponseRejectReason) { + if (GPUProcessManager* gpm = GPUProcessManager::Get()) { + if (GPUChild* child = gpm->GetGPUChild()) { + child->mMemoryReportRequest = nullptr; + } + } + }); return true; } diff -Nru firefox-esr-140.9.1esr/gfx/ipc/GPUChild.h firefox-esr-140.10.0esr/gfx/ipc/GPUChild.h --- firefox-esr-140.9.1esr/gfx/ipc/GPUChild.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ipc/GPUChild.h 2026-04-15 01:59:49.000000000 +0000 @@ -79,7 +79,7 @@ void ActorDestroy(ActorDestroyReason aWhy) override; mozilla::ipc::IPCResult RecvGraphicsError(const nsCString& aError); - mozilla::ipc::IPCResult RecvNotifyUiObservers(const nsCString& aTopic); + mozilla::ipc::IPCResult RecvFlushActiveCheckerboardReportsDone(); mozilla::ipc::IPCResult RecvNotifyDeviceReset( const GPUDeviceData& aData, const DeviceResetReason& aReason, const DeviceResetDetectPlace& aPlace); diff -Nru firefox-esr-140.9.1esr/gfx/ipc/GPUParent.cpp firefox-esr-140.10.0esr/gfx/ipc/GPUParent.cpp --- firefox-esr-140.9.1esr/gfx/ipc/GPUParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ipc/GPUParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -655,12 +655,11 @@ return IPC_OK(); } -mozilla::ipc::IPCResult GPUParent::RecvNotifyGpuObservers( - const nsCString& aTopic) { +mozilla::ipc::IPCResult GPUParent::RecvFlushActiveCheckerboardReports() { nsCOMPtr obsSvc = mozilla::services::GetObserverService(); MOZ_ASSERT(obsSvc); if (obsSvc) { - obsSvc->NotifyObservers(nullptr, aTopic.get(), nullptr); + obsSvc->NotifyObservers(nullptr, "APZ:FlushActiveCheckerboard", nullptr); } return IPC_OK(); } @@ -697,7 +696,8 @@ } mozilla::ipc::IPCResult GPUParent::RecvShutdownVR() { - if (StaticPrefs::dom_vr_process_enabled_AtStartup()) { + if (StaticPrefs::dom_vr_process_enabled_AtStartup() && + StaticPrefs::dom_vr_enabled()) { VRGPUChild::Shutdown(); } return IPC_OK(); diff -Nru firefox-esr-140.9.1esr/gfx/ipc/GPUParent.h firefox-esr-140.10.0esr/gfx/ipc/GPUParent.h --- firefox-esr-140.9.1esr/gfx/ipc/GPUParent.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ipc/GPUParent.h 2026-04-15 01:59:49.000000000 +0000 @@ -95,7 +95,7 @@ const LayerTreeIdMapping& aMapping); mozilla::ipc::IPCResult RecvRemoveLayerTreeIdMapping( const LayerTreeIdMapping& aMapping); - mozilla::ipc::IPCResult RecvNotifyGpuObservers(const nsCString& aTopic); + mozilla::ipc::IPCResult RecvFlushActiveCheckerboardReports(); mozilla::ipc::IPCResult RecvRequestMemoryReport( const uint32_t& generation, const bool& anonymize, const bool& minimizeMemoryUsage, diff -Nru firefox-esr-140.9.1esr/gfx/ipc/GPUProcessManager.cpp firefox-esr-140.10.0esr/gfx/ipc/GPUProcessManager.cpp --- firefox-esr-140.9.1esr/gfx/ipc/GPUProcessManager.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ipc/GPUProcessManager.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -1640,12 +1640,11 @@ mListeners.RemoveElement(aListener); } -bool GPUProcessManager::NotifyGpuObservers(const char* aTopic) { +bool GPUProcessManager::FlushActiveCheckerboardReports() { if (NS_FAILED(EnsureGPUReady())) { return false; } - nsCString topic(aTopic); - mGPUChild->SendNotifyGpuObservers(topic); + mGPUChild->SendFlushActiveCheckerboardReports(); return true; } diff -Nru firefox-esr-140.9.1esr/gfx/ipc/GPUProcessManager.h firefox-esr-140.10.0esr/gfx/ipc/GPUProcessManager.h --- firefox-esr-140.9.1esr/gfx/ipc/GPUProcessManager.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ipc/GPUProcessManager.h 2026-04-15 01:59:50.000000000 +0000 @@ -180,9 +180,9 @@ void AddListener(GPUProcessListener* aListener); void RemoveListener(GPUProcessListener* aListener); - // Send a message to the GPU process observer service to broadcast. Returns - // true if the message was sent, false if not. - bool NotifyGpuObservers(const char* aTopic); + // Send a message to the GPU process to flush any active checkerboard reports. + // Returns true if the message was sent, false if not. + bool FlushActiveCheckerboardReports(); // Kills the GPU process. Used in normal operation to recover from an error, // as well as for tests and diagnostics. diff -Nru firefox-esr-140.9.1esr/gfx/ipc/GfxMessageUtils.h firefox-esr-140.10.0esr/gfx/ipc/GfxMessageUtils.h --- firefox-esr-140.9.1esr/gfx/ipc/GfxMessageUtils.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ipc/GfxMessageUtils.h 2026-04-15 01:59:50.000000000 +0000 @@ -19,6 +19,7 @@ #include "gfxTelemetry.h" #include "gfxTypes.h" #include "ipc/EnumSerializer.h" +#include "mozilla/EnumTypeTraits.h" #include "ipc/IPCMessageUtilsSpecializations.h" #include "mozilla/gfx/CrossProcessPaint.h" #include "mozilla/gfx/FileHandleWrapper.h" @@ -259,6 +260,36 @@ mozilla::gfx::ColorSpace::SRGB, mozilla::gfx::ColorSpace::Max> {}; +template +using GfxEnumSerializer = + ContiguousEnumSerializerInclusive::min, + mozilla::ContiguousEnumValues::max>; + +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; + template <> struct ParamTraits : public ContiguousEnumSerializerInclusive< diff -Nru firefox-esr-140.9.1esr/gfx/ipc/PGPU.ipdl firefox-esr-140.10.0esr/gfx/ipc/PGPU.ipdl --- firefox-esr-140.9.1esr/gfx/ipc/PGPU.ipdl 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ipc/PGPU.ipdl 2026-04-15 01:59:49.000000000 +0000 @@ -104,9 +104,7 @@ // the GPU process. This blocks until one is available (i.e., Init has completed). async SimulateDeviceReset(); - // Have a message be broadcasted to the GPU process by the GPU process - // observer service. - async NotifyGpuObservers(nsCString aTopic); + async FlushActiveCheckerboardReports(); async RequestMemoryReport(uint32_t generation, bool anonymize, @@ -153,9 +151,7 @@ async CreateVRProcess(); async ShutdownVRProcess(); - // Have a message be broadcasted to the UI process by the UI process - // observer service. - async NotifyUiObservers(nsCString aTopic); + async FlushActiveCheckerboardReportsDone(); // Messages for reporting telemetry to the UI process. async AccumulateChildHistograms(HistogramAccumulation[] accumulations); diff -Nru firefox-esr-140.9.1esr/gfx/layers/BufferTexture.cpp firefox-esr-140.10.0esr/gfx/layers/BufferTexture.cpp --- firefox-esr-140.9.1esr/gfx/layers/BufferTexture.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/BufferTexture.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -175,8 +175,8 @@ aYUVColorSpace, aColorRange, aSubsampling); return CreateInternal( - aAllocator ? aAllocator->GetTextureForwarder() : nullptr, descriptor, - gfx::BackendType::NONE, bufSize, aTextureFlags); + aAllocator ? aAllocator->GetTextureForwarder().get() : nullptr, + descriptor, gfx::BackendType::NONE, bufSize, aTextureFlags); } void BufferTextureData::FillInfo(TextureData::Info& aInfo) const { diff -Nru firefox-esr-140.9.1esr/gfx/layers/D3D11ShareHandleImage.cpp firefox-esr-140.10.0esr/gfx/layers/D3D11ShareHandleImage.cpp --- firefox-esr-140.9.1esr/gfx/layers/D3D11ShareHandleImage.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/D3D11ShareHandleImage.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -141,8 +141,8 @@ } data->mColorSpace = mColorSpace; data->SetColorRange(mColorRange); - return MakeAndAddRef(data, mTextureFlags, - aAllocator->GetTextureForwarder()); + return MakeAndAddRef( + data, mTextureFlags, aAllocator->GetTextureForwarder().get()); } private: diff -Nru firefox-esr-140.9.1esr/gfx/layers/D3D11YCbCrImage.cpp firefox-esr-140.10.0esr/gfx/layers/D3D11YCbCrImage.cpp --- firefox-esr-140.9.1esr/gfx/layers/D3D11YCbCrImage.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/D3D11YCbCrImage.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -81,7 +81,7 @@ hr = mDevice->CreateTexture2D(&newDesc, nullptr, getter_AddRefs(textureCr)); NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr); - TextureForwarder* forwarder = + RefPtr forwarder = aAllocator ? aAllocator->GetTextureForwarder() : nullptr; return TextureClient::CreateWithData( diff -Nru firefox-esr-140.9.1esr/gfx/layers/DMABUFSurfaceImage.cpp firefox-esr-140.10.0esr/gfx/layers/DMABUFSurfaceImage.cpp --- firefox-esr-140.9.1esr/gfx/layers/DMABUFSurfaceImage.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/DMABUFSurfaceImage.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -65,7 +65,7 @@ BackendType backend = BackendType::NONE; mTextureClient = TextureClient::CreateWithData( DMABUFTextureData::Create(mSurface, backend), TextureFlags::DEFAULT, - aKnowsCompositor->GetTextureForwarder()); + aKnowsCompositor->GetTextureForwarder().get()); } return mTextureClient; } diff -Nru firefox-esr-140.9.1esr/gfx/layers/DcompSurfaceImage.cpp firefox-esr-140.10.0esr/gfx/layers/DcompSurfaceImage.cpp --- firefox-esr-140.9.1esr/gfx/layers/DcompSurfaceImage.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/DcompSurfaceImage.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -34,7 +34,7 @@ KnowsCompositor* aKnowsCompositor) { RefPtr textureClient = MakeAndAddRef( new DcompSurfaceTexture(aHandle, aSize, aFormat), TextureFlags::NO_FLAGS, - aKnowsCompositor->GetTextureForwarder()); + aKnowsCompositor->GetTextureForwarder().get()); return textureClient.forget(); } @@ -106,7 +106,12 @@ return; } MOZ_ASSERT(mHandle); - MOZ_ASSERT(aImageKeys.length() == 1); + + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } + auto method = aOp == TextureHost::ADD_IMAGE ? &wr::TransactionBuilder::AddExternalImage : &wr::TransactionBuilder::UpdateExternalImage; @@ -137,7 +142,10 @@ return; } LOG("DcompSurfaceHandleHost %p PushDisplayItems", this); - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage( aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), diff -Nru firefox-esr-140.9.1esr/gfx/layers/ImageDataSerializer.cpp firefox-esr-140.10.0esr/gfx/layers/ImageDataSerializer.cpp --- firefox-esr-140.9.1esr/gfx/layers/ImageDataSerializer.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ImageDataSerializer.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -330,6 +330,10 @@ return nullptr; } + if (!aBuffer) { + return nullptr; + } + layers::PlanarYCbCrData ycbcrData; ycbcrData.mYChannel = GetYChannel(aBuffer, aDescriptor); ycbcrData.mYStride = aDescriptor.yStride(); diff -Nru firefox-esr-140.9.1esr/gfx/layers/MacIOSurfaceImage.cpp firefox-esr-140.10.0esr/gfx/layers/MacIOSurfaceImage.cpp --- firefox-esr-140.9.1esr/gfx/layers/MacIOSurfaceImage.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/MacIOSurfaceImage.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -27,7 +27,7 @@ IsDRM() ? TextureFlags::DRM_SOURCE : TextureFlags::DEFAULT; mTextureClient = TextureClient::CreateWithData( MacIOSurfaceTextureData::Create(mSurface, backend), flags, - aKnowsCompositor->GetTextureForwarder()); + aKnowsCompositor->GetTextureForwarder().get()); } return mTextureClient; } diff -Nru firefox-esr-140.9.1esr/gfx/layers/ScreenshotGrabber.cpp firefox-esr-140.10.0esr/gfx/layers/ScreenshotGrabber.cpp --- firefox-esr-140.9.1esr/gfx/layers/ScreenshotGrabber.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ScreenshotGrabber.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -154,10 +154,14 @@ return; } + if (aWindowSize.IsEmpty() || mBufferSize.IsEmpty()) { + return; + } + Size windowSize(aWindowSize); float scale = std::min(mBufferSize.width / windowSize.width, mBufferSize.height / windowSize.height); - IntSize scaledSize = IntSize::Round(windowSize * scale); + IntSize scaledSize = Max(IntSize::Round(windowSize * scale), IntSize(1, 1)); RefPtr scaledTarget = ScaleDownWindowRenderSourceToSize( aWindow, scaledSize, windowRenderSource, 0); diff -Nru firefox-esr-140.9.1esr/gfx/layers/SourceSurfaceSharedData.cpp firefox-esr-140.10.0esr/gfx/layers/SourceSurfaceSharedData.cpp --- firefox-esr-140.9.1esr/gfx/layers/SourceSurfaceSharedData.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/SourceSurfaceSharedData.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -83,9 +83,11 @@ auto computedStride = CheckedInt(mSize.width) * BytesPerPixel(mFormat); + auto computedLength = CheckedInt(mSize.height) * mStride; if (mSize.width < 0 || mSize.height < 0 || mStride < 0 || - !computedStride.isValid() || mStride < computedStride.value() || - !image::SurfaceCache::IsLegalSize(mSize) || + !computedStride.isValid() || computedStride.value() <= 0 || + mStride < computedStride.value() || !computedLength.isValid() || + computedLength.value() <= 0 || !image::SurfaceCache::IsLegalSize(mSize) || mBufHandle.Size() < GetAlignedDataLength()) { return false; } diff -Nru firefox-esr-140.9.1esr/gfx/layers/apz/src/APZCTreeManager.cpp firefox-esr-140.10.0esr/gfx/layers/apz/src/APZCTreeManager.cpp --- firefox-esr-140.9.1esr/gfx/layers/apz/src/APZCTreeManager.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/apz/src/APZCTreeManager.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -216,8 +216,7 @@ } if (XRE_IsGPUProcess()) { if (gfx::GPUParent* gpu = gfx::GPUParent::GetSingleton()) { - nsCString topic("APZ:FlushActiveCheckerboard:Done"); - Unused << gpu->SendNotifyUiObservers(topic); + Unused << gpu->SendFlushActiveCheckerboardReportsDone(); } } else { MOZ_ASSERT(XRE_IsParentProcess()); diff -Nru firefox-esr-140.9.1esr/gfx/layers/apz/util/CheckerboardReportService.cpp firefox-esr-140.10.0esr/gfx/layers/apz/util/CheckerboardReportService.cpp --- firefox-esr-140.9.1esr/gfx/layers/apz/util/CheckerboardReportService.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/apz/util/CheckerboardReportService.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -202,7 +202,7 @@ void CheckerboardReportService::FlushActiveReports() { MOZ_ASSERT(XRE_IsParentProcess()); gfx::GPUProcessManager* gpu = gfx::GPUProcessManager::Get(); - if (gpu && gpu->NotifyGpuObservers("APZ:FlushActiveCheckerboard")) { + if (gpu && gpu->FlushActiveCheckerboardReports()) { return; } diff -Nru firefox-esr-140.9.1esr/gfx/layers/client/ImageClient.cpp firefox-esr-140.10.0esr/gfx/layers/client/ImageClient.cpp --- firefox-esr-140.9.1esr/gfx/layers/client/ImageClient.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/client/ImageClient.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -118,7 +118,7 @@ typedImage->GetOriginPos(), typedImage->GetHasAlpha(), typedImage->GetForceBT709ColorSpace(), typedImage->GetTransformOverride(), - aKnowsCompositor->GetTextureForwarder(), TextureFlags::DEFAULT); + aKnowsCompositor->GetTextureForwarder().get(), TextureFlags::DEFAULT); #endif } else { RefPtr surface = aImage->GetAsSourceSurface(); diff -Nru firefox-esr-140.9.1esr/gfx/layers/client/TextureClient.cpp firefox-esr-140.10.0esr/gfx/layers/client/TextureClient.cpp --- firefox-esr-140.9.1esr/gfx/layers/client/TextureClient.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/client/TextureClient.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -1180,8 +1180,8 @@ } bool TextureClient::InitIPDLActor(CompositableForwarder* aForwarder) { - MOZ_ASSERT(aForwarder && aForwarder->GetTextureForwarder()->GetThread() == - mAllocator->GetThread()); + RefPtr textureFwd = aForwarder->GetTextureForwarder(); + MOZ_ASSERT(aForwarder && textureFwd->GetThread() == mAllocator->GetThread()); if (mActor && !mActor->IPCOpen()) { return false; @@ -1189,7 +1189,6 @@ if (mActor && !mActor->mDestroyed) { CompositableForwarder* currentFwd = mActor->mCompositableForwarder; - TextureForwarder* currentTexFwd = mActor->mTextureForwarder; if (currentFwd != aForwarder) { // It's a bit iffy but right now ShadowLayerForwarder inherits // TextureForwarder even though it should not. @@ -1197,7 +1196,8 @@ // the CompositorBridgeChild. It's Ok for a texture to move from a // ShadowLayerForwarder to another, but not form a CompositorBridgeChild // to another (they use different channels). - if (currentTexFwd && currentTexFwd != aForwarder->GetTextureForwarder()) { + if (mActor->mTextureForwarder && + mActor->mTextureForwarder != textureFwd) { gfxCriticalError() << "Attempt to move a texture to a different channel CF."; MOZ_ASSERT_UNREACHABLE("unexpected to be called"); @@ -1211,8 +1211,7 @@ return false; } mActor->mCompositableForwarder = aForwarder; - mActor->mUsesImageBridge = - aForwarder->GetTextureForwarder()->UsesImageBridge(); + mActor->mUsesImageBridge = textureFwd->UsesImageBridge(); } return true; } @@ -1225,8 +1224,7 @@ } // Try external image id allocation. - mExternalImageId = - aForwarder->GetTextureForwarder()->GetNextExternalImageId(); + mExternalImageId = textureFwd->GetNextExternalImageId(); ReadLockDescriptor readLockDescriptor = null_t(); @@ -1238,7 +1236,7 @@ } } - PTextureChild* actor = aForwarder->GetTextureForwarder()->CreateTexture( + PTextureChild* actor = textureFwd->CreateTexture( desc, std::move(readLockDescriptor), aForwarder->GetCompositorBackendType(), GetFlags(), dom::ContentParentId(), mSerial, mExternalImageId); @@ -1254,7 +1252,7 @@ mActor = static_cast(actor); mActor->mCompositableForwarder = aForwarder; - mActor->mTextureForwarder = aForwarder->GetTextureForwarder(); + mActor->mTextureForwarder = textureFwd; mActor->mTextureClient = this; // If the TextureClient is already locked, we have to lock TextureChild's @@ -1268,13 +1266,11 @@ bool TextureClient::InitIPDLActor(KnowsCompositor* aKnowsCompositor, const dom::ContentParentId& aContentId) { + RefPtr textureFwd = aKnowsCompositor->GetTextureForwarder(); MOZ_ASSERT(aKnowsCompositor && - aKnowsCompositor->GetTextureForwarder()->GetThread() == - mAllocator->GetThread()); - TextureForwarder* fwd = aKnowsCompositor->GetTextureForwarder(); + textureFwd->GetThread() == mAllocator->GetThread()); if (mActor && !mActor->mDestroyed) { CompositableForwarder* currentFwd = mActor->mCompositableForwarder; - TextureForwarder* currentTexFwd = mActor->mTextureForwarder; if (currentFwd) { gfxCriticalError() @@ -1282,12 +1278,12 @@ return false; } - if (currentTexFwd && currentTexFwd != fwd) { + if (mActor->mTextureForwarder && mActor->mTextureForwarder != textureFwd) { gfxCriticalError() << "Attempt to move a texture to a different channel TF."; return false; } - mActor->mTextureForwarder = fwd; + mActor->mTextureForwarder = textureFwd; return true; } MOZ_ASSERT(!mActor || mActor->mDestroyed, @@ -1299,8 +1295,7 @@ } // Try external image id allocation. - mExternalImageId = - aKnowsCompositor->GetTextureForwarder()->GetNextExternalImageId(); + mExternalImageId = textureFwd->GetNextExternalImageId(); ReadLockDescriptor readLockDescriptor = null_t(); { @@ -1311,10 +1306,10 @@ } } - PTextureChild* actor = - fwd->CreateTexture(desc, std::move(readLockDescriptor), - aKnowsCompositor->GetCompositorBackendType(), - GetFlags(), aContentId, mSerial, mExternalImageId); + PTextureChild* actor = textureFwd->CreateTexture( + desc, std::move(readLockDescriptor), + aKnowsCompositor->GetCompositorBackendType(), GetFlags(), aContentId, + mSerial, mExternalImageId); if (!actor) { gfxCriticalNote << static_cast(desc.type()) << ", " << static_cast( @@ -1325,7 +1320,7 @@ } mActor = static_cast(actor); - mActor->mTextureForwarder = fwd; + mActor->mTextureForwarder = textureFwd; mActor->mTextureClient = this; // If the TextureClient is already locked, we have to lock TextureChild's @@ -1344,9 +1339,9 @@ KnowsCompositor* aAllocator, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { - return TextureClient::CreateForDrawing(aAllocator->GetTextureForwarder(), - aFormat, aSize, aAllocator, aSelector, - aTextureFlags, aAllocFlags); + return TextureClient::CreateForDrawing( + aAllocator->GetTextureForwarder().get(), aFormat, aSize, aAllocator, + aSelector, aTextureFlags, aAllocFlags); } // static @@ -1419,8 +1414,8 @@ #endif if (data) { - return MakeAndAddRef(data, aTextureFlags, - aAllocator->GetTextureForwarder()); + return MakeAndAddRef( + data, aTextureFlags, aAllocator->GetTextureForwarder().get()); } // Fall back to using UpdateFromSurface @@ -1449,7 +1444,7 @@ gfx::BackendType aMoz2DBackend, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { return CreateForRawBufferAccess( - aAllocator->GetTextureForwarder(), aFormat, aSize, aMoz2DBackend, + aAllocator->GetTextureForwarder().get(), aFormat, aSize, aMoz2DBackend, aAllocator->GetCompositorBackendType(), aTextureFlags, aAllocFlags); } @@ -1518,7 +1513,7 @@ } return MakeAndAddRef(data, aTextureFlags, - aAllocator->GetTextureForwarder()); + aAllocator->GetTextureForwarder().get()); } TextureClient::TextureClient(TextureData* aData, TextureFlags aFlags, @@ -1721,7 +1716,9 @@ case ReadLockDescriptor::TUntrustedShmemSection: { const UntrustedShmemSection& untrusted = aDescriptor.get_UntrustedShmemSection(); - Maybe section = ShmemSection::FromUntrusted(untrusted); + size_t minSize = sizeof(ShmemTextureReadLock::ShmReadLockInfo); + Maybe section = + ShmemSection::FromUntrusted(untrusted, minSize); if (section.isNothing()) { return nullptr; } diff -Nru firefox-esr-140.9.1esr/gfx/layers/composite/TextureHost.cpp firefox-esr-140.10.0esr/gfx/layers/composite/TextureHost.cpp --- firefox-esr-140.9.1esr/gfx/layers/composite/TextureHost.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/composite/TextureHost.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -123,9 +123,12 @@ ReadLockDescriptor&& aReadLock, LayersBackend aLayersBackend, TextureFlags aFlags, const dom::ContentParentId& aContentId, uint64_t aSerial, const wr::MaybeExternalImageId& aExternalImageId) { + MOZ_ASSERT(!(aFlags & TextureFlags::DEALLOCATE_CLIENT)); + + TextureFlags flags = aFlags & ~TextureFlags::DEALLOCATE_CLIENT; TextureParent* actor = new TextureParent(aAllocator, aContentId, aSerial, aExternalImageId); - if (!actor->Init(aSharedData, std::move(aReadLock), aLayersBackend, aFlags)) { + if (!actor->Init(aSharedData, std::move(aReadLock), aLayersBackend, flags)) { actor->ActorDestroy(ipc::IProtocol::ActorDestroyReason::FailedConstructor); delete actor; return nullptr; @@ -264,17 +267,19 @@ switch (data.type()) { case MemoryOrShmem::TShmem: { const ipc::Shmem& shmem = data.get_Shmem(); - const BufferDescriptor& desc = bufferDesc.desc(); if (!shmem.IsReadable()) { - // We failed to map the shmem so we can't verify its size. This - // should not be a fatal error, so just create the texture with - // nothing backing it. - result = new ShmemTextureHost(shmem, desc, aDeallocator, aFlags); - break; + // We failed to map the shmem so we can't verify its size. + // Attempting to construct a ShmemTextureHost with it will succeed, + // but the resulting object will have a null shmem and can't ever be + // locked or mapped -- it's not useful at all. We just return + // nullptr instead. + gfxCriticalError() << "Failed texture host with unmappable shmem."; + return nullptr; } size_t bufSize = shmem.Size(); size_t reqSize = SIZE_MAX; + const BufferDescriptor& desc = bufferDesc.desc(); switch (desc.type()) { case BufferDescriptor::TYCbCrDescriptor: { const YCbCrDescriptor& ycbcr = desc.get_YCbCrDescriptor(); @@ -506,6 +511,10 @@ } else { texture = new wr::RenderBufferTextureHost(GetBuffer(), GetBufferDescriptor()); + + if (auto* shmemTextureHost = AsShmemTextureHost()) { + shmemTextureHost->OnRenderTextureCreated(texture); + } } wr::RenderThread::Get()->RegisterExternalImage(aExternalImageId, @@ -538,7 +547,10 @@ : wr::ExternalImageType::Buffer(); if (GetFormat() != gfx::SurfaceFormat::YUV420) { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected keys lenght"); + return; + } wr::ImageDescriptor descriptor( GetSize(), @@ -547,7 +559,10 @@ (aResources.*method)(aImageKeys[0], descriptor, aExtID, imageType, 0, /* aNormalizedUvs */ false); } else { - MOZ_ASSERT(aImageKeys.length() == 3); + if (aImageKeys.length() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected keys lenght"); + return; + } const layers::YCbCrDescriptor& desc = mDescriptor.get_YCbCrDescriptor(); gfx::IntSize ySize = desc.display().Size(); @@ -578,13 +593,19 @@ bool useExternalSurface = aFlags.contains(PushDisplayItemFlag::SUPPORTS_EXTERNAL_BUFFER_TEXTURES); if (GetFormat() != gfx::SurfaceFormat::YUV420) { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, preferCompositorSurface, useExternalSurface); } else { - MOZ_ASSERT(aImageKeys.length() == 3); + if (aImageKeys.length() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } const YCbCrDescriptor& desc = mDescriptor.get_YCbCrDescriptor(); aBuilder.PushYCbCrPlanarImage( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], aImageKeys[2], @@ -714,6 +735,9 @@ NS_WARNING("BufferTextureHost: unsupported format!"); return nullptr; } + if (!GetBuffer()) { + return nullptr; + } if (mFormat == gfx::SurfaceFormat::YUV420) { result = ImageDataSerializer::DataSourceSurfaceFromYCbCrDescriptor( GetBuffer(), mDescriptor.get_YCbCrDescriptor(), aSurface); @@ -721,10 +745,29 @@ return nullptr; } } else { + auto stride = + ImageDataSerializer::GetRGBStride(mDescriptor.get_RGBDescriptor()); + + struct Closure { + RefPtr mEventTarget; + RefPtr mRunnable; + }; + + RefPtr eventTarget = CompositorThread(); + RefPtr runnable = + NS_NewRunnableFunction("BufferTextureHost::GetAsSurface::Runnable", + [self = RefPtr{this}]() {}); + + Closure* closure = new Closure{eventTarget.forget(), runnable.forget()}; + + auto destroyedCallback = [](void* aClosure) mutable { + auto* closure = static_cast(aClosure); + closure->mEventTarget->Dispatch(closure->mRunnable.forget()); + delete closure; + }; + result = gfx::Factory::CreateWrappingDataSourceSurface( - GetBuffer(), - ImageDataSerializer::GetRGBStride(mDescriptor.get_RGBDescriptor()), - mSize, mFormat); + GetBuffer(), stride, mSize, mFormat, destroyedCallback, closure); } return result.forget(); } @@ -734,8 +777,12 @@ ISurfaceAllocator* aDeallocator, TextureFlags aFlags) : BufferTextureHost(aDesc, aFlags), mDeallocator(aDeallocator) { + MOZ_ASSERT(!(mFlags & TextureFlags::DEALLOCATE_CLIENT)); + if (aShmem.IsReadable()) { - mShmem = MakeUnique(aShmem); + UniquePtr shmem = MakeUnique(aShmem); + mShmemDeallocRunnable = + new ShmemDeallocRunnable(mDeallocator, std::move(shmem)); } else { // This can happen if we failed to map the shmem on this process, perhaps // because it was big and we didn't have enough contiguous address space @@ -750,35 +797,69 @@ } ShmemTextureHost::~ShmemTextureHost() { - MOZ_ASSERT(!mShmem || (mFlags & TextureFlags::DEALLOCATE_CLIENT), - "Leaking our buffer"); DeallocateDeviceData(); MOZ_COUNT_DTOR(ShmemTextureHost); } -void ShmemTextureHost::DeallocateSharedData() { - if (mShmem) { - MOZ_ASSERT(mDeallocator, - "Shared memory would leak without a ISurfaceAllocator"); - mDeallocator->AsShmemAllocator()->DeallocShmem(*mShmem); - mShmem = nullptr; +void ShmemTextureHost::DeallocateSharedData() {} + +void ShmemTextureHost::ForgetSharedData() {} + +void ShmemTextureHost::OnShutdown() { mShmemDeallocRunnable = nullptr; } + +ShmemTextureHost::ShmemDeallocRunnable::ShmemDeallocRunnable( + ISurfaceAllocator* aDeallocator, UniquePtr&& aShmem) + : Runnable("ShmemDeallocRunnable"), + mDeallocator(aDeallocator), + mShmem(std::move(aShmem)) {} + +nsresult ShmemTextureHost::ShmemDeallocRunnable::Run() { + if (!mDeallocator || !mShmem) { + return NS_OK; } + mDeallocator->AsShmemAllocator()->DeallocShmem(*mShmem); + mShmem = nullptr; + return NS_OK; } -void ShmemTextureHost::ForgetSharedData() { - if (mShmem) { - mShmem = nullptr; +ShmemTextureHost::ShmemDeallocRunnable::~ShmemDeallocRunnable() { + if (!mDeallocator || !mShmem) { + return; } + mDeallocator->AsShmemAllocator()->DeallocShmem(*mShmem); } -void ShmemTextureHost::OnShutdown() { mShmem = nullptr; } +void ShmemTextureHost::OnRenderTextureCreated( + wr::RenderTextureHost* aRenderTexture) { + MOZ_ASSERT(aRenderTexture); + + if (!mShmemDeallocRunnable || !mShmemDeallocRunnable->GetShmem()) { + return; + } + + RefPtr eventTarget = GetCurrentSerialEventTarget(); + RefPtr runnable = mShmemDeallocRunnable; + + auto destroyedCallback = [eventTarget = std::move(eventTarget), + runnable = std::move(runnable)]() mutable { + eventTarget->Dispatch(runnable.forget()); + }; + + aRenderTexture->SetDestroyedCallback(destroyedCallback); +} uint8_t* ShmemTextureHost::GetBuffer() { - return mShmem ? mShmem->get() : nullptr; + if (mShmemDeallocRunnable && mShmemDeallocRunnable->GetShmem()) { + return mShmemDeallocRunnable->GetShmem()->get(); + } + return nullptr; } size_t ShmemTextureHost::GetBufferSize() { - return mShmem ? mShmem->Size() : 0; + if (mShmemDeallocRunnable && mShmemDeallocRunnable->GetShmem()) { + return mShmemDeallocRunnable->GetShmem()->Size(); + } + return 0; } MemoryTextureHost::MemoryTextureHost(uint8_t* aBuffer, diff -Nru firefox-esr-140.9.1esr/gfx/layers/composite/TextureHost.h firefox-esr-140.10.0esr/gfx/layers/composite/TextureHost.h --- firefox-esr-140.9.1esr/gfx/layers/composite/TextureHost.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/composite/TextureHost.h 2026-04-15 01:59:49.000000000 +0000 @@ -50,6 +50,7 @@ namespace wr { class DisplayListBuilder; class TransactionBuilder; +class RenderTextureHost; } // namespace wr namespace layers { @@ -903,9 +904,25 @@ ShmemTextureHost* AsShmemTextureHost() override { return this; } + void OnRenderTextureCreated(wr::RenderTextureHost* aRenderTexture); + protected: - UniquePtr mShmem; + class ShmemDeallocRunnable final : public Runnable { + public: + ShmemDeallocRunnable(ISurfaceAllocator* aDeallocator, + UniquePtr&& aShmem); + NS_IMETHOD Run() override; + mozilla::ipc::Shmem* GetShmem() { return mShmem.get(); } + + protected: + virtual ~ShmemDeallocRunnable(); + + RefPtr mDeallocator; + UniquePtr mShmem; + }; + RefPtr mDeallocator; + RefPtr mShmemDeallocRunnable; }; /** diff -Nru firefox-esr-140.9.1esr/gfx/layers/d3d11/TextureD3D11.cpp firefox-esr-140.10.0esr/gfx/layers/d3d11/TextureD3D11.cpp --- firefox-esr-140.9.1esr/gfx/layers/d3d11/TextureD3D11.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/d3d11/TextureD3D11.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -494,7 +494,8 @@ data->SetColorRange(aColorRange); RefPtr textureClient = MakeAndAddRef( - data, TextureFlags::NO_FLAGS, aKnowsCompositor->GetTextureForwarder()); + data, TextureFlags::NO_FLAGS, + aKnowsCompositor->GetTextureForwarder().get()); const auto textureId = GpuProcessD3D11TextureMap::GetNextTextureId(); data->SetGpuProcessTextureId(textureId); @@ -1338,7 +1339,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } wr::ImageDescriptor descriptor(mSize, GetFormat()); // Prefer TextureExternal unless the backend requires TextureRect. @@ -1357,7 +1361,11 @@ case gfx::SurfaceFormat::P010: case gfx::SurfaceFormat::P016: case gfx::SurfaceFormat::NV12: { - MOZ_ASSERT(aImageKeys.length() == 2); + if (aImageKeys.length() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } + MOZ_ASSERT(mSize.width % 2 == 0); MOZ_ASSERT(mSize.height % 2 == 0); @@ -1412,7 +1420,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, @@ -1427,7 +1438,10 @@ // it may be handled as if it was DXGI_FORMAT_P016. This is approximately // perceptually correct. However, due to rounding error, the precise // quantized value after sampling may be off by 1. - MOZ_ASSERT(aImageKeys.length() == 2); + if (aImageKeys.length() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushNV12Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], GetFormat() == gfx::SurfaceFormat::NV12 ? wr::ColorDepth::Color8 @@ -1515,8 +1529,13 @@ return; } + if (aImageKeys.length() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } + MOZ_ASSERT(mHandles[0] && mHandles[1] && mHandles[2]); - MOZ_ASSERT(aImageKeys.length() == 3); + // Assume the chroma planes are rounded up if the luma plane is odd sized. MOZ_ASSERT((mSizeCbCr.width == mSizeY.width || mSizeCbCr.width == (mSizeY.width + 1) >> 1) && @@ -1560,7 +1579,10 @@ return; } - MOZ_ASSERT(aImageKeys.length() == 3); + if (aImageKeys.length() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushYCbCrPlanarImage( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], aImageKeys[2], diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/APZInputBridgeChild.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/APZInputBridgeChild.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/APZInputBridgeChild.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/APZInputBridgeChild.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -205,7 +205,9 @@ aDoubleTapToZoomMetrics); return; } - dom::BrowserParent* tab = + // Hold strong reference to BrowserParent because SendHandleTap + // can run script via SetFocus. + RefPtr tab = dom::BrowserParent::GetBrowserParentFromLayersId(aGuid.mLayersId); if (tab) { #ifdef MOZ_WIDGET_ANDROID diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/CanvasChild.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/CanvasChild.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/CanvasChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/CanvasChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -142,20 +142,18 @@ } already_AddRefed GetDataSurface() final { - EnsureDataSurfaceOnMainThread(); + MutexAutoLock lock(mDataSurfaceLock); + EnsureDataSurfaceOnMainThread(lock); return do_AddRef(mDataSourceSurface); } void AttachSurface() { mDetached = false; } - void DetachSurface() { mDetached = true; } + void DetachSurface(bool aInvalidate = false) { + mDetached = true; - void InvalidateDataSurface() { - if (mDataSourceSurface && mMayInvalidate) { - // This must be the only reference to the data left. - MOZ_ASSERT(mDataSourceSurface->hasOneRef()); - mDataSourceSurface = - gfx::Factory::CopyDataSourceSurface(mDataSourceSurface); - mMayInvalidate = false; + if (aInvalidate) { + MutexAutoLock lock(mDataSurfaceLock); + InvalidateDataSurface(lock); } } @@ -165,6 +163,10 @@ } bool GetSurfaceDescriptor(SurfaceDescriptor& aDesc) final { + if (!NS_IsMainThread()) { + // Only allow recording surface upload optimization on main thread. + return false; + } static Atomic sNextExportID(0); if (!mExportID) { mExportID = gfx::ReferencePtr(++sNextExportID); @@ -177,11 +179,31 @@ } private: - void EnsureDataSurfaceOnMainThread() { - // The data can only be retrieved on the main thread. - if (!mDataSourceSurface && NS_IsMainThread()) { - mDataSourceSurface = mCanvasChild->GetDataSurface( - mTextureOwnerId, mRecordedSurface, mDetached, mMayInvalidate); + void InvalidateDataSurface(const MutexAutoLock& aProofOfLock) + MOZ_REQUIRES(mDataSurfaceLock) { + // The data is about to be invalidated and must be copied before it is + // modified. + if (mDataSourceSurface && mMayInvalidate) { + mDataSourceSurface = + gfx::Factory::CopyDataSourceSurface(mDataSourceSurface); + mMayInvalidate = false; + } + } + + void EnsureDataSurfaceOnMainThread(const MutexAutoLock& aProofOfLock) + MOZ_REQUIRES(mDataSurfaceLock) { + if (NS_IsMainThread()) { + // The data can only be retrieved on the main thread. + if (!mDataSourceSurface) { + mDataSourceSurface = mCanvasChild->GetDataSurface( + mTextureOwnerId, mRecordedSurface, mDetached, mMayInvalidate); + } + } else { + // If data is going to be accessed on another thread, then copy the data + // if necessary before access. This avoids the main thread accidentally + // trying to invalidate the data surface while the other thread is still + // accessing it. + InvalidateDataSurface(aProofOfLock); } } @@ -207,9 +229,11 @@ RefPtr mRecordedSurface; RefPtr mCanvasChild; RefPtr mRecorder; - RefPtr mDataSourceSurface; + Mutex mDataSurfaceLock{"SourceSurfaceCanvasRecording::mDataSurfaceLock"}; + RefPtr mDataSourceSurface + MOZ_GUARDED_BY(mDataSurfaceLock); + bool mMayInvalidate MOZ_GUARDED_BY(mDataSurfaceLock) = false; bool mDetached = false; - bool mMayInvalidate = false; ReferencePtr mExportID; }; @@ -679,10 +703,7 @@ bool aInvalidate) { if (auto* surface = static_cast(aSurface.get())) { - surface->DetachSurface(); - if (aInvalidate) { - surface->InvalidateDataSurface(); - } + surface->DetachSurface(aInvalidate); } } diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/CanvasTranslator.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/CanvasTranslator.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/CanvasTranslator.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/CanvasTranslator.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -1587,11 +1587,36 @@ if (usedDescriptor.isSome() && usedDescriptor.ref() == aSurfaceDescriptor) { MOZ_ASSERT(usedSurf); MOZ_ASSERT(usedWrapper); - MOZ_ASSERT(aTextureHost->GetSize() == usedSurf->GetSize()); - // Since the data is the same as before, the DataSourceSurfaceWrapper can be - // reused. - return do_AddRef(usedWrapper); + auto* bufferTextureHost = aTextureHost->AsBufferTextureHost(); + if (bufferTextureHost) { + if (usedSurf->GetType() == gfx::SurfaceType::DATA_ALIGNED) { + // Buffer of DataSourceSurface is owned by DataSourceSurface + MOZ_ASSERT(aTextureHost->GetSize() == usedSurf->GetSize()); + if (aTextureHost->GetSize() == usedSurf->GetSize()) { + // Since the data is the same as before, the DataSourceSurfaceWrapper + // can be reused. + return do_AddRef(usedWrapper); + } else { + mUsedDataSurfaceForSurfaceDescriptor = nullptr; + mUsedWrapperForSurfaceDescriptor = nullptr; + mUsedSurfaceDescriptorForSurfaceDescriptor = Nothing(); + } + } else { + // Buffer of DataSourceSurface is owned by BufferTextureHost + if (bufferTextureHost->GetBuffer() && + bufferTextureHost->GetBuffer() == usedSurf->GetData() && + aTextureHost->GetSize() == usedSurf->GetSize() && + aTextureHost->GetFormat() == usedSurf->GetFormat()) { + // Since the data is the same as before, the DataSourceSurfaceWrapper + // can be reused. + return do_AddRef(usedWrapper); + } + mUsedDataSurfaceForSurfaceDescriptor = nullptr; + mUsedWrapperForSurfaceDescriptor = nullptr; + mUsedSurfaceDescriptorForSurfaceDescriptor = Nothing(); + } + } } usedWrapper = nullptr; diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/CompositableTransactionParent.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/CompositableTransactionParent.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/CompositableTransactionParent.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/CompositableTransactionParent.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -19,6 +19,7 @@ #include "mozilla/Unused.h" #include "nsDebug.h" // for NS_WARNING, NS_ASSERTION #include "nsRegion.h" // for nsIntRegion +#include "nsTHashSet.h" namespace mozilla { namespace layers { @@ -126,6 +127,21 @@ } } +void CompositableParentManager::DestroyActors( + const nsTArray& aToDestroy) { + nsTHashSet seenTextureParents; + for (const auto& op : aToDestroy) { + if (op.type() == OpDestroy::TPTexture) { + PTextureParent* textureParent = op.get_PTexture().AsParent(); + if (!seenTextureParents.EnsureInserted(textureParent)) { + // Already destroyed this one in the current batch; skip. + continue; + } + } + DestroyActor(op); + } +} + RefPtr CompositableParentManager::AddCompositable( const CompositableHandle& aHandle, const TextureInfo& aInfo) { if (mCompositables.find(aHandle.Value()) != mCompositables.end()) { diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/CompositableTransactionParent.h firefox-esr-140.10.0esr/gfx/layers/ipc/CompositableTransactionParent.h --- firefox-esr-140.9.1esr/gfx/layers/ipc/CompositableTransactionParent.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/CompositableTransactionParent.h 2026-04-15 01:59:50.000000000 +0000 @@ -28,6 +28,8 @@ void DestroyActor(const OpDestroy& aOp); + void DestroyActors(const nsTArray& aToDestroy); + void UpdateFwdTransactionId(uint64_t aTransactionId) { MOZ_ASSERT(mFwdTransactionId < aTransactionId); mFwdTransactionId = aTransactionId; diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/CompositorBridgeChild.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/CompositorBridgeChild.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/CompositorBridgeChild.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/CompositorBridgeChild.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -391,7 +391,7 @@ PTextureChild* CompositorBridgeChild::AllocPTextureChild( const SurfaceDescriptor&, ReadLockDescriptor&, const LayersBackend&, - const TextureFlags&, const LayersId&, const uint64_t& aSerial, + const TextureFlags&, const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId) { return TextureClient::CreateIPDLActor(); } @@ -513,11 +513,11 @@ wr::MaybeExternalImageId& aExternalImageId) { PTextureChild* textureChild = AllocPTextureChild(aSharedData, aReadLock, aLayersBackend, aFlags, - LayersId{0} /* FIXME */, aSerial, aExternalImageId); + aSerial, aExternalImageId); - return SendPTextureConstructor( - textureChild, aSharedData, std::move(aReadLock), aLayersBackend, aFlags, - LayersId{0} /* FIXME? */, aSerial, aExternalImageId); + return SendPTextureConstructor(textureChild, aSharedData, + std::move(aReadLock), aLayersBackend, aFlags, + aSerial, aExternalImageId); } already_AddRefed CompositorBridgeChild::GetCanvasChild() { diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/CompositorBridgeChild.h firefox-esr-140.10.0esr/gfx/layers/ipc/CompositorBridgeChild.h --- firefox-esr-140.9.1esr/gfx/layers/ipc/CompositorBridgeChild.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/CompositorBridgeChild.h 2026-04-15 01:59:50.000000000 +0000 @@ -88,7 +88,7 @@ PTextureChild* AllocPTextureChild( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const LayersId& aId, const uint64_t& aSerial, + const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId); bool DeallocPTextureChild(PTextureChild* actor); diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/CompositorBridgeParent.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/CompositorBridgeParent.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/CompositorBridgeParent.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/CompositorBridgeParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -1693,8 +1693,7 @@ PTextureParent* CompositorBridgeParent::AllocPTextureParent( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const LayersId& aId, const uint64_t& aSerial, - const wr::MaybeExternalImageId& aExternalImageId) { + const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId) { return TextureHost::CreateIPDLActor( this, aSharedData, std::move(aReadLock), aLayersBackend, aFlags, mCompositorManager->GetContentId(), aSerial, aExternalImageId); diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/CompositorBridgeParent.h firefox-esr-140.10.0esr/gfx/layers/ipc/CompositorBridgeParent.h --- firefox-esr-140.9.1esr/gfx/layers/ipc/CompositorBridgeParent.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/CompositorBridgeParent.h 2026-04-15 01:59:49.000000000 +0000 @@ -161,7 +161,7 @@ virtual PTextureParent* AllocPTextureParent( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aBackend, const TextureFlags& aTextureFlags, - const LayersId& id, const uint64_t& aSerial, + const uint64_t& aSerial, const MaybeExternalImageId& aExternalImageId) = 0; virtual bool DeallocPTextureParent(PTextureParent* aActor) = 0; @@ -316,7 +316,7 @@ PTextureParent* AllocPTextureParent( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const LayersId& aId, const uint64_t& aSerial, + const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId) override; bool DeallocPTextureParent(PTextureParent* actor) override; diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/CompositorThread.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/CompositorThread.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/CompositorThread.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/CompositorThread.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -136,7 +136,9 @@ ImageBridgeParent::Shutdown(); gfx::VRManagerParent::Shutdown(); - MediaSystemResourceService::Shutdown(); + CompositorThread()->Dispatch( + NS_NewRunnableFunction("MediaSystemResourceService::Shutdown", + []() { MediaSystemResourceService::Shutdown(); })); CompositorManagerParent::Shutdown(); gfx::gfxGradientCache::Shutdown(); diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/ContentCompositorBridgeParent.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/ContentCompositorBridgeParent.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -211,6 +211,10 @@ mozilla::ipc::IPCResult ContentCompositorBridgeParent::RecvNotifyChildCreated( const LayersId& child, CompositorOptions* aOptions) { + if (NS_WARN_IF(!LayerTreeOwnerTracker::Get()->IsMapped(child, OtherPid()))) { + return IPC_OK(); + } + StaticMonitorAutoLock lock(CompositorBridgeParent::sIndirectLayerTreesLock); for (auto it = CompositorBridgeParent::sIndirectLayerTrees.begin(); it != CompositorBridgeParent::sIndirectLayerTrees.end(); it++) { @@ -381,32 +385,7 @@ PTextureParent* ContentCompositorBridgeParent::AllocPTextureParent( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const LayersId& aId, const uint64_t& aSerial, - const wr::MaybeExternalImageId& aExternalImageId) { - CompositorBridgeParent::LayerTreeState* state = nullptr; - - StaticMonitorAutoLock lock(CompositorBridgeParent::sIndirectLayerTreesLock); - auto itr = CompositorBridgeParent::sIndirectLayerTrees.find(aId); - if (CompositorBridgeParent::sIndirectLayerTrees.end() != itr) { - state = &itr->second; - } - - TextureFlags flags = aFlags; - - LayersBackend actualBackend = LayersBackend::LAYERS_NONE; - if (!state) { - // The compositor was recreated, and we're receiving layers updates for a - // a layer manager that will soon be discarded or invalidated. We can't - // return null because this will mess up deserialization later and we'll - // kill the content process. Instead, we signal that the underlying - // TextureHost should not attempt to access the compositor. - flags |= TextureFlags::INVALID_COMPOSITOR; - } else if (actualBackend != LayersBackend::LAYERS_NONE && - aLayersBackend != actualBackend) { - gfxDevCrash(gfx::LogReason::PAllocTextureBackendMismatch) - << "Texture backend is wrong"; - } - + const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId) { return TextureHost::CreateIPDLActor( this, aSharedData, std::move(aReadLock), aLayersBackend, aFlags, mCompositorManager->GetContentId(), aSerial, aExternalImageId); diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/ContentCompositorBridgeParent.h firefox-esr-140.10.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.h --- firefox-esr-140.9.1esr/gfx/layers/ipc/ContentCompositorBridgeParent.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.h 2026-04-15 01:59:50.000000000 +0000 @@ -122,7 +122,7 @@ PTextureParent* AllocPTextureParent( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const LayersId& aId, const uint64_t& aSerial, + const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId) override; bool DeallocPTextureParent(PTextureParent* actor) override; diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/ISurfaceAllocator.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/ISurfaceAllocator.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/ISurfaceAllocator.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/ISurfaceAllocator.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -18,6 +18,10 @@ mozilla::Atomic GfxMemoryImageReporter::sAmount(0); +RefPtr ISurfaceAllocator::GetTextureForwarder() { + return nullptr; +} + void HostIPCAllocator::SendPendingAsyncMessages() { if (mPendingAsyncMessage.empty()) { return; @@ -166,10 +170,13 @@ return; } + size_t headerSize = sizeof(ShmemSectionHeapAllocation); + MOZ_RELEASE_ASSERT(aShmemSection.offset() >= headerSize); + ShmemSectionHeapAllocation* allocHeader = reinterpret_cast( aShmemSection.shmem().get() + aShmemSection.offset() - - sizeof(ShmemSectionHeapAllocation)); + headerSize); MOZ_ASSERT(allocHeader->mSize == aShmemSection.size()); @@ -225,7 +232,11 @@ } Maybe ShmemSection::FromUntrusted( - const UntrustedShmemSection& aUntrusted) { + const UntrustedShmemSection& aUntrusted, size_t aMinimumSize) { + if (aUntrusted.size() < aMinimumSize) { + return Nothing(); + } + ShmemSection section; if (!section.Init(aUntrusted.shmem(), aUntrusted.offset(), aUntrusted.size())) { diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/ISurfaceAllocator.h firefox-esr-140.10.0esr/gfx/layers/ipc/ISurfaceAllocator.h --- firefox-esr-140.9.1esr/gfx/layers/ipc/ISurfaceAllocator.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/ISurfaceAllocator.h 2026-04-15 01:59:50.000000000 +0000 @@ -76,7 +76,7 @@ virtual CompositableForwarder* AsCompositableForwarder() { return nullptr; } - virtual TextureForwarder* GetTextureForwarder() { return nullptr; } + virtual RefPtr GetTextureForwarder(); virtual ClientIPCAllocator* AsClientAllocator() { return nullptr; } @@ -157,7 +157,7 @@ class ShmemSection { public: static Maybe FromUntrusted( - const UntrustedShmemSection& aUntrusted); + const UntrustedShmemSection& aUntrusted, size_t aMinSize); bool Init(const mozilla::ipc::Shmem& aShm, uint32_t offset, uint32_t size); UntrustedShmemSection AsUntrusted(); @@ -204,14 +204,6 @@ bool IsSurfaceDescriptorValid(const SurfaceDescriptor& aSurface); -already_AddRefed GetSurfaceForDescriptor( - const SurfaceDescriptor& aDescriptor); - -uint8_t* GetAddressFromDescriptor(const SurfaceDescriptor& aDescriptor); - -void DestroySurfaceDescriptor(mozilla::ipc::IShmemAllocator* aAllocator, - SurfaceDescriptor* aSurface); - class GfxMemoryImageReporter final : public nsIMemoryReporter { ~GfxMemoryImageReporter() = default; diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/ImageBridgeChild.h firefox-esr-140.10.0esr/gfx/layers/ipc/ImageBridgeChild.h --- firefox-esr-140.9.1esr/gfx/layers/ipc/ImageBridgeChild.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/ImageBridgeChild.h 2026-04-15 01:59:49.000000000 +0000 @@ -115,7 +115,7 @@ public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ImageBridgeChild, override); - TextureForwarder* GetTextureForwarder() override { return this; } + RefPtr GetTextureForwarder() override { return this; } LayersIPCActor* GetLayersIPCActor() override { return this; } /** diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/ImageBridgeParent.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/ImageBridgeParent.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/ImageBridgeParent.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/ImageBridgeParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -181,22 +181,7 @@ ~AutoImageBridgeParentAsyncMessageSender() { mImageBridge->SendPendingAsyncMessages(); if (mToDestroy) { - // Iterate mToDestroy but de-duplicate it to avoid destroying the - // same texture parent actor twice. - nsTHashSet seenTextureParents; - for (const auto& op : *mToDestroy) { - // Peek inside the op (as DestroyActor does) to see if we are about - // to destroy a PTextureParent. - if (op.type() == OpDestroy::TPTexture) { - PTextureParent* textureParent = op.get_PTexture().AsParent(); - if (!seenTextureParents.EnsureInserted(textureParent)) { - // Already seen, so skip this one. - continue; - } - } - - mImageBridge->DestroyActor(op); - } + mImageBridge->DestroyActors(*mToDestroy); } } diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/KnowsCompositor.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/KnowsCompositor.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/KnowsCompositor.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/KnowsCompositor.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "KnowsCompositor.h" -#include "mozilla/layers/ImageDataSerializer.h" #include "mozilla/layers/ImageBridgeChild.h" #include "mozilla/ipc/ProtocolUtils.h" @@ -38,7 +37,7 @@ KnowsCompositorMediaProxy::~KnowsCompositorMediaProxy() = default; -TextureForwarder* KnowsCompositorMediaProxy::GetTextureForwarder() { +RefPtr KnowsCompositorMediaProxy::GetTextureForwarder() { return mThreadSafeAllocator->GetTextureForwarder(); } @@ -56,53 +55,4 @@ aSurface.type() != SurfaceDescriptor::Tnull_t; } -uint8_t* GetAddressFromDescriptor(const SurfaceDescriptor& aDescriptor) { - MOZ_ASSERT(IsSurfaceDescriptorValid(aDescriptor)); - MOZ_RELEASE_ASSERT( - aDescriptor.type() == SurfaceDescriptor::TSurfaceDescriptorBuffer, - "GFX: surface descriptor is not the right type."); - - auto memOrShmem = aDescriptor.get_SurfaceDescriptorBuffer().data(); - if (memOrShmem.type() == MemoryOrShmem::TShmem) { - return memOrShmem.get_Shmem().get(); - } else { - return reinterpret_cast(memOrShmem.get_uintptr_t()); - } -} - -already_AddRefed GetSurfaceForDescriptor( - const SurfaceDescriptor& aDescriptor) { - if (aDescriptor.type() != SurfaceDescriptor::TSurfaceDescriptorBuffer) { - return nullptr; - } - uint8_t* data = GetAddressFromDescriptor(aDescriptor); - auto rgb = - aDescriptor.get_SurfaceDescriptorBuffer().desc().get_RGBDescriptor(); - uint32_t stride = ImageDataSerializer::GetRGBStride(rgb); - return gfx::Factory::CreateWrappingDataSourceSurface(data, stride, rgb.size(), - rgb.format()); -} - -void DestroySurfaceDescriptor(ipc::IShmemAllocator* aAllocator, - SurfaceDescriptor* aSurface) { - MOZ_ASSERT(aSurface); - - SurfaceDescriptorBuffer& desc = aSurface->get_SurfaceDescriptorBuffer(); - switch (desc.data().type()) { - case MemoryOrShmem::TShmem: { - aAllocator->DeallocShmem(desc.data().get_Shmem()); - break; - } - case MemoryOrShmem::Tuintptr_t: { - uint8_t* ptr = (uint8_t*)desc.data().get_uintptr_t(); - GfxMemoryImageReporter::WillFree(ptr); - delete[] ptr; - break; - } - default: - MOZ_CRASH("surface type not implemented!"); - } - *aSurface = SurfaceDescriptor(); -} - } // namespace mozilla::layers diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/KnowsCompositor.h firefox-esr-140.10.0esr/gfx/layers/ipc/KnowsCompositor.h --- firefox-esr-140.9.1esr/gfx/layers/ipc/KnowsCompositor.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/KnowsCompositor.h 2026-04-15 01:59:49.000000000 +0000 @@ -183,7 +183,7 @@ /** * Helpers for finding other related interface. These are infallible. */ - virtual TextureForwarder* GetTextureForwarder() = 0; + virtual RefPtr GetTextureForwarder() = 0; virtual LayersIPCActor* GetLayersIPCActor() = 0; protected: @@ -215,7 +215,7 @@ explicit KnowsCompositorMediaProxy( const TextureFactoryIdentifier& aIdentifier); - TextureForwarder* GetTextureForwarder() override; + RefPtr GetTextureForwarder() override; LayersIPCActor* GetLayersIPCActor() override; diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/PCompositorBridge.ipdl firefox-esr-140.10.0esr/gfx/layers/ipc/PCompositorBridge.ipdl --- firefox-esr-140.9.1esr/gfx/layers/ipc/PCompositorBridge.ipdl 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/PCompositorBridge.ipdl 2026-04-15 01:59:50.000000000 +0000 @@ -185,7 +185,7 @@ sync StopFrameTimeRecording(uint32_t startIndex) returns (float[] intervals); - async PTexture(SurfaceDescriptor aSharedData, ReadLockDescriptor aReadLock, LayersBackend aBackend, TextureFlags aTextureFlags, LayersId id, uint64_t aSerial, MaybeExternalImageId aExternalImageId); + async PTexture(SurfaceDescriptor aSharedData, ReadLockDescriptor aReadLock, LayersBackend aBackend, TextureFlags aTextureFlags, uint64_t aSerial, MaybeExternalImageId aExternalImageId); sync SyncWithCompositor(); diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/PWebRenderBridge.ipdl firefox-esr-140.10.0esr/gfx/layers/ipc/PWebRenderBridge.ipdl --- firefox-esr-140.9.1esr/gfx/layers/ipc/PWebRenderBridge.ipdl 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/PWebRenderBridge.ipdl 2026-04-15 01:59:49.000000000 +0000 @@ -79,7 +79,7 @@ // Start capturing each frame to disk. See // nsIDOMWindowUtils::wrStartCaptureSequence for documentation. - async StartCaptureSequence(nsCString aPath, uint32_t aFlags); + async StartCaptureSequence(uint32_t aFlags); // Stop the captures started by StartCaptureSequence. See // nsIDOMWindowUtils::wrStopCaptureSequence for documentation. diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/RemoteContentController.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/RemoteContentController.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/RemoteContentController.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/RemoteContentController.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -71,7 +71,9 @@ ("HandleTapOnMainThread(%d)", (int)aTapType)); MOZ_ASSERT(NS_IsMainThread()); - dom::BrowserParent* tab = + // Hold strong reference to BrowserParent because SendHandleTap + // can run script via SetFocus. + RefPtr tab = dom::BrowserParent::GetBrowserParentFromLayersId(aGuid.mLayersId); if (tab) { tab->SendHandleTap(aTapType, aPoint, aModifiers, aGuid, aInputBlockId, diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/SharedSurfacesParent.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/SharedSurfacesParent.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/SharedSurfacesParent.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/SharedSurfacesParent.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -238,6 +238,11 @@ MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread()); MOZ_ASSERT(aPid != base::GetCurrentProcId()); + if (aDesc.format() != SurfaceFormat::B8G8R8X8 && + aDesc.format() != SurfaceFormat::B8G8R8A8) { + return; + } + RefPtr surface = new SourceSurfaceSharedDataWrapper(); diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/VideoBridgeChild.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/VideoBridgeChild.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/VideoBridgeChild.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/VideoBridgeChild.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -59,7 +59,7 @@ VideoBridgeChild::~VideoBridgeChild() = default; -VideoBridgeChild* VideoBridgeChild::GetSingleton() { +RefPtr VideoBridgeChild::GetSingleton() { StaticMutexAutoLock lock(sVideoBridgeLock); return sVideoBridge; } diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/VideoBridgeChild.h firefox-esr-140.10.0esr/gfx/layers/ipc/VideoBridgeChild.h --- firefox-esr-140.9.1esr/gfx/layers/ipc/VideoBridgeChild.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/VideoBridgeChild.h 2026-04-15 01:59:50.000000000 +0000 @@ -25,7 +25,7 @@ static void StartupForGPUProcess(); static void Shutdown(); - static VideoBridgeChild* GetSingleton(); + static RefPtr GetSingleton(); // PVideoBridgeChild PTextureChild* AllocPTextureChild(const SurfaceDescriptor& aSharedData, diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/VideoBridgeParent.cpp firefox-esr-140.10.0esr/gfx/layers/ipc/VideoBridgeParent.cpp --- firefox-esr-140.9.1esr/gfx/layers/ipc/VideoBridgeParent.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/VideoBridgeParent.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -99,16 +99,16 @@ MOZ_ASSERT(mCompositorThreadHolder->IsInThread()); - auto* actor = mTextureMap[aSerial]; - if (NS_WARN_IF(!actor)) { + const auto i = mTextureMap.find(aSerial); + if (NS_WARN_IF(i == mTextureMap.end())) { return nullptr; } - if (NS_WARN_IF(aContentId != TextureHost::GetTextureContentId(actor))) { + if (NS_WARN_IF(aContentId != i->second.mContentId)) { return nullptr; } - return do_AddRef(TextureHost::AsTextureHost(actor)); + return do_AddRef(i->second.mTextureHost); } already_AddRefed VideoBridgeParent::LookupTexture( @@ -120,12 +120,12 @@ return nullptr; } - auto* actor = mTextureMap[aSerial]; - if (actor) { - if (NS_WARN_IF(aContentId != TextureHost::GetTextureContentId(actor))) { + auto i = mTextureMap.find(aSerial); + if (i != mTextureMap.end()) { + if (NS_WARN_IF(aContentId != i->second.mContentId)) { return nullptr; } - return do_AddRef(TextureHost::AsTextureHost(actor)); + return do_AddRef(i->second.mTextureHost); } // We cannot block on the Compositor thread because that is the thread we get @@ -166,16 +166,16 @@ lock.Wait(); } - actor = mTextureMap[aSerial]; - if (!actor) { + i = mTextureMap.find(aSerial); + if (NS_WARN_IF(i == mTextureMap.end())) { return nullptr; } - if (NS_WARN_IF(aContentId != TextureHost::GetTextureContentId(actor))) { + if (NS_WARN_IF(aContentId != i->second.mContentId)) { return nullptr; } - return do_AddRef(TextureHost::AsTextureHost(actor)); + return do_AddRef(i->second.mTextureHost); } void VideoBridgeParent::ActorDestroy(ActorDestroyReason aWhy) { @@ -259,13 +259,21 @@ } MonitorAutoLock lock(mMonitor); - mTextureMap[aSerial] = parent; + mTextureMap.insert( + {aSerial, {TextureHost::AsTextureHost(parent), aContentId}}); return parent; } bool VideoBridgeParent::DeallocPTextureParent(PTextureParent* actor) { - MonitorAutoLock lock(mMonitor); - mTextureMap.erase(TextureHost::GetTextureSerial(actor)); + RefPtr textureHost; + { + MonitorAutoLock lock(mMonitor); + auto i = mTextureMap.find(TextureHost::GetTextureSerial(actor)); + if (i != mTextureMap.end()) { + textureHost = std::move(i->second.mTextureHost); + mTextureMap.erase(i); + } + } return TextureHost::DestroyIPDLActor(actor); } diff -Nru firefox-esr-140.9.1esr/gfx/layers/ipc/VideoBridgeParent.h firefox-esr-140.10.0esr/gfx/layers/ipc/VideoBridgeParent.h --- firefox-esr-140.9.1esr/gfx/layers/ipc/VideoBridgeParent.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/ipc/VideoBridgeParent.h 2026-04-15 01:59:50.000000000 +0000 @@ -74,10 +74,15 @@ void DoUnregisterExternalImages(); + struct TextureHolder { + RefPtr mTextureHost; + dom::ContentParentId mContentId; + }; + Monitor mMonitor; RefPtr mCompositorThreadHolder MOZ_GUARDED_BY(mMonitor); - std::map mTextureMap MOZ_GUARDED_BY(mMonitor); + std::map mTextureMap MOZ_GUARDED_BY(mMonitor); bool mClosed; }; diff -Nru firefox-esr-140.9.1esr/gfx/layers/opengl/DMABUFTextureHostOGL.cpp firefox-esr-140.10.0esr/gfx/layers/opengl/DMABUFTextureHostOGL.cpp --- firefox-esr-140.9.1esr/gfx/layers/opengl/DMABUFTextureHostOGL.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/opengl/DMABUFTextureHostOGL.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -94,7 +94,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8X8: case gfx::SurfaceFormat::B8G8R8A8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } // XXX Add RGBA handling. Temporary hack to avoid crash // With BGRA format setting, rendering works without problem. wr::ImageDescriptor descriptor(GetSize(), mSurface->GetFormat()); @@ -103,8 +106,10 @@ break; } case gfx::SurfaceFormat::NV12: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetWidth(0), mSurface->GetHeight(0)), gfx::SurfaceFormat::A8); @@ -118,8 +123,10 @@ break; } case gfx::SurfaceFormat::YUV420: { - MOZ_ASSERT(aImageKeys.length() == 3); - MOZ_ASSERT(mSurface->GetTextureCount() == 3); + if (aImageKeys.length() != 3 || mSurface->GetTextureCount() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetWidth(0), mSurface->GetHeight(0)), gfx::SurfaceFormat::A8); @@ -135,8 +142,10 @@ break; } case gfx::SurfaceFormat::P010: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetWidth(0), mSurface->GetHeight(0)), gfx::SurfaceFormat::A16); @@ -150,8 +159,10 @@ break; } case gfx::SurfaceFormat::NV16: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetWidth(0), mSurface->GetHeight(0)), gfx::SurfaceFormat::A16); @@ -185,7 +196,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, @@ -194,8 +208,10 @@ break; } case gfx::SurfaceFormat::NV12: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } // Those images can only be generated at present by the VAAPI H264 decoder // which only supports 8 bits color depth. aBuilder.PushNV12Image( @@ -206,8 +222,10 @@ break; } case gfx::SurfaceFormat::YUV420: { - MOZ_ASSERT(aImageKeys.length() == 3); - MOZ_ASSERT(mSurface->GetTextureCount() == 3); + if (aImageKeys.length() != 3 || mSurface->GetTextureCount() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } // Those images can only be generated at present by the VAAPI vp8 decoder // which only supports 8 bits color depth. aBuilder.PushYCbCrPlanarImage( @@ -218,8 +236,10 @@ break; } case gfx::SurfaceFormat::P010: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } aBuilder.PushP010Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], wr::ColorDepth::Color10, wr::ToWrYuvColorSpace(GetYUVColorSpace()), @@ -228,8 +248,10 @@ break; } case gfx::SurfaceFormat::NV16: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } aBuilder.PushNV16Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], wr::ColorDepth::Color10, wr::ToWrYuvColorSpace(GetYUVColorSpace()), diff -Nru firefox-esr-140.9.1esr/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp firefox-esr-140.10.0esr/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp --- firefox-esr-140.9.1esr/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -124,8 +124,10 @@ switch (GetFormat()) { case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); - MOZ_ASSERT(mSurface->GetPlaneCount() == 0); + if (aImageKeys.length() != 1 || mSurface->GetPlaneCount() != 0) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } // The internal pixel format of MacIOSurface is always BGRX or BGRA // format. auto format = GetFormat() == gfx::SurfaceFormat::B8G8R8A8 @@ -141,16 +143,20 @@ // converted RGB interleaving data or a YCbCr interleaving data depending // on the different platform setting. (e.g. It will be RGB at OpenGL 2.1 // and YCbCr at OpenGL 3.1) - MOZ_ASSERT(aImageKeys.length() == 1); - MOZ_ASSERT(mSurface->GetPlaneCount() == 0); + if (aImageKeys.length() != 1 || mSurface->GetPlaneCount() != 0) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor(GetSize(), gfx::SurfaceFormat::B8G8R8X8); (aResources.*method)(aImageKeys[0], descriptor, aExtID, imageType, 0, /* aNormalizedUvs */ false); break; } case gfx::SurfaceFormat::NV12: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetDevicePixelWidth(0), mSurface->GetDevicePixelHeight(0)), @@ -166,8 +172,10 @@ break; } case gfx::SurfaceFormat::P010: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetDevicePixelWidth(0), mSurface->GetDevicePixelHeight(0)), @@ -183,8 +191,10 @@ break; } case gfx::SurfaceFormat::NV16: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetDevicePixelWidth(0), mSurface->GetDevicePixelHeight(0)), @@ -214,8 +224,10 @@ switch (GetFormat()) { case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); - MOZ_ASSERT(mSurface->GetPlaneCount() == 0); + if (aImageKeys.length() != 1 || mSurface->GetPlaneCount() != 0) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } // We disable external compositing for RGB surfaces for now until // we've tested support more thoroughly. Bug 1667917. aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], @@ -226,8 +238,10 @@ break; } case gfx::SurfaceFormat::YUY2: { - MOZ_ASSERT(aImageKeys.length() == 1); - MOZ_ASSERT(mSurface->GetPlaneCount() == 0); + if (aImageKeys.length() != 1 || mSurface->GetPlaneCount() != 0) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } // Those images can only be generated at present by the Apple H264 decoder // which only supports 8 bits color depth. aBuilder.PushYCbCrInterleavedImage( @@ -238,8 +252,10 @@ break; } case gfx::SurfaceFormat::NV12: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } aBuilder.PushNV12Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], wr::ColorDepth::Color8, wr::ToWrYuvColorSpace(GetYUVColorSpace()), @@ -248,8 +264,10 @@ break; } case gfx::SurfaceFormat::P010: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } aBuilder.PushP010Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], wr::ColorDepth::Color10, wr::ToWrYuvColorSpace(GetYUVColorSpace()), @@ -258,8 +276,10 @@ break; } case gfx::SurfaceFormat::NV16: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } aBuilder.PushNV16Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], wr::ColorDepth::Color10, wr::ToWrYuvColorSpace(GetYUVColorSpace()), diff -Nru firefox-esr-140.9.1esr/gfx/layers/opengl/TextureHostOGL.cpp firefox-esr-140.10.0esr/gfx/layers/opengl/TextureHostOGL.cpp --- firefox-esr-140.9.1esr/gfx/layers/opengl/TextureHostOGL.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/opengl/TextureHostOGL.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -593,7 +593,10 @@ switch (GetFormat()) { case gfx::SurfaceFormat::R8G8B8X8: case gfx::SurfaceFormat::R8G8B8A8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected to be called"); + return; + } // XXX Add RGBA handling. Temporary hack to avoid crash // With BGRA format setting, rendering works without problem. @@ -627,7 +630,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, @@ -885,7 +891,10 @@ switch (GetFormat()) { case gfx::SurfaceFormat::R8G8B8X8: case gfx::SurfaceFormat::R8G8B8A8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected to be called"); + return; + } // XXX Add RGBA handling. Temporary hack to avoid crash // With BGRA format setting, rendering works without problem. @@ -917,7 +926,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, @@ -1043,7 +1055,11 @@ gfx::SurfaceFormat format = GetFormat(); - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected to be called"); + return; + } + // XXX Add RGBA handling. Temporary hack to avoid crash // With BGRA format setting, rendering works without problem. auto formatTmp = format == gfx::SurfaceFormat::R8G8B8A8 @@ -1063,7 +1079,10 @@ bool supportsExternalCompositing = SupportsExternalCompositing(aBuilder.GetBackendType()); - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, diff -Nru firefox-esr-140.9.1esr/gfx/layers/wr/AsyncImagePipelineOp.cpp firefox-esr-140.10.0esr/gfx/layers/wr/AsyncImagePipelineOp.cpp --- firefox-esr-140.9.1esr/gfx/layers/wr/AsyncImagePipelineOp.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/wr/AsyncImagePipelineOp.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -11,6 +11,32 @@ namespace mozilla { namespace layers { +AsyncImagePipelineOp::AsyncImagePipelineOp( + Tag aTag, AsyncImagePipelineManager* aAsyncImageManager, + const wr::PipelineId& aPipelineId, TextureHost* aTextureHost) + : mTag(aTag), + mAsyncImageManager(aAsyncImageManager), + mPipelineId(aPipelineId), + mTextureHost(aTextureHost) { + MOZ_ASSERT(mTag == Tag::ApplyAsyncImageForPipeline); +} + +AsyncImagePipelineOp::AsyncImagePipelineOp( + Tag aTag, AsyncImagePipelineManager* aAsyncImageManager, + const wr::PipelineId& aPipelineId) + : mTag(aTag), + mAsyncImageManager(aAsyncImageManager), + mPipelineId(aPipelineId) { + MOZ_ASSERT(mTag == Tag::RemoveAsyncImagePipeline); +} + +AsyncImagePipelineOp::~AsyncImagePipelineOp() = default; +AsyncImagePipelineOp::AsyncImagePipelineOp(AsyncImagePipelineOp&&) = default; +AsyncImagePipelineOp::AsyncImagePipelineOp(const AsyncImagePipelineOp&) = + default; + +AsyncImagePipelineOps::~AsyncImagePipelineOps() = default; + void AsyncImagePipelineOps::HandleOps(wr::TransactionBuilder& aTxn) { MOZ_ASSERT(!mList.empty()); @@ -18,7 +44,7 @@ auto& frontOp = mList.front(); switch (frontOp.mTag) { case AsyncImagePipelineOp::Tag::ApplyAsyncImageForPipeline: { - auto* manager = frontOp.mAsyncImageManager; + AsyncImagePipelineManager* manager = frontOp.mAsyncImageManager.get(); const auto& pipelineId = frontOp.mPipelineId; const auto& textureHost = frontOp.mTextureHost; @@ -26,7 +52,7 @@ break; } case AsyncImagePipelineOp::Tag::RemoveAsyncImagePipeline: { - auto* manager = frontOp.mAsyncImageManager; + AsyncImagePipelineManager* manager = frontOp.mAsyncImageManager.get(); const auto& pipelineId = frontOp.mPipelineId; manager->RemoveAsyncImagePipeline(pipelineId, /* aPendingOps */ nullptr, aTxn); diff -Nru firefox-esr-140.9.1esr/gfx/layers/wr/AsyncImagePipelineOp.h firefox-esr-140.10.0esr/gfx/layers/wr/AsyncImagePipelineOp.h --- firefox-esr-140.9.1esr/gfx/layers/wr/AsyncImagePipelineOp.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/wr/AsyncImagePipelineOp.h 2026-04-15 01:59:49.000000000 +0000 @@ -10,6 +10,7 @@ #include #include "mozilla/layers/TextureHost.h" +#include "mozilla/RefPtr.h" #include "mozilla/webrender/webrender_ffi.h" #include "Units.h" @@ -33,30 +34,26 @@ const Tag mTag; - AsyncImagePipelineManager* const mAsyncImageManager; + // Hold a strong reference: queued ops can outlive their owning + // WebRenderBridgeParent and be processed after StopAndClearResources frees + // the manager via a deferred remote-texture callback. + const RefPtr mAsyncImageManager; const wr::PipelineId mPipelineId; const CompositableTextureHostRef mTextureHost; + // Out-of-line so callers don't need the full AsyncImagePipelineManager type + // to instantiate ~RefPtr. + ~AsyncImagePipelineOp(); + AsyncImagePipelineOp(AsyncImagePipelineOp&&); + AsyncImagePipelineOp(const AsyncImagePipelineOp&); + private: - AsyncImagePipelineOp(const Tag aTag, - AsyncImagePipelineManager* aAsyncImageManager, + AsyncImagePipelineOp(Tag aTag, AsyncImagePipelineManager* aAsyncImageManager, const wr::PipelineId& aPipelineId, - TextureHost* aTextureHost) - : mTag(aTag), - mAsyncImageManager(aAsyncImageManager), - mPipelineId(aPipelineId), - mTextureHost(aTextureHost) { - MOZ_ASSERT(mTag == Tag::ApplyAsyncImageForPipeline); - } + TextureHost* aTextureHost); - AsyncImagePipelineOp(const Tag aTag, - AsyncImagePipelineManager* aAsyncImageManager, - const wr::PipelineId& aPipelineId) - : mTag(aTag), - mAsyncImageManager(aAsyncImageManager), - mPipelineId(aPipelineId) { - MOZ_ASSERT(mTag == Tag::RemoveAsyncImagePipeline); - } + AsyncImagePipelineOp(Tag aTag, AsyncImagePipelineManager* aAsyncImageManager, + const wr::PipelineId& aPipelineId); public: static AsyncImagePipelineOp ApplyAsyncImageForPipeline( @@ -77,6 +74,9 @@ struct AsyncImagePipelineOps { explicit AsyncImagePipelineOps(wr::Transaction* aTransaction) : mTransaction(aTransaction) {} + // Out-of-line so callers don't need the full AsyncImagePipelineManager type + // to instantiate ~RefPtr for queued ops. + ~AsyncImagePipelineOps(); void HandleOps(wr::TransactionBuilder& aTxn); diff -Nru firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderBridgeChild.cpp firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderBridgeChild.cpp --- firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderBridgeChild.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderBridgeChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -341,7 +341,7 @@ return static_cast(Manager()); } -TextureForwarder* WebRenderBridgeChild::GetTextureForwarder() { +RefPtr WebRenderBridgeChild::GetTextureForwarder() { return static_cast(GetCompositorBridgeChild()); } @@ -575,9 +575,8 @@ void WebRenderBridgeChild::Capture() { this->SendCapture(); } -void WebRenderBridgeChild::StartCaptureSequence(const nsCString& aPath, - uint32_t aFlags) { - this->SendStartCaptureSequence(aPath, aFlags); +void WebRenderBridgeChild::StartCaptureSequence(uint32_t aFlags) { + this->SendStartCaptureSequence(aFlags); } void WebRenderBridgeChild::StopCaptureSequence() { diff -Nru firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderBridgeChild.h firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderBridgeChild.h --- firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderBridgeChild.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderBridgeChild.h 2026-04-15 01:59:49.000000000 +0000 @@ -91,7 +91,7 @@ wr::PipelineId GetPipeline() { return mPipelineId; } // KnowsCompositor - TextureForwarder* GetTextureForwarder() override; + RefPtr GetTextureForwarder() override; LayersIPCActor* GetLayersIPCActor() override; void SyncWithCompositor( const Maybe& aWindowID = Nothing()) override; @@ -178,7 +178,7 @@ void DeallocResourceShmem(RefCountedShmem& aShm); void Capture(); - void StartCaptureSequence(const nsCString& path, uint32_t aFlags); + void StartCaptureSequence(uint32_t aFlags); void StopCaptureSequence(); bool SendEnsureConnected(TextureFactoryIdentifier* textureFactoryIdentifier, diff -Nru firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderBridgeParent.cpp firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderBridgeParent.cpp --- firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderBridgeParent.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderBridgeParent.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -315,21 +315,8 @@ mWebRenderBridgeParent->SendPendingAsyncMessages(); if (mActorsToDestroy) { // Destroy the actors after sending the async messages because the latter - // may contain references to some actors. De-duplicate the array to avoid - // destroying the same texture parent actor twice. - nsTHashSet seenTextureParents; - for (const auto& op : *mActorsToDestroy) { - // Peek inside the op (as DestroyActor does) to see if we are about - // to destroy a PTextureParent. - if (op.type() == OpDestroy::TPTexture) { - PTextureParent* textureParent = op.get_PTexture().AsParent(); - if (!seenTextureParents.EnsureInserted(textureParent)) { - // Already seen, so skip this one. - continue; - } - } - mWebRenderBridgeParent->DestroyActor(op); - } + // may contain references to some actors. + mWebRenderBridgeParent->DestroyActors(*mActorsToDestroy); } } @@ -826,6 +813,14 @@ auto op = aIsUpdate ? TextureHost::UPDATE_IMAGE : TextureHost::ADD_IMAGE; WebRenderTextureHost* wrTexture = aTexture->AsWebRenderTextureHost(); if (wrTexture) { + if (wrTexture->NumSubTextures() != 1) { + gfxCriticalNote << "PushExternalImageForTexture: texture requires " + << wrTexture->NumSubTextures() + << " keys but only 1 provided for extId:" + << wr::AsUint64(aExtId); + return false; + } + Range keys(&aKey, 1); wrTexture->PushResourceUpdates(aResources, op, keys, wrTexture->GetExternalImageKey()); @@ -1263,9 +1258,7 @@ const TimeStamp& aFwdTime, nsTArray&& aPayloads, const bool& aRenderOffscreen) { if (mDestroyed) { - for (const auto& op : aToDestroy) { - DestroyActor(op); - } + DestroyActors(aToDestroy); wr::IpcResourceUpdateQueue::ReleaseShmems(this, aDisplayList.mSmallShmems); wr::IpcResourceUpdateQueue::ReleaseShmems(this, aDisplayList.mLargeShmems); return IPC_OK(); @@ -1401,9 +1394,7 @@ const TimeStamp& aTxnStartTime, const nsACString& aTxnURL, const TimeStamp& aFwdTime, nsTArray&& aPayloads) { if (mDestroyed) { - for (const auto& op : aToDestroy) { - DestroyActor(op); - } + DestroyActors(aToDestroy); if (aTransactionData) { wr::IpcResourceUpdateQueue::ReleaseShmems(this, aTransactionData->mSmallShmems); @@ -1897,6 +1888,12 @@ return; } + if (aPipelineId == mPipelineId) { + gfxCriticalNote << "Content attempted AddPipelineIdForCompositable on " + "root pipeline"; + return; + } + MOZ_ASSERT(mAsyncCompositables.find(wr::AsUint64(aPipelineId)) == mAsyncCompositables.end()); @@ -1953,6 +1950,12 @@ return; } + if (aPipelineId == mPipelineId) { + gfxCriticalNote << "Content attempted RemovePipelineIdForCompositable on " + "root pipeline"; + return; + } + auto it = mAsyncCompositables.find(wr::AsUint64(aPipelineId)); if (it == mAsyncCompositables.end()) { return; @@ -2149,9 +2152,9 @@ } mozilla::ipc::IPCResult WebRenderBridgeParent::RecvStartCaptureSequence( - const nsACString& aPath, const uint32_t& aFlags) { + const uint32_t& aFlags) { if (!mDestroyed) { - mApi->StartCaptureSequence(aPath, aFlags); + mApi->StartCaptureSequence(aFlags); } return IPC_OK(); } diff -Nru firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderBridgeParent.h firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderBridgeParent.h --- firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderBridgeParent.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderBridgeParent.h 2026-04-15 01:59:50.000000000 +0000 @@ -146,7 +146,7 @@ const wr::RenderReasons& aReasons) override; mozilla::ipc::IPCResult RecvCapture() override; mozilla::ipc::IPCResult RecvStartCaptureSequence( - const nsACString& path, const uint32_t& aFlags) override; + const uint32_t& aFlags) override; mozilla::ipc::IPCResult RecvStopCaptureSequence() override; mozilla::ipc::IPCResult RecvSyncWithCompositor() override; diff -Nru firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderMessageUtils.h firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderMessageUtils.h --- firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderMessageUtils.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderMessageUtils.h 2026-04-15 01:59:49.000000000 +0000 @@ -11,8 +11,6 @@ #include "ipc/EnumSerializer.h" #include "ipc/IPCMessageUtils.h" -#include "mozilla/IsEnumCase.h" -#include "mozilla/ParamTraits_IsEnumCase.h" #include "mozilla/ParamTraits_TiedFields.h" #include "mozilla/webrender/webrender_ffi.h" #include "mozilla/webrender/WebRenderTypes.h" @@ -178,42 +176,6 @@ return std::tie(a.flags, a.synthetic_italics, a.render_mode, a._padding); } -// - - -#if !(defined(XP_MACOSX) || defined(XP_WIN)) - -template <> -inline constexpr bool IsEnumCase( - const wr::FontLCDFilter raw) { - switch (raw) { - case wr::FontLCDFilter::None: - case wr::FontLCDFilter::Default: - case wr::FontLCDFilter::Light: - case wr::FontLCDFilter::Legacy: - case wr::FontLCDFilter::Sentinel: - return true; - } - return false; -} - -template <> -inline constexpr bool IsEnumCase(const wr::FontHinting raw) { - switch (raw) { - case wr::FontHinting::None: - case wr::FontHinting::Mono: - case wr::FontHinting::Light: - case wr::FontHinting::Normal: - case wr::FontHinting::LCD: - case wr::FontHinting::Sentinel: - return true; - } - return false; -} - -#endif // !(defined(XP_MACOSX) || defined(XP_WIN)) - -// - - template <> inline auto TiedFields( mozilla::wr::FontInstancePlatformOptions& a) { @@ -251,30 +213,6 @@ } template <> -inline constexpr bool IsEnumCase(const wr::OpacityType raw) { - switch (raw) { - case wr::OpacityType::Opaque: - case wr::OpacityType::HasAlphaChannel: - case wr::OpacityType::Sentinel: - return true; - } - return false; -} - -template <> -inline constexpr bool IsEnumCase( - const wr::FontRenderMode raw) { - switch (raw) { - case wr::FontRenderMode::Mono: - case wr::FontRenderMode::Alpha: - case wr::FontRenderMode::Subpixel: - case wr::FontRenderMode::Sentinel: - return true; - } - return false; -} - -template <> inline auto TiedFields( mozilla::wr::InternerSubReport& a) { #define _COMMA , @@ -374,11 +312,15 @@ template <> struct ParamTraits - : public ParamTraits_IsEnumCase {}; + : public ContiguousEnumSerializer {}; template <> struct ParamTraits - : public ParamTraits_IsEnumCase {}; + : public ContiguousEnumSerializer {}; #endif // !(defined(XP_MACOSX) || defined(XP_WIN)) @@ -451,11 +393,15 @@ template <> struct ParamTraits - : public ParamTraits_IsEnumCase {}; + : public ContiguousEnumSerializer {}; template <> struct ParamTraits - : public ParamTraits_IsEnumCase {}; + : public ContiguousEnumSerializer {}; template <> struct ParamTraits diff -Nru firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderScrollData.cpp firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderScrollData.cpp --- firefox-esr-140.9.1esr/gfx/layers/wr/WebRenderScrollData.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/layers/wr/WebRenderScrollData.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -305,7 +305,11 @@ const WebRenderLayerScrollData* currentChild = &aParent.mLayerScrollData[currentChildIndex]; childDescendantCounts += currentChild->mDescendantCount; - currentChild->ValidateSubtree(aParent, aVisitCounts, currentChildIndex); + if (!currentChild->ValidateSubtree(aParent, aVisitCounts, + currentChildIndex)) { + // If a subtree is invalid, we are also invalid. + return false; + } // The current child's descendants come first in the array, and the next // element after that is our next child. diff -Nru firefox-esr-140.9.1esr/gfx/ots/moz.yaml firefox-esr-140.10.0esr/gfx/ots/moz.yaml --- firefox-esr-140.9.1esr/gfx/ots/moz.yaml 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ots/moz.yaml 2026-04-15 01:59:49.000000000 +0000 @@ -10,8 +10,8 @@ url: https://github.com/khaledhosny/ots - release: 41136f2f0afc3db21a1f95b3348f62c5d6372b93 (2025-01-07T23:20:03Z). - revision: 41136f2f0afc3db21a1f95b3348f62c5d6372b93 + release: 35a4c35a46c01c172ef51a0da9a487e710c2d499 (2026-03-27T19:05:02Z). + revision: 35a4c35a46c01c172ef51a0da9a487e710c2d499 license: BSD-3-Clause license-file: LICENSE diff -Nru firefox-esr-140.9.1esr/gfx/ots/ots-lz4.patch firefox-esr-140.10.0esr/gfx/ots/ots-lz4.patch --- firefox-esr-140.9.1esr/gfx/ots/ots-lz4.patch 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ots/ots-lz4.patch 2026-04-15 01:59:49.000000000 +0000 @@ -1,11 +1,7 @@ diff --git a/src/glat.cc b/src/glat.cc --- a/src/glat.cc +++ b/src/glat.cc -@@ -1,16 +1,16 @@ - // Copyright (c) 2009-2017 The OTS Authors. All rights reserved. - // Use of this source code is governed by a BSD-style license that can be - // found in the LICENSE file. - +@@ -5,7 +5,7 @@ #include "glat.h" #include "gloc.h" @@ -13,18 +9,8 @@ +#include "mozilla/Compression.h" #include #include - - namespace ots { - - // ----------------------------------------------------------------------------- - // OpenTypeGLAT_v1 - // ----------------------------------------------------------------------------- -@@ -212,24 +212,25 @@ bool OpenTypeGLAT_v3::Parse(const uint8_ - } - // decompressed table must be <= OTS_MAX_DECOMPRESSED_TABLE_SIZE - if (decompressed_size > OTS_MAX_DECOMPRESSED_TABLE_SIZE) { - return DropGraphite("Decompressed size exceeds %gMB: %gMB", - OTS_MAX_DECOMPRESSED_TABLE_SIZE / (1024.0 * 1024.0), + +@@ -217,14 +217,15 @@ bool OpenTypeGLAT_v3::Parse(const uint8_t* data, size_t length, decompressed_size / (1024.0 * 1024.0)); } std::unique_ptr decompressed(new uint8_t[decompressed_size]()); @@ -39,17 +25,12 @@ - decompressed_size); // output buffer size - if (ret < 0 || unsigned(ret) != decompressed_size) { - return DropGraphite("Decompression failed with error code %d", ret); -+ &outputSize); // return output size ++ &outputSize); // output buffer size + if (!ret || outputSize != decompressed_size) { + return DropGraphite("Decompression failed"); } return this->Parse(decompressed.get(), decompressed_size, true); - } - default: - return DropGraphite("Unknown compression scheme"); - } - if (this->compHead & RESERVED) { - Warning("Nonzero reserved"); + diff --git a/src/silf.cc b/src/silf.cc --- a/src/silf.cc +++ b/src/silf.cc @@ -71,7 +52,7 @@ bool OpenTypeSILF::Parse(const uint8_t* data, size_t length, bool prevent_decompression) { Buffer table(data, length); -@@ -45,24 +45,25 @@ bool OpenTypeSILF::Parse(const uint8_t* +@@ -45,24 +45,25 @@ bool OpenTypeSILF::Parse(const uint8_t* } // decompressed table must be <= OTS_MAX_DECOMPRESSED_TABLE_SIZE if (decompressed_size > OTS_MAX_DECOMPRESSED_TABLE_SIZE) { @@ -79,7 +60,7 @@ OTS_MAX_DECOMPRESSED_TABLE_SIZE / (1024.0 * 1024.0), decompressed_size / (1024.0 * 1024.0)); } - std::unique_ptr decompressed(new uint8_t[decompressed_size]()); + std::unique_ptr decompressed(new uint8_t[decompressed_size]()); - int ret = LZ4_decompress_safe_partial( + size_t outputSize = 0; + bool ret = mozilla::Compression::LZ4::decompressPartial( @@ -91,7 +72,7 @@ - decompressed_size); // output buffer size - if (ret < 0 || unsigned(ret) != decompressed_size) { - return DropGraphite("Decompression failed with error code %d", ret); -+ &outputSize); // return output size ++ &outputSize); // output buffer size + if (!ret || outputSize != decompressed_size) { + return DropGraphite("Decompression failed"); } @@ -101,4 +82,4 @@ return DropGraphite("Unknown compression scheme"); } } - if (!table.ReadU16(&this->numSub)) { + if (!table.ReadU16(&this->numSub)) { diff -Nru firefox-esr-140.9.1esr/gfx/ots/src/cff.cc firefox-esr-140.10.0esr/gfx/ots/src/cff.cc --- firefox-esr-140.9.1esr/gfx/ots/src/cff.cc 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ots/src/cff.cc 2026-04-15 01:59:50.000000000 +0000 @@ -214,7 +214,7 @@ // check number format uint8_t nibbles[2]; - nibbles[0] = (nibble & 0xf0) >> 8; + nibbles[0] = (nibble & 0xf0) >> 4; nibbles[1] = (nibble & 0x0f); for (unsigned i = 0; i < 2; ++i) { if (nibbles[i] == 0xd) { // reserved number @@ -311,7 +311,7 @@ if (!table.ReadU8(&b1)) { return OTS_FAILURE(); } - result = -(b0 - 251) * 256 + b1 - 108; + result = -(b0 - 251) * 256 - b1 - 108; } else { return OTS_FAILURE(); } @@ -899,6 +899,11 @@ if (type != DICT_DATA_TOPLEVEL) { return OTS_FAILURE(); } + // A CID-keyed font must have exactly one FDSelect; duplicates would + // make the validated fd_select map diverge from the serialized bytes. + if (!out_cff->fd_select.empty()) { + return OTS_FAILURE(); + } if (operands.size() != 1) { return OTS_FAILURE(); } diff -Nru firefox-esr-140.9.1esr/gfx/ots/src/cff_charstring.cc firefox-esr-140.10.0esr/gfx/ots/src/cff_charstring.cc --- firefox-esr-140.9.1esr/gfx/ots/src/cff_charstring.cc 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ots/src/cff_charstring.cc 2026-04-15 01:59:50.000000000 +0000 @@ -195,7 +195,7 @@ return OTS_FAILURE(); } result += v; - *out_number = result; + *out_number = static_cast(result); } else if (v <= 31) { *out_number = v; *out_is_operator = true; diff -Nru firefox-esr-140.9.1esr/gfx/ots/src/cmap.cc firefox-esr-140.10.0esr/gfx/ots/src/cmap.cc --- firefox-esr-140.9.1esr/gfx/ots/src/cmap.cc 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ots/src/cmap.cc 2026-04-15 01:59:50.000000000 +0000 @@ -314,8 +314,9 @@ return Error("format 12 subtable group endCharCode before startCharCode (0x%4X < 0x%4X)", groups[i].end_range, groups[i].start_range); } + // Maximum glyph ID must be less than num_glyphs. if ((groups[i].end_range - groups[i].start_range) + - groups[i].start_glyph_id > num_glyphs) { + groups[i].start_glyph_id >= num_glyphs) { return Error("bad format 12 subtable group startGlyphID (%d)", groups[i].start_glyph_id); } } diff -Nru firefox-esr-140.9.1esr/gfx/ots/src/glat.cc firefox-esr-140.10.0esr/gfx/ots/src/glat.cc --- firefox-esr-140.9.1esr/gfx/ots/src/glat.cc 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ots/src/glat.cc 2026-04-15 01:59:49.000000000 +0000 @@ -223,7 +223,7 @@ table.remaining(), // input buffer size (input size + padding) reinterpret_cast(decompressed.get()), decompressed_size, // target output size - &outputSize); // return output size + &outputSize); // output buffer size if (!ret || outputSize != decompressed_size) { return DropGraphite("Decompression failed"); } diff -Nru firefox-esr-140.9.1esr/gfx/ots/src/layout.cc firefox-esr-140.10.0esr/gfx/ots/src/layout.cc --- firefox-esr-140.9.1esr/gfx/ots/src/layout.cc 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ots/src/layout.cc 2026-04-15 01:59:50.000000000 +0000 @@ -190,7 +190,7 @@ if (!subtable.ReadU16(&start_glyph)) { return OTS_FAILURE_MSG("Failed to read starting glyph of class definition"); } - if (start_glyph > num_glyphs) { + if (start_glyph >= num_glyphs) { return OTS_FAILURE_MSG("Bad starting glyph %d in class definition", start_glyph); } @@ -281,7 +281,7 @@ if (!subtable.ReadU16(&glyph)) { return OTS_FAILURE_MSG("Failed to read glyph %d in coverage", i); } - if (glyph > num_glyphs) { + if (glyph >= num_glyphs) { return OTS_FAILURE_MSG("bad glyph ID: %u", glyph); } } @@ -386,7 +386,7 @@ if (!subtable.ReadU16(&glyph_id)) { return OTS_FAILURE_MSG("Failed to read glyph %d", i); } - if (glyph_id > num_glyphs) { + if (glyph_id >= num_glyphs) { return OTS_FAILURE_MSG("Bad glyph %d for entry %d", glyph_id, i); } } @@ -662,7 +662,7 @@ if (!subtable.ReadU16(&glyph_id)) { return OTS_FAILURE_MSG("Failed to read backtrack glyph %d in chain rule subtable", i); } - if (glyph_id > num_glyphs) { + if (glyph_id >= num_glyphs) { return OTS_FAILURE_MSG("Bad glyph id %d for bactrack glyph %d in chain rule subtable", glyph_id, i); } } @@ -679,7 +679,7 @@ if (!subtable.ReadU16(&glyph_id)) { return OTS_FAILURE_MSG("Failed to read input glyph %d in chain rule subtable", i); } - if (glyph_id > num_glyphs) { + if (glyph_id >= num_glyphs) { return OTS_FAILURE_MSG("Bad glyph id %d for input glyph %d in chain rule subtable", glyph_id, i); } } @@ -693,7 +693,7 @@ if (!subtable.ReadU16(&glyph_id)) { return OTS_FAILURE_MSG("Failed to read lookahead glyph %d in chain rule subtable", i); } - if (glyph_id > num_glyphs) { + if (glyph_id >= num_glyphs) { return OTS_FAILURE_MSG("Bad glyph id %d for lookadhead glyph %d in chain rule subtable", glyph_id, i); } } diff -Nru firefox-esr-140.9.1esr/gfx/ots/src/ots.cc firefox-esr-140.10.0esr/gfx/ots/src/ots.cc --- firefox-esr-140.9.1esr/gfx/ots/src/ots.cc 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ots/src/ots.cc 2026-04-15 01:59:50.000000000 +0000 @@ -1066,7 +1066,7 @@ void Table::Message(int level, const char *format, va_list va) { char msg[206] = { OTS_UNTAG(m_tag), ':', ' ' }; std::vsnprintf(msg + 6, 200, format, va); - m_font->file->context->Message(level, msg); + m_font->file->context->Message(level, "%s", msg); } bool Table::Error(const char *format, ...) { diff -Nru firefox-esr-140.9.1esr/gfx/ots/src/silf.cc firefox-esr-140.10.0esr/gfx/ots/src/silf.cc --- firefox-esr-140.9.1esr/gfx/ots/src/silf.cc 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ots/src/silf.cc 2026-04-15 01:59:49.000000000 +0000 @@ -49,14 +49,14 @@ OTS_MAX_DECOMPRESSED_TABLE_SIZE / (1024.0 * 1024.0), decompressed_size / (1024.0 * 1024.0)); } - std::unique_ptr decompressed(new uint8_t[decompressed_size]()); + std::unique_ptr decompressed(new uint8_t[decompressed_size]()); size_t outputSize = 0; bool ret = mozilla::Compression::LZ4::decompressPartial( reinterpret_cast(data + table.offset()), table.remaining(), // input buffer size (input size + padding) reinterpret_cast(decompressed.get()), decompressed_size, // target output size - &outputSize); // return output size + &outputSize); // output buffer size if (!ret || outputSize != decompressed_size) { return DropGraphite("Decompression failed"); } diff -Nru firefox-esr-140.9.1esr/gfx/ots/src/variations.cc firefox-esr-140.10.0esr/gfx/ots/src/variations.cc --- firefox-esr-140.9.1esr/gfx/ots/src/variations.cc 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ots/src/variations.cc 2026-04-15 01:59:50.000000000 +0000 @@ -222,7 +222,8 @@ } if (tupleIndex & INTERMEDIATE_REGION) { - std::vector startTuple(axisCount); + std::vector startTuple; + startTuple.reserve(axisCount); for (unsigned axis = 0; axis < axisCount; axis++) { int16_t coordinate; if (!subtable.ReadS16(&coordinate)) { @@ -234,7 +235,8 @@ startTuple.push_back(coordinate); } - std::vector endTuple(axisCount); + std::vector endTuple; + endTuple.reserve(axisCount); for (unsigned axis = 0; axis < axisCount; axis++) { int16_t coordinate; if (!subtable.ReadS16(&coordinate)) { diff -Nru firefox-esr-140.9.1esr/gfx/src/FilterSupport.cpp firefox-esr-140.10.0esr/gfx/src/FilterSupport.cpp --- firefox-esr-140.9.1esr/gfx/src/FilterSupport.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/src/FilterSupport.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -417,7 +417,7 @@ static const float hueRotateB = 0.283f; switch (aMatrixAttributes.mType) { - case SVG_FECOLORMATRIX_TYPE_MATRIX: { + case SVGFEColorMatrixType::Matrix: { if (aMatrixAttributes.mValues.Length() != 20) { return false; } @@ -426,7 +426,7 @@ break; } - case SVG_FECOLORMATRIX_TYPE_SATURATE: { + case SVGFEColorMatrixType::Saturate: { if (aMatrixAttributes.mValues.Length() != 1) { return false; } @@ -441,7 +441,7 @@ break; } - case SVG_FECOLORMATRIX_TYPE_HUE_ROTATE: { + case SVGFEColorMatrixType::HueRotate: { if (aMatrixAttributes.mValues.Length() != 1) { return false; } @@ -468,12 +468,12 @@ break; } - case SVG_FECOLORMATRIX_TYPE_LUMINANCE_TO_ALPHA: { + case SVGFEColorMatrixType::LuminanceToAlpha: { PodCopy(aOutMatrix, luminanceToAlphaMatrix, 20); break; } - case SVG_FECOLORMATRIX_TYPE_SEPIA: { + case SVGFEColorMatrixType::Sepia: { if (aMatrixAttributes.mValues.Length() != 1) { return false; } @@ -532,10 +532,10 @@ RefPtr filter; - uint32_t type = aFunctionAttributes.mTypes[aInChannel]; + SVGFEComponentTransferType type = aFunctionAttributes.mTypes[aInChannel]; switch (type) { - case SVG_FECOMPONENTTRANSFER_TYPE_TABLE: { + case SVGFEComponentTransferType::Table: { const nsTArray& tableValues = aFunctionAttributes.mValues[aInChannel]; if (tableValues.Length() < 2) return; @@ -557,7 +557,7 @@ break; } - case SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: { + case SVGFEComponentTransferType::Discrete: { const nsTArray& tableValues = aFunctionAttributes.mValues[aInChannel]; if (tableValues.Length() < 1) return; @@ -580,7 +580,7 @@ break; } - case SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: { + case SVGFEComponentTransferType::Linear: { static const LinearTransferAtts slopeAtt[4] = { ATT_LINEAR_TRANSFER_SLOPE_R, ATT_LINEAR_TRANSFER_SLOPE_G, ATT_LINEAR_TRANSFER_SLOPE_B, ATT_LINEAR_TRANSFER_SLOPE_A}; @@ -605,7 +605,7 @@ break; } - case SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: { + case SVGFEComponentTransferType::Gamma: { static const GammaTransferAtts amplitudeAtt[4] = { ATT_GAMMA_TRANSFER_AMPLITUDE_R, ATT_GAMMA_TRANSFER_AMPLITUDE_G, ATT_GAMMA_TRANSFER_AMPLITUDE_B, ATT_GAMMA_TRANSFER_AMPLITUDE_A}; @@ -635,7 +635,7 @@ break; } - case SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: + case SVGFEComponentTransferType::Identity: default: break; } @@ -678,12 +678,12 @@ } already_AddRefed operator()(const BlendAttributes& aBlend) { - uint32_t mode = aBlend.mBlendMode; + SVGFEBlendMode mode = aBlend.mBlendMode; RefPtr filter; - if (mode == SVG_FEBLEND_MODE_UNKNOWN) { + if (mode == SVGFEBlendMode::Unknown) { return nullptr; } - if (mode == SVG_FEBLEND_MODE_NORMAL) { + if (mode == SVGFEBlendMode::Normal) { filter = mDT->CreateFilter(FilterType::COMPOSITE); if (!filter) { return nullptr; @@ -695,25 +695,27 @@ if (!filter) { return nullptr; } - static const uint8_t blendModes[SVG_FEBLEND_MODE_LUMINOSITY + 1] = { - 0, - 0, - BLEND_MODE_MULTIPLY, - BLEND_MODE_SCREEN, - BLEND_MODE_DARKEN, - BLEND_MODE_LIGHTEN, - BLEND_MODE_OVERLAY, - BLEND_MODE_COLOR_DODGE, - BLEND_MODE_COLOR_BURN, - BLEND_MODE_HARD_LIGHT, - BLEND_MODE_SOFT_LIGHT, - BLEND_MODE_DIFFERENCE, - BLEND_MODE_EXCLUSION, - BLEND_MODE_HUE, - BLEND_MODE_SATURATION, - BLEND_MODE_COLOR, - BLEND_MODE_LUMINOSITY}; - filter->SetAttribute(ATT_BLEND_BLENDMODE, (uint32_t)blendModes[mode]); + static const uint8_t blendModes[] = {0, + 0, + BLEND_MODE_MULTIPLY, + BLEND_MODE_SCREEN, + BLEND_MODE_DARKEN, + BLEND_MODE_LIGHTEN, + BLEND_MODE_OVERLAY, + BLEND_MODE_COLOR_DODGE, + BLEND_MODE_COLOR_BURN, + BLEND_MODE_HARD_LIGHT, + BLEND_MODE_SOFT_LIGHT, + BLEND_MODE_DIFFERENCE, + BLEND_MODE_EXCLUSION, + BLEND_MODE_HUE, + BLEND_MODE_SATURATION, + BLEND_MODE_COLOR, + BLEND_MODE_LUMINOSITY}; + static_assert(std::size(blendModes) == + ContiguousEnumSize::value); + filter->SetAttribute(ATT_BLEND_BLENDMODE, + (uint32_t)blendModes[static_cast(mode)]); // The correct input order for both software and D2D filters is flipped // from our source order, so flip here. filter->SetInput(IN_BLEND_IN, mSources[1]); @@ -764,9 +766,10 @@ rx = std::min(rx, kMorphologyMaxRadius); ry = std::min(ry, kMorphologyMaxRadius); - MorphologyOperator op = aMorphology.mOperator == SVG_OPERATOR_ERODE - ? MORPHOLOGY_OPERATOR_ERODE - : MORPHOLOGY_OPERATOR_DILATE; + MorphologyOperator op = + aMorphology.mOperator == SVGMorphologyOperator::Erode + ? MORPHOLOGY_OPERATOR_ERODE + : MORPHOLOGY_OPERATOR_DILATE; RefPtr filter = mDT->CreateFilter(FilterType::MORPHOLOGY); if (!filter) { @@ -801,14 +804,14 @@ already_AddRefed operator()( const ComponentTransferAttributes& aComponentTransfer) { MOZ_ASSERT(aComponentTransfer.mTypes[0] != - SVG_FECOMPONENTTRANSFER_SAME_AS_R); + SVGFEComponentTransferType::SameAsR); MOZ_ASSERT(aComponentTransfer.mTypes[3] != - SVG_FECOMPONENTTRANSFER_SAME_AS_R); + SVGFEComponentTransferType::SameAsR); RefPtr filters[4]; // one for each FILTER_*_TRANSFER type for (int32_t i = 0; i < 4; i++) { int32_t inputIndex = (aComponentTransfer.mTypes[i] == - SVG_FECOMPONENTTRANSFER_SAME_AS_R) && + SVGFEComponentTransferType::SameAsR) && (i < 3) ? 0 : i; @@ -856,15 +859,17 @@ filter->SetAttribute(ATT_CONVOLVE_MATRIX_BIAS, aConvolveMatrix.mBias); filter->SetAttribute(ATT_CONVOLVE_MATRIX_TARGET, aConvolveMatrix.mTarget); filter->SetAttribute(ATT_CONVOLVE_MATRIX_SOURCE_RECT, mSourceRegions[0]); - uint32_t edgeMode = aConvolveMatrix.mEdgeMode; - static const uint8_t edgeModes[SVG_EDGEMODE_NONE + 1] = { - EDGE_MODE_NONE, // SVG_EDGEMODE_UNKNOWN - EDGE_MODE_DUPLICATE, // SVG_EDGEMODE_DUPLICATE - EDGE_MODE_WRAP, // SVG_EDGEMODE_WRAP - EDGE_MODE_NONE // SVG_EDGEMODE_NONE + static const uint8_t edgeModes[] = { + EDGE_MODE_NONE, // SVGEdgeMode::Unknown + EDGE_MODE_DUPLICATE, // SVGEdgeMode::Duplicate + EDGE_MODE_WRAP, // SVGEdgeMode::Wrap + EDGE_MODE_NONE // SVGEdgeMode::None }; - filter->SetAttribute(ATT_CONVOLVE_MATRIX_EDGE_MODE, - (uint32_t)edgeModes[edgeMode]); + static_assert(std::size(edgeModes) == + ContiguousEnumSize::value); + filter->SetAttribute( + ATT_CONVOLVE_MATRIX_EDGE_MODE, + (uint32_t)edgeModes[static_cast(aConvolveMatrix.mEdgeMode)]); filter->SetAttribute(ATT_CONVOLVE_MATRIX_KERNEL_UNIT_LENGTH, aConvolveMatrix.mKernelUnitLength); filter->SetAttribute(ATT_CONVOLVE_MATRIX_PRESERVE_ALPHA, @@ -885,17 +890,21 @@ return nullptr; } filter->SetAttribute(ATT_DISPLACEMENT_MAP_SCALE, aDisplacementMap.mScale); - static const uint8_t channel[SVG_CHANNEL_A + 1] = { - COLOR_CHANNEL_R, // SVG_CHANNEL_UNKNOWN - COLOR_CHANNEL_R, // SVG_CHANNEL_R - COLOR_CHANNEL_G, // SVG_CHANNEL_G - COLOR_CHANNEL_B, // SVG_CHANNEL_B - COLOR_CHANNEL_A // SVG_CHANNEL_A + static const uint8_t channel[] = { + COLOR_CHANNEL_R, // SVGChannel::Unknown + COLOR_CHANNEL_R, // SVGChannel::R + COLOR_CHANNEL_G, // SVGChannel::G + COLOR_CHANNEL_B, // SVGChannel::B + COLOR_CHANNEL_A // SVGChannel::A }; - filter->SetAttribute(ATT_DISPLACEMENT_MAP_X_CHANNEL, - (uint32_t)channel[aDisplacementMap.mXChannel]); - filter->SetAttribute(ATT_DISPLACEMENT_MAP_Y_CHANNEL, - (uint32_t)channel[aDisplacementMap.mYChannel]); + static_assert(std::size(channel) == + ContiguousEnumSize::value); + filter->SetAttribute( + ATT_DISPLACEMENT_MAP_X_CHANNEL, + (uint32_t)channel[static_cast(aDisplacementMap.mXChannel)]); + filter->SetAttribute( + ATT_DISPLACEMENT_MAP_Y_CHANNEL, + (uint32_t)channel[static_cast(aDisplacementMap.mYChannel)]); filter->SetInput(IN_DISPLACEMENT_MAP_IN, mSources[0]); filter->SetInput(IN_DISPLACEMENT_MAP_IN2, mSources[1]); return filter.forget(); @@ -912,13 +921,16 @@ filter->SetAttribute(ATT_TURBULENCE_NUM_OCTAVES, aTurbulence.mOctaves); filter->SetAttribute(ATT_TURBULENCE_STITCHABLE, aTurbulence.mStitchable); filter->SetAttribute(ATT_TURBULENCE_SEED, (uint32_t)aTurbulence.mSeed); - static const uint8_t type[SVG_TURBULENCE_TYPE_TURBULENCE + 1] = { - TURBULENCE_TYPE_FRACTAL_NOISE, // SVG_TURBULENCE_TYPE_UNKNOWN - TURBULENCE_TYPE_FRACTAL_NOISE, // SVG_TURBULENCE_TYPE_FRACTALNOISE - TURBULENCE_TYPE_TURBULENCE // SVG_TURBULENCE_TYPE_TURBULENCE + static const uint8_t type[] = { + TURBULENCE_TYPE_FRACTAL_NOISE, // SVGTurbulenceType::Unknown + TURBULENCE_TYPE_FRACTAL_NOISE, // SVGTurbulenceType::FractalNoise + TURBULENCE_TYPE_TURBULENCE // SVGTurbulenceType::Turbulence }; - filter->SetAttribute(ATT_TURBULENCE_TYPE, - (uint32_t)type[aTurbulence.mType]); + static_assert(std::size(type) == + ContiguousEnumSize::value); + filter->SetAttribute( + ATT_TURBULENCE_TYPE, + (uint32_t)type[static_cast(aTurbulence.mType)]); filter->SetAttribute( ATT_TURBULENCE_RECT, mDescription.PrimitiveSubregion() - aTurbulence.mOffset); @@ -928,8 +940,8 @@ already_AddRefed operator()( const CompositeAttributes& aComposite) { RefPtr filter; - uint32_t op = aComposite.mOperator; - if (op == SVG_FECOMPOSITE_OPERATOR_ARITHMETIC) { + SVGFECompositeOperator op = aComposite.mOperator; + if (op == SVGFECompositeOperator::Arithmetic) { const nsTArray& coefficients = aComposite.mCoefficients; static const float allZero[4] = {0, 0, 0, 0}; filter = mDT->CreateFilter(FilterType::ARITHMETIC_COMBINE); @@ -948,17 +960,20 @@ if (!filter) { return nullptr; } - static const uint8_t operators[SVG_FECOMPOSITE_OPERATOR_LIGHTER + 1] = { - COMPOSITE_OPERATOR_OVER, // SVG_FECOMPOSITE_OPERATOR_UNKNOWN - COMPOSITE_OPERATOR_OVER, // SVG_FECOMPOSITE_OPERATOR_OVER - COMPOSITE_OPERATOR_IN, // SVG_FECOMPOSITE_OPERATOR_IN - COMPOSITE_OPERATOR_OUT, // SVG_FECOMPOSITE_OPERATOR_OUT - COMPOSITE_OPERATOR_ATOP, // SVG_FECOMPOSITE_OPERATOR_ATOP - COMPOSITE_OPERATOR_XOR, // SVG_FECOMPOSITE_OPERATOR_XOR + static const uint8_t operators[] = { + COMPOSITE_OPERATOR_OVER, // SVGFECompositeOperator::Unknown + COMPOSITE_OPERATOR_OVER, // SVGFECompositeOperator::Over + COMPOSITE_OPERATOR_IN, // SVGFECompositeOperator::In + COMPOSITE_OPERATOR_OUT, // SVGFECompositeOperator::Out + COMPOSITE_OPERATOR_ATOP, // SVGFECompositeOperator::Atop + COMPOSITE_OPERATOR_XOR, // SVGFECompositeOperator::Xor COMPOSITE_OPERATOR_OVER, // Unused, arithmetic is handled above - COMPOSITE_OPERATOR_LIGHTER // SVG_FECOMPOSITE_OPERATOR_LIGHTER + COMPOSITE_OPERATOR_LIGHTER // SVGFECompositeOperator::Lighter }; - filter->SetAttribute(ATT_COMPOSITE_OPERATOR, (uint32_t)operators[op]); + static_assert(std::size(operators) == + ContiguousEnumSize::value); + filter->SetAttribute(ATT_COMPOSITE_OPERATOR, + (uint32_t)operators[static_cast(op)]); filter->SetInput(IN_COMPOSITE_IN_START, mSources[1]); filter->SetInput(IN_COMPOSITE_IN_START + 1, mSources[0]); } @@ -1416,7 +1431,7 @@ } nsIntRegion operator()(const ConvolveMatrixAttributes& aConvolveMatrix) { - if (aConvolveMatrix.mEdgeMode != EDGE_MODE_NONE) { + if (aConvolveMatrix.mEdgeMode != SVGEdgeMode::None) { return mDescription.PrimitiveSubregion(); } Size kernelUnitLength = aConvolveMatrix.mKernelUnitLength; @@ -1535,7 +1550,7 @@ static float ResultOfZeroUnderTransferFunction( const ComponentTransferAttributes& aFunctionAttributes, int32_t channel) { switch (aFunctionAttributes.mTypes[channel]) { - case SVG_FECOMPONENTTRANSFER_TYPE_TABLE: { + case SVGFEComponentTransferType::Table: { const nsTArray& tableValues = aFunctionAttributes.mValues[channel]; if (tableValues.Length() < 2) { return 0.0f; @@ -1543,7 +1558,7 @@ return tableValues[0]; } - case SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: { + case SVGFEComponentTransferType::Discrete: { const nsTArray& tableValues = aFunctionAttributes.mValues[channel]; if (tableValues.Length() < 1) { return 0.0f; @@ -1551,17 +1566,17 @@ return tableValues[0]; } - case SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: { + case SVGFEComponentTransferType::Linear: { const nsTArray& values = aFunctionAttributes.mValues[channel]; return values[kComponentTransferInterceptIndex]; } - case SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: { + case SVGFEComponentTransferType::Gamma: { const nsTArray& values = aFunctionAttributes.mValues[channel]; return values[kComponentTransferOffsetIndex]; } - case SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: + case SVGFEComponentTransferType::Identity: default: return 0.0f; } @@ -1587,7 +1602,7 @@ } nsIntRegion operator()(const ColorMatrixAttributes& aColorMatrix) { - if (aColorMatrix.mType == (uint32_t)SVG_FECOLORMATRIX_TYPE_MATRIX) { + if (aColorMatrix.mType == SVGFEColorMatrixType::Matrix) { const nsTArray& values = aColorMatrix.mValues; if (values.Length() == 20 && values[19] > 0.0f) { return mDescription.PrimitiveSubregion(); @@ -1597,8 +1612,8 @@ } nsIntRegion operator()(const MorphologyAttributes& aMorphology) { - uint32_t op = aMorphology.mOperator; - if (op == SVG_OPERATOR_ERODE) { + SVGMorphologyOperator op = aMorphology.mOperator; + if (op == SVGMorphologyOperator::Erode) { return mInputExtents[0]; } Size radii = aMorphology.mRadii; @@ -1650,8 +1665,8 @@ } nsIntRegion operator()(const CompositeAttributes& aComposite) { - uint32_t op = aComposite.mOperator; - if (op == SVG_FECOMPOSITE_OPERATOR_ARITHMETIC) { + SVGFECompositeOperator op = aComposite.mOperator; + if (op == SVGFECompositeOperator::Arithmetic) { // The arithmetic composite primitive can draw outside the bounding // box of its source images. const nsTArray& coefficients = aComposite.mCoefficients; @@ -1674,7 +1689,7 @@ } return region; } - if (op == SVG_FECOMPOSITE_OPERATOR_IN) { + if (op == SVGFECompositeOperator::In) { return mInputExtents[0].Intersect(mInputExtents[1]); } return ResultChangeRegionForPrimitive(mDescription, mInputExtents); diff -Nru firefox-esr-140.9.1esr/gfx/src/FilterSupport.h firefox-esr-140.10.0esr/gfx/src/FilterSupport.h --- firefox-esr-140.9.1esr/gfx/src/FilterSupport.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/src/FilterSupport.h 2026-04-15 01:59:50.000000000 +0000 @@ -7,6 +7,7 @@ #ifndef __FilterSupport_h #define __FilterSupport_h +#include "mozilla/EnumTypeTraits.h" #include "mozilla/gfx/2D.h" #include "mozilla/gfx/Matrix.h" #include "mozilla/gfx/Point.h" @@ -32,75 +33,120 @@ DrawTarget* aDT, SourceSurface* aSurface, const IntPoint& aSurfacePosition); } // namespace FilterWrappers -// Morphology Operators -const unsigned short SVG_OPERATOR_UNKNOWN = 0; -const unsigned short SVG_OPERATOR_ERODE = 1; -const unsigned short SVG_OPERATOR_DILATE = 2; - -// ColorMatrix types -const unsigned short SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0; -const unsigned short SVG_FECOLORMATRIX_TYPE_MATRIX = 1; -const unsigned short SVG_FECOLORMATRIX_TYPE_SATURATE = 2; -const unsigned short SVG_FECOLORMATRIX_TYPE_HUE_ROTATE = 3; -const unsigned short SVG_FECOLORMATRIX_TYPE_LUMINANCE_TO_ALPHA = 4; -// ColorMatrix types for CSS filters -const unsigned short SVG_FECOLORMATRIX_TYPE_SEPIA = 5; - -// ComponentTransfer types -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0; -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1; -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2; -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3; -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4; -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5; -const unsigned short SVG_FECOMPONENTTRANSFER_SAME_AS_R = 6; - -// Blend Mode Values -const unsigned short SVG_FEBLEND_MODE_UNKNOWN = 0; -const unsigned short SVG_FEBLEND_MODE_NORMAL = 1; -const unsigned short SVG_FEBLEND_MODE_MULTIPLY = 2; -const unsigned short SVG_FEBLEND_MODE_SCREEN = 3; -const unsigned short SVG_FEBLEND_MODE_DARKEN = 4; -const unsigned short SVG_FEBLEND_MODE_LIGHTEN = 5; -const unsigned short SVG_FEBLEND_MODE_OVERLAY = 6; -const unsigned short SVG_FEBLEND_MODE_COLOR_DODGE = 7; -const unsigned short SVG_FEBLEND_MODE_COLOR_BURN = 8; -const unsigned short SVG_FEBLEND_MODE_HARD_LIGHT = 9; -const unsigned short SVG_FEBLEND_MODE_SOFT_LIGHT = 10; -const unsigned short SVG_FEBLEND_MODE_DIFFERENCE = 11; -const unsigned short SVG_FEBLEND_MODE_EXCLUSION = 12; -const unsigned short SVG_FEBLEND_MODE_HUE = 13; -const unsigned short SVG_FEBLEND_MODE_SATURATION = 14; -const unsigned short SVG_FEBLEND_MODE_COLOR = 15; -const unsigned short SVG_FEBLEND_MODE_LUMINOSITY = 16; - -// Edge Mode Values -const unsigned short SVG_EDGEMODE_UNKNOWN = 0; -const unsigned short SVG_EDGEMODE_DUPLICATE = 1; -const unsigned short SVG_EDGEMODE_WRAP = 2; -const unsigned short SVG_EDGEMODE_NONE = 3; - -// Channel Selectors -const unsigned short SVG_CHANNEL_UNKNOWN = 0; -const unsigned short SVG_CHANNEL_R = 1; -const unsigned short SVG_CHANNEL_G = 2; -const unsigned short SVG_CHANNEL_B = 3; -const unsigned short SVG_CHANNEL_A = 4; - -// Turbulence Types -const unsigned short SVG_TURBULENCE_TYPE_UNKNOWN = 0; -const unsigned short SVG_TURBULENCE_TYPE_FRACTALNOISE = 1; -const unsigned short SVG_TURBULENCE_TYPE_TURBULENCE = 2; - -// Composite Operators -const unsigned short SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0; -const unsigned short SVG_FECOMPOSITE_OPERATOR_OVER = 1; -const unsigned short SVG_FECOMPOSITE_OPERATOR_IN = 2; -const unsigned short SVG_FECOMPOSITE_OPERATOR_OUT = 3; -const unsigned short SVG_FECOMPOSITE_OPERATOR_ATOP = 4; -const unsigned short SVG_FECOMPOSITE_OPERATOR_XOR = 5; -const unsigned short SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6; -const unsigned short SVG_FECOMPOSITE_OPERATOR_LIGHTER = 7; +enum class SVGMorphologyOperator : uint8_t { + Unknown = 0, + Erode = 1, + Dilate = 2, +}; + +enum class SVGFEColorMatrixType : uint8_t { + Unknown = 0, + Matrix = 1, + Saturate = 2, + HueRotate = 3, + LuminanceToAlpha = 4, + // ColorMatrix types for CSS filters + Sepia = 5, +}; + +enum class SVGFEComponentTransferType : uint8_t { + Unknown = 0, + Identity = 1, + Table = 2, + Discrete = 3, + Linear = 4, + Gamma = 5, + SameAsR = 6, +}; + +enum class SVGFEBlendMode : uint8_t { + Unknown = 0, + Normal = 1, + Multiply = 2, + Screen = 3, + Darken = 4, + Lighten = 5, + Overlay = 6, + ColorDodge = 7, + ColorBurn = 8, + HardLight = 9, + SoftLight = 10, + Difference = 11, + Exclusion = 12, + Hue = 13, + Saturation = 14, + Color = 15, + Luminosity = 16, +}; + +enum class SVGEdgeMode : uint8_t { + Unknown = 0, + Duplicate = 1, + Wrap = 2, + None = 3, +}; + +enum class SVGChannel : uint8_t { + Unknown = 0, + R = 1, + G = 2, + B = 3, + A = 4, +}; + +enum class SVGTurbulenceType : uint8_t { + Unknown = 0, + FractalNoise = 1, + Turbulence = 2, +}; + +enum class SVGFECompositeOperator : uint8_t { + Unknown = 0, + Over = 1, + In = 2, + Out = 3, + Atop = 4, + Xor = 5, + Arithmetic = 6, + Lighter = 7, +}; + +} // namespace gfx + +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGMorphologyOperator::Dilate; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGFEColorMatrixType::Sepia; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGFEComponentTransferType::SameAsR; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGFEBlendMode::Luminosity; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGEdgeMode::None; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGChannel::A; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGTurbulenceType::Turbulence; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGFECompositeOperator::Lighter; +}; + +namespace gfx { struct FilterAttribute; @@ -114,7 +160,7 @@ }; struct BlendAttributes { - uint32_t mBlendMode; + SVGFEBlendMode mBlendMode; bool operator==(const BlendAttributes& aOther) const { return mBlendMode == aOther.mBlendMode; @@ -122,7 +168,7 @@ }; struct MorphologyAttributes { - uint32_t mOperator; + SVGMorphologyOperator mOperator; Size mRadii; bool operator==(const MorphologyAttributes& aOther) const { @@ -160,8 +206,8 @@ struct DisplacementMapAttributes { float mScale; - uint32_t mXChannel; - uint32_t mYChannel; + SVGChannel mXChannel; + SVGChannel mYChannel; bool operator==(const DisplacementMapAttributes& aOther) const { return mScale == aOther.mScale && mXChannel == aOther.mXChannel && @@ -175,7 +221,7 @@ float mSeed; uint32_t mOctaves; bool mStitchable; - uint32_t mType; + SVGTurbulenceType mType; bool operator==(const TurbulenceAttributes& aOther) const { return mOffset == aOther.mOffset && @@ -242,7 +288,7 @@ }; struct ColorMatrixAttributes { - uint32_t mType; + SVGFEColorMatrixType mType; ImplicitlyCopyableFloatArray mValues; bool operator==(const ColorMatrixAttributes& aOther) const { @@ -250,7 +296,7 @@ } }; -// If the types for G and B are SVG_FECOMPONENTTRANSFER_SAME_AS_R, +// If the types for G and B are SVGFEComponentTransferType::SameAsR, // use the R channel values - this lets us avoid copies. const uint32_t kChannelROrRGB = 0; const uint32_t kChannelG = 1; @@ -265,7 +311,7 @@ const uint32_t kComponentTransferOffsetIndex = 2; struct ComponentTransferAttributes { - uint8_t mTypes[4]; + SVGFEComponentTransferType mTypes[4]; ImplicitlyCopyableFloatArray mValues[4]; bool operator==(const ComponentTransferAttributes& aOther) const { @@ -282,7 +328,7 @@ float mDivisor; float mBias; IntPoint mTarget; - uint32_t mEdgeMode; + SVGEdgeMode mEdgeMode; Size mKernelUnitLength; bool mPreserveAlpha; @@ -297,7 +343,7 @@ }; struct CompositeAttributes { - uint32_t mOperator; + SVGFECompositeOperator mOperator; ImplicitlyCopyableFloatArray mCoefficients; bool operator==(const CompositeAttributes& aOther) const { diff -Nru firefox-esr-140.9.1esr/gfx/tests/gtest/TestYUVtoRGB32.cpp firefox-esr-140.10.0esr/gfx/tests/gtest/TestYUVtoRGB32.cpp --- firefox-esr-140.9.1esr/gfx/tests/gtest/TestYUVtoRGB32.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/tests/gtest/TestYUVtoRGB32.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -21,8 +21,12 @@ const Color YELLOW(255, 255, 0); const Color WHITE(255, 255, 255); const Color CHOCOLATE(210, 105, 30); -const std::array COLOR_LIST = {BLACK, BLUE, GREEN, CYAN, RED, - MAGENTA, YELLOW, WHITE, CHOCOLATE}; +const Color PERU(205, 133, 63); +const Color ROSYBROWN(188, 143, 143); +const Color STEELBLUE(70, 130, 180); +const std::array COLOR_LIST = { + BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, + YELLOW, WHITE, CHOCOLATE, PERU, ROSYBROWN, STEELBLUE}; Color RGB2YUV(const Color& aRGBColor) { const uint8_t& r = std::get<0>(aRGBColor); @@ -236,6 +240,26 @@ Color(236, 111, 20), // gfx::YUVColorSpace::BT2020 Color(229, 102, 20)}); + map.emplace(Hash(PERU), std::array{// gfx::YUVColorSpace::BT601 + Color(219, 137, 58), + // gfx::YUVColorSpace::BT709 + Color(228, 140, 58), + // gfx::YUVColorSpace::BT2020 + Color(223, 134, 59)}); + map.emplace(Hash(ROSYBROWN), + std::array{// gfx::YUVColorSpace::BT601 + Color(200, 147, 147), + // gfx::YUVColorSpace::BT709 + Color(204, 152, 147), + // gfx::YUVColorSpace::BT2020 + Color(201, 149, 147)}); + map.emplace(Hash(STEELBLUE), + std::array{// gfx::YUVColorSpace::BT601 + Color(65, 133, 189), + // gfx::YUVColorSpace::BT709 + Color(58, 129, 189), + // gfx::YUVColorSpace::BT2020 + Color(62, 135, 189)}); return map; } @@ -356,3 +380,131 @@ IsColorMatched(expectation, RGBX.get(), bufferSize); } } + +// Fills a 4×4 Y plane and chroma planes for a frame whose luma is divided +// into four 2×2 blocks. aColors[blockRow][blockCol] gives the color for each +// block. Chroma plane dimensions depend on aSubsampling: +// FULL (YV24): 4×4 chroma, each pixel maps 1:1 to a luma pixel. +// HALF_WIDTH (YV16): 2×4 chroma, half-width but full height. +// HALF_WIDTH_AND_HEIGHT (YV12): 2×2 chroma. +// Callers must provide at least 16 bytes for aUBuf/aVBuf to cover the FULL +// case; smaller subsamplings use only a prefix of that. +static void FillTwoByTwoFrame(const Color aColors[2][2], + gfx::ChromaSubsampling aSubsampling, + uint8_t* aYBuf, uint8_t* aUBuf, uint8_t* aVBuf) { + // Give each luma pixel a unique Y by adding a small per-pixel offset based + // on its position within its 2x2 chroma block: +0/+2/+4/+6 for + // (top-left/top-right/bottom-left/bottom-right). This makes luma sampling + // bugs detectable without meaningfully shifting the color. + for (int r = 0; r < 4; r++) { + for (int c = 0; c < 4; c++) { + uint8_t baseY = std::get<0>(RGB2YUV(aColors[r / 2][c / 2])); + aYBuf[r * 4 + c] = baseY + (r % 2) * 4 + (c % 2) * 2; + } + } + int chromaWidth = (aSubsampling == gfx::ChromaSubsampling::FULL) ? 4 : 2; + int chromaHeight = + (aSubsampling == gfx::ChromaSubsampling::HALF_WIDTH_AND_HEIGHT) ? 2 : 4; + for (int chromaRow = 0; chromaRow < chromaHeight; chromaRow++) { + int blockRow = chromaRow * 2 / chromaHeight; + for (int chromaCol = 0; chromaCol < chromaWidth; chromaCol++) { + int blockCol = chromaCol * 2 / chromaWidth; + aUBuf[chromaRow * chromaWidth + chromaCol] = + std::get<1>(RGB2YUV(aColors[blockRow][blockCol])); + aVBuf[chromaRow * chromaWidth + chromaCol] = + std::get<2>(RGB2YUV(aColors[blockRow][blockCol])); + } + } +} + +// Fills and converts a 4×4 test frame, writing the result into aOutput. +// aStride is in bytes. See FillTwoByTwoFrame for the aColors layout. +static void ConvertTestFrame(const Color aColors[2][2], + gfx::ChromaSubsampling aSubsampling, + const gfx::IntRect& aPictureRect, uint8_t* aOutput, + int32_t aStride) { + uint8_t yBuf[16], uBuf[16], vBuf[16]; + FillTwoByTwoFrame(aColors, aSubsampling, yBuf, uBuf, vBuf); + layers::PlanarYCbCrData data; + data.mYChannel = yBuf; + data.mYStride = 4; + data.mYSkip = 0; + data.mCbChannel = uBuf; + data.mCrChannel = vBuf; + data.mCbCrStride = (aSubsampling == gfx::ChromaSubsampling::FULL) ? 4 : 2; + data.mCbSkip = 0; + data.mCrSkip = 0; + data.mChromaSubsampling = aSubsampling; + data.mYUVColorSpace = gfx::YUVColorSpace::BT709; + data.mColorRange = gfx::ColorRange::LIMITED; + data.mPictureRect = aPictureRect; + ConvertYCbCrToRGB32(data, gfx::SurfaceFormat::R8G8B8X8, aOutput, aStride, + nullptr); +} + +// Tests for odd pic_x / pic_y offsets in YV12, YV16, and YV24. +// +// The 4x4 frame has four 2x2 chroma blocks with distinct mid-range colors. +// Within each block each luma pixel has a unique Y value (offset +0/+2/+4/+6), +// so both chroma and luma misalignment are detectable. The reference is a full +// even-aligned 4x4 conversion; each odd-crop output pixel is checked against +// its corresponding source position in that reference. +static const gfx::ChromaSubsampling kTestSubsamplings[] = { + gfx::ChromaSubsampling::HALF_WIDTH_AND_HEIGHT, + gfx::ChromaSubsampling::HALF_WIDTH, gfx::ChromaSubsampling::FULL}; + +static void RunOddPicTest(const Color aColors[2][2], + const gfx::IntRect& aRect) { + const int32_t stride = aRect.Width() * 4; + UniquePtr output = MakeUnique(aRect.Height() * stride); + auto exp = GetExpectedConvertedRGB(); + const size_t bt709 = static_cast(gfx::YUVColorSpace::BT709); + + for (gfx::ChromaSubsampling subsampling : kTestSubsamplings) { + // fullRef: even-aligned 4x4 reference (no odd-offset ambiguity). + uint8_t fullRef[4 * 4 * 4]; + ConvertTestFrame(aColors, subsampling, gfx::IntRect(0, 0, 4, 4), fullRef, + 4 * 4); + + // Sanity-check the reference: top-left of each 2x2 block (Y offset 0) + // must match GetExpectedConvertedRGB; the other three pixels in the block + // must be distinct but close (Y delta ≤6 → channel delta ~2-7). + for (int br = 0; br < 2; br++) { + for (int bc = 0; bc < 2; bc++) { + uint8_t* base = fullRef + (br * 2) * 4 * 4 + (bc * 2) * 4; + IsColorMatched(exp[Hash(aColors[br][bc])][bt709], base, 4); + for (int dr = 0; dr < 2; dr++) { + for (int dc = 0; dc < 2; dc++) { + if (dr == 0 && dc == 0) continue; + uint8_t* other = + fullRef + (br * 2 + dr) * 4 * 4 + (bc * 2 + dc) * 4; + for (int ch = 0; ch < 3; ch++) { + ASSERT_NE(base[ch], other[ch]); + ASSERT_NEAR(base[ch], other[ch], 10); + } + } + } + } + } + + // output: the odd-crop conversion under test. + ConvertTestFrame(aColors, subsampling, aRect, output.get(), stride); + + // Each output pixel must match its source position in the full reference. + for (int row = 0; row < aRect.Height(); row++) { + for (int col = 0; col < aRect.Width(); col++) { + uint8_t* ref = fullRef + (aRect.y + row) * 4 * 4 + (aRect.x + col) * 4; + Color expected(ref[0], ref[1], ref[2]); + IsColorMatched(expected, output.get() + row * stride + col * 4, 4); + } + } + } +} + +TEST(YCbCrUtils, ConvertYCbCrToRGB32OddPicOffset) +{ + const Color colors[2][2] = {{CHOCOLATE, PERU}, {ROSYBROWN, STEELBLUE}}; + RunOddPicTest(colors, gfx::IntRect(1, 1, 3, 3)); // both odd + RunOddPicTest(colors, gfx::IntRect(1, 0, 3, 4)); // odd pic_x only + RunOddPicTest(colors, gfx::IntRect(0, 1, 4, 3)); // odd pic_y only +} diff -Nru firefox-esr-140.9.1esr/gfx/thebes/COLRFonts.cpp firefox-esr-140.10.0esr/gfx/thebes/COLRFonts.cpp --- firefox-esr-140.9.1esr/gfx/thebes/COLRFonts.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/COLRFonts.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -2312,7 +2312,7 @@ uint32_t deltaSetSize = (uint16_t(regionIndexCount) + uint16_t(wordDeltaCount)) << longWords; if (reinterpret_cast(deltaSets()) + - uint16_t(itemCount) * deltaSetSize > + uint64_t(uint16_t(itemCount)) * deltaSetSize > reinterpret_cast(aHeader) + aLength) { return false; } diff -Nru firefox-esr-140.9.1esr/gfx/thebes/CoreTextFontList.h firefox-esr-140.10.0esr/gfx/thebes/CoreTextFontList.h --- firefox-esr-140.9.1esr/gfx/thebes/CoreTextFontList.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/CoreTextFontList.h 2026-04-15 01:59:50.000000000 +0000 @@ -84,6 +84,8 @@ static void DestroyBlobFunc(void* aUserData); + FontTableCache* GetFontTableCache(bool aCreate) override { return nullptr; } + CGFontRef mFontRef MOZ_GUARDED_BY(mLock); // owning reference const double mSizeHint; diff -Nru firefox-esr-140.9.1esr/gfx/thebes/SharedFontList.cpp firefox-esr-140.10.0esr/gfx/thebes/SharedFontList.cpp --- firefox-esr-140.9.1esr/gfx/thebes/SharedFontList.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/SharedFontList.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -798,6 +798,14 @@ bool FontList::AppendShmBlock(uint32_t aSizeNeeded) { MOZ_ASSERT(XRE_IsParentProcess()); + + // TODO: currently most callers of AppendShmBlock() (via Alloc()) assume + // the allocation is infallible; hence the release-assert here is the safe + // way to handle overflow. Consider whether to make the allocation fallible, + // and instead handle null safely in the callers. + MOZ_RELEASE_ASSERT(mBlocks.Length() < (1u << Pointer::kIndexBits), + "FontList shm block limit exceeded"); + uint32_t size = std::max(aSizeNeeded, SHM_BLOCK_SIZE); auto handle = ipc::shared_memory::CreateFreezable(size); if (!handle) { diff -Nru firefox-esr-140.9.1esr/gfx/thebes/SharedFontList.h firefox-esr-140.10.0esr/gfx/thebes/SharedFontList.h --- firefox-esr-140.9.1esr/gfx/thebes/SharedFontList.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/SharedFontList.h 2026-04-15 01:59:49.000000000 +0000 @@ -42,7 +42,8 @@ Pointer(uint32_t aBlock, uint32_t aOffset) : mBlockAndOffset((aBlock << kBlockShift) | aOffset) { - MOZ_ASSERT(aBlock < (1u << kIndexBits) && aOffset < (1u << kBlockShift)); + MOZ_RELEASE_ASSERT(aBlock < (1u << kIndexBits) && + aOffset < (1u << kBlockShift)); } Pointer(const Pointer& aOther) { diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxDWriteFontList.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxDWriteFontList.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxDWriteFontList.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxDWriteFontList.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -384,7 +384,10 @@ return fe; } -gfxDWriteFontEntry::~gfxDWriteFontEntry() {} +gfxDWriteFontEntry::~gfxDWriteFontEntry() { + auto* cache = mFontTableCache.exchange(nullptr); + delete cache; +} static bool UsingArabicOrHebrewScriptSystemLocale() { LANGID langid = PRIMARYLANGID(::GetSystemDefaultLangID()); @@ -512,6 +515,18 @@ return nullptr; } +gfxFontEntry::FontTableCache* gfxDWriteFontEntry::GetFontTableCache( + bool aCreate) { + // Create the cache if it does not yet exist. + if (!mFontTableCache && aCreate) { + auto* cache = new FontTableCache(); + if (!mFontTableCache.compareExchange(nullptr, cache)) { + delete cache; + } + } + return mFontTableCache; +} + nsresult gfxDWriteFontEntry::ReadCMAP(FontInfoData* aFontInfoData) { AUTO_PROFILER_LABEL("gfxDWriteFontEntry::ReadCMAP", GRAPHICS); @@ -1584,7 +1599,7 @@ if (FAILED(hr)) { glean::fontlist::dwritefont_init_problem.AccumulateSingleSample( uint32_t(errGDIInterop)); - mSharedFontList.reset(nullptr); + delete mSharedFontList.exchange(nullptr); return; } @@ -1593,7 +1608,7 @@ if (!mSystemFonts) { glean::fontlist::dwritefont_init_problem.AccumulateSingleSample( uint32_t(errSystemFontCollection)); - mSharedFontList.reset(nullptr); + delete mSharedFontList.exchange(nullptr); return; } #ifdef MOZ_BUNDLED_FONTS diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxDWriteFontList.h firefox-esr-140.10.0esr/gfx/thebes/gfxDWriteFontList.h --- firefox-esr-140.9.1esr/gfx/thebes/gfxDWriteFontList.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxDWriteFontList.h 2026-04-15 01:59:50.000000000 +0000 @@ -217,6 +217,8 @@ static bool InitLogFont(IDWriteFont* aFont, LOGFONTW* aLogFont); + FontTableCache* GetFontTableCache(bool aCreate) override; + /** * A fontentry only needs to have either of these. If it has both only * the IDWriteFont will be used. @@ -236,6 +238,8 @@ DWRITE_FONT_FACE_TYPE mFaceType; + mozilla::Atomic mFontTableCache; + int8_t mIsCJK; bool mIsSystemFont; bool mForceGDIClassic; diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxFT2FontBase.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxFT2FontBase.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxFT2FontBase.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxFT2FontBase.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -747,7 +747,7 @@ * Get the cached glyph metrics for the glyph id if available. Otherwise, query * FreeType for the glyph extents and initialize the glyph metrics. */ -const gfxFT2FontBase::GlyphMetrics& gfxFT2FontBase::GetCachedGlyphMetrics( +gfxFT2FontBase::GlyphMetrics gfxFT2FontBase::GetCachedGlyphMetrics( uint16_t aGID, IntRect* aBounds) { { // Try to read cached metrics without exclusive locking. @@ -782,7 +782,7 @@ bool gfxFT2FontBase::GetGlyphBounds(uint16_t aGID, gfxRect* aBounds, bool aTight) { IntRect bounds; - const GlyphMetrics& metrics = GetCachedGlyphMetrics(aGID, &bounds); + const GlyphMetrics metrics = GetCachedGlyphMetrics(aGID, &bounds); if (!metrics.HasValidBounds()) { return false; } diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxFT2FontBase.h firefox-esr-140.10.0esr/gfx/thebes/gfxFT2FontBase.h --- firefox-esr-140.9.1esr/gfx/thebes/gfxFT2FontBase.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxFT2FontBase.h 2026-04-15 01:59:49.000000000 +0000 @@ -142,7 +142,7 @@ uint16_t mHeight; }; - const GlyphMetrics& GetCachedGlyphMetrics( + GlyphMetrics GetCachedGlyphMetrics( uint16_t aGID, mozilla::gfx::IntRect* aBounds = nullptr); mozilla::UniquePtr> mGlyphMetrics diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxFT2FontList.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxFT2FontList.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxFT2FontList.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxFT2FontList.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -165,6 +165,10 @@ */ FT2FontEntry::~FT2FontEntry() { + auto* cache = mFontTableCache.exchange(nullptr); + delete cache; + auto* face = mHBFace.exchange(nullptr); + hb_face_destroy(face); if (mMMVar) { SharedFTFace* face = mFTFace; FT_Done_MM_Var(face->GetFace()->glyph->library, mMMVar); @@ -453,45 +457,52 @@ return rv; } -hb_face_t* FT2FontEntry::CreateHBFace() const { - hb_face_t* result = nullptr; +hb_face_t* FT2FontEntry::CreateHBFace() { + if (mHBFace) { + return hb_face_reference(mHBFace); + } + hb_face_t* face = nullptr; if (mFilename[0] == '/') { // An absolute path means a normal file in the filesystem, so we can use - // hb_blob_create_from_file to read it. - gfxFontUtils::AutoHBBlob fileBlob( - hb_blob_create_from_file(mFilename.get())); - if (hb_blob_get_length(fileBlob) > 0) { - result = hb_face_create(fileBlob, mFTFontIndex); + // hb_face_create_from_file_or_fail, and keep the face around. + face = hb_face_create_from_file_or_fail(mFilename.get(), mFTFontIndex); + if (face) { + if (!mHBFace.compareExchange(nullptr, face)) { + hb_face_destroy(face); + face = mHBFace; + } } - } else { - // A relative path means an omnijar resource, which we may need to - // decompress to a temporary buffer. - RefPtr reader = Omnijar::GetReader(Omnijar::Type::GRE); - nsZipItem* item = reader->GetItem(mFilename); - MOZ_ASSERT(item, "failed to find zip entry"); - if (item) { - // TODO(jfkthame): - // Check whether the item is compressed; if not, we could just get a - // pointer without needing to allocate a buffer and copy the data. - // (Currently this configuration isn't used for Gecko on Android.) - uint32_t length = item->RealSize(); - uint8_t* buffer = static_cast(malloc(length)); - if (buffer) { - nsZipCursor cursor(item, reader, buffer, length); - cursor.Copy(&length); - MOZ_ASSERT(length == item->RealSize(), "error reading font"); - if (length == item->RealSize()) { - gfxFontUtils::AutoHBBlob blob( - hb_blob_create((const char*)buffer, length, - HB_MEMORY_MODE_READONLY, buffer, free)); - result = hb_face_create(blob, mFTFontIndex); - } + return hb_face_reference(face); + } + + // A relative path means an omnijar resource, which we may need to + // decompress to a temporary buffer. + RefPtr reader = Omnijar::GetReader(Omnijar::Type::GRE); + nsZipItem* item = reader->GetItem(mFilename); + MOZ_ASSERT(item, "failed to find zip entry"); + if (item) { + // TODO(jfkthame): + // Check whether the item is compressed; if not, we could just get a + // pointer without needing to allocate a buffer and copy the data. + // (Currently this configuration isn't used for Gecko on Android.) + uint32_t length = item->RealSize(); + uint8_t* buffer = static_cast(malloc(length)); + if (buffer) { + nsZipCursor cursor(item, reader, buffer, length); + cursor.Copy(&length); + MOZ_ASSERT(length == item->RealSize(), "error reading font"); + if (length == item->RealSize()) { + gfxFontUtils::AutoHBBlob blob( + hb_blob_create((const char*)buffer, length, HB_MEMORY_MODE_READONLY, + buffer, free)); + // We don't retain this face; the caller will own the only reference. + return hb_face_create(blob, mFTFontIndex); } } } - return result; + return nullptr; } bool FT2FontEntry::HasFontTable(uint32_t aTableTag) { @@ -562,14 +573,13 @@ } } - // If the FT_Face hasn't been instantiated, try to read table directly - // via harfbuzz API to avoid expensive FT_Face creation. - if (!mFTFace && !mFilename.IsEmpty()) { - hb_face_t* face = CreateHBFace(); - if (face) { + // Try to read table directly via harfbuzz API, unless CreateHBFace will be + // expensive. + if (mHBFace || (!mFilename.IsEmpty() && mFilename[0] == '/')) { + if (hb_face_t* face = CreateHBFace()) { hb_blob_t* result = hb_face_reference_table(face, aTableTag); hb_face_destroy(face); - return result; + return result != hb_blob_get_empty() ? result : nullptr; } } @@ -578,6 +588,17 @@ return gfxFontEntry::GetFontTable(aTableTag); } +gfxFontEntry::FontTableCache* FT2FontEntry::GetFontTableCache(bool aCreate) { + // Create the cache if it does not yet exist. + if (!mFontTableCache && aCreate) { + auto* cache = new FontTableCache(); + if (!mFontTableCache.compareExchange(nullptr, cache)) { + delete cache; + } + } + return mFontTableCache; +} + bool FT2FontEntry::HasVariations() { switch (mHasVariations) { case HasVariationsState::No: diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxFT2FontList.h firefox-esr-140.10.0esr/gfx/thebes/gfxFT2FontList.h --- firefox-esr-140.9.1esr/gfx/thebes/gfxFT2FontList.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxFT2FontList.h 2026-04-15 01:59:50.000000000 +0000 @@ -86,9 +86,11 @@ // Get a harfbuzz face for this font, if possible. The caller is responsible // to destroy the face when no longer needed. + // Note that a face may be cached by the font entry, and a new reference + // returned to the caller. // This may be a bit expensive, so avoid calling multiple times if the same // face can be re-used for several purposes instead. - hb_face_t* CreateHBFace() const; + hb_face_t* CreateHBFace(); /** * Append this face's metadata to aFaceList for storage in the FontNameCache @@ -106,15 +108,22 @@ void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf, FontListSizes* aSizes) const override; + nsCString mFilename; + uint8_t mFTFontIndex; + + protected: + FontTableCache* GetFontTableCache(bool aCreate) override; + + mozilla::Atomic mFontTableCache; + + mozilla::Atomic mHBFace; + // Strong reference (addref'd), but held in an atomic ptr rather than a // normal RefPtr. mozilla::Atomic mFTFace; FT_MM_Var* mMMVar = nullptr; - nsCString mFilename; - uint8_t mFTFontIndex; - mozilla::ThreadSafeWeakPtr mUnscaledFont; nsTHashSet mAvailableTables; diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxFcPlatformFontList.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxFcPlatformFontList.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxFcPlatformFontList.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxFcPlatformFontList.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -7,7 +7,6 @@ #include "gfxFcPlatformFontList.h" #include "gfxFont.h" -#include "gfxFontConstants.h" #include "gfxFT2Utils.h" #include "gfxPlatform.h" #include "nsPresContext.h" @@ -18,25 +17,20 @@ #include "mozilla/Sprintf.h" #include "mozilla/StaticPrefs_gfx.h" #include "mozilla/glean/GfxMetrics.h" -#include "mozilla/TimeStamp.h" #include "nsGkAtoms.h" #include "nsIConsoleService.h" #include "nsIGfxInfo.h" #include "mozilla/Components.h" #include "nsString.h" #include "nsStringFwd.h" -#include "nsUnicodeProperties.h" #include "nsDirectoryServiceUtils.h" #include "nsDirectoryServiceDefs.h" -#include "nsAppDirectoryServiceDefs.h" #include "nsCharSeparatedTokenizer.h" #include "nsXULAppAPI.h" #include "SharedFontList-impl.h" #include "StandardFonts-linux.inc" #include "mozilla/intl/Locale.h" -#include "mozilla/gfx/HelpersCairo.h" - #include #include #include @@ -64,7 +58,6 @@ using namespace mozilla; using namespace mozilla::gfx; -using namespace mozilla::unicode; using namespace mozilla::intl; #ifndef FC_POSTSCRIPT_NAME @@ -401,13 +394,17 @@ } gfxFontconfigFontEntry::~gfxFontconfigFontEntry() { + auto* cache = mFontTableCache.exchange(nullptr); + delete cache; + auto* face = mHBFace.exchange(nullptr); + hb_face_destroy(face); if (mMMVar) { // Prior to freetype 2.9, there was no specific function to free the // FT_MM_Var record, and the docs just said to use free(). // InitializeVarFuncs must have been called in order for mMMVar to be // non-null here, so we don't need to do it again. if (sDoneVar) { - auto ftFace = GetFTFace(); + auto* ftFace = GetFTFace(); MOZ_ASSERT(ftFace, "How did mMMVar get set without a face?"); (*sDoneVar)(ftFace->GetFace()->glyph->library, mMMVar); } else { @@ -415,11 +412,75 @@ } } if (mFTFaceInitialized) { - auto face = mFTFace.exchange(nullptr); + auto* face = mFTFace.exchange(nullptr); NS_IF_RELEASE(face); } } +gfxFontconfigFontEntry::AutoHBFace gfxFontconfigFontEntry::GetHBFace() { + hb_face_t* face = mHBFace; + if (!face) { + FcChar8* filename; + FcPattern* pattern = GetPattern(); + bool useTableCache = false; + if (FcPatternGetString(pattern, FC_FILE, 0, &filename) == FcResultMatch) { + // Pattern has a filename: system font that we can load via + // hb_face_create_from_file_or_fail, allowing harfbuzz to manage table + // access internally. + int index; + if (FcPatternGetInteger(pattern, FC_INDEX, 0, &index) != FcResultMatch) { + index = 0; // default to 0 if not found in pattern + } + // Mask out possible variation-instance index stashed by fontconfig; we + // just want the face index within a collection file. + index &= 0xFFFF; + face = hb_face_create_from_file_or_fail((const char*)filename, index); + } else { + // If we have an FT_Font with webfont user data attached, we can use + // hb_face_create to wrap that. + if (mFTFaceInitialized) { + if (const FTUserFontData* ufd = GetUserFontData()) { + if (ufd->FontData()) { + hb_blob_t* blob = hb_blob_create( + (const char*)ufd->FontData(), ufd->FontDataLength(), + HB_MEMORY_MODE_READONLY, nullptr, nullptr); + // Currently the face index is always zero, as we don't support + // collections as webfonts. + face = hb_face_create(blob, 0); + // Drop our blob reference; the face will hold on to it. + hb_blob_destroy(blob); + } + } + } + } + if (!face) { + // Failed to create a face directly; fall back to gfxFontEntry::GetHBFace, + // which will use hb_face_create_for_tables and the font table cache. + NS_WARNING(nsPrintfCString("fallback to gfxFontEntry::GetHBFace for %s", + Name().get()) + .get()); + face = hb_face_reference(gfxFontEntry::GetHBFace()); + useTableCache = true; + } + AutoWriteLock lock(mLock); + if (mHBFace.compareExchange(nullptr, face)) { + if (useTableCache) { + auto* cache = new FontTableCache(); + if (!mFontTableCache.compareExchange(nullptr, cache)) { + delete cache; + } + } + } else { + // Lost a race to initialize mHBFace; discard our new one and use the + // winner of the race. + hb_face_destroy(face); + face = mHBFace; + } + } + // Return a new reference, owned by the AutoHBFace. + return AutoHBFace(hb_face_reference(face)); +} + nsresult gfxFontconfigFontEntry::ReadCMAP(FontInfoData* aFontInfoData) { // attempt this once, if errors occur leave a blank cmap if (mCharacterMap) { @@ -528,7 +589,13 @@ } } - return gfxFontEntry::GetFontTable(aTableTag); + // Use the cache only if it has already been created. + if (mFontTableCache) { + return gfxFontEntry::GetFontTable(aTableTag); + } + + auto* table = hb_face_reference_table(GetHBFace(), aTableTag); + return table != hb_blob_get_empty() ? table : nullptr; } double gfxFontconfigFontEntry::GetAspect(uint8_t aSizeAdjustBasis) { @@ -937,7 +1004,7 @@ AutoWriteLock lock(mLock); // Here, we use the original mFTFace, not a potential clone with variation // settings applied. - auto ftFace = GetFTFace(); + auto* ftFace = GetFTFace(); unscaledFont = ftFace->GetData() ? new UnscaledFontFontconfig(ftFace) : new UnscaledFontFontconfig( std::move(file), index, ftFace); @@ -967,7 +1034,7 @@ } FTUserFontData* gfxFontconfigFontEntry::GetUserFontData() { - auto face = GetFTFace(); + auto* face = GetFTFace(); if (face && face->GetData()) { return static_cast(face->GetData()); } @@ -1005,7 +1072,7 @@ return true; } } else { - if (auto ftFace = GetFTFace()) { + if (auto* ftFace = GetFTFace()) { if (ftFace->GetFace()->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS) { mHasVariations = HasVariationsState::Yes; return true; @@ -1032,7 +1099,7 @@ if (!sGetVar) { return nullptr; } - auto ftFace = GetFTFace(); + auto* ftFace = GetFTFace(); if (!ftFace) { return nullptr; } @@ -1306,7 +1373,7 @@ if (!fe) { continue; } - auto fce = static_cast(fe.get()); + auto* fce = static_cast(fe.get()); aAddPatternFunc(fce->GetPattern(), mContainsAppFonts); } } else { @@ -1871,7 +1938,7 @@ return MakeUnique(); }) .get() - ->Add(fontlist::Face::InitData(initData), /* singleName = */ false); + ->Add(fontlist::Face::InitData(initData), /* aSingleName = */ false); n++; if (n == int(cIndex)) { diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxFcPlatformFontList.h firefox-esr-140.10.0esr/gfx/thebes/gfxFcPlatformFontList.h --- firefox-esr-140.9.1esr/gfx/thebes/gfxFcPlatformFontList.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxFcPlatformFontList.h 2026-04-15 01:59:50.000000000 +0000 @@ -9,11 +9,9 @@ #include "gfxFT2FontBase.h" #include "gfxPlatformFontList.h" #include "mozilla/FontPropertyTypes.h" -#include "mozilla/mozalloc.h" #include "mozilla/RefPtr.h" #include "mozilla/UniquePtr.h" #include "nsClassHashtable.h" -#include "nsTHashMap.h" #include #include "ft2build.h" @@ -89,6 +87,8 @@ gfxFontEntry* Clone() const override; + AutoHBFace GetHBFace() override; + FcPattern* GetPattern() { return mFontPattern; } nsresult ReadCMAP(FontInfoData* aFontInfoData = nullptr) override; @@ -107,6 +107,9 @@ bool HasFontTable(uint32_t aTableTag) override; nsresult CopyFontTable(uint32_t aTableTag, nsTArray&) override; hb_blob_t* GetFontTable(uint32_t aTableTag) override; + FontTableCache* GetFontTableCache(bool aCreate) override { + return mFontTableCache; + }; double GetAspect(uint8_t aSizeAdjustBasis); @@ -127,6 +130,14 @@ mozilla::Atomic mFTFace; mozilla::Atomic mFTFaceInitialized; + // HarfBuzz face, if the entry is backed by a disk file. Initialized on first + // use. + mozilla::Atomic mHBFace; + + // Font table cache, created only if we fail to create a hb_face_t that wraps + // the complete font data. + mozilla::Atomic mFontTableCache; + // Whether TestCharacterMap should check the actual cmap rather than asking // fontconfig about character coverage. // We do this for app-bundled (rather than system) fonts, as they may diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxFont.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxFont.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxFont.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxFont.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -49,6 +49,7 @@ #include "gfxSVGGlyphs.h" #include "gfx2DGlue.h" #include "TextDrawTarget.h" +#include "COLRFonts.h" #include "ThebesRLBox.h" @@ -1079,7 +1080,6 @@ gfxHarfBuzzShaper* gfxFont::GetHarfBuzzShaper() { if (!mHarfBuzzShaper) { auto* shaper = new gfxHarfBuzzShaper(this); - shaper->Initialize(); if (!mHarfBuzzShaper.compareExchange(nullptr, shaper)) { delete shaper; } @@ -2684,7 +2684,7 @@ // We need the hbShaper to get color glyph bounds, so check that it's // usable. hbShaper = GetHarfBuzzShaper(); - if (!hbShaper && !hbShaper->IsInitialized()) { + if (!hbShaper) { return false; } if (aTextDrawer) { diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxFontEntry.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxFontEntry.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxFontEntry.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxFontEntry.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -13,30 +13,21 @@ #include "gfxTextRun.h" #include "gfxPlatform.h" -#include "nsGkAtoms.h" #include "gfxTypes.h" #include "gfxContext.h" -#include "gfxFontConstants.h" #include "gfxGraphiteShaper.h" #include "gfxHarfBuzzShaper.h" #include "gfxUserFontSet.h" #include "gfxPlatformFontList.h" -#include "nsUnicodeProperties.h" -#include "nsMathUtils.h" -#include "nsBidiUtils.h" -#include "nsStyleConsts.h" -#include "mozilla/AppUnits.h" #include "mozilla/FloatingPoint.h" #include "mozilla/Likely.h" #include "mozilla/MemoryReporting.h" -#include "mozilla/Preferences.h" #include "mozilla/ProfilerLabels.h" #include "mozilla/ScopeExit.h" -#include "mozilla/Services.h" #include "mozilla/StaticPrefs_layout.h" #include "gfxSVGGlyphs.h" -#include "gfx2DGlue.h" +#include "COLRFonts.h" #include "harfbuzz/hb.h" #include "harfbuzz/hb-ot.h" @@ -50,10 +41,12 @@ using namespace mozilla::gfx; using namespace mozilla::unicode; -void gfxCharacterMap::NotifyMaybeReleased(gfxCharacterMap* aCmap) { +void gfxCharacterMap::NotifyMaybeReleased(gfxCharacterMap* aCmap, + uint32_t aHash) { // Tell gfxPlatformFontList that a charmap's refcount was decremented, - // so it should check whether the object is to be deleted. - gfxPlatformFontList::PlatformFontList()->MaybeRemoveCmap(aCmap); + // so it should check whether the object is to be deleted. aCmap may be + // dangling; aHash was captured while it was alive. + gfxPlatformFontList::PlatformFontList()->MaybeRemoveCmap(aCmap, aHash); } gfxFontEntry::gfxFontEntry(const nsACString& aName, bool aIsStandardFace) @@ -111,8 +104,6 @@ } } - mFontTableCache.reset(nullptr); - delete mSVGGlyphs.exchange(nullptr); delete[] mUVSData.exchange(nullptr); @@ -120,9 +111,8 @@ NS_IF_RELEASE(cmap); // By the time the entry is destroyed, all font instances that were - // using it should already have been deleted, and so the HB and/or Gr - // face objects should have been released. - MOZ_ASSERT(!mHBFace); + // using it should already have been deleted, and so any Graphite + // face object should have been released. MOZ_ASSERT(!mGrFaceInitialized); } @@ -143,9 +133,16 @@ } bool gfxFontEntry::TrySetShmemCharacterMap() { - MOZ_ASSERT(mShmemFace); - auto list = gfxPlatformFontList::PlatformFontList()->SharedFontList(); - auto* shmemCmap = mShmemFace->mCharacterMap.ToPtr(list); + auto* pfl = gfxPlatformFontList::PlatformFontList(); + // Hold the platform-fontlist lock so InitFontList() cannot reset + // mSharedFontList while we dereference it. + gfxPlatformFontList::AutoLock lock(pfl->mLock); + auto* face = mShmemFace; + if (!face) { + return false; + } + auto* list = pfl->SharedFontList(); + const auto* shmemCmap = face->mCharacterMap.ToPtr(list); mShmemCharacterMap.exchange(shmemCmap); return shmemCmap != nullptr; } @@ -387,7 +384,7 @@ auto* colr = GetFontTable(TRUETYPE_TAG('C', 'O', 'L', 'R')); auto* cpal = colr ? GetFontTable(TRUETYPE_TAG('C', 'P', 'A', 'L')) : nullptr; - if (colr && cpal && gfx::COLRFonts::ValidateColorGlyphs(colr, cpal)) { + if (colr && cpal && COLRFonts::ValidateColorGlyphs(colr, cpal)) { if (!mCOLR.compareExchange(nullptr, colr)) { hb_blob_destroy(colr); } @@ -403,178 +400,55 @@ return mCOLR && mCPAL; } -/** - * FontTableBlobData - * - * See FontTableHashEntry for the general strategy. - */ - -class gfxFontEntry::FontTableBlobData { - public: - explicit FontTableBlobData(nsTArray&& aBuffer) - : mTableData(std::move(aBuffer)), mFontEntry(nullptr), mHashKey(0) { - MOZ_COUNT_CTOR(FontTableBlobData); - } - - ~FontTableBlobData() { - MOZ_COUNT_DTOR(FontTableBlobData); - if (mFontEntry && mHashKey) { - AutoWriteLock lock(mFontEntry->mLock); - mFontEntry->mFontTableCache->RemoveEntry(mHashKey); - } - } - - // Useful for creating blobs - const char* GetTable() const { - return reinterpret_cast(mTableData.Elements()); - } - uint32_t GetTableLength() const { return mTableData.Length(); } - - // Tell this FontTableBlobData to remove the HashEntry when this is - // destroyed. - void ManageHashEntry(gfxFontEntry* aFontEntry, uint32_t aHashKey) { - mFontEntry = aFontEntry; - mHashKey = aHashKey; - } - - // Disconnect from the HashEntry (because the blob has already been - // removed from the hashtable). - void ForgetHashEntry() { - mFontEntry = nullptr; - mHashKey = 0; - } - - size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const { - return mTableData.ShallowSizeOfExcludingThis(aMallocSizeOf); - } - size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const { - return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); - } - - private: - // The font table data block - const nsTArray mTableData; - - // The blob destroy function needs to know the owning font entry - // so that it can take the font-entry's lock while modifying the - // hashtable; and the hashtable key, so that it can remove the entry. - gfxFontEntry* mFontEntry; - uint32_t mHashKey; - - // not implemented - FontTableBlobData(const FontTableBlobData&); -}; - -hb_blob_t* gfxFontEntry::FontTableHashEntry::ShareTableAndGetBlob( - nsTArray&& aTable, gfxFontEntry* aFontEntry) { - Clear(); - // adopts elements of aTable - mSharedBlobData = new FontTableBlobData(std::move(aTable)); - - mBlob = hb_blob_create( - mSharedBlobData->GetTable(), mSharedBlobData->GetTableLength(), - HB_MEMORY_MODE_READONLY, mSharedBlobData, DeleteFontTableBlobData); - if (mBlob == hb_blob_get_empty()) { - // The FontTableBlobData was destroyed during hb_blob_create(). - // The (empty) blob will still be held in the hashtable with a strong - // reference. - mSharedBlobData = nullptr; - return hb_blob_reference(mBlob); - } - - // Tell the FontTableBlobData to remove this hash entry when destroyed. - // The hashtable does not keep a strong reference. - mSharedBlobData->ManageHashEntry(aFontEntry, GetKey()); - return mBlob; -} - -void gfxFontEntry::FontTableHashEntry::Clear() { - // If the FontTableBlobData is managing the hash entry, then the blob is - // not owned by this HashEntry; otherwise there is strong reference to the - // blob that must be removed. - if (mSharedBlobData) { - mSharedBlobData->ForgetHashEntry(); - mSharedBlobData = nullptr; - } else { - hb_blob_destroy(mBlob); +already_AddRefed gfxFontEntry::GetCMAPFromFontInfo( + FontInfoData* aFontInfoData, uint32_t& aUVSOffset) { + if (!aFontInfoData || !aFontInfoData->mLoadCmaps) { + return nullptr; } - mBlob = nullptr; -} - -// a hb_destroy_func for hb_blob_create - -/* static */ -void gfxFontEntry::FontTableHashEntry::DeleteFontTableBlobData( - void* aBlobData) { - delete static_cast(aBlobData); -} -hb_blob_t* gfxFontEntry::FontTableHashEntry::GetBlob() const { - return hb_blob_reference(mBlob); + return aFontInfoData->GetCMAP(mName, aUVSOffset); } -bool gfxFontEntry::GetExistingFontTable(uint32_t aTag, hb_blob_t** aBlob) { - AutoReadLock lock(mLock); - - if (MOZ_UNLIKELY(!mFontTableCache)) { - return false; - } - - if (const auto* entry = mFontTableCache->GetEntry(aTag)) { - *aBlob = entry->GetBlob(); - return true; +gfxFontEntry::FontTableBlob::FontTableBlob(nsTArray&& aData) + : mData(std::move(aData)) { + if (!mData.IsEmpty()) { + mBlob = hb_blob_create(reinterpret_cast(mData.Elements()), + mData.Length(), HB_MEMORY_MODE_READONLY, nullptr, + nullptr); } - - return false; } -hb_blob_t* gfxFontEntry::ShareFontTableAndGetBlob(uint32_t aTag, - nsTArray* aBuffer) { - AutoWriteLock lock(mLock); - - if (MOZ_UNLIKELY(!mFontTableCache)) { - mFontTableCache = MakeUnique(8); - } - - FontTableHashEntry* entry; - if (MOZ_UNLIKELY(entry = mFontTableCache->GetEntry(aTag))) { - // We must have been racing with another GetFontTable for the same table, - // and it won the race and filled in the entry before we took the lock. - // Ignore `aBuffer` and return a reference to the existing blob. - return entry->GetBlob(); - } - - // Infallible PutEntry call, so `entry` will be non-null. - entry = mFontTableCache->PutEntry(aTag); - - if (!aBuffer) { - // ensure the entry is null - entry->Clear(); - return nullptr; - } - - return entry->ShareTableAndGetBlob(std::move(*aBuffer), this); +size_t gfxFontEntry::FontTableBlob::SizeOfExcludingThis( + MallocSizeOf aMallocSizeOf) const { + return mData.ShallowSizeOfExcludingThis(aMallocSizeOf) + + ((mBlob && mBlob != hb_blob_get_empty()) ? aMallocSizeOf(mBlob) : 0); } -already_AddRefed gfxFontEntry::GetCMAPFromFontInfo( - FontInfoData* aFontInfoData, uint32_t& aUVSOffset) { - if (!aFontInfoData || !aFontInfoData->mLoadCmaps) { +hb_blob_t* gfxFontEntry::GetFontTable(uint32_t aTag) { + auto* cache = GetFontTableCache(true); + MOZ_ASSERT(cache, "missing or incomplete GetFontTable override?"); + if (!cache) { return nullptr; } - return aFontInfoData->GetCMAP(mName, aUVSOffset); -} - -hb_blob_t* gfxFontEntry::GetFontTable(uint32_t aTag) { - hb_blob_t* blob; - if (GetExistingFontTable(aTag, &blob)) { - return blob; + { + AutoReadLock lock(mLock); + if (auto lookup = cache->Lookup(aTag)) { + return lookup.Data().GetBlob(); + } } nsTArray buffer; bool haveTable = NS_SUCCEEDED(CopyFontTable(aTag, buffer)); - return ShareFontTableAndGetBlob(aTag, haveTable ? &buffer : nullptr); + AutoWriteLock lock(mLock); + return cache + ->LookupOrInsertWith(aTag, + [&] { + return haveTable ? FontTableBlob(std::move(buffer)) + : FontTableBlob(); + }) + .GetBlob(); } // callback for HarfBuzz to get a font table (in hb_blob_t form) @@ -1088,7 +962,7 @@ if (len < sizeof(TrakHeader)) { return false; } - auto trak = reinterpret_cast(data); + const auto* trak = reinterpret_cast(data); uint16_t horizOffset = trak->horizOffset; if (trak->version != 0x00010000 || uint16_t(trak->format) != 0 || horizOffset == 0 || uint16_t(trak->reserved) != 0) { @@ -1098,7 +972,8 @@ if (horizOffset > len - sizeof(TrackData)) { return false; } - auto trackData = reinterpret_cast(data + horizOffset); + const auto* trackData = + reinterpret_cast(data + horizOffset); uint16_t nTracks = trackData->nTracks; mNumTrakSizes = trackData->nSizes; if (nTracks == 0 || mNumTrakSizes < 2) { @@ -1110,7 +985,7 @@ len - (sizeof(TrackData) + nTracks * sizeof(TrackTableEntry))) { return false; } - auto trackTable = reinterpret_cast( + const auto* trackTable = reinterpret_cast( data + horizOffset + sizeof(TrackData)); // Look for 'normal' tracking, bail out if no such track is present. unsigned trackIndex; @@ -1398,18 +1273,6 @@ } } -size_t gfxFontEntry::FontTableHashEntry::SizeOfExcludingThis( - mozilla::MallocSizeOf aMallocSizeOf) const { - size_t n = 0; - if (mBlob) { - n += aMallocSizeOf(mBlob); - } - if (mSharedBlobData) { - n += mSharedBlobData->SizeOfIncludingThis(aMallocSizeOf); - } - return n; -} - void gfxFontEntry::AddSizeOfExcludingThis(MallocSizeOf aMallocSizeOf, FontListSizes* aSizes) const { aSizes->mFontListSize += mName.SizeOfExcludingThisIfUnshared(aMallocSizeOf); @@ -1419,11 +1282,19 @@ aSizes->mCharMapsSize += GetCharacterMap()->SizeOfIncludingThis(aMallocSizeOf); } + { AutoReadLock lock(mLock); - if (mFontTableCache) { + // Passing `false` to GetFontTableCache() here means it will not actually + // modify anything, just return the existing cache if any. + if (auto* cache = + const_cast(this)->GetFontTableCache(false)) { aSizes->mFontTableCacheSize += - mFontTableCache->SizeOfIncludingThis(aMallocSizeOf); + cache->ShallowSizeOfIncludingThis(aMallocSizeOf); + for (auto it = cache->ConstIter(); !it.Done(); it.Next()) { + aSizes->mFontTableCacheSize += + it.Data().SizeOfExcludingThis(aMallocSizeOf); + } } } @@ -1789,7 +1660,7 @@ gfxFontEntry* fe = nullptr; float distance = INFINITY; - for (auto e : entries) { + for (auto* e : entries) { if (e->SkipDuringSystemFallback()) { continue; } diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxFontEntry.h firefox-esr-140.10.0esr/gfx/thebes/gfxFontEntry.h --- firefox-esr-140.9.1esr/gfx/thebes/gfxFontEntry.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxFontEntry.h 2026-04-15 01:59:49.000000000 +0000 @@ -8,9 +8,7 @@ #include #include -#include #include -#include "COLRFonts.h" #include "ThebesRLBoxTypes.h" #include "gfxFontUtils.h" #include "gfxFontVariations.h" @@ -28,7 +26,6 @@ #include "mozilla/TypedEnumBits.h" #include "mozilla/UniquePtr.h" #include "mozilla/intl/UnicodeScriptCodes.h" -#include "nsTHashMap.h" #include "nsDebug.h" #include "nsHashKeys.h" #include "nsISupports.h" @@ -91,14 +88,15 @@ // new reference, or completes the release first!) void Release() { MOZ_ASSERT(int32_t(mRefCnt) > 0, "dup release"); - // We can't safely read this after we've decremented mRefCnt, so save it - // in a local variable here. Note that the value is never reset to false + // We can't safely read mShared and mHash after we've decremented mRefCnt, + // so save them in locals here. Note that mShared is never reset to false // once it has been set to true (when recording the cmap in the shared // table), so there's no risk of this resulting in a "false positive" when // tested later. A "false negative" is possible but harmless; it would // just mean we miss an opportunity to release a reference from the shared - // cmap table. + // cmap table. mHash is set once before sharing and never changes. bool isShared = mShared; + uint32_t hash = mHash; // Ensure we only access mRefCnt once, for consistency if the object is // being used by multiple threads. @@ -111,7 +109,13 @@ if (isShared) { MOZ_ASSERT(count > 0); if (count == 1) { - NotifyMaybeReleased(this); + // After --mRefCnt (above), `this` may be freed at any time (by another + // thread racing us into MaybeRemoveCmap and deleting first, or by the + // gfxPlatformFontList destructor's teardown path). We must not + // dereference `this` from here on. Pass the captured hash by value so + // MaybeRemoveCmap can perform the hashtable lookup without + // dereferencing the potentially-dangling pointer. + NotifyMaybeReleased(this, hash); } return; } @@ -157,7 +161,7 @@ void CalcHash() { mHash = GetChecksum(); } - static void NotifyMaybeReleased(gfxCharacterMap* aCmap); + static void NotifyMaybeReleased(gfxCharacterMap* aCmap, uint32_t aHash); // Only used when clearing the shared-cmap hashtable during shutdown. void ClearSharedFlag() { @@ -448,7 +452,7 @@ hb_face_t* mFace; }; - AutoHBFace GetHBFace() { + virtual AutoHBFace GetHBFace() { return AutoHBFace(hb_face_create_for_tables(HBGetTable, this, nullptr)); } @@ -750,13 +754,6 @@ // Usually, only one of these will actually be created for any given font // entry, depending on the font tables that are present. - // hb_face_t is refcounted internally, so each shaper that's using it will - // bump the ref count when it acquires the face, and "destroy" (release) it - // in its destructor. The font entry has only this non-owning reference to - // the face; when the face is deleted, it will tell the font entry to forget - // it, so that a new face will be created next time it is needed. - mozilla::Atomic mHBFace; - static hb_blob_t* HBGetTable(hb_face_t* face, uint32_t aTag, void* aUserData); // Callback that the hb_face will use to tell us when it is being deleted. @@ -811,96 +808,35 @@ int16_t mXMax = std::numeric_limits::max(); int16_t mYMax = std::numeric_limits::max(); - private: - /** - * Font table hashtable, to support GetFontTable for harfbuzz. - * - * The harfbuzz shaper (and potentially other clients) needs access to raw - * font table data. This needs to be cached so that it can be used - * repeatedly (each time we construct a text run; in some cases, for - * each character/glyph within the run) without re-fetching large tables - * every time. - * - * Because we may instantiate many gfxFonts for the same physical font - * file (at different sizes), we should ensure that they can share a - * single cached copy of the font tables. To do this, we implement table - * access and sharing on the fontEntry rather than the font itself. - * - * The default implementation uses GetFontTable() to read font table - * data into byte arrays, and wraps them in blobs which are registered in - * a hashtable. The hashtable can then return pre-existing blobs to - * harfbuzz. - * - * Harfbuzz will "destroy" the blobs when it is finished with them. When - * the last blob reference is removed, the FontTableBlobData user data - * will remove the blob from the hashtable if still registered. - */ - - class FontTableBlobData; - - /** - * FontTableHashEntry manages the entries of hb_blob_t's containing font - * table data. - * - * This is used to share font tables across fonts with the same - * font entry (but different sizes) for use by HarfBuzz. The hashtable - * does not own a strong reference to the blob, but keeps a weak pointer, - * managed by FontTableBlobData. Similarly FontTableBlobData keeps only a - * weak pointer to the hashtable, managed by FontTableHashEntry. - */ - - class FontTableHashEntry : public nsUint32HashKey { + protected: + // Font table cache, used only by backend implementations that are not able + // to provide a cheap GetFontTable() that wraps already-cached data. + class FontTableBlob { public: - // Declarations for nsTHashtable - - typedef nsUint32HashKey KeyClass; - typedef KeyClass::KeyType KeyType; - typedef KeyClass::KeyTypePointer KeyTypePointer; - - explicit FontTableHashEntry(KeyTypePointer aTag) - : KeyClass(aTag), mSharedBlobData(nullptr), mBlob(nullptr) {} - - // NOTE: This assumes the new entry belongs to the same hashtable as - // the old, because the mHashtable pointer in mSharedBlobData (if - // present) will not be updated. - FontTableHashEntry(FontTableHashEntry&& toMove) - : KeyClass(std::move(toMove)), - mSharedBlobData(std::move(toMove.mSharedBlobData)), - mBlob(std::move(toMove.mBlob)) { - toMove.mSharedBlobData = nullptr; - toMove.mBlob = nullptr; + FontTableBlob() = default; + explicit FontTableBlob(nsTArray&& aData); + FontTableBlob(const FontTableBlob& aOther) = delete; + FontTableBlob(FontTableBlob&& aOther) + : mData(std::move(aOther.mData)), mBlob(std::move(aOther.mBlob)) { + aOther.mBlob = nullptr; } - ~FontTableHashEntry() { Clear(); } - - // FontTable/Blob API - - // Transfer (not copy) elements of aTable to a new hb_blob_t and - // return ownership to the caller. A weak reference to the blob is - // recorded in the font entry's table cache so that others may use - // the same table. - hb_blob_t* ShareTableAndGetBlob(nsTArray&& aTable, - gfxFontEntry* aFontEntry); - - // Return a strong reference to the blob. - // Callers must hb_blob_destroy the returned blob. - hb_blob_t* GetBlob() const; - - void Clear(); + ~FontTableBlob() { hb_blob_destroy(mBlob); } + hb_blob_t* GetBlob() const { return hb_blob_reference(mBlob); } size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const; - private: - static void DeleteFontTableBlobData(void* aBlobData); - // not implemented - FontTableHashEntry& operator=(FontTableHashEntry& toCopy); - - FontTableBlobData* mSharedBlobData; - hb_blob_t* mBlob; + protected: + nsTArray mData; + hb_blob_t* mBlob = nullptr; }; - using FontTableCache = nsTHashtable; - mozilla::UniquePtr mFontTableCache MOZ_GUARDED_BY(mLock); + using FontTableCache = nsTHashMap; + // Get the font table cache, if this backend uses it. Backends or individual + // font entries that don't want to use the cache just return nullptr. + // If aCreate is false, a new cache will not be created, but if one already + // exists it will be returned. + virtual FontTableCache* GetFontTableCache(bool aCreate) = 0; }; MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(gfxFontEntry::RangeFlags) diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxGDIFontList.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxGDIFontList.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxGDIFontList.cpp 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxGDIFontList.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -133,12 +133,29 @@ InitLogFont(aFaceName, aFontType); } +GDIFontEntry::~GDIFontEntry() { + auto* cache = mFontTableCache.exchange(nullptr); + delete cache; +} + gfxFontEntry* GDIFontEntry::Clone() const { MOZ_ASSERT(!IsUserFont(), "we can only clone installed fonts!"); return new GDIFontEntry(Name(), mFontType, SlantStyle(), Weight(), Stretch(), nullptr); } +gfxFontEntry::FontTableCache* GDIFontEntry::GetFontTableCache( + bool aCreate) { + // Create the cache if it does not yet exist. + if (!mFontTableCache && aCreate) { + auto* cache = new FontTableCache(); + if (!mFontTableCache.compareExchange(nullptr, cache)) { + delete cache; + } + } + return mFontTableCache; +} + nsresult GDIFontEntry::ReadCMAP(FontInfoData* aFontInfoData) { AUTO_PROFILER_LABEL("GDIFontEntry::ReadCMAP", OTHER); diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxGDIFontList.h firefox-esr-140.10.0esr/gfx/thebes/gfxGDIFontList.h --- firefox-esr-140.9.1esr/gfx/thebes/gfxGDIFontList.h 2026-04-03 15:52:20.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxGDIFontList.h 2026-04-15 01:59:49.000000000 +0000 @@ -94,6 +94,8 @@ // This replaces FontEntry from gfxWindowsFonts.h/cpp. class GDIFontEntry final : public gfxFontEntry { public: + virtual ~GDIFontEntry(); + LPLOGFONTW GetLogFont() { return &mLogFont; } nsresult ReadCMAP(FontInfoData* aFontInfoData = nullptr) override; @@ -163,6 +165,8 @@ SlantStyleRange aStyle, WeightRange aWeight, StretchRange aStretch, gfxUserFontData* aUserFontData); + FontTableCache* GetFontTableCache(bool aCreate) override; + void InitLogFont(const nsACString& aName, gfxWindowsFontType aFontType); gfxFont* CreateFontInstance(const gfxFontStyle* aFontStyle) override; @@ -176,6 +180,8 @@ LOGFONTW mLogFont; mozilla::ThreadSafeWeakPtr mUnscaledFont; + + mozilla::Atomic mFontTableCache; }; // a single font family, referencing one or more faces diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxHarfBuzzShaper.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxHarfBuzzShaper.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxHarfBuzzShaper.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxHarfBuzzShaper.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -37,30 +37,10 @@ gfxHarfBuzzShaper::gfxHarfBuzzShaper(gfxFont* aFont) : gfxFontShaper(aFont), - mHBFont(nullptr), - mBuffer(nullptr), - mCallbackData(), - mKernTable(nullptr), - mHmtxTable(nullptr), - mVmtxTable(nullptr), - mVORGTable(nullptr), - mLocaTable(nullptr), - mGlyfTable(nullptr), - mCmapTable(nullptr), - mCmapFormat(-1), - mSubtableOffset(0), - mUVSTableOffset(0), - mNumLongHMetrics(0), - mNumLongVMetrics(0), - mDefaultVOrg(-1.0), mUseFontGetGlyph(aFont->ProvidesGetGlyph()), - mIsSymbolFont(false), - mUseFontGlyphWidths(aFont->ProvidesGlyphWidths()), - mInitialized(false), - mVerticalInitialized(false), - mUseVerticalPresentationForms(false), - mLoadedLocaGlyf(false), - mLocaLongOffsets(false) {} + mUseFontGlyphWidths(aFont->ProvidesGlyphWidths()) { + (void)NS_WARN_IF(!Initialize()); +} gfxHarfBuzzShaper::~gfxHarfBuzzShaper() { // hb_*_destroy functions are safe to call on nullptr @@ -79,15 +59,16 @@ hb_codepoint_t gfxHarfBuzzShaper::GetGlyphUncached( hb_codepoint_t unicode) const { + // Note that the fields used here are set during Initialize() and then never + // modified, so locking is not necessary. hb_codepoint_t gid = 0; if (mUseFontGetGlyph) { - MutexAutoUnlock unlock(mCacheLock); gid = mFont->GetGlyph(unicode, 0); } else { // we only instantiate a harfbuzz shaper if there's a cmap available - NS_ASSERTION(mCmapTable && (mCmapFormat > 0) && (mSubtableOffset > 0), - "cmap data not correctly set up, expect disaster"); + MOZ_ASSERT(mCmapTable && (mCmapFormat > 0) && (mSubtableOffset > 0), + "cmap data not correctly set up, expect disaster"); uint32_t length; const uint8_t* data = (const uint8_t*)hb_blob_get_data(mCmapTable, &length); @@ -147,30 +128,21 @@ hb_codepoint_t gfxHarfBuzzShaper::GetNominalGlyph( hb_codepoint_t unicode) const { - MutexAutoLock lock(mCacheLock); + RecursiveMutexAutoLock lock(mMutex); auto cached = mCmapCache->Lookup(unicode); if (cached) { return cached.Data().mGlyphId; } - // This call can temporarily unlock the cache if mUseFontGetGlyph is true. hb_codepoint_t gid = GetGlyphUncached(unicode); - - if (mUseFontGetGlyph) { - // GetGlyphUncached may have invalidated our earlier cache lookup! - mCmapCache->Put(unicode, CmapCacheData{unicode, gid}); - } else { - cached.Set(CmapCacheData{unicode, gid}); - } - + mCmapCache->Put(unicode, CmapCacheData{unicode, gid}); return gid; } unsigned int gfxHarfBuzzShaper::GetNominalGlyphs( unsigned int count, const hb_codepoint_t* first_unicode, unsigned int unicode_stride, hb_codepoint_t* first_glyph, - unsigned int glyph_stride) { - MutexAutoLock lock(mCacheLock); + unsigned int glyph_stride) const { unsigned int result = 0; while (result < count) { hb_codepoint_t usv = *first_unicode; @@ -302,17 +274,18 @@ return charPair ? charPair[1] : 0; } -static hb_bool_t HBGetNominalGlyph(hb_font_t* font, void* font_data, - hb_codepoint_t unicode, - hb_codepoint_t* glyph, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); +hb_bool_t gfxHarfBuzzShaper::HBGetNominalGlyph(hb_font_t* font, void* font_data, + hb_codepoint_t unicode, + hb_codepoint_t* glyph, + void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); - if (fcd->mShaper->UseVerticalPresentationForms()) { + if (shaper->UseVerticalPresentationForms()) { hb_codepoint_t verticalForm = gfxHarfBuzzShaper::GetVerticalPresentationForm(unicode); if (verticalForm) { - *glyph = fcd->mShaper->GetNominalGlyph(verticalForm); + *glyph = shaper->GetNominalGlyph(verticalForm); if (*glyph != 0) { return true; } @@ -320,37 +293,39 @@ // fall back to the non-vertical form if we didn't find an alternate } - *glyph = fcd->mShaper->GetNominalGlyph(unicode); + *glyph = shaper->GetNominalGlyph(unicode); return *glyph != 0; } -static unsigned int HBGetNominalGlyphs( +/* static */ unsigned int gfxHarfBuzzShaper::HBGetNominalGlyphs( hb_font_t* font, void* font_data, unsigned int count, const hb_codepoint_t* first_unicode, unsigned int unicode_stride, hb_codepoint_t* first_glyph, unsigned int glyph_stride, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - if (fcd->mShaper->UseVerticalPresentationForms()) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + if (shaper->UseVerticalPresentationForms()) { return 0; } - return fcd->mShaper->GetNominalGlyphs(count, first_unicode, unicode_stride, - first_glyph, glyph_stride); + // GetNominalGlyphs requires that the mMutex is held, which is guaranteed + // because we're inside a callback from hb_shape. + MOZ_PUSH_IGNORE_THREAD_SAFETY + return shaper->GetNominalGlyphs(count, first_unicode, unicode_stride, + first_glyph, glyph_stride); + MOZ_POP_THREAD_SAFETY } -static hb_bool_t HBGetVariationGlyph(hb_font_t* font, void* font_data, - hb_codepoint_t unicode, - hb_codepoint_t variation_selector, - hb_codepoint_t* glyph, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); +/* static */ hb_bool_t gfxHarfBuzzShaper::HBGetVariationGlyph( + hb_font_t* font, void* font_data, hb_codepoint_t unicode, + hb_codepoint_t variation_selector, hb_codepoint_t* glyph, void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); - if (fcd->mShaper->UseVerticalPresentationForms()) { + if (shaper->UseVerticalPresentationForms()) { hb_codepoint_t verticalForm = gfxHarfBuzzShaper::GetVerticalPresentationForm(unicode); if (verticalForm) { - *glyph = - fcd->mShaper->GetVariationGlyph(verticalForm, variation_selector); + *glyph = shaper->GetVariationGlyph(verticalForm, variation_selector); if (*glyph != 0) { return true; } @@ -358,7 +333,7 @@ // fall back to the non-vertical form if we didn't find an alternate } - *glyph = fcd->mShaper->GetVariationGlyph(unicode, variation_selector); + *glyph = shaper->GetVariationGlyph(unicode, variation_selector); return *glyph != 0; } @@ -405,13 +380,12 @@ hb_position_t gfxHarfBuzzShaper::GetGlyphHAdvance(hb_codepoint_t glyph) const { if (mUseFontGlyphWidths) { - MutexAutoLock lock(mCacheLock); + RecursiveMutexAutoLock lock(mMutex); if (auto cached = mWidthCache->Lookup(glyph)) { return cached.Data().mAdvance; } - mCacheLock.Unlock(); + hb_position_t advance = GetFont()->GetGlyphWidth(glyph); - mCacheLock.Lock(); mWidthCache->Put(glyph, WidthCacheData{glyph, advance}); return advance; } @@ -424,19 +398,14 @@ unsigned int glyph_stride, hb_position_t* first_advance, unsigned int advance_stride) const { + // This is called with the mMutex mutex already held. if (mUseFontGlyphWidths) { - // Take the cache lock here, hoping we'll be able to retrieve a bunch of - // widths from the cache for the cost of a single locking operation. - MutexAutoLock lock(mCacheLock); for (unsigned int i = 0; i < count; ++i) { hb_codepoint_t gid = *first_glyph; if (auto cached = mWidthCache->Lookup(gid)) { *first_advance = cached.Data().mAdvance; } else { - // Unlock to avoid deadlock if the font needs internal locking. - mCacheLock.Unlock(); hb_position_t advance = GetFont()->GetGlyphWidth(gid); - mCacheLock.Lock(); mWidthCache->Put(gid, WidthCacheData{gid, advance}); *first_advance = advance; } @@ -458,7 +427,9 @@ } hb_position_t gfxHarfBuzzShaper::GetGlyphVAdvance(hb_codepoint_t glyph) { - InitializeVertical(); + if (!mVerticalInitialized) { + InitializeVertical(); + } if (!mVmtxTable) { // Must be a "vertical" font that doesn't actually have vertical metrics. @@ -483,39 +454,41 @@ uint16_t(metrics->metrics[glyph].advanceWidth)); } -static hb_position_t HBGetGlyphHAdvance(hb_font_t* font, void* font_data, - hb_codepoint_t glyph, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - return fcd->mShaper->GetGlyphHAdvance(glyph); -} - -static void HBGetGlyphHAdvances(hb_font_t* font, void* font_data, - unsigned int count, - const hb_codepoint_t* first_glyph, - unsigned int glyph_stride, - hb_position_t* first_advance, - unsigned int advance_stride, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - fcd->mShaper->GetGlyphHAdvances(count, first_glyph, glyph_stride, - first_advance, advance_stride); -} - -static hb_position_t HBGetGlyphVAdvance(hb_font_t* font, void* font_data, - hb_codepoint_t glyph, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); +/* static */ hb_position_t gfxHarfBuzzShaper::HBGetGlyphHAdvance( + hb_font_t* font, void* font_data, hb_codepoint_t glyph, void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + return shaper->GetGlyphHAdvance(glyph); +} + +/* static */ void gfxHarfBuzzShaper::HBGetGlyphHAdvances( + hb_font_t* font, void* font_data, unsigned int count, + const hb_codepoint_t* first_glyph, unsigned int glyph_stride, + hb_position_t* first_advance, unsigned int advance_stride, + void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + + // GetGlyphHAdvances requires that mMutex is held, which is guaranteed + // because we're inside a callback from hb_shape. + MOZ_PUSH_IGNORE_THREAD_SAFETY + shaper->GetGlyphHAdvances(count, first_glyph, glyph_stride, first_advance, + advance_stride); + MOZ_POP_THREAD_SAFETY +} + +/* static */ hb_position_t gfxHarfBuzzShaper::HBGetGlyphVAdvance( + hb_font_t* font, void* font_data, hb_codepoint_t glyph, void* user_data) { + gfxHarfBuzzShaper* shaper = static_cast(font_data); // Currently, we don't offer gfxFont subclasses a method to override this // and provide hinted platform-specific vertical advances (analogous to the // GetGlyphWidth method for horizontal advances). If that proves necessary, // we'll add a new gfxFont method and call it from here. - hb_position_t advance = fcd->mShaper->GetGlyphVAdvance(glyph); + hb_position_t advance = shaper->GetGlyphVAdvance(glyph); if (advance < 0) { // Not available (e.g. broken metrics in the font); use a fallback value. - advance = FloatToFixed(fcd->mShaper->GetFont() - ->GetMetrics(nsFontMetrics::eVertical) - .aveCharWidth); + advance = FloatToFixed( + shaper->GetFont()->GetMetrics(nsFontMetrics::eVertical).aveCharWidth); } // We negate the value from GetGlyphVAdvance here because harfbuzz shapes // with a coordinate system where positive is upwards, whereas the inline @@ -535,12 +508,12 @@ AutoSwap_PRInt16 vertOriginY; }; -static hb_bool_t HBGetGlyphVOrigin(hb_font_t* font, void* font_data, - hb_codepoint_t glyph, hb_position_t* x, - hb_position_t* y, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - fcd->mShaper->GetGlyphVOrigin(glyph, x, y); +/* static */ hb_bool_t gfxHarfBuzzShaper::HBGetGlyphVOrigin( + hb_font_t* font, void* font_data, hb_codepoint_t glyph, hb_position_t* x, + hb_position_t* y, void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + shaper->GetGlyphVOrigin(glyph, x, y); return true; } @@ -644,13 +617,12 @@ *aY = mDefaultVOrg; } -static hb_bool_t HBGetGlyphExtents(hb_font_t* font, void* font_data, - hb_codepoint_t glyph, - hb_glyph_extents_t* extents, - void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - return fcd->mShaper->GetGlyphExtents(glyph, extents); +/* static */ hb_bool_t gfxHarfBuzzShaper::HBGetGlyphExtents( + hb_font_t* font, void* font_data, hb_codepoint_t glyph, + hb_glyph_extents_t* extents, void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + return shaper->GetGlyphExtents(glyph, extents); } // Find the data for glyph ID |aGlyph| in the 'glyf' table, if present. @@ -687,15 +659,17 @@ uint32_t len; const char* data = hb_blob_get_data(mLocaTable, &len); if (mLocaLongOffsets) { - if ((aGlyph + 1) * sizeof(AutoSwap_PRUint32) > len) { + // We read offsets[aGlyph] and offsets[aGlyph + 1], so require aGlyph + 2 + // entries. + if ((aGlyph + 2) * sizeof(AutoSwap_PRUint32) > len) { return nullptr; } const AutoSwap_PRUint32* offsets = reinterpret_cast(data); offset = offsets[aGlyph]; - *aEmptyGlyf = (offset == uint16_t(offsets[aGlyph + 1])); + *aEmptyGlyf = (offset == uint32_t(offsets[aGlyph + 1])); } else { - if ((aGlyph + 1) * sizeof(AutoSwap_PRUint16) > len) { + if ((aGlyph + 2) * sizeof(AutoSwap_PRUint16) > len) { return nullptr; } const AutoSwap_PRUint16* offsets = @@ -745,10 +719,9 @@ return true; } -static hb_bool_t HBGetContourPoint(hb_font_t* font, void* font_data, - unsigned int point_index, - hb_codepoint_t glyph, hb_position_t* x, - hb_position_t* y, void* user_data) { +/* static */ hb_bool_t gfxHarfBuzzShaper::HBGetContourPoint( + hb_font_t* font, void* font_data, unsigned int point_index, + hb_codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* user_data) { /* not yet implemented - no support for used of hinted contour points to fine-tune anchor positions in GPOS AnchorFormat2 */ return false; @@ -1123,13 +1096,12 @@ return 0; } -static hb_position_t HBGetHKerning(hb_font_t* font, void* font_data, - hb_codepoint_t first_glyph, - hb_codepoint_t second_glyph, - void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - return fcd->mShaper->GetHKerning(first_glyph, second_glyph); +/* static */ hb_position_t gfxHarfBuzzShaper::HBGetHKerning( + hb_font_t* font, void* font_data, hb_codepoint_t first_glyph, + hb_codepoint_t second_glyph, void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + return shaper->GetHKerning(first_glyph, second_glyph); } /* @@ -1216,11 +1188,9 @@ hb_ot_tag_to_script(HB_TAG('m', 'a', 't', 'h')); bool gfxHarfBuzzShaper::Initialize() { - if (mInitialized) { - return mHBFont != nullptr; - } - mInitialized = true; - mCallbackData.mShaper = this; + // We don't need to lock here, as we're just initializing the shaper and no + // other thread can yet be using it. + MOZ_PUSH_IGNORE_THREAD_SAFETY if (!sHBFontFuncs) { // static function callback pointers, initialized by the first @@ -1293,9 +1263,6 @@ mNumGlyphs = uint16_t(maxp->numGlyphs); } - // We don't need to take the cache lock here, as we're just initializing the - // shaper and no other thread can yet be using it. - MOZ_PUSH_IGNORE_THREAD_SAFETY mCmapCache = MakeUnique(); if (mUseFontGlyphWidths) { @@ -1307,7 +1274,6 @@ return false; } } - MOZ_POP_THREAD_SAFETY mBuffer = hb_buffer_create(); hb_buffer_set_unicode_funcs(mBuffer, sHBUnicodeFuncs); @@ -1318,14 +1284,16 @@ mFont->GetFontEntry()->HasFontTable(TRUETYPE_TAG('C', 'F', 'F', ' ')) ? sNominalGlyphFunc : sHBFontFuncs; - mHBFont = CreateHBFont(mFont, funcs, &mCallbackData); + mHBFont = CreateHBFont(mFont, funcs, this); + + MOZ_POP_THREAD_SAFETY return true; } hb_font_t* gfxHarfBuzzShaper::CreateHBFont(gfxFont* aFont, hb_font_funcs_t* aFontFuncs, - FontCallbackData* aCallbackData) { + void* aCallbackData) { auto face(aFont->GetFontEntry()->GetHBFace()); hb_font_t* result = hb_font_create(face); @@ -1395,9 +1363,8 @@ void gfxHarfBuzzShaper::InitializeVertical() { // We only do this once. If we don't have a mHmtxTable after that, // we'll be making up fallback metrics. - if (mVerticalInitialized) { - return; - } + RecursiveMutexAutoLock lock(mMutex); + mVerticalInitialized = true; if (!mHmtxTable) { @@ -1459,14 +1426,16 @@ nsAtom* aLanguage, bool aVertical, RoundingFlags aRounding, gfxShapedText* aShapedText) { - mUseVerticalPresentationForms = false; - - if (!Initialize()) { - return false; - } + // gfxFont (and hence this shaper) may be shared across threads via the + // global font cache; serialize ShapeText so that mBuffer and other mutable + // per-call state cannot be touched concurrently. + RecursiveMutexAutoLock lock(mMutex); + mUseVerticalPresentationForms = false; if (aVertical) { - InitializeVertical(); + if (!mVerticalInitialized) { + InitializeVertical(); + } if (!mFont->GetFontEntry()->SupportsOpenTypeFeature( aScript, HB_TAG('v', 'e', 'r', 't'))) { mUseVerticalPresentationForms = true; diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxHarfBuzzShaper.h firefox-esr-140.10.0esr/gfx/thebes/gfxHarfBuzzShaper.h --- firefox-esr-140.9.1esr/gfx/thebes/gfxHarfBuzzShaper.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxHarfBuzzShaper.h 2026-04-15 01:59:50.000000000 +0000 @@ -12,24 +12,53 @@ #include "nsUnicodeProperties.h" #include "mozilla/gfx/2D.h" #include "mozilla/MruCache.h" -#include "mozilla/Mutex.h" +#include "mozilla/RecursiveMutex.h" class gfxHarfBuzzShaper : public gfxFontShaper { + // private static methods for HarfBuzz callbacks: + static hb_bool_t HBGetNominalGlyph(hb_font_t* font, void* font_data, + hb_codepoint_t unicode, + hb_codepoint_t* glyph, void* user_data); + static unsigned int HBGetNominalGlyphs( + hb_font_t* font, void* font_data, unsigned int count, + const hb_codepoint_t* first_unicode, unsigned int unicode_stride, + hb_codepoint_t* first_glyph, unsigned int glyph_stride, void* user_data); + static hb_bool_t HBGetVariationGlyph(hb_font_t* font, void* font_data, + hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t* glyph, void* user_data); + static hb_position_t HBGetGlyphHAdvance(hb_font_t* font, void* font_data, + hb_codepoint_t glyph, + void* user_data); + static void HBGetGlyphHAdvances(hb_font_t* font, void* font_data, + unsigned int count, + const hb_codepoint_t* first_glyph, + unsigned int glyph_stride, + hb_position_t* first_advance, + unsigned int advance_stride, void* user_data); + static hb_position_t HBGetGlyphVAdvance(hb_font_t* font, void* font_data, + hb_codepoint_t glyph, + void* user_data); + static hb_bool_t HBGetGlyphVOrigin(hb_font_t* font, void* font_data, + hb_codepoint_t glyph, hb_position_t* x, + hb_position_t* y, void* user_data); + static hb_bool_t HBGetGlyphExtents(hb_font_t* font, void* font_data, + hb_codepoint_t glyph, + hb_glyph_extents_t* extents, + void* user_data); + static hb_bool_t HBGetContourPoint(hb_font_t* font, void* font_data, + unsigned int point_index, + hb_codepoint_t glyph, hb_position_t* x, + hb_position_t* y, void* user_data); + static hb_position_t HBGetHKerning(hb_font_t* font, void* font_data, + hb_codepoint_t first_glyph, + hb_codepoint_t second_glyph, + void* user_data); + public: explicit gfxHarfBuzzShaper(gfxFont* aFont); virtual ~gfxHarfBuzzShaper(); - /* - * For HarfBuzz font callback functions, font_data is a ptr to a - * FontCallbackData struct - */ - struct FontCallbackData { - gfxHarfBuzzShaper* mShaper; - }; - - // Initializes the shaper and returns whether this was successful. - bool Initialize(); - // Returns whether the shaper has been successfully initialized. bool IsInitialized() const { return mHBFont != nullptr; } @@ -38,41 +67,20 @@ nsAtom* aLanguage, bool aVertical, RoundingFlags aRounding, gfxShapedText* aShapedText) override; - // get a given font table in harfbuzz blob form - hb_blob_t* GetFontTable(hb_tag_t aTag) const; - // map unicode character to glyph ID hb_codepoint_t GetNominalGlyph(hb_codepoint_t unicode) const; - unsigned int GetNominalGlyphs(unsigned int count, - const hb_codepoint_t* first_unicode, - unsigned int unicode_stride, - hb_codepoint_t* first_glyph, - unsigned int glyph_stride); + hb_codepoint_t GetVariationGlyph(hb_codepoint_t unicode, hb_codepoint_t variation_selector) const; // get harfbuzz glyph advance, in font design units hb_position_t GetGlyphHAdvance(hb_codepoint_t glyph) const; - void GetGlyphHAdvances(unsigned int count, const hb_codepoint_t* first_glyph, - unsigned int glyph_stride, - hb_position_t* first_advance, - unsigned int advance_stride) const; // Get vertical glyph advance, or -1 if not available; caller should check // for a negative result and provide a fallback or fail, as appropriate. hb_position_t GetGlyphVAdvance(hb_codepoint_t glyph); - void GetGlyphVOrigin(hb_codepoint_t aGlyph, hb_position_t* aX, - hb_position_t* aY) const; - - hb_position_t GetHKerning(uint16_t aFirstGlyph, uint16_t aSecondGlyph) const; - - hb_bool_t GetGlyphExtents(hb_codepoint_t aGlyph, - hb_glyph_extents_t* aExtents) const; - - bool UseVerticalPresentationForms() const { - return mUseVerticalPresentationForms; - } + hb_font_t* GetHBFont() const { return mHBFont; } static hb_script_t GetHBScriptUsedForShaping(Script aScript) { // Decide what harfbuzz script code will be used for shaping @@ -95,23 +103,48 @@ // bounds, etc; if not, the built-in hb_ot font functions will be used. static hb_font_t* CreateHBFont(gfxFont* aFont, hb_font_funcs_t* aFontFuncs = nullptr, - FontCallbackData* aCallbackData = nullptr); - - hb_font_t* GetHBFont() const { return mHBFont; } - hb_face_t* GetHBFace() const { return hb_font_get_face(mHBFont); } + void* aCallbackData = nullptr); protected: - // This is called with the cache locked, but if mUseFontGetGlyph is true, it - // may unlock it temporarily. So in this case, it may invalidate an earlier - // cache entry reference. - hb_codepoint_t GetGlyphUncached(hb_codepoint_t unicode) const - MOZ_REQUIRES(mCacheLock); + // Initializes the shaper and returns whether this was successful. + bool Initialize(); + + // get a given font table in harfbuzz blob form + hb_blob_t* GetFontTable(hb_tag_t aTag) const; + + unsigned int GetNominalGlyphs(unsigned int count, + const hb_codepoint_t* first_unicode, + unsigned int unicode_stride, + hb_codepoint_t* first_glyph, + unsigned int glyph_stride) const + MOZ_REQUIRES(mMutex); + + void GetGlyphHAdvances(unsigned int count, const hb_codepoint_t* first_glyph, + unsigned int glyph_stride, + hb_position_t* first_advance, + unsigned int advance_stride) const + MOZ_REQUIRES(mMutex); + + void GetGlyphVOrigin(hb_codepoint_t aGlyph, hb_position_t* aX, + hb_position_t* aY) const; + + hb_position_t GetHKerning(uint16_t aFirstGlyph, uint16_t aSecondGlyph) const; + + hb_bool_t GetGlyphExtents(hb_codepoint_t aGlyph, + hb_glyph_extents_t* aExtents) const; + + bool UseVerticalPresentationForms() const { + return mUseVerticalPresentationForms; + } + + hb_codepoint_t GetGlyphUncached(hb_codepoint_t unicode) const; hb_position_t GetGlyphHAdvanceUncached(hb_codepoint_t gid) const; nsresult SetGlyphsFromRun(gfxShapedText* aShapedText, uint32_t aOffset, uint32_t aLength, const char16_t* aText, - bool aVertical, RoundingFlags aRounding); + bool aVertical, RoundingFlags aRounding) + MOZ_REQUIRES(mMutex); // retrieve glyph positions, applying advance adjustments and attachments // returns results in appUnits @@ -133,12 +166,20 @@ const Glyf* FindGlyf(hb_codepoint_t aGlyph, bool* aEmptyGlyf) const; // size-specific font object, owned by the gfxHarfBuzzShaper - hb_font_t* mHBFont; + hb_font_t* mHBFont = nullptr; - // harfbuzz buffer for the shaping process - hb_buffer_t* mBuffer; + // Held for the duration of ShapeText(): the shaper (and its hb_buffer_t) + // is shared across threads via the global gfxFontCache, so concurrent + // ShapeText() calls must be serialized to avoid racing on mBuffer and + // other mutable per-call state. + // GetNominalGlyph() and GetGlyphHAdvance() also need to lock the mutex + // because they may be called directly from thebes code, as well as via + // harfbuzz callbacks. + mutable mozilla::RecursiveMutex mMutex = + mozilla::RecursiveMutex("gfxHarfBuzzShaper::mMutex"); - mutable mozilla::Mutex mCacheLock = mozilla::Mutex("shaperCacheMutex"); + // harfbuzz buffer for the shaping process. + hb_buffer_t* mBuffer MOZ_GUARDED_BY(mMutex) = nullptr; struct CmapCacheData { uint32_t mCodepoint; @@ -153,7 +194,7 @@ } }; - mutable mozilla::UniquePtr mCmapCache MOZ_GUARDED_BY(mCacheLock); + mutable mozilla::UniquePtr mCmapCache MOZ_GUARDED_BY(mMutex); struct WidthCacheData { hb_codepoint_t mGlyphId; @@ -168,9 +209,7 @@ } }; - mutable mozilla::UniquePtr mWidthCache MOZ_GUARDED_BY(mCacheLock); - - FontCallbackData mCallbackData; + mutable mozilla::UniquePtr mWidthCache MOZ_GUARDED_BY(mMutex); // Following table references etc are declared "mutable" because the // harfbuzz callback functions take a const ptr to the shaper, but @@ -178,66 +217,68 @@ // in the font. // Old-style TrueType kern table, if we're not doing GPOS kerning - mutable hb_blob_t* mKernTable; + mutable hb_blob_t* mKernTable = nullptr; // Cached copy of the hmtx table. - mutable hb_blob_t* mHmtxTable; + mutable hb_blob_t* mHmtxTable = nullptr; // For vertical fonts, cached vmtx and VORG table, if present. - mutable hb_blob_t* mVmtxTable; - mutable hb_blob_t* mVORGTable; + mutable hb_blob_t* mVmtxTable = nullptr; + mutable hb_blob_t* mVORGTable = nullptr; // And for vertical TrueType (not CFF) fonts that have vmtx, // we also use loca and glyf to get glyph bounding boxes. - mutable hb_blob_t* mLocaTable; - mutable hb_blob_t* mGlyfTable; + mutable hb_blob_t* mLocaTable = nullptr; + mutable hb_blob_t* mGlyfTable = nullptr; // Cached pointer to cmap subtable to be used for char-to-glyph mapping. // This comes from GetFontTablePtr; if it is non-null, our destructor // must call ReleaseFontTablePtr to avoid permanently caching the table. - mutable hb_blob_t* mCmapTable; - mutable int32_t mCmapFormat; - mutable uint32_t mSubtableOffset; - mutable uint32_t mUVSTableOffset; + // These are set during Initialize(), before any use of the shaper. + hb_blob_t* mCmapTable = nullptr; + int32_t mCmapFormat = -1; + uint32_t mSubtableOffset = 0; + uint32_t mUVSTableOffset = 0; // Cached copy of numLongMetrics field from the hhea table, // for use when looking up glyph metrics; initialized to 0 by the // constructor so we can tell it hasn't been set yet. // This is a signed value so that we can use -1 to indicate // an error (if the hhea table was not available). - mutable int32_t mNumLongHMetrics; + mutable int32_t mNumLongHMetrics = 0; // Similarly for vhea if it's a vertical font. - mutable int32_t mNumLongVMetrics; + mutable int32_t mNumLongVMetrics = 0; // Default y-coordinate for glyph vertical origin, used if the font // does not actually have vertical-layout metrics. - mutable gfxFloat mDefaultVOrg; + mutable gfxFloat mDefaultVOrg = -1.0; // Number of glyphs in the font (set from 'maxp' during initialization). uint32_t mNumGlyphs = 0; // Whether the font implements GetGlyph, or we should read tables // directly - bool mUseFontGetGlyph; + bool mUseFontGetGlyph = false; // Whether the font is an MS Symbol-encoded font, in which case we will // try remapping U+0020..00FF to U+F020..F0FF for characters in the U+00xx // range that are otherwise unsupported. - bool mIsSymbolFont; + bool mIsSymbolFont = false; // Whether the font implements GetGlyphWidth, or we should read tables // directly to get ideal widths - bool mUseFontGlyphWidths; - - bool mInitialized; - bool mVerticalInitialized; + bool mUseFontGlyphWidths = false; // Whether to use vertical presentation forms for CJK characters // when available (only set if the 'vert' feature is not available). - bool mUseVerticalPresentationForms; + bool mUseVerticalPresentationForms = false; // these are set from the FindGlyf callback on first use of the glyf data - mutable bool mLoadedLocaGlyf; - mutable bool mLocaLongOffsets; + mutable bool mLoadedLocaGlyf = false; + mutable bool mLocaLongOffsets = false; + + // This is atomic so that we can check it without necessarily holding the + // lock. + std::atomic mVerticalInitialized = false; }; #endif /* GFX_HARFBUZZSHAPER_H */ diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxPlatformFontList.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxPlatformFontList.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxPlatformFontList.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxPlatformFontList.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -379,6 +379,8 @@ kFontSystemWhitelistPref); } NS_RELEASE(gFontListPrefObserver); + + delete mSharedFontList.exchange(nullptr); } FontVisibility gfxPlatformFontList::GetFontVisibility(nsCString& aFont, @@ -657,7 +659,9 @@ // From here, gfxPlatformFontList::IsInitialized will return true, // unless InitFontListForPlatform() fails and we reset it below. - mFontlistInitCount++; + if (MOZ_UNLIKELY(!++mFontlistInitCount)) { + ++mFontlistInitCount; // if the counter wrapped, bump it past zero + } InitializeCodepointsWithNoFonts(); @@ -676,19 +680,20 @@ } mFontEntries.Clear(); mShmemCharMaps.Clear(); - bool oldSharedList = mSharedFontList != nullptr; - mSharedFontList.reset(new fontlist::FontList(mFontlistInitCount)); + bool oldSharedList = SharedFontList() != nullptr; + delete mSharedFontList.exchange(new fontlist::FontList(mFontlistInitCount)); InitSharedFontListForPlatform(); - if (mSharedFontList && mSharedFontList->Initialized()) { + auto* newList = SharedFontList(); + if (newList && newList->Initialized()) { if (mLocalNameTable.Count()) { - SharedFontList()->SetLocalNames(mLocalNameTable); + newList->SetLocalNames(mLocalNameTable); mLocalNameTable.Clear(); } } else { // something went wrong, fall back to in-process list gfxCriticalNote << "Failed to initialize shared font list, " "falling back to in-process list."; - mSharedFontList.reset(nullptr); + delete mSharedFontList.exchange(nullptr); } if (oldSharedList && XRE_IsParentProcess()) { // notify all children of the change @@ -702,7 +707,10 @@ } } - if (!SharedFontList()) { + if (SharedFontList()) { + mFontListGeneration = SharedFontList()->GetGeneration(); + } else { + mFontListGeneration = 0; if (NS_FAILED(InitFontListForPlatform())) { mFontlistInitCount = 0; return false; @@ -789,7 +797,7 @@ } bool initialized = false; dom::ContentChild::GetSingleton()->SendInitOtherFamilyNames( - list->GetGeneration(), mDefer, &initialized); + pfl->GetGeneration(), mDefer, &initialized); pfl->mOtherFamilyNamesInitialized.compareExchange(false, initialized); return NS_OK; } @@ -810,8 +818,7 @@ if (NS_IsMainThread()) { bool initialized; dom::ContentChild::GetSingleton()->SendInitOtherFamilyNames( - SharedFontList()->GetGeneration(), aDeferOtherFamilyNamesLoading, - &initialized); + GetGeneration(), aDeferOtherFamilyNamesLoading, &initialized); mOtherFamilyNamesInitialized.compareExchange(false, initialized); } else { NS_DispatchToMainThread( @@ -1407,10 +1414,10 @@ return NS_OK; } if (XRE_IsParentProcess()) { - pfl->StartCmapLoading(list->GetGeneration(), mStartIndex); + pfl->StartCmapLoading(pfl->GetGeneration(), mStartIndex); } else { dom::ContentChild::GetSingleton()->SendStartCmapLoading( - list->GetGeneration(), mStartIndex); + pfl->GetGeneration(), mStartIndex); } return NS_OK; } @@ -1431,12 +1438,11 @@ // If we're already on the main thread, don't bother dispatching a runnable // here to kick off the loading process, just do it directly. if (NS_IsMainThread()) { - auto* list = SharedFontList(); if (XRE_IsParentProcess()) { - StartCmapLoading(list->GetGeneration(), aStartIndex); + StartCmapLoading(GetGeneration(), aStartIndex); } else { - dom::ContentChild::GetSingleton()->SendStartCmapLoading( - list->GetGeneration(), aStartIndex); + dom::ContentChild::GetSingleton()->SendStartCmapLoading(GetGeneration(), + aStartIndex); } } else { NS_DispatchToMainThread(new StartCmapLoadingRunnable(aStartIndex)); @@ -1491,7 +1497,7 @@ if (!list) { return NS_OK; } - if (mGeneration != list->GetGeneration()) { + if (mGeneration != pfl->GetGeneration()) { return NS_OK; } uint32_t numFamilies = list->NumFamilies(); @@ -1559,7 +1565,7 @@ void gfxPlatformFontList::StartCmapLoading(uint32_t aGeneration, uint32_t aStartIndex) { MOZ_RELEASE_ASSERT(XRE_IsParentProcess()); - if (aGeneration != SharedFontList()->GetGeneration()) { + if (aGeneration != GetGeneration()) { return; } if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { @@ -1831,7 +1837,8 @@ mLoadCmaps(aLoadCmaps) {} NS_IMETHOD Run() override { - auto list = gfxPlatformFontList::PlatformFontList()->SharedFontList(); + auto* pfl = gfxPlatformFontList::PlatformFontList(); + auto* list = pfl->SharedFontList(); if (!list) { return NS_OK; } @@ -1840,8 +1847,12 @@ // was posted - just ignore it. return NS_OK; } - dom::ContentChild::GetSingleton()->SendInitializeFamily( - list->GetGeneration(), mIndex, mLoadCmaps); + auto& family = list->Families()[mIndex]; + if (mLoadCmaps ? family.IsFullyInitialized() : family.IsInitialized()) { + // Some other runnable initialized this or somesuch. + return NS_OK; + } + (void)pfl->InitializeFamily(&family, mLoadCmaps); return NS_OK; } @@ -1854,21 +1865,21 @@ bool aLoadCmaps) { MOZ_ASSERT(SharedFontList()); auto list = SharedFontList(); + auto* families = list->Families(); + if (!families) { + return false; + } + uint32_t index = aFamily - families; + if (index >= list->NumFamilies()) { + return false; + } + if (!NS_IsMainThread() && (!sInitFontListThread || !IsInitFontListThread())) { + NS_DispatchToMainThread(new InitializeFamilyRunnable(index, aLoadCmaps)); + return aFamily->IsInitialized(); + } if (!XRE_IsParentProcess()) { - auto* families = list->Families(); - if (!families) { - return false; - } - uint32_t index = aFamily - families; - if (index >= list->NumFamilies()) { - return false; - } - if (NS_IsMainThread()) { - dom::ContentChild::GetSingleton()->SendInitializeFamily( - list->GetGeneration(), index, aLoadCmaps); - } else { - NS_DispatchToMainThread(new InitializeFamilyRunnable(index, aLoadCmaps)); - } + dom::ContentChild::GetSingleton()->SendInitializeFamily( + GetGeneration(), index, aLoadCmaps); return aFamily->IsInitialized(); } @@ -1884,8 +1895,7 @@ // all the cmaps at once and reduce IPC traffic (and content-process file // access overhead, which is crippling for DirectWrite on Windows). if (aLoadCmaps) { - auto* faces = aFamily->Faces(list); - if (faces) { + if (auto* faces = aFamily->Faces(list)) { for (size_t i = 0; i < aFamily->NumFaces(); i++) { auto* face = faces[i].ToPtr(list); if (face && face->mCharacterMap.IsNull()) { @@ -2054,7 +2064,8 @@ aCmap->CalcHash(); aCmap->mShared = true; // Set the shared flag in preparation for adding // to the global table. - RefPtr cmap = mSharedCmaps.PutEntry(aCmap)->GetKey(); + CharMapLookup lookup{aCmap, aCmap->mHash, /* mCompareByPointer */ false}; + RefPtr cmap = mSharedCmaps.PutEntry(lookup)->GetCharMap(); // If we ended up finding a different, pre-existing entry, clear the // shared flag on this one so that it'll get deleted on Release(). @@ -2069,9 +2080,17 @@ // when a user of the charmap drops a reference and the refcount goes to 1; // in that case, it is possible our shared set is the only remaining user // of the object, and we should remove it. -// Note that aCharMap might have already been freed, so we must not try to -// dereference it until we have checked that it's still present in our table. -void gfxPlatformFontList::MaybeRemoveCmap(gfxCharacterMap* aCharMap) { +// +// CAUTION: aCharMap may already have been freed by the time we are called +// (another thread may have raced us here and deleted it first, or the +// destructor's teardown path may have run). We MUST NOT dereference aCharMap +// until we have established that it is still present in our table -- the +// table's strong reference then guarantees the object is alive. The hash +// lookup itself uses aHash (captured before the caller's --mRefCnt while the +// object was definitely alive) and pointer-identity comparison, so it never +// dereferences aCharMap. +void gfxPlatformFontList::MaybeRemoveCmap(gfxCharacterMap* aCharMap, + uint32_t aHash) { // Lock so that nobody else can get a reference via FindCharMap while we're // checking here. AutoLock lock(mLock); @@ -2081,14 +2100,18 @@ return; } - // aCharMap needs to match the entry and be the same ptr and still have a - // refcount of exactly 1 (i.e. we hold the only reference) before removing. - // If we're racing another thread, it might already have been removed, in - // which case GetEntry will not find it and we won't try to dereference the - // already-freed pointer. - CharMapHashKey* found = - mSharedCmaps.GetEntry(const_cast(aCharMap)); - if (found && found->GetKey() == aCharMap && aCharMap->RefCount() == 1) { + // Look up by captured hash + pointer identity; this does not dereference + // aCharMap. If a racing thread already removed and freed aCharMap, GetEntry + // simply won't find it (the freed slot can't reappear in the table at the + // same address while we hold mLock, since insertions also need mLock). + CharMapLookup lookup{aCharMap, aHash, /* mCompareByPointer */ true}; + CharMapHashKey* found = mSharedCmaps.GetEntry(lookup); + + // If found, the table holds a strong ref, so aCharMap is alive and we may + // dereference it. We must check that it still has a refcount of exactly 1 + // (the table's ref) before we remove; a FindCharMap may have raced us and + // AddRef'd it. + if (found && aCharMap->RefCount() == 1) { // Forget our reference to the object that's being deleted, without // calling Release() on it. Unused << found->mCharMap.forget(); @@ -3019,7 +3042,8 @@ aSizes->mFontListSize += mSharedCmaps.ShallowSizeOfExcludingThis(aMallocSizeOf); for (const auto& entry : mSharedCmaps) { - aSizes->mCharMapsSize += entry.GetKey()->SizeOfIncludingThis(aMallocSizeOf); + aSizes->mCharMapsSize += + entry.GetCharMap()->SizeOfIncludingThis(aMallocSizeOf); } aSizes->mFontListSize += @@ -3154,7 +3178,7 @@ if (!list) { return; } - if (!aGeneration || list->GetGeneration() == aGeneration) { + if (!aGeneration || GetGeneration() == aGeneration) { list->ShareShmBlockToProcess(aIndex, aPid, aOut); } else { *aOut = nullptr; @@ -3194,7 +3218,7 @@ if (!list) { return; } - if (list->GetGeneration() != aGeneration) { + if (GetGeneration() != aGeneration) { return; } if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { @@ -3219,7 +3243,7 @@ if (!list) { return; } - if (list->GetGeneration() != aGeneration) { + if (GetGeneration() != aGeneration) { return; } if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { @@ -3260,7 +3284,7 @@ if (!list) { return; } - if (list->GetGeneration() != aGeneration) { + if (GetGeneration() != aGeneration) { return; } if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { @@ -3290,7 +3314,7 @@ if (!list) { return false; } - if (list->GetGeneration() != aGeneration) { + if (GetGeneration() != aGeneration) { return false; } if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { @@ -3299,10 +3323,6 @@ return InitOtherFamilyNames(aDefer); } -uint32_t gfxPlatformFontList::GetGeneration() const { - return SharedFontList() ? SharedFontList()->GetGeneration() : 0; -} - gfxPlatformFontList::FontPrefs::FontPrefs() { // This must be created on the main thread, so that we can safely use the // Preferences service. Once created, it can be read from any thread. diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxPlatformFontList.h firefox-esr-140.10.0esr/gfx/thebes/gfxPlatformFontList.h --- firefox-esr-140.9.1esr/gfx/thebes/gfxPlatformFontList.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxPlatformFontList.h 2026-04-15 01:59:50.000000000 +0000 @@ -36,13 +36,29 @@ } } // namespace mozilla +// Lookup key for the shared-cmap hashtable. The hash is carried separately +// from the gfxCharacterMap pointer so that MaybeRemoveCmap can look up an +// entry without dereferencing the (potentially already freed) pointer. +struct CharMapLookup { + // The cmap to look up. In pointer-compare mode this may be dangling and is + // used for pointer-equality only; in content-compare mode it must be alive. + gfxCharacterMap* mCharMap; + // The cmap's mHash, captured while the object was known to be alive. + uint32_t mHash; + // If true, KeyEquals compares by pointer identity (no deref of mCharMap). + // If false, KeyEquals compares by content (derefs mCharMap; must be alive). + bool mCompareByPointer; +}; + class CharMapHashKey : public PLDHashEntryHdr { public: - typedef gfxCharacterMap* KeyType; - typedef const gfxCharacterMap* KeyTypePointer; + typedef CharMapLookup KeyType; + typedef const CharMapLookup* KeyTypePointer; - explicit CharMapHashKey(const gfxCharacterMap* aCharMap) - : mCharMap(const_cast(aCharMap)) { + explicit CharMapHashKey(const CharMapLookup* aLookup) + : mCharMap(aLookup->mCharMap) { + // Only content-compare lookups (FindCharMap) insert; the cmap is alive. + MOZ_ASSERT(!aLookup->mCompareByPointer); MOZ_COUNT_CTOR(CharMapHashKey); } CharMapHashKey(const CharMapHashKey& toCopy) : mCharMap(toCopy.mCharMap) { @@ -50,23 +66,29 @@ } MOZ_COUNTED_DTOR(CharMapHashKey) - gfxCharacterMap* GetKey() const { return mCharMap.get(); } + gfxCharacterMap* GetCharMap() const { return mCharMap.get(); } - bool KeyEquals(const gfxCharacterMap* aCharMap) const { - MOZ_ASSERT(!aCharMap->mBuildOnTheFly && !mCharMap->mBuildOnTheFly, + bool KeyEquals(const CharMapLookup* aLookup) const { + if (aLookup->mCompareByPointer) { + // Pointer-identity compare for MaybeRemoveCmap. Does not dereference + // aLookup->mCharMap, which may be dangling. + return mCharMap.get() == aLookup->mCharMap; + } + // Content compare for FindCharMap. aLookup->mCharMap must be alive. + MOZ_ASSERT(!aLookup->mCharMap->mBuildOnTheFly && !mCharMap->mBuildOnTheFly, "custom cmap used in shared cmap hashtable"); - // cmaps built on the fly never match - if (aCharMap->mHash != mCharMap->mHash) { + if (aLookup->mHash != mCharMap->mHash) { return false; } - return mCharMap->Equals(aCharMap); + return mCharMap->Equals(aLookup->mCharMap); } - static const gfxCharacterMap* KeyToPointer(gfxCharacterMap* aCharMap) { - return aCharMap; + static const CharMapLookup* KeyToPointer(const CharMapLookup& aLookup) { + return &aLookup; } - static PLDHashNumber HashKey(const gfxCharacterMap* aCharMap) { - return aCharMap->mHash; + static PLDHashNumber HashKey(const CharMapLookup* aLookup) { + // Use the captured hash; never dereference aLookup->mCharMap. + return aLookup->mHash; } enum { ALLOW_MEMMOVE = true }; @@ -349,7 +371,7 @@ const gfxFontStyle* aStyle); mozilla::fontlist::FontList* SharedFontList() const { - return mSharedFontList.get(); + return mSharedFontList; } // Create a handle for a single shmem block (identified by index) ready to @@ -510,8 +532,9 @@ already_AddRefed FindCharMap(gfxCharacterMap* aCmap); // Remove the cmap from the shared cmap set if it holds the only remaining - // reference to the object. - void MaybeRemoveCmap(gfxCharacterMap* aCharMap); + // reference to the object. aCharMap may be dangling; aHash is its mHash + // captured while it was known alive. + void MaybeRemoveCmap(gfxCharacterMap* aCharMap, uint32_t aHash); // Keep track of userfont sets to notify when global fontlist changes occur. void AddUserFontSet(gfxUserFontSet* aUserFontSet) { @@ -639,7 +662,7 @@ // existing references to shared font family or face objects and character // maps will no longer be valid. // (The legacy (non-shared) list just returns 0 here.) - uint32_t GetGeneration() const; + uint32_t GetGeneration() const { return mFontListGeneration; } // Sometimes we need to know if we're on the InitFontList startup thread. static bool IsInitFontListThread() { @@ -1062,7 +1085,9 @@ nsTArray mEnabledFontsList; nsTHashSet mIconFontsSet; - mozilla::UniquePtr mSharedFontList; + // This is an owning reference; we are responsible to delete the FontList at + // appropriate times. + std::atomic mSharedFontList = nullptr; nsClassHashtable mAliasTable; nsTHashMap @@ -1078,6 +1103,9 @@ RefPtr mLoadCmapsRunnable; uint32_t mStartedLoadingCmapsFrom MOZ_GUARDED_BY(mLock) = 0xffffffffu; + // Cached value of mSharedFontList->GetGeneration(), updated by InitFontList. + std::atomic mFontListGeneration = 0; + bool mFontFamilyWhitelistActive = false; static PRThread* sInitFontListThread; diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxTextRun.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxTextRun.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxTextRun.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxTextRun.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -2026,17 +2026,8 @@ void gfxFontGroup::AddFamilyToFontList(fontlist::Family* aFamily, StyleGenericFontFamily aGeneric) { gfxPlatformFontList* pfl = gfxPlatformFontList::PlatformFontList(); - if (!aFamily->IsInitialized()) { - if (ServoStyleSet* set = gfxFontUtils::CurrentServoStyleSet()) { - // If we need to initialize a Family record, but we're on a style - // worker thread, we have to defer it. - set->AppendTask(PostTraversalTask::InitializeFamily(aFamily)); - set->AppendTask(PostTraversalTask::FontInfoUpdate(set)); - return; - } - if (!pfl->InitializeFamily(aFamily)) { - return; - } + if (!aFamily->IsInitialized() && !pfl->InitializeFamily(aFamily)) { + return; } AutoTArray faceList; aFamily->FindAllFacesForStyle(pfl->SharedFontList(), mStyle, faceList); diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxUserFontSet.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxUserFontSet.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxUserFontSet.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxUserFontSet.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -94,6 +94,10 @@ // traversal, since PostTraversalTask objects can hold raw pointers to // gfxUserFontEntry objects. MOZ_ASSERT(!gfxFontUtils::IsInServoTraversal()); + // Ensure the platform font entry is destroyed on the main thread, to avoid + // potential race updating the sUserFonts cache. + NS_ReleaseOnMainThread("gfxUserFontEntry::mPlatformFontEntry", + mPlatformFontEntry.forget()); } bool gfxUserFontEntry::Matches(const nsTArray& aFontFaceSrcList, @@ -541,7 +545,7 @@ // If we need to start a font load and we're on a style // worker thread, we have to defer it. SetLoadState(STATUS_LOAD_PENDING); - set->AppendTask(PostTraversalTask::LoadFontEntry(this)); + set->AppendTask(PostTraversalTask::LoadFontEntry(do_AddRef(this))); return; } @@ -1115,6 +1119,16 @@ // discard it as no longer valid. if (ufe->GetPlatformFontEntry() && ufe->GetPlatformFontEntry()->IsLocalUserFont()) { + // Clear shmem pointers on the local-user-font entry: it is not tracked + // in gfxPlatformFontList::mFontEntries, so InitFontList()'s cleanup loop + // misses it. + gfxFontEntry* pfe = ufe->GetPlatformFontEntry(); + { + AutoWriteLock lock(pfe->mLock); + pfe->mShmemCharacterMap = nullptr; + pfe->mShmemFace = nullptr; + pfe->mShmemFamily = nullptr; + } ufe->mPlatformFontEntry = nullptr; } // If the entry had a local source, we need to re-evaluate the source list @@ -1130,12 +1144,13 @@ for (auto& ufe : entriesToCancel) { if (auto* loader = ufe->GetLoader()) { // If there's a loader, we need to cancel it, because we'll trigger a - // fresh load if required when we re-resolve the font... + // fresh load if required when we re-resolve the font. Cancel() removes + // the loader from the set it was registered in (not necessarily |this| + // font set). loader->Cancel(); - RemoveLoader(loader); } else { - // ...otherwise, just reset our state so that we'll re-evaluate the - // source list from the beginning. + // Otherwise, just reset our state so that we'll re-evaluate the source + // list from the beginning. ufe->LoadCanceled(); } } @@ -1229,6 +1244,7 @@ } void gfxUserFontSet::UserFontCache::CacheFont(gfxFontEntry* aFontEntry) { + MOZ_ASSERT(NS_IsMainThread()); NS_ASSERTION(aFontEntry->mFamilyName.Length() != 0, "caching a font associated with no family yet"); @@ -1283,6 +1299,10 @@ } void gfxUserFontSet::UserFontCache::ForgetFont(gfxFontEntry* aFontEntry) { + // The only caller is ~gfxFontEntry; if this fires, there is a path to + // off-main-thread destruction of a font entry with mIsDataUserFont set + // that needs to be proxied to main thread (see ~gfxUserFontEntry). + MOZ_ASSERT(NS_IsMainThread()); if (!sUserFonts) { // if we've already deleted the cache (i.e. during shutdown), // just ignore this @@ -1306,6 +1326,7 @@ gfxFontEntry* gfxUserFontSet::UserFontCache::GetFont( const gfxFontFaceSrc& aSrc, const gfxUserFontEntry& aUserFontEntry) { + MOZ_ASSERT(NS_IsMainThread() || gfxFontUtils::CurrentServoStyleSet()); if (!sUserFonts || StaticPrefs::gfx_downloadable_fonts_disable_cache()) { return nullptr; } diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxUserFontSet.h firefox-esr-140.10.0esr/gfx/thebes/gfxUserFontSet.h --- firefox-esr-140.9.1esr/gfx/thebes/gfxUserFontSet.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxUserFontSet.h 2026-04-15 01:59:50.000000000 +0000 @@ -767,6 +767,8 @@ // user font entry. virtual void GetUserFontSets(nsTArray>& aResult); + FontTableCache* GetFontTableCache(bool aCreate) override { return nullptr; } + // general load state UserFontLoadState mUserFontLoadState; diff -Nru firefox-esr-140.9.1esr/gfx/thebes/gfxUtils.cpp firefox-esr-140.10.0esr/gfx/thebes/gfxUtils.cpp --- firefox-esr-140.9.1esr/gfx/thebes/gfxUtils.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/thebes/gfxUtils.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -230,8 +230,7 @@ DataSourceSurface::MappedSurface destMap; if (!MapSrcAndCreateMappedDest(srcSurf, &destSurf, &srcMap, &destMap)) { MOZ_ASSERT(false, "MapSrcAndCreateMappedDest failed."); - RefPtr surface(srcSurf); - return surface.forget(); + return nullptr; } PremultiplyData(srcMap.mData, srcMap.mStride, srcSurf->GetFormat(), @@ -249,8 +248,7 @@ DataSourceSurface::MappedSurface destMap; if (!MapSrcAndCreateMappedDest(srcSurf, &destSurf, &srcMap, &destMap)) { MOZ_ASSERT(false, "MapSrcAndCreateMappedDest failed."); - RefPtr surface(srcSurf); - return surface.forget(); + return nullptr; } UnpremultiplyData(srcMap.mData, srcMap.mStride, srcSurf->GetFormat(), diff -Nru firefox-esr-140.9.1esr/gfx/vr/VRManager.cpp firefox-esr-140.10.0esr/gfx/vr/VRManager.cpp --- firefox-esr-140.9.1esr/gfx/vr/VRManager.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/vr/VRManager.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -155,8 +155,8 @@ #if !defined(MOZ_WIDGET_ANDROID) // XRE_IsGPUProcess() is helping us to check some platforms like // Win 7 try which are not using GPU process but VR process is enabled. - mVRProcessEnabled = - StaticPrefs::dom_vr_process_enabled_AtStartup() && XRE_IsGPUProcess(); + mVRProcessEnabled = StaticPrefs::dom_vr_process_enabled_AtStartup() && + StaticPrefs::dom_vr_enabled() && XRE_IsGPUProcess(); VRServiceHost::Init(mVRProcessEnabled); mServiceHost = VRServiceHost::Get(); // We must shutdown before VRServiceHost, which is cleared diff -Nru firefox-esr-140.9.1esr/gfx/vr/external_api/moz_external_vr.h firefox-esr-140.10.0esr/gfx/vr/external_api/moz_external_vr.h --- firefox-esr-140.9.1esr/gfx/vr/external_api/moz_external_vr.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/vr/external_api/moz_external_vr.h 2026-04-15 01:59:50.000000000 +0000 @@ -209,8 +209,9 @@ case gfx::VRControllerType::PicoGaze: case gfx::VRControllerType::PicoG2: case gfx::VRControllerType::PicoNeo2: - case gfx::VRControllerType::_end: return true; + case gfx::VRControllerType::_end: + break; } return false; } diff -Nru firefox-esr-140.9.1esr/gfx/vr/ipc/VRChild.cpp firefox-esr-140.10.0esr/gfx/vr/ipc/VRChild.cpp --- firefox-esr-140.9.1esr/gfx/vr/ipc/VRChild.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/vr/ipc/VRChild.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -169,25 +169,27 @@ const Maybe& aDMDFile) { mMemoryReportRequest = MakeUnique(aGeneration); - PVRChild::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [&](const uint32_t& aGeneration2) { - if (VRProcessManager* vpm = VRProcessManager::Get()) { - if (VRChild* child = vpm->GetVRChild()) { - if (child->mMemoryReportRequest) { - child->mMemoryReportRequest->Finish(aGeneration2); - child->mMemoryReportRequest = nullptr; + PVRChild::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [](uint32_t aGeneration2) { + if (VRProcessManager* vpm = VRProcessManager::Get()) { + if (VRChild* child = vpm->GetVRChild()) { + if (child->mMemoryReportRequest) { + child->mMemoryReportRequest->Finish(aGeneration2); + child->mMemoryReportRequest = nullptr; + } + } } - } - } - }, - [&](mozilla::ipc::ResponseRejectReason) { - if (VRProcessManager* vpm = VRProcessManager::Get()) { - if (VRChild* child = vpm->GetVRChild()) { - child->mMemoryReportRequest = nullptr; - } - } - }); + }, + [](mozilla::ipc::ResponseRejectReason) { + if (VRProcessManager* vpm = VRProcessManager::Get()) { + if (VRChild* child = vpm->GetVRChild()) { + child->mMemoryReportRequest = nullptr; + } + } + }); return true; } diff -Nru firefox-esr-140.9.1esr/gfx/webrender_bindings/RenderTextureHost.cpp firefox-esr-140.10.0esr/gfx/webrender_bindings/RenderTextureHost.cpp --- firefox-esr-140.9.1esr/gfx/webrender_bindings/RenderTextureHost.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/webrender_bindings/RenderTextureHost.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -91,6 +91,9 @@ RenderTextureHost::~RenderTextureHost() { MOZ_ASSERT(RenderThread::IsInRenderThread()); MOZ_COUNT_DTOR(RenderTextureHost); + if (mDestroyedCallback) { + mDestroyedCallback(); + } } wr::WrExternalImage RenderTextureHost::Lock(uint8_t aChannelIndex, diff -Nru firefox-esr-140.9.1esr/gfx/webrender_bindings/RenderTextureHost.h firefox-esr-140.10.0esr/gfx/webrender_bindings/RenderTextureHost.h --- firefox-esr-140.9.1esr/gfx/webrender_bindings/RenderTextureHost.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/webrender_bindings/RenderTextureHost.h 2026-04-15 01:59:50.000000000 +0000 @@ -97,6 +97,11 @@ virtual void UnlockSWGL() {} + virtual bool LockSWGLCompositeSurface(void* aContext, + wr::SWGLCompositeSurfaceInfo* aInfo) { + return false; + } + virtual RefPtr CreateTextureSource( layers::TextureSourceProvider* aProvider); @@ -177,6 +182,11 @@ virtual RefPtr GetTextureHostUsageInfo( const MutexAutoLock& aProofOfMapLock); + void SetDestroyedCallback(std::function&& aDestroyedCallback) { + MOZ_ASSERT(!mDestroyedCallback); + mDestroyedCallback = std::move(aDestroyedCallback); + } + protected: virtual ~RenderTextureHost(); @@ -184,6 +194,7 @@ // protected by RenderThread::mRenderTextureMapLock RefPtr mRenderTextureHostUsageInfo; + std::function mDestroyedCallback; friend class RenderTextureHostWrapper; }; diff -Nru firefox-esr-140.9.1esr/gfx/webrender_bindings/RenderTextureHostSWGL.h firefox-esr-140.10.0esr/gfx/webrender_bindings/RenderTextureHostSWGL.h --- firefox-esr-140.9.1esr/gfx/webrender_bindings/RenderTextureHostSWGL.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/webrender_bindings/RenderTextureHostSWGL.h 2026-04-15 01:59:50.000000000 +0000 @@ -49,7 +49,7 @@ // WrSWGLCompositeSurfaceInfo. This is paired with a call to UnlockSWGL when // composition is done. bool LockSWGLCompositeSurface(void* aContext, - wr::SWGLCompositeSurfaceInfo* aInfo); + wr::SWGLCompositeSurfaceInfo* aInfo) override; size_t BytesFromPlanes() { NS_ASSERTION(mPlanes.size(), "Can't compute bytes without any planes"); diff -Nru firefox-esr-140.9.1esr/gfx/webrender_bindings/RenderTextureHostWrapper.cpp firefox-esr-140.10.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.cpp --- firefox-esr-140.9.1esr/gfx/webrender_bindings/RenderTextureHostWrapper.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -52,6 +52,30 @@ } } +wr::WrExternalImage RenderTextureHostWrapper::LockSWGL( + uint8_t aChannelIndex, void* aContext, RenderCompositor* aCompositor) { + if (!mTextureHost) { + return InvalidToWrExternalImage(); + } + + return mTextureHost->LockSWGL(aChannelIndex, aContext, aCompositor); +} + +void RenderTextureHostWrapper::UnlockSWGL() { + if (mTextureHost) { + mTextureHost->UnlockSWGL(); + } +} + +bool RenderTextureHostWrapper::LockSWGLCompositeSurface( + void* aContext, wr::SWGLCompositeSurfaceInfo* aInfo) { + if (!mTextureHost) { + return false; + } + + return mTextureHost->LockSWGLCompositeSurface(aContext, aInfo); +} + void RenderTextureHostWrapper::ClearCachedResources() { if (mTextureHost) { mTextureHost->ClearCachedResources(); diff -Nru firefox-esr-140.9.1esr/gfx/webrender_bindings/RenderTextureHostWrapper.h firefox-esr-140.10.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.h --- firefox-esr-140.9.1esr/gfx/webrender_bindings/RenderTextureHostWrapper.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.h 2026-04-15 01:59:50.000000000 +0000 @@ -65,6 +65,13 @@ PlaneInfo& aPlaneInfo) override; void UnmapPlanes() override; + wr::WrExternalImage LockSWGL(uint8_t aChannelIndex, void* aContext, + RenderCompositor* aCompositor) override; + + void UnlockSWGL() override; + bool LockSWGLCompositeSurface(void* aContext, + wr::SWGLCompositeSurfaceInfo* aInfo) override; + // This is just a wrapper, so doesn't need to report the // size of the wrapped object (which reports itself). size_t Bytes() override { return 0; } diff -Nru firefox-esr-140.9.1esr/gfx/webrender_bindings/WebRenderAPI.cpp firefox-esr-140.10.0esr/gfx/webrender_bindings/WebRenderAPI.cpp --- firefox-esr-140.9.1esr/gfx/webrender_bindings/WebRenderAPI.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/webrender_bindings/WebRenderAPI.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -876,19 +876,16 @@ void WebRenderAPI::Capture() { // see CaptureBits // SCENE | FRAME | TILE_CACHE - uint8_t bits = 15; // TODO: get from JavaScript - const char* path = "wr-capture"; // TODO: get from JavaScript - wr_api_capture(mDocHandle, path, bits); + uint8_t bits = 15; // TODO: get from JavaScript + wr_api_capture(mDocHandle, bits); } -void WebRenderAPI::StartCaptureSequence(const nsACString& aPath, - uint32_t aFlags) { +void WebRenderAPI::StartCaptureSequence(uint32_t aFlags) { if (mCaptureSequence) { wr_api_stop_capture_sequence(mDocHandle); } - wr_api_start_capture_sequence(mDocHandle, PromiseFlatCString(aPath).get(), - aFlags); + wr_api_start_capture_sequence(mDocHandle, aFlags); mCaptureSequence = true; } diff -Nru firefox-esr-140.9.1esr/gfx/webrender_bindings/WebRenderAPI.h firefox-esr-140.10.0esr/gfx/webrender_bindings/WebRenderAPI.h --- firefox-esr-140.9.1esr/gfx/webrender_bindings/WebRenderAPI.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/webrender_bindings/WebRenderAPI.h 2026-04-15 01:59:50.000000000 +0000 @@ -313,7 +313,7 @@ void Capture(); - void StartCaptureSequence(const nsACString& aPath, uint32_t aFlags); + void StartCaptureSequence(uint32_t aFlags); void StopCaptureSequence(); void BeginRecording(const TimeStamp& aRecordingStart, diff -Nru firefox-esr-140.9.1esr/gfx/webrender_bindings/src/bindings.rs firefox-esr-140.10.0esr/gfx/webrender_bindings/src/bindings.rs --- firefox-esr-140.9.1esr/gfx/webrender_bindings/src/bindings.rs 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/webrender_bindings/src/bindings.rs 2026-04-15 01:59:50.000000000 +0000 @@ -2599,12 +2599,11 @@ txn.add_raw_font(key, bytes.flush_into_vec(), index); } -fn generate_capture_path(path: *const c_char) -> Option { +fn generate_capture_path() -> Option { use std::fs::{create_dir_all, File}; use std::io::Write; - let cstr = unsafe { CStr::from_ptr(path) }; - let local_dir = PathBuf::from(&*cstr.to_string_lossy()); + let local_dir = PathBuf::from("wr-capture"); // On Android we need to write into a particular folder on external // storage so that (a) it can be written without requiring permissions @@ -2653,16 +2652,16 @@ } #[no_mangle] -pub extern "C" fn wr_api_capture(dh: &mut DocumentHandle, path: *const c_char, bits_raw: u32) { - if let Some(path) = generate_capture_path(path) { +pub extern "C" fn wr_api_capture(dh: &mut DocumentHandle, bits_raw: u32) { + if let Some(path) = generate_capture_path() { let bits = CaptureBits::from_bits(bits_raw as _).unwrap(); dh.api.save_capture(path, bits); } } #[no_mangle] -pub extern "C" fn wr_api_start_capture_sequence(dh: &mut DocumentHandle, path: *const c_char, bits_raw: u32) { - if let Some(path) = generate_capture_path(path) { +pub extern "C" fn wr_api_start_capture_sequence(dh: &mut DocumentHandle, bits_raw: u32) { + if let Some(path) = generate_capture_path() { let bits = CaptureBits::from_bits(bits_raw as _).unwrap(); dh.api.start_capture_sequence(path, bits); } diff -Nru firefox-esr-140.9.1esr/gfx/ycbcr/scale_yuv_argb.cpp firefox-esr-140.10.0esr/gfx/ycbcr/scale_yuv_argb.cpp --- firefox-esr-140.9.1esr/gfx/ycbcr/scale_yuv_argb.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ycbcr/scale_yuv_argb.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -11,6 +11,7 @@ #include "libyuv/scale.h" +#include #include #include @@ -937,7 +938,7 @@ YUVColorSpace yuv_color_space) { YUVBuferIter iter; - iter.src_width = src_width; + iter.src_width = std::min(src_width, dst_width); iter.src_height = src_height; iter.src_stride_y = src_stride_y; iter.src_stride_u = src_stride_u; diff -Nru firefox-esr-140.9.1esr/gfx/ycbcr/yuv_convert.cpp firefox-esr-140.10.0esr/gfx/ycbcr/yuv_convert.cpp --- firefox-esr-140.9.1esr/gfx/ycbcr/yuv_convert.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/gfx/ycbcr/yuv_convert.cpp 2026-04-15 01:59:49.000000000 +0000 @@ -177,6 +177,7 @@ } case YV16: { src_y = y_buf + y_pitch * pic_y + pic_x; + // Only used when pic_x is even; odd pic_x is handled below. src_u = u_buf + uv_pitch * pic_y + pic_x / 2; src_v = v_buf + uv_pitch * pic_y + pic_x / 2; @@ -185,8 +186,10 @@ } case YV12: { src_y = y_buf + y_pitch * pic_y + pic_x; - src_u = u_buf + (uv_pitch * pic_y + pic_x) / 2; - src_v = v_buf + (uv_pitch * pic_y + pic_x) / 2; + // Only used when pic_x and pic_y are both even; odd values are handled + // below. + src_u = u_buf + uv_pitch * (pic_y / 2) + pic_x / 2; + src_v = v_buf + uv_pitch * (pic_y / 2) + pic_x / 2; fConvertYUVToARGB = libyuv::I420ToARGBMatrix; break; @@ -210,6 +213,81 @@ const uint8_t* u_channel = swap_uv? src_v : src_u; const uint8_t* v_channel = swap_uv? src_u : src_v; + + // libyuv handles odd crop widths and heights correctly via its _Any_ row + // variants, but cannot handle an odd pic_x or pic_y for subsampled formats. + // For YV12/YV16 an odd pic_x means the Y plane starts at a position that + // doesn't align with a chroma column boundary; for YV12, odd pic_y has the + // same problem vertically. libyuv would then pair each Y sample with the + // wrong chroma, affecting every pixel in the image. + // + // Fix: split the output into up to 4 non-overlapping regions, each with + // even-aligned source coordinates. Integer division of an odd sx or sy by 2 + // floors to the correct chroma index (both luma positions in a 2x2 block + // share one chroma sample), so all regions are correct. + // + // With dx = pic_x & 1 and dy = pic_y & 1 (each 0 or 1): + // + // +------------+--------------------+ + // | dx x dy | (W-dx) x dy | <- only when dy > 0 + // +------------+--------------------+ + // | dx x (H-dy)| (W-dx) x (H-dy) | <- left col only when dx > 0 + // +------------+--------------------+ + + // dx/dy: 1 if pic_x/pic_y is odd and the format has chroma subsampling in + // that axis, 0 otherwise. + int dx = (yuv_type == YV12 || yuv_type == YV16) ? (pic_x & 1) : 0; + int dy = (yuv_type == YV12) ? (pic_y & 1) : 0; + if (dx | dy) { + // Converts source sub-region (sx, sy, w, h) to the area at dst in rgb_buf. + auto convert = [&](int sx, int sy, int w, int h, uint8_t* dst) -> nsresult { + if (w <= 0 || h <= 0) { + return NS_OK; + } + const uint8_t* py = y_buf + sy * y_pitch + sx; + const uint8_t* pu; + const uint8_t* pv; + if (yuv_type == YV12) { + pu = u_buf + (sy / 2) * uv_pitch + sx / 2; + pv = v_buf + (sy / 2) * uv_pitch + sx / 2; + } else { // YV16: full-height chroma planes, only horizontally subsampled. + pu = u_buf + sy * uv_pitch + sx / 2; + pv = v_buf + sy * uv_pitch + sx / 2; + } + const uint8_t* uc = swap_uv ? pv : pu; + const uint8_t* vc = swap_uv ? pu : pv; + return ToNSResult(fConvertYUVToARGB(py, y_pitch, uc, uv_pitch, vc, uv_pitch, + dst, rgb_pitch, yuv_constant, w, h)); + }; + if (dy) { + // First output row (source row pic_y is odd). + if (dx) { + // Corner pixel: source (pic_x, pic_y) → output top-left. + nsresult rv = convert(pic_x, pic_y, 1, 1, rgb_buf); + if (NS_FAILED(rv)) { + return rv; + } + } + // Remaining columns of first row; source x pic_x+dx is even. + nsresult rv = convert(pic_x + dx, pic_y, pic_width - dx, 1, rgb_buf + dx * 4); + if (NS_FAILED(rv)) { + return rv; + } + } + int sy = pic_y + dy; // even-aligned source y for remaining output rows + int h = pic_height - dy; + if (dx) { + // Left column of remaining rows; width=1 handles the odd source x. + nsresult rv = convert(pic_x, sy, 1, h, rgb_buf + dy * rgb_pitch); + if (NS_FAILED(rv)) { + return rv; + } + } + // Main body: source (pic_x+dx, sy), both even-aligned. + return convert(pic_x + dx, sy, pic_width - dx, h, + rgb_buf + dy * rgb_pitch + dx * 4); + } + return ToNSResult(fConvertYUVToARGB(src_y, y_pitch, u_channel, uv_pitch, v_channel, uv_pitch, rgb_buf, rgb_pitch, yuv_constant, pic_width, pic_height)); diff -Nru firefox-esr-140.9.1esr/image/ImageWrapper.cpp firefox-esr-140.10.0esr/image/ImageWrapper.cpp --- firefox-esr-140.9.1esr/image/ImageWrapper.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/image/ImageWrapper.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -240,7 +240,8 @@ NS_IMETHODIMP_(void) ImageWrapper::RequestRefresh(const TimeStamp& aTime) { - return mInnerImage->RequestRefresh(aTime); + RefPtr inner = mInnerImage; + return inner->RequestRefresh(aTime); } NS_IMETHODIMP diff -Nru firefox-esr-140.9.1esr/image/RasterImage.cpp firefox-esr-140.10.0esr/image/RasterImage.cpp --- firefox-esr-140.9.1esr/image/RasterImage.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/image/RasterImage.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -81,6 +81,8 @@ //****************************************************************************** RasterImage::~RasterImage() { + mIsBeingDestroyed = true; + // Make sure our SourceBuffer is marked as complete. This will ensure that any // outstanding decoders terminate. if (!mSourceBuffer->IsComplete()) { @@ -489,8 +491,12 @@ void RasterImage::OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey) { MOZ_ASSERT(mProgressTracker); + if (mIsBeingDestroyed) { + return; + } + bool animatedFramesDiscarded = - mAnimationState && aSurfaceKey.Playback() == PlaybackType::eAnimated; + aSurfaceKey.Playback() == PlaybackType::eAnimated; nsCOMPtr eventTarget = do_GetMainThread(); diff -Nru firefox-esr-140.9.1esr/image/RasterImage.h firefox-esr-140.10.0esr/image/RasterImage.h --- firefox-esr-140.9.1esr/image/RasterImage.h 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/image/RasterImage.h 2026-04-15 01:59:50.000000000 +0000 @@ -17,6 +17,7 @@ #ifndef mozilla_image_RasterImage_h #define mozilla_image_RasterImage_h +#include "mozilla/Atomics.h" #include "Image.h" #include "nsCOMPtr.h" #include "imgIContainer.h" @@ -382,6 +383,8 @@ // This is currently only used for statistics int32_t mDecodeCount; + Atomic mIsBeingDestroyed{false}; + #ifdef DEBUG uint32_t mFramesNotified; #endif diff -Nru firefox-esr-140.9.1esr/image/VectorImage.cpp firefox-esr-140.10.0esr/image/VectorImage.cpp --- firefox-esr-140.9.1esr/image/VectorImage.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/image/VectorImage.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -1603,6 +1603,10 @@ // invalid document. ReportDocumentUseCounters(); + // ProgressTracker::SyncNotifyProgress may release us, so ensure we + // stick around long enough to complete our work. + RefPtr kungFuDeathGrip(this); + if (mProgressTracker) { // Notify observers about the error and unblock page load. Progress progress = FLAG_HAS_ERROR; diff -Nru firefox-esr-140.9.1esr/image/decoders/nsPNGDecoder.cpp firefox-esr-140.10.0esr/image/decoders/nsPNGDecoder.cpp --- firefox-esr-140.9.1esr/image/decoders/nsPNGDecoder.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/image/decoders/nsPNGDecoder.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -448,9 +448,6 @@ mInProfile = qcms_profile_create_cicp( primaries, ChooseTransferCharacteristics(tc)); if (mInProfile) { - if (!(color_type & PNG_COLOR_MASK_COLOR)) { - png_set_gray_to_rgb(png_ptr); - } return qcms_profile_get_rendering_intent(mInProfile); } } @@ -477,9 +474,7 @@ mismatch = true; } } else { - if (profileSpace == icSigRgbData) { - png_set_gray_to_rgb(png_ptr); - } else if (profileSpace != icSigGrayData) { + if (profileSpace != icSigRgbData && profileSpace != icSigGrayData) { mismatch = true; } } @@ -498,7 +493,6 @@ *sRGBTag = true; int fileIntent; - png_set_gray_to_rgb(png_ptr); png_get_sRGB(png_ptr, info_ptr, &fileIntent); uint32_t map[] = {QCMS_INTENT_PERCEPTUAL, QCMS_INTENT_RELATIVE_COLORIMETRIC, QCMS_INTENT_SATURATION, @@ -523,10 +517,6 @@ mInProfile = qcms_profile_create_rgb_with_gamma(whitePoint, primaries, 1.0 / gammaOfFile); - - if (mInProfile) { - png_set_gray_to_rgb(png_ptr); - } } return QCMS_INTENT_PERCEPTUAL; // Our default @@ -593,9 +583,9 @@ // We only need to extract the color profile for non-metadata decodes. It is // fairly expensive to read the profile and create the transform so we should // avoid it if not necessary. - uint32_t intent = -1; - bool sRGBTag = false; if (!decoder->IsMetadataDecode()) { + uint32_t intent = -1; + bool sRGBTag = false; if (decoder->mCMSMode != CMSMode::Off) { intent = gfxPlatform::GetRenderingIntent(); uint32_t pIntent = @@ -604,15 +594,74 @@ if (intent == uint32_t(-1)) { intent = pIntent; } + + // png_get_channels won't return accurate info for determining the alpha + // status until after we call png_read_update_info below so we use this + // method of determining if we will have alpha so that we can select the + // correct qcms input type here. + const bool willHaveAlpha = + (color_type & PNG_COLOR_MASK_ALPHA) || num_trans != 0; + + // Determine the qcms transform here, before png_read_update_info commits + // libpng to a specific output format. For gray images the presence or + // absence of a qcms transform determines if we want libpng to output + // gray data (we call qcms to transform it to rgb before passing it to + // the surface pipe), or rgb data (no qcms transform so we need rgb data + // to pass directly into the surface pipe). + if (decoder->mInProfile && decoder->GetCMSOutputProfile()) { + uint32_t profileSpace = + qcms_profile_get_color_space(decoder->mInProfile); + decoder->mUsePipeTransform = profileSpace != icSigGrayData; + + qcms_data_type inType, outType; + if (decoder->mUsePipeTransform) { + // libpng outputs data in RGBA order and we want our final output to + // be BGRA order. SurfacePipe takes care of this for us but + // unfortunately the swizzle to change the order can happen before or + // after color management depending on if we have alpha. If we have + // alpha then the order will be color management then swizzle. If we + // do not have alpha then the order will be swizzle then color + // management. See CreateSurfacePipe + // https://searchfox.org/mozilla-central/rev/7d6651d29c5c1620bc059f879a3e9bbfb53f271f/image/SurfacePipeFactory.h#133-145 + if (willHaveAlpha) { + inType = QCMS_DATA_RGBA_8; + outType = QCMS_DATA_RGBA_8; + } else { + inType = gfxPlatform::GetCMSOSRGBAType(); + outType = inType; + } + } else { + // qcms operates on the data before we hand it to SurfacePipe. + inType = willHaveAlpha ? QCMS_DATA_GRAYA_8 : QCMS_DATA_GRAY_8; + outType = gfxPlatform::GetCMSOSRGBAType(); + } + decoder->mTransform = qcms_transform_create( + decoder->mInProfile, inType, decoder->GetCMSOutputProfile(), + outType, (qcms_intent)intent); + } else if ((sRGBTag && decoder->mCMSMode == CMSMode::TaggedOnly) || + decoder->mCMSMode == CMSMode::All) { + // See comment above about SurfacePipe, color management and ordering. + decoder->mUsePipeTransform = true; + if (willHaveAlpha) { + decoder->mTransform = + decoder->GetCMSsRGBTransform(SurfaceFormat::R8G8B8A8); + } else { + decoder->mTransform = + decoder->GetCMSsRGBTransform(SurfaceFormat::OS_RGBA); + } + } } - const bool hasColorInfo = decoder->mInProfile || sRGBTag; - if (!hasColorInfo || !decoder->GetCMSOutputProfile()) { + + // Expand gray to RGB unless we will pass the data to qcms to handle it via + // a non-pipe transform. + if (!decoder->mTransform || decoder->mUsePipeTransform) { png_set_gray_to_rgb(png_ptr); + } - // only do gamma correction if CMS isn't entirely disabled - if (decoder->mCMSMode != CMSMode::Off) { - PNGDoGammaCorrection(png_ptr, info_ptr); - } + // Only apply libpng gamma correction when there is no qcms transform to + // handle it, and CMS is not entirely disabled. + if (!decoder->mTransform && decoder->mCMSMode != CMSMode::Off) { + PNGDoGammaCorrection(png_ptr, info_ptr); } } @@ -651,7 +700,6 @@ } #endif - auto transparency = decoder->GetTransparencyType(frameRect); if (decoder->IsMetadataDecode()) { // If we are animated then the first frame rect is either: // 1) the whole image if the IDAT chunk is part of the animation @@ -660,61 +708,14 @@ // PostHasTransparency in the metadata decode if we need to. So it's // okay to pass IntRect(0, 0, width, height) here for animated images; // they will call with the proper first frame rect in the full decode. - decoder->PostHasTransparencyIfNeeded(transparency); + decoder->PostHasTransparencyIfNeeded( + decoder->GetTransparencyType(frameRect)); // We have the metadata we're looking for, so stop here, before we allocate // buffers below. return decoder->DoTerminate(png_ptr, TerminalState::SUCCESS); } - if (decoder->mInProfile && decoder->GetCMSOutputProfile()) { - qcms_data_type inType; - qcms_data_type outType; - - uint32_t profileSpace = qcms_profile_get_color_space(decoder->mInProfile); - decoder->mUsePipeTransform = profileSpace != icSigGrayData; - if (decoder->mUsePipeTransform) { - // libpng outputs data in RGBA order and we want our final output to be - // BGRA order. SurfacePipe takes care of this for us but unfortunately the - // swizzle to change the order can happen before or after color management - // depending on if we have alpha. If we have alpha then the order will be - // color management then swizzle. If we do not have alpha then the order - // will be swizzle then color management. See CreateSurfacePipe - // https://searchfox.org/mozilla-central/rev/7d6651d29c5c1620bc059f879a3e9bbfb53f271f/image/SurfacePipeFactory.h#133-145 - if (transparency == TransparencyType::eAlpha) { - inType = QCMS_DATA_RGBA_8; - outType = QCMS_DATA_RGBA_8; - } else { - inType = gfxPlatform::GetCMSOSRGBAType(); - outType = inType; - } - } else { - // qcms operates on the data before we hand it to SurfacePipe. - if (color_type & PNG_COLOR_MASK_ALPHA) { - inType = QCMS_DATA_GRAYA_8; - outType = gfxPlatform::GetCMSOSRGBAType(); - } else { - inType = QCMS_DATA_GRAY_8; - outType = gfxPlatform::GetCMSOSRGBAType(); - } - } - - decoder->mTransform = qcms_transform_create(decoder->mInProfile, inType, - decoder->GetCMSOutputProfile(), - outType, (qcms_intent)intent); - } else if ((sRGBTag && decoder->mCMSMode == CMSMode::TaggedOnly) || - decoder->mCMSMode == CMSMode::All) { - // See comment above about SurfacePipe, color management and ordering. - decoder->mUsePipeTransform = true; - if (transparency == TransparencyType::eAlpha) { - decoder->mTransform = - decoder->GetCMSsRGBTransform(SurfaceFormat::R8G8B8A8); - } else { - decoder->mTransform = - decoder->GetCMSsRGBTransform(SurfaceFormat::OS_RGBA); - } - } - #ifdef PNG_APNG_SUPPORTED if (isAnimated) { png_set_progressive_frame_fn(png_ptr, nsPNGDecoder::frame_info_callback, diff -Nru firefox-esr-140.9.1esr/ipc/glue/BackgroundParentImpl.cpp firefox-esr-140.10.0esr/ipc/glue/BackgroundParentImpl.cpp --- firefox-esr-140.9.1esr/ipc/glue/BackgroundParentImpl.cpp 2026-04-03 15:52:21.000000000 +0000 +++ firefox-esr-140.10.0esr/ipc/glue/BackgroundParentImpl.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -537,6 +537,12 @@ PSharedWorkerParent* aActor, const mozilla::dom::RemoteWorkerData& aData, const uint64_t& aWindowID, const mozilla::dom::MessagePortIdentifier& aPortIdentifier) { + + if (MOZ_UNLIKELY(aData.serviceWorkerData().type() != + OptionalServiceWorkerData::Tvoid_t)) { + return IPC_FAIL(this, "Invalid worker type for PSharedWorkerParent"); + } + mozilla::dom::SharedWorkerParent* actor = static_cast(aActor); actor->Initialize(aData, aWindowID, aPortIdentifier); @@ -677,6 +683,10 @@ AssertIsInMainProcess(); AssertIsOnBackgroundThread(); + if (!StaticPrefs::dom_udpsocket_enabled() && aFilter.IsEmpty()) { + return IPC_FAIL(this, "udp socket not enabled"); + } + if (aOptionalPrincipal.isSome()) { // Support for checking principals (for non-mtransport use) will be handled // in bug 1167039 diff -Nru firefox-esr-140.9.1esr/ipc/glue/UtilityProcessParent.cpp firefox-esr-140.10.0esr/ipc/glue/UtilityProcessParent.cpp --- firefox-esr-140.9.1esr/ipc/glue/UtilityProcessParent.cpp 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/ipc/glue/UtilityProcessParent.cpp 2026-04-15 01:59:51.000000000 +0000 @@ -37,17 +37,20 @@ const bool& aMinimizeMemoryUsage, const Maybe& aDMDFile) { mMemoryReportRequest = MakeUnique(aGeneration); - PUtilityProcessParent::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [self = RefPtr{this}](const uint32_t& aGeneration2) { - if (self->mMemoryReportRequest) { - self->mMemoryReportRequest->Finish(aGeneration2); - self->mMemoryReportRequest = nullptr; - } - }, - [self = RefPtr{this}](mozilla::ipc::ResponseRejectReason) { - self->mMemoryReportRequest = nullptr; - }); + RefPtr self(this); + PUtilityProcessParent::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [self](uint32_t aGeneration2) { + if (self->mMemoryReportRequest) { + self->mMemoryReportRequest->Finish(aGeneration2); + self->mMemoryReportRequest = nullptr; + } + }, + [self](mozilla::ipc::ResponseRejectReason) { + self->mMemoryReportRequest = nullptr; + }); return true; } diff -Nru firefox-esr-140.9.1esr/js/loader/ModuleLoaderBase.cpp firefox-esr-140.10.0esr/js/loader/ModuleLoaderBase.cpp --- firefox-esr-140.9.1esr/js/loader/ModuleLoaderBase.cpp 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/loader/ModuleLoaderBase.cpp 2026-04-15 01:59:51.000000000 +0000 @@ -169,8 +169,14 @@ bool ModuleLoaderBase::ImportMetaResolve(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); - RootedValue modulePrivate( - cx, js::GetFunctionNativeReserved(&args.callee(), ModulePrivateSlot)); + RootedValue moduleValue( + cx, js::GetFunctionNativeReserved( + &args.callee(), + static_cast(ModuleRecordSlot))); + MOZ_ASSERT(!moduleValue.isUndefined()); + RootedObject moduleRecord(cx, &moduleValue.toObject()); + RootedValue modulePrivate(cx, GetModulePrivate(moduleRecord)); + MOZ_ASSERT(!modulePrivate.isUndefined()); // https://html.spec.whatwg.org/#hostgetimportmetaproperties // Step 4.1. Set specifier to ? ToString(specifier). @@ -280,10 +286,15 @@ } // Store the 'active script' of the meta object into the function slot. - // https://html.spec.whatwg.org/#active-script + // See https://html.spec.whatwg.org/#active-script + // + // Note: Hold a reference to the module record which in turn keeps the + // ModuleScript alive when import.resolve is called. RootedObject resolveFuncObj(aCx, JS_GetFunctionObject(resolveFunc)); - js::SetFunctionNativeReserved(resolveFuncObj, ModulePrivateSlot, - aReferencingPrivate); + RootedObject moduleRecord(aCx, script->ModuleRecord()); + js::SetFunctionNativeReserved( + resolveFuncObj, static_cast(ModuleRecordSlot), + JS::ObjectValue(*moduleRecord)); return true; } diff -Nru firefox-esr-140.9.1esr/js/loader/ModuleLoaderBase.h firefox-esr-140.10.0esr/js/loader/ModuleLoaderBase.h --- firefox-esr-140.9.1esr/js/loader/ModuleLoaderBase.h 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/loader/ModuleLoaderBase.h 2026-04-15 01:59:51.000000000 +0000 @@ -557,7 +557,7 @@ bool IsFetchingAndHasWaitingRequest(ModuleLoadRequest* aRequest); // The slot stored in ImportMetaResolve function. - enum { ModulePrivateSlot = 0, SlotCount }; + enum { ModuleRecordSlot = 0, SlotCount }; // The number of args in ImportMetaResolve. static const uint32_t ImportMetaResolveNumArgs = 1; diff -Nru firefox-esr-140.9.1esr/js/public/Object.h firefox-esr-140.10.0esr/js/public/Object.h --- firefox-esr-140.9.1esr/js/public/Object.h 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/public/Object.h 2026-04-15 01:59:51.000000000 +0000 @@ -129,6 +129,12 @@ SetReservedSlot(obj, 0, PrivateValue(nsISupportsValue)); } +/** + * Returns true if the native object has own named properties, i.e. user-added + * properties (expandos). Must not be called on proxy objects. + */ +extern JS_PUBLIC_API bool NativeObjectHasOwnProperties(const JSObject* obj); + } // namespace JS // JSObject* is an aligned pointer, but this information isn't available in the diff -Nru firefox-esr-140.9.1esr/js/src/debugger/Debugger.cpp firefox-esr-140.10.0esr/js/src/debugger/Debugger.cpp --- firefox-esr-140.9.1esr/js/src/debugger/Debugger.cpp 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/debugger/Debugger.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -1152,6 +1152,9 @@ if (success && completion.get().suspending()) { Debugger::suspendGeneratorDebuggerFrames(cx, frame); } else { + if (frame.isWasmDebugFrame()) { + DebugEnvironments::onPopWasm(cx, frame); + } Debugger::terminateDebuggerFrames(cx, frame); } }); diff -Nru firefox-esr-140.9.1esr/js/src/gc/GC.cpp firefox-esr-140.10.0esr/js/src/gc/GC.cpp --- firefox-esr-140.9.1esr/js/src/gc/GC.cpp 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/gc/GC.cpp 2026-04-15 01:59:51.000000000 +0000 @@ -2194,8 +2194,11 @@ break; } - // Check whether something used the chunk while lock was released. - if (!CanDecommitWholeChunk(chunk)) { + // Check whether something used the chunk while the lock was released. The + // chunk may have been taken from the empty chunks pool (e.g. adopted as + // the current chunk, or repurposed as a nursery/buffer chunk), so we must + // verify it is still a member of the pool before removing it. + if (!emptyChunks(lock).contains(chunk) || !CanDecommitWholeChunk(chunk)) { continue; } diff -Nru firefox-esr-140.9.1esr/js/src/gc/GCRuntime.h firefox-esr-140.10.0esr/js/src/gc/GCRuntime.h --- firefox-esr-140.9.1esr/js/src/gc/GCRuntime.h 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/gc/GCRuntime.h 2026-04-15 01:59:51.000000000 +0000 @@ -108,13 +108,15 @@ void sort(); + // Linear time, use with caution. + bool contains(ArenaChunk* chunk) const; + private: ArenaChunk* mergeSort(ArenaChunk* list, size_t count); bool isSorted() const; #ifdef DEBUG public: - bool contains(ArenaChunk* chunk) const; bool verify() const; void verifyChunks() const; #endif diff -Nru firefox-esr-140.9.1esr/js/src/gc/Heap.cpp firefox-esr-140.10.0esr/js/src/gc/Heap.cpp --- firefox-esr-140.9.1esr/js/src/gc/Heap.cpp 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/gc/Heap.cpp 2026-04-15 01:59:51.000000000 +0000 @@ -696,10 +696,11 @@ return true; } -#ifdef DEBUG - bool ChunkPool::contains(ArenaChunk* chunk) const { +#ifdef DEBUG verify(); +#endif + for (ArenaChunk* cursor = head_; cursor; cursor = cursor->info.next) { if (cursor == chunk) { return true; @@ -708,6 +709,8 @@ return false; } +#ifdef DEBUG + bool ChunkPool::verify() const { MOZ_ASSERT(bool(head_) == bool(count_)); uint32_t count = 0; diff -Nru firefox-esr-140.9.1esr/js/src/jit/MIR-wasm.cpp firefox-esr-140.10.0esr/js/src/jit/MIR-wasm.cpp --- firefox-esr-140.9.1esr/js/src/jit/MIR-wasm.cpp 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit/MIR-wasm.cpp 2026-04-15 01:59:51.000000000 +0000 @@ -311,6 +311,16 @@ return load->accessType() == accessType() && congruentIfOperandsEqual(load); } +bool MWasmI31RefGet::congruentTo(const MDefinition* ins) const { + if (!ins->isWasmI31RefGet()) { + return false; + } + // Make sure that we have a signed/signed or unsigned/unsigned pair to be + // considered congruent. + return congruentIfOperandsEqual(ins) && + ins->toWasmI31RefGet()->wideningOp() == wideningOp(); +} + MDefinition::AliasType MWasmLoadInstanceDataField::mightAlias( const MDefinition* def) const { if (def->isWasmStoreInstanceDataField()) { diff -Nru firefox-esr-140.9.1esr/js/src/jit/MIR.cpp firefox-esr-140.10.0esr/js/src/jit/MIR.cpp --- firefox-esr-140.9.1esr/js/src/jit/MIR.cpp 2026-04-03 15:52:23.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit/MIR.cpp 2026-04-15 01:59:50.000000000 +0000 @@ -6549,6 +6549,34 @@ return MConstant::NewIntPtr(alloc, intptr_t(ival)); } +AliasSet MLoadScriptedProxyHandler::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MGuardIsNativeObject::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MGuardIsProxy::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MGuardIsNotProxy::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MGuardIsNotDOMProxy::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MGuardHasProxyHandler::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MIsConstructor::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + MDefinition* MIsObject::foldsTo(TempAllocator& alloc) { MDefinition* input = object(); if (!input->isBox()) { diff -Nru firefox-esr-140.9.1esr/js/src/jit/MIR.h firefox-esr-140.10.0esr/js/src/jit/MIR.h --- firefox-esr-140.9.1esr/js/src/jit/MIR.h 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit/MIR.h 2026-04-15 01:59:50.000000000 +0000 @@ -9051,7 +9051,9 @@ } MDefinition* foldsTo(TempAllocator& alloc) override; - AliasSet getAliasSet() const override { return AliasSet::None(); } + AliasSet getAliasSet() const override { + return AliasSet::Load(AliasSet::ObjectFields); + } }; class MHasClass : public MUnaryInstruction, public SingleObjectPolicy::Data { @@ -9072,7 +9074,9 @@ const JSClass* getClass() const { return class_; } MDefinition* foldsTo(TempAllocator& alloc) override; - AliasSet getAliasSet() const override { return AliasSet::None(); } + AliasSet getAliasSet() const override { + return AliasSet::Load(AliasSet::ObjectFields); + } bool congruentTo(const MDefinition* ins) const override { if (!ins->isHasClass()) { return false; @@ -9112,7 +9116,9 @@ } MDefinition* foldsTo(TempAllocator& alloc) override; - AliasSet getAliasSet() const override { return AliasSet::None(); } + AliasSet getAliasSet() const override { + return AliasSet::Load(AliasSet::ObjectFields); + } bool congruentTo(const MDefinition* ins) const override { if (!ins->isGuardToClass()) { return false; diff -Nru firefox-esr-140.9.1esr/js/src/jit/MIROps.yaml firefox-esr-140.10.0esr/js/src/jit/MIROps.yaml --- firefox-esr-140.9.1esr/js/src/jit/MIROps.yaml 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit/MIROps.yaml 2026-04-15 01:59:51.000000000 +0000 @@ -668,7 +668,7 @@ result_type: Object guard: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom generate_lir: true #ifdef JS_PUNBOX64 @@ -825,7 +825,7 @@ wideningOp: wasm::FieldWideningOp type_policy: none result_type: Int32 - congruent_to: if_operands_equal + congruent_to: custom alias_set: none generate_lir: true @@ -2161,7 +2161,7 @@ guard: true movable: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom - name: GuardGlobalGeneration arguments: @@ -2180,7 +2180,7 @@ guard: true movable: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom - name: GuardIsNotDOMProxy operands: @@ -2189,7 +2189,7 @@ guard: true movable: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom - name: GuardIsNotProxy operands: @@ -2199,7 +2199,7 @@ movable: true congruent_to: if_operands_equal folds_to: custom - alias_set: none + alias_set: custom - name: ProxyGet operands: @@ -2401,7 +2401,7 @@ guard: true movable: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom # Loads a specific JSObject* that was originally nursery-allocated. # See also WarpObjectField. @@ -2965,7 +2965,7 @@ result_type: Boolean movable: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom generate_lir: true - name: IsCrossRealmArrayConstructor diff -Nru firefox-esr-140.9.1esr/js/src/jit/ScalarReplacement.cpp firefox-esr-140.10.0esr/js/src/jit/ScalarReplacement.cpp --- firefox-esr-140.9.1esr/js/src/jit/ScalarReplacement.cpp 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit/ScalarReplacement.cpp 2026-04-15 01:59:51.000000000 +0000 @@ -3044,11 +3044,7 @@ bool mergeIntoSuccessorState(MBasicBlock* curr, MBasicBlock* succ, BlockState** pSuccState); -#ifdef DEBUG void assertSuccess(); -#else - void assertSuccess() {} -#endif bool oom() const { return oom_; } @@ -3065,15 +3061,13 @@ state_ = state; } -#ifdef DEBUG void WasmStructMemoryView::assertSuccess() { // Make sure that the undefined value used as a placeholder is not used. - MOZ_ASSERT(!undefinedVal_->hasUses()); + MOZ_RELEASE_ASSERT(!undefinedVal_->hasUses()); // Make sure that the MWasmNewStruct instruction is not used anymore. - MOZ_ASSERT(!struct_->hasUses()); + MOZ_RELEASE_ASSERT(!struct_->hasUses()); } -#endif MBasicBlock* WasmStructMemoryView::startingBlock() { return startBlock_; } @@ -3323,7 +3317,7 @@ } case MDefinition::Opcode::WasmStoreFieldRef: { // Escaped if it's stored into another struct. - if (def->toWasmStoreFieldRef()->value() == newStruct) { + if (def->toWasmStoreFieldRef()->value() == ins) { JitSpewDef(JitSpew_Escape, "is escaped by\n", def); return true; } diff -Nru firefox-esr-140.9.1esr/js/src/jit-test/tests/arguments/bug2029316.js firefox-esr-140.10.0esr/js/src/jit-test/tests/arguments/bug2029316.js --- firefox-esr-140.9.1esr/js/src/jit-test/tests/arguments/bug2029316.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit-test/tests/arguments/bug2029316.js 2026-04-15 01:59:51.000000000 +0000 @@ -0,0 +1,17 @@ +function makeArgs() { + "use strict"; + return arguments; +} +function test() { + for (var alloc = 1; alloc < 50; alloc++) { + var args = makeArgs(1, 2, 3); + oomAtAllocation(alloc); + try { + delete args[0]; + } catch (e) {} + resetOOMFailure(); + args[0] = "x"; + assertEq(args[0], "x"); + } +} +test(); diff -Nru firefox-esr-140.9.1esr/js/src/jit-test/tests/arguments/bug2029317.js firefox-esr-140.10.0esr/js/src/jit-test/tests/arguments/bug2029317.js --- firefox-esr-140.9.1esr/js/src/jit-test/tests/arguments/bug2029317.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit-test/tests/arguments/bug2029317.js 2026-04-15 01:59:51.000000000 +0000 @@ -0,0 +1,25 @@ +function test() { + var f = function() { return arguments; }; + var template = new Array(9000).fill(0); + + var a = f.apply(null, template); + Object.defineProperty(a, 0, {value: "v1", writable: false, configurable: true}); + + for (var alloc = 4; alloc < 15; alloc++) { + var args = null; + var ok = false; + oomAtAllocation(alloc); + try { + args = f.apply(null, template); + ok = true; + Object.defineProperty(args, 0, {value: "v1", writable: false, configurable: true}); + } catch (e) {} + resetOOMFailure(); + + if (ok) { + Object.defineProperty(args, 0, {value: "v2"}); + assertEq(args[0], "v2"); + } + } +} +test(); diff -Nru firefox-esr-140.9.1esr/js/src/jit-test/tests/modules/bug-2027274.js firefox-esr-140.10.0esr/js/src/jit-test/tests/modules/bug-2027274.js --- firefox-esr-140.9.1esr/js/src/jit-test/tests/modules/bug-2027274.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit-test/tests/modules/bug-2027274.js 2026-04-15 01:59:51.000000000 +0000 @@ -0,0 +1,14 @@ +// |jit-test| slow; error: InternalError: too much recursion +var leaf = parseModule("await 0; throw 1;", "l.js"); +registerModule("l", leaf); +moduleLink(leaf); +moduleEvaluate(leaf); +var p = "l"; +for (var i = 0; i < 50000; i++) { + var m = parseModule("import '" + p + "'; if(0) await 0;", "m" + i + ".js"); + registerModule("m" + i, m); + moduleLink(m); + moduleEvaluate(m); + p = "m" + i; +} +drainJobQueue(); diff -Nru firefox-esr-140.9.1esr/js/src/jit-test/tests/structured-clone/allobjs.js firefox-esr-140.10.0esr/js/src/jit-test/tests/structured-clone/allobjs.js --- firefox-esr-140.9.1esr/js/src/jit-test/tests/structured-clone/allobjs.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit-test/tests/structured-clone/allobjs.js 2026-04-15 01:59:51.000000000 +0000 @@ -0,0 +1,34 @@ +var bytes = new BigUint64Array([ + 0xfff1000000000002n, // SCTAG_HEADER (version=2) + 0xffff002200000000n, // SCTAG_ERROR_OBJECT + 0xffff000480000001n, // .message = SCTAG_STRING (length=1, Latin-1) + 0x0000000000000078n, // string data: "x" + 0xffff000700000000n, // .hasCause = SCTAG_ARRAY_OBJECT (length=0) <-- INVALID!!! + 0xffff000480000002n, // .filename = SCTAG_STRING (length=2, Latin-1) + 0x000000000000652dn, // string data: "e-" + 0xffff000300000002n, // .lineNumber = SCTAG_INT32 (value=2) + 0xffff000300000011n, // .column = SCTAG_INT32 (value=17) + 0xffff000000000000n, // .cause = SCTAG_NULL + 0xffff000000000000n, // .errors = SCTAG_NULL + 0xffff0016ffff0018n, // .stack = SCTAG_SAVED_FRAME_OBJECT | SCTAG_NULL_JSPRINCIPALS + 0xffff000200000000n, // .mutedErrors = SCTAG_BOOLEAN (value=0) + 0xffff000480000002n, // .source = SCTAG_STRING (length=2, Latin-1) + 0x000000000000652dn, // string data: "e-" + 0xffff000300000002n, // .lineNumber = SCTAG_INT32 (value=2) + 0xffff000300000011n, // .columnNumber SCTAG_INT32 (value=17) + 0xffff000000000000n, // .functionDisplayName = SCTAG_NULL + 0xffff000000000000n, // .asyncCause = SCTAG_NULL + 0xffff000000000000n, // .parent = SCTAG_NULL + 0xffff001300000000n, // SCTAG_END_OF_KEYS + 0xffff001300000000n, // SCTAG_END_OF_KEYS +]); +var buf = serialize(null, undefined, {scope: 'DifferentProcess'}); +buf.arraybuffer = bytes.buffer; + +var e; +try { + deserialize(buf); +} catch (err) { + e = err; +} +assertEq(e.message.includes("hasCause must be a boolean"), true); diff -Nru firefox-esr-140.9.1esr/js/src/jit-test/tests/wasm/bug2020378.js firefox-esr-140.10.0esr/js/src/jit-test/tests/wasm/bug2020378.js --- firefox-esr-140.9.1esr/js/src/jit-test/tests/wasm/bug2020378.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit-test/tests/wasm/bug2020378.js 2026-04-15 01:59:51.000000000 +0000 @@ -0,0 +1,177 @@ +// |jit-test| skip-if: !wasmThreadsEnabled() + +const m = new WebAssembly.Module(wasmTextToBinary(` +(module + (memory $m32 1 1) + (memory $m64 i64 1 1) + (memory $m32s 1 1 shared) + (memory $m64s i64 1 1 shared) + + ${["", "s"].map(s => ` + (func (export "wait3232${s}") (param i32) (result i32) + (memory.atomic.wait32 $m32${s} + (local.get 0) + (i32.const 0) + (i64.const 0) + ) + ) + (func (export "wait3264${s}") (param i32) (result i32) + (memory.atomic.wait64 $m32${s} + (local.get 0) + (i64.const 0) + (i64.const 0) + ) + ) + (func (export "wait6432${s}") (param i64) (result i32) + (memory.atomic.wait32 $m64${s} + (local.get 0) + (i32.const 0) + (i64.const 0) + ) + ) + (func (export "wait6464${s}") (param i64) (result i32) + (memory.atomic.wait64 $m64${s} + (local.get 0) + (i64.const 0) + (i64.const 0) + ) + ) + (func (export "notify32${s}") (param i32) (result i32) + (memory.atomic.notify $m32${s} + (local.get 0) + (i32.const 0) + ) + ) + (func (export "notify64${s}") (param i64) (result i32) + (memory.atomic.notify $m64${s} + (local.get 0) + (i32.const 0) + ) + ) + `).join("\n")} +)`)); +const { + wait3232, wait3264, + wait6432, wait6464, + notify32, notify64, + + wait3232s, wait3264s, + wait6432s, wait6464s, + notify32s, notify64s, +} = new WebAssembly.Instance(m).exports; + +// +// Shared memories +// + +assertEq(wait3232s(0), 2); +assertEq(wait3232s(65532), 2); +assertErrorMessage(() => wait3232s(65533), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3232s(65536), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait3232s(-8), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait3232s(-4), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait3232s(-3), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3232s(-2), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3232s(-1), WebAssembly.RuntimeError, /unaligned/); + +assertEq(wait3264s(0), 2); +assertEq(wait3264s(65528), 2); +assertErrorMessage(() => wait3264s(65529), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3264s(65536), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait3264s(-16), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait3264s(-8), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait3264s(-7), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3264s(-6), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3264s(-5), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3264s(-4), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3264s(-3), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3264s(-2), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3264s(-1), WebAssembly.RuntimeError, /unaligned/); + +assertEq(wait6432s(0n), 2); +assertEq(wait6432s(65532n), 2); +assertErrorMessage(() => wait6432s(65533n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6432s(65536n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**32n-8n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**32n-4n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**32n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**33n-8n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**33n-4n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**33n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(-8n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(-4n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(-3n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6432s(-2n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6432s(-1n), WebAssembly.RuntimeError, /unaligned/); + +assertEq(wait6464s(0n), 2); +assertEq(wait6464s(65528n), 2); +assertErrorMessage(() => wait6464s(65529n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6464s(65536n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**32n-16n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**32n-8n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**32n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**33n-16n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**33n-8n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6432s(2n**33n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6464s(-16n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6464s(-8n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => wait6464s(-7n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6464s(-6n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6464s(-5n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6464s(-4n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6464s(-3n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6464s(-2n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6464s(-1n), WebAssembly.RuntimeError, /unaligned/); + +assertEq(notify32s(65532), 0); +assertErrorMessage(() => notify32s(65533), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => notify32s(65536), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => notify32s(-8), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => notify32s(-4), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => notify32s(-3), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => notify32s(-2), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => notify32s(-1), WebAssembly.RuntimeError, /unaligned/); + +assertEq(notify64s(65532n), 0); +assertErrorMessage(() => notify64s(65533n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => notify64s(65536n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => notify64s(-8n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => notify64s(-4n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => notify64s(-3n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => notify64s(-2n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => notify64s(-1n), WebAssembly.RuntimeError, /unaligned/); + +// +// Non-shared memories +// + +assertErrorMessage(() => wait3232(65532), WebAssembly.RuntimeError, /non-shared/); +assertErrorMessage(() => wait3232(65533), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3232(65536), WebAssembly.RuntimeError, /non-shared/); +assertErrorMessage(() => wait3232(-4), WebAssembly.RuntimeError, /non-shared/); + +assertErrorMessage(() => wait3264(65528), WebAssembly.RuntimeError, /non-shared/); +assertErrorMessage(() => wait3264(65529), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait3264(65536), WebAssembly.RuntimeError, /non-shared/); +assertErrorMessage(() => wait3264(-8), WebAssembly.RuntimeError, /non-shared/); + +assertErrorMessage(() => wait6432(65532n), WebAssembly.RuntimeError, /non-shared/); +assertErrorMessage(() => wait6432(65533n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6432(65536n), WebAssembly.RuntimeError, /non-shared/); +assertErrorMessage(() => wait6432(-4n), WebAssembly.RuntimeError, /non-shared/); + +assertErrorMessage(() => wait6464(65528n), WebAssembly.RuntimeError, /non-shared/); +assertErrorMessage(() => wait6464(65529n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => wait6464(65536n), WebAssembly.RuntimeError, /non-shared/); +assertErrorMessage(() => wait6464(-8n), WebAssembly.RuntimeError, /non-shared/); + +assertEq(notify32(65532), 0); +assertErrorMessage(() => notify32(65533), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => notify32(65536), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => notify32(-4), WebAssembly.RuntimeError, /index out of bounds/); + +assertEq(notify64(65532n), 0); +assertErrorMessage(() => notify64(65533n), WebAssembly.RuntimeError, /unaligned/); +assertErrorMessage(() => notify64(65536n), WebAssembly.RuntimeError, /index out of bounds/); +assertErrorMessage(() => notify64(-4n), WebAssembly.RuntimeError, /index out of bounds/); diff -Nru firefox-esr-140.9.1esr/js/src/jit-test/tests/wasm/gc/i31ref.js firefox-esr-140.10.0esr/js/src/jit-test/tests/wasm/gc/i31ref.js --- firefox-esr-140.9.1esr/js/src/jit-test/tests/wasm/gc/i31ref.js 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit-test/tests/wasm/gc/i31ref.js 2026-04-15 01:59:51.000000000 +0000 @@ -178,3 +178,26 @@ assertErrorMessage(() => i31GetU_null(), WebAssembly.RuntimeError, /dereferencing null pointer/); assertErrorMessage(() => i31GetS_null(), WebAssembly.RuntimeError, /dereferencing null pointer/); + +// Test i31.get_s and i31.get_u operations with some cornercases. +let { f } = new WebAssembly.Instance( + new WebAssembly.Module(wasmTextToBinary(` +(module + (func (export "f") (param i32) (result i32) + (local i31ref) + local.get 0 + ref.i31 + local.tee 1 + i31.get_s + local.get 1 + i31.get_u + i32.eq + ) +)`))).exports; + +assertEq(f(-1), 0); +assertEq(f(-2), 0); +assertEq(f(-0x40000000), 0); +assertEq(f(0), 1); +assertEq(f(1), 1); +assertEq(f(0x3FFFFFFF), 1); diff -Nru firefox-esr-140.9.1esr/js/src/jit-test/tests/wasm/regress/bug2029735.js firefox-esr-140.10.0esr/js/src/jit-test/tests/wasm/regress/bug2029735.js --- firefox-esr-140.9.1esr/js/src/jit-test/tests/wasm/regress/bug2029735.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jit-test/tests/wasm/regress/bug2029735.js 2026-04-15 01:59:51.000000000 +0000 @@ -0,0 +1,11 @@ +var dummy = {abc: 1}; +// Non-Latin1 UTF-8 function name that hash-collides with the Latin1 "abc" atom. +// The unreachable trap exercises UTF8EqualsChars when building the error message. +var bytes = wasmTextToBinary('(module (func $"\\ee\\96\\95\\ea\\b5\\81\\04" (export "f") unreachable))'); +var ex = null; +try { + new WebAssembly.Instance(new WebAssembly.Module(bytes)).exports.f(); +} catch (e) { + ex = e; +} +assertEq(ex.stack.includes("\uE595\uAD41\x04@"), true); diff -Nru firefox-esr-140.9.1esr/js/src/jsfriendapi.cpp firefox-esr-140.10.0esr/js/src/jsfriendapi.cpp --- firefox-esr-140.9.1esr/js/src/jsfriendapi.cpp 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/jsfriendapi.cpp 2026-04-15 01:59:51.000000000 +0000 @@ -479,6 +479,10 @@ } } +bool JS::NativeObjectHasOwnProperties(const JSObject* obj) { + return !obj->as().empty(); +} + void js::SetPreserveWrapperCallbacks( JSContext* cx, PreserveWrapperCallback preserveWrapper, HasReleasedWrapperCallback hasReleasedWrapper) { diff -Nru firefox-esr-140.9.1esr/js/src/proxy/Proxy.cpp firefox-esr-140.10.0esr/js/src/proxy/Proxy.cpp --- firefox-esr-140.9.1esr/js/src/proxy/Proxy.cpp 2026-04-03 15:52:22.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/proxy/Proxy.cpp 2026-04-15 01:59:51.000000000 +0000 @@ -425,7 +425,9 @@ if (!ToPropertyKey(cx, idVal, &id)) { return false; } - + if (MOZ_UNLIKELY(!proxy->is())) { + return HasProperty(cx, proxy, id, result); + } return Proxy::has(cx, proxy, id, result); } @@ -466,7 +468,9 @@ if (!ToPropertyKey(cx, idVal, &id)) { return false; } - + if (MOZ_UNLIKELY(!proxy->is())) { + return HasOwnProperty(cx, proxy, id, result); + } return Proxy::hasOwn(cx, proxy, id, result); } @@ -548,6 +552,9 @@ } RootedValue receiver(cx, ObjectValue(*proxy)); + if (MOZ_UNLIKELY(!proxy->is())) { + return GetProperty(cx, proxy, receiver, id, vp); + } return Proxy::getInternal(cx, proxy, receiver, id, vp); } @@ -621,7 +628,11 @@ ObjectOpResult result; RootedValue receiver(cx, ObjectValue(*proxy)); - if (!Proxy::setInternal(cx, proxy, id, val, receiver, result)) { + if (MOZ_UNLIKELY(!proxy->is())) { + if (!SetProperty(cx, proxy, id, val, receiver, result)) { + return false; + } + } else if (!Proxy::setInternal(cx, proxy, id, val, receiver, result)) { return false; } return result.checkStrictModeError(cx, proxy, id, strict); diff -Nru firefox-esr-140.9.1esr/js/src/vm/ArgumentsObject.cpp firefox-esr-140.10.0esr/js/src/vm/ArgumentsObject.cpp --- firefox-esr-140.9.1esr/js/src/vm/ArgumentsObject.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/vm/ArgumentsObject.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -864,6 +864,12 @@ } } + // Ensure the arguments object has RareArgumentsData so that step 8 is + // infallible. + if (isMapped && !argsobj->getOrCreateRareData(cx)) { + return false; + } + // Step 6. NativeDefineProperty will lookup [[Value]] for us. if (defineMapped) { if (!DefineMappedIndex(cx, argsobj, id, &newArgDesc, result)) { @@ -884,17 +890,15 @@ if (isMapped) { unsigned arg = unsigned(id.toInt()); if (desc.isAccessorDescriptor()) { - if (!argsobj->markElementDeleted(cx, arg)) { - return false; - } + bool ok = argsobj->markElementDeleted(cx, arg); + MOZ_RELEASE_ASSERT(ok, "shouldn't fail after getOrCreateRareData"); } else { if (desc.hasValue()) { argsobj->setElement(arg, desc.value()); } if (desc.hasWritable() && !desc.writable()) { - if (!argsobj->markElementDeleted(cx, arg)) { - return false; - } + bool ok = argsobj->markElementDeleted(cx, arg); + MOZ_RELEASE_ASSERT(ok, "shouldn't fail after getOrCreateRareData"); } } } @@ -940,7 +944,7 @@ if (id.isInt()) { unsigned arg = unsigned(id.toInt()); - if (arg < argsobj->initialLength()) { + if (argsobj->isElement(arg)) { argsobj->setElement(arg, v); return result.succeed(); } diff -Nru firefox-esr-140.9.1esr/js/src/vm/AsyncFunction.cpp firefox-esr-140.10.0esr/js/src/vm/AsyncFunction.cpp --- firefox-esr-140.9.1esr/js/src/vm/AsyncFunction.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/vm/AsyncFunction.cpp 2026-04-15 01:59:53.000000000 +0000 @@ -316,9 +316,8 @@ cx, &func.getExtendedSlot(FunctionExtended::MODULE_SLOT) .toObject() .as()); - AsyncModuleExecutionRejected(cx, module, args.get(0)); args.rval().setUndefined(); - return true; + return AsyncModuleExecutionRejected(cx, module, args.get(0)); } AsyncFunctionGeneratorObject* AsyncFunctionGeneratorObject::create( diff -Nru firefox-esr-140.9.1esr/js/src/vm/CharacterEncoding.cpp firefox-esr-140.10.0esr/js/src/vm/CharacterEncoding.cpp --- firefox-esr-140.9.1esr/js/src/vm/CharacterEncoding.cpp 2026-04-03 15:52:24.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/vm/CharacterEncoding.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -536,21 +536,14 @@ template bool UTF8EqualsChars(const JS::UTF8Chars& utfChars, const CharT* chars) { + static_assert(std::is_same_v || + std::is_same_v); + size_t ind = 0; bool isEqual = true; auto checkEqual = [&isEqual, &ind, chars](char16_t c) -> LoopDisposition { -#ifdef DEBUG - JS::SmallestEncoding encoding = JS::SmallestEncoding::ASCII; - UpdateSmallestEncodingForChar(c, &encoding); - if (std::is_same_v) { - MOZ_ASSERT(encoding <= JS::SmallestEncoding::Latin1); - } else if (!std::is_same_v) { - MOZ_CRASH("Invalid character type in UTF8EqualsChars"); - } -#endif - - if (CharT(c) != chars[ind]) { + if (c != char16_t(chars[ind])) { isEqual = false; return LoopDisposition::Break; } @@ -559,7 +552,7 @@ return LoopDisposition::Continue; }; - // To get here, you must have checked your work. + // The caller must have already validated UTF-8 well-formedness. InflateUTF8ToUTF16(/* cx = */ nullptr, utfChars, checkEqual); diff -Nru firefox-esr-140.9.1esr/js/src/vm/EnvironmentObject.cpp firefox-esr-140.10.0esr/js/src/vm/EnvironmentObject.cpp --- firefox-esr-140.9.1esr/js/src/vm/EnvironmentObject.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/vm/EnvironmentObject.cpp 2026-04-15 01:59:53.000000000 +0000 @@ -3081,6 +3081,30 @@ onPopGeneric(cx, ei); } +void DebugEnvironments::onPopWasm(JSContext* cx, AbstractFramePtr frame) { + MOZ_ASSERT(frame.isWasmDebugFrame()); + + DebugEnvironments* envs = cx->realm()->debugEnvs(); + if (!envs) { + return; + } + + Rooted instance(cx, frame.wasmInstance()->object()); + uint32_t funcIndex = frame.asWasmDebugFrame()->funcIndex(); + Rooted wasmFunctionScope( + cx, instance->getExistingFunctionScope(funcIndex)); + if (!wasmFunctionScope) { + return; + } + + MissingEnvironmentKey key(frame, wasmFunctionScope); + if (MissingEnvironmentMap::Ptr p = envs->missingEnvs.lookup(key)) { + EnvironmentObject& env = p->value()->environment(); + envs->liveEnvs.remove(&env); + envs->missingEnvs.remove(p); + } +} + void DebugEnvironments::onRealmUnsetIsDebuggee(Realm* realm) { if (DebugEnvironments* envs = realm->debugEnvs()) { envs->proxiedEnvs.clear(); diff -Nru firefox-esr-140.9.1esr/js/src/vm/EnvironmentObject.h firefox-esr-140.10.0esr/js/src/vm/EnvironmentObject.h --- firefox-esr-140.9.1esr/js/src/vm/EnvironmentObject.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/vm/EnvironmentObject.h 2026-04-15 01:59:53.000000000 +0000 @@ -1518,6 +1518,7 @@ const jsbytecode* pc); static void onPopWith(AbstractFramePtr frame); static void onPopModule(JSContext* cx, const EnvironmentIter& ei); + static void onPopWasm(JSContext* cx, AbstractFramePtr frame); static void onRealmUnsetIsDebuggee(Realm* realm); }; diff -Nru firefox-esr-140.9.1esr/js/src/vm/MatchPairs.h firefox-esr-140.10.0esr/js/src/vm/MatchPairs.h --- firefox-esr-140.9.1esr/js/src/vm/MatchPairs.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/vm/MatchPairs.h 2026-04-15 01:59:54.000000000 +0000 @@ -72,7 +72,10 @@ friend class RegExpShared; friend class RegExpStatics; - void forgetArray() { pairs_ = nullptr; } + void forgetArray() { + pairs_ = nullptr; + pairCount_ = 0; + } public: void checkAgainst(size_t inputLength) { diff -Nru firefox-esr-140.9.1esr/js/src/vm/Modules.cpp firefox-esr-140.10.0esr/js/src/vm/Modules.cpp --- firefox-esr-140.9.1esr/js/src/vm/Modules.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/vm/Modules.cpp 2026-04-15 01:59:53.000000000 +0000 @@ -1973,7 +1973,9 @@ std::ignore = cx->getPendingException(&exception); } cx->clearPendingException(); - AsyncModuleExecutionRejected(cx, module, exception); + if (!AsyncModuleExecutionRejected(cx, module, exception)) { + MOZ_ASSERT(cx->isThrowingOverRecursed()); + } } // https://tc39.es/ecma262/#sec-async-module-execution-fulfilled @@ -2112,25 +2114,30 @@ // https://tc39.es/ecma262/#sec-async-module-execution-rejected // ES2023 16.2.1.5.2.5 AsyncModuleExecutionRejected -void js::AsyncModuleExecutionRejected(JSContext* cx, +bool js::AsyncModuleExecutionRejected(JSContext* cx, Handle module, HandleValue error) { + AutoCheckRecursionLimit recursion(cx); + if (!recursion.check(cx)) { + return false; + } + // Step 1. If module.[[Status]] is evaluated, then: if (module->status() == ModuleStatus::Evaluated) { // Step 1.a. Assert: module.[[EvaluationError]] is not empty MOZ_ASSERT(module->hadEvaluationError()); // Step 1.b. Return unused. - return; + return true; } // Step 2. Assert: module.[[Status]] is evaluating-async. MOZ_ASSERT(module->status() == ModuleStatus::EvaluatingAsync); - // Step 3. Assert: module.[[AsyncEvaluation]] is true. + // Step 3. Assert: module.[[AsyncEvaluationOrder]] is an integer. MOZ_ASSERT(module->isAsyncEvaluating()); - // Step 4. 4. Assert: module.[[EvaluationError]] is empty. + // Step 4. Assert: module.[[EvaluationError]] is empty. MOZ_ASSERT(!module->hadEvaluationError()); ModuleObject::onTopLevelEvaluationFinished(module); @@ -2141,25 +2148,15 @@ // Step 6. Set module.[[Status]] to evaluated. MOZ_ASSERT(module->status() == ModuleStatus::Evaluated); + // Step 7. Set module.[[AsyncEvaluationOrder]] to done. module->clearAsyncEvaluatingPostOrder(); - // Step 7. For each Cyclic Module Record m of module.[[AsyncParentModules]], - // do: - Rooted parents(cx, module->asyncParentModules()); - Rooted parent(cx); - for (uint32_t i = 0; i < parents->length(); i++) { - parent = &parents->get(i).toObject().as(); - - // Step 7.a. Perform AsyncModuleExecutionRejected(m, error). - AsyncModuleExecutionRejected(cx, parent, error); - } - - // Step 8. If module.[[TopLevelCapability]] is not empty, then: + // Step 9. If module.[[TopLevelCapability]] is not empty, then: if (module->hasTopLevelCapability()) { - // Step 8.a. Assert: module.[[CycleRoot]] is module. + // Step 9.a. Assert: module.[[CycleRoot]] is module. MOZ_ASSERT(module->getCycleRoot() == module); - // Step 8.b. Perform ! Call(module.[[TopLevelCapability]].[[Reject]], + // Step 9.b. Perform ! Call(module.[[TopLevelCapability]].[[Reject]], // undefined, error). if (!ModuleObject::topLevelCapabilityReject(cx, module, error)) { // If Reject fails, there's nothing more we can do here. @@ -2167,5 +2164,19 @@ } } - // Step 9. Return unused. + // Step 10. For each Cyclic Module Record m of module.[[AsyncParentModules]], + // do: + Rooted parents(cx, module->asyncParentModules()); + Rooted parent(cx); + for (uint32_t i = 0; i < parents->length(); i++) { + parent = &parents->get(i).toObject().as(); + + // Step 10.a. Perform AsyncModuleExecutionRejected(m, error). + if (!AsyncModuleExecutionRejected(cx, parent, error)) { + return false; + } + } + + // Step 11. Return unused. + return true; } diff -Nru firefox-esr-140.9.1esr/js/src/vm/Modules.h firefox-esr-140.10.0esr/js/src/vm/Modules.h --- firefox-esr-140.9.1esr/js/src/vm/Modules.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/vm/Modules.h 2026-04-15 01:59:53.000000000 +0000 @@ -49,7 +49,9 @@ void AsyncModuleExecutionFulfilled(JSContext* cx, Handle module); -void AsyncModuleExecutionRejected(JSContext* cx, Handle module, +// This function recusively calls AsyncModuleExecutionRejected on async parent +// modules. It returns false if the stack recusion limit is exceeded. +bool AsyncModuleExecutionRejected(JSContext* cx, Handle module, HandleValue error); } // namespace js diff -Nru firefox-esr-140.9.1esr/js/src/vm/RegExpStatics.h firefox-esr-140.10.0esr/js/src/vm/RegExpStatics.h --- firefox-esr-140.9.1esr/js/src/vm/RegExpStatics.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/vm/RegExpStatics.h 2026-04-15 01:59:53.000000000 +0000 @@ -248,6 +248,7 @@ if (!matches.initArrayFrom(newPairs)) { ReportOutOfMemory(cx); + clear(); return false; } diff -Nru firefox-esr-140.9.1esr/js/src/vm/StructuredClone.cpp firefox-esr-140.10.0esr/js/src/vm/StructuredClone.cpp --- firefox-esr-140.9.1esr/js/src/vm/StructuredClone.cpp 2026-04-03 15:52:24.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/vm/StructuredClone.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -2990,6 +2990,12 @@ if (!startRead(&isHuge)) { return false; } + if (!isHuge.isBoolean()) { + JS_ReportErrorNumberASCII(context(), GetErrorMessage, nullptr, + JSMSG_SC_BAD_SERIALIZED_DATA, + "isHuge must be a boolean"); + return false; + } // Read the SharedArrayBuffer object. RootedValue payload(cx); @@ -3808,7 +3814,13 @@ if (!startRead(&val)) { return nullptr; } - bool hasCause = ToBoolean(val); + if (!val.isBoolean()) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_SC_BAD_SERIALIZED_DATA, + "hasCause must be a boolean"); + return nullptr; + } + bool hasCause = val.toBoolean(); Rooted> cause(cx, mozilla::Nothing()); if (hasCause) { cause = mozilla::Some(BooleanValue(true)); @@ -3874,6 +3886,12 @@ } if (errorObj->type() == JSEXN_AGGREGATEERR) { + if (!errors.isObject() || !errors.toObject().is()) { + JS_ReportErrorNumberASCII( + cx, GetErrorMessage, nullptr, JSMSG_SC_BAD_SERIALIZED_DATA, + "AggregateError 'errors' field must be an Array"); + return false; + } if (!DefineDataProperty(context(), errorObj, cx->names().errors, errors, 0)) { return false; diff -Nru firefox-esr-140.9.1esr/js/src/wasm/WasmInstance.cpp firefox-esr-140.10.0esr/js/src/wasm/WasmInstance.cpp --- firefox-esr-140.9.1esr/js/src/wasm/WasmInstance.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/wasm/WasmInstance.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -393,18 +393,18 @@ PtrT byteOffset, ValT value, int64_t timeout_ns) { JSContext* cx = instance->cx(); - if (!instance->memory(memoryIndex)->isShared()) { - ReportTrapError(cx, JSMSG_WASM_NONSHARED_WAIT); + if (byteOffset & (sizeof(ValT) - 1)) { + ReportTrapError(cx, JSMSG_WASM_UNALIGNED_ACCESS); return -1; } - if (byteOffset & (sizeof(ValT) - 1)) { - ReportTrapError(cx, JSMSG_WASM_UNALIGNED_ACCESS); + if (!instance->memory(memoryIndex)->isShared()) { + ReportTrapError(cx, JSMSG_WASM_NONSHARED_WAIT); return -1; } - if (byteOffset + sizeof(ValT) > - instance->memory(memoryIndex)->volatileMemoryLength()) { + size_t memSizeBytes = instance->memory(memoryIndex)->volatileMemoryLength(); + if (memSizeBytes < sizeof(ValT) || byteOffset > memSizeBytes - sizeof(ValT)) { ReportTrapError(cx, JSMSG_WASM_OUT_OF_BOUNDS); return -1; } @@ -468,16 +468,14 @@ uint32_t memoryIndex) { JSContext* cx = instance->cx(); - // The alignment guard is not in the wasm spec as of 2017-11-02, but is - // considered likely to appear, as 4-byte alignment is required for WAKE by - // the spec's validation algorithm. - if (byteOffset & 3) { ReportTrapError(cx, JSMSG_WASM_UNALIGNED_ACCESS); return -1; } - if (byteOffset >= instance->memory(memoryIndex)->volatileMemoryLength()) { + size_t memSizeBytes = instance->memory(memoryIndex)->volatileMemoryLength(); + if (memSizeBytes < sizeof(int32_t) || + byteOffset > memSizeBytes - sizeof(int32_t)) { ReportTrapError(cx, JSMSG_WASM_OUT_OF_BOUNDS); return -1; } diff -Nru firefox-esr-140.9.1esr/js/src/wasm/WasmJS.cpp firefox-esr-140.10.0esr/js/src/wasm/WasmJS.cpp --- firefox-esr-140.9.1esr/js/src/wasm/WasmJS.cpp 2026-04-03 15:52:24.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/wasm/WasmJS.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -2009,6 +2009,15 @@ return getReservedSlot(EXPORTS_OBJ_SLOT).toObject(); } +WasmFunctionScope* WasmInstanceObject::getExistingFunctionScope( + uint32_t funcIndex) const { + if (auto p = scopes().asWasmFunctionScopeMap().lookup(funcIndex)) { + return p->value(); + } + + return nullptr; +} + WasmInstanceObject::UnspecifiedScopeMap& WasmInstanceObject::scopes() const { return *(UnspecifiedScopeMap*)(getReservedSlot(SCOPES_SLOT).toPrivate()); } diff -Nru firefox-esr-140.9.1esr/js/src/wasm/WasmJS.h firefox-esr-140.10.0esr/js/src/wasm/WasmJS.h --- firefox-esr-140.9.1esr/js/src/wasm/WasmJS.h 2026-04-03 15:52:24.000000000 +0000 +++ firefox-esr-140.10.0esr/js/src/wasm/WasmJS.h 2026-04-15 01:59:54.000000000 +0000 @@ -223,6 +223,7 @@ wasm::Instance& instance() const; JSObject& exportsObj() const; + WasmFunctionScope* getExistingFunctionScope(uint32_t funcIndex) const; [[nodiscard]] static bool getExportedFunction( JSContext* cx, Handle instanceObj, diff -Nru firefox-esr-140.9.1esr/js/xpconnect/src/ExportHelpers.cpp firefox-esr-140.10.0esr/js/xpconnect/src/ExportHelpers.cpp --- firefox-esr-140.9.1esr/js/xpconnect/src/ExportHelpers.cpp 2026-04-03 15:52:24.000000000 +0000 +++ firefox-esr-140.10.0esr/js/xpconnect/src/ExportHelpers.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -402,7 +402,7 @@ FunctionForwarderOptions& options, MutableHandleValue vp) { RootedId id(cx, idArg); - if (id.isVoid()) { + if (!id.isString()) { id = GetJSIDByIndex(cx, XPCJSContext::IDX_EMPTYSTRING); } @@ -501,7 +501,7 @@ } } if (!funName) { - funName = JS_AtomizeAndPinString(cx, ""); + funName = JS_GetEmptyString(cx); } JS_MarkCrossZoneIdValue(cx, StringValue(funName)); @@ -511,7 +511,11 @@ } else { JS_MarkCrossZoneId(cx, id); } - MOZ_ASSERT(id.isString()); + + if (!id.isString()) { + JS_ReportErrorASCII(cx, "defineAs must be a string"); + return false; + } // The function forwarder will live in the target compartment. Since // this function will be referenced from its private slot, to avoid a diff -Nru firefox-esr-140.9.1esr/js/xpconnect/src/XPCJSRuntime.cpp firefox-esr-140.10.0esr/js/xpconnect/src/XPCJSRuntime.cpp --- firefox-esr-140.9.1esr/js/xpconnect/src/XPCJSRuntime.cpp 2026-04-03 15:52:24.000000000 +0000 +++ firefox-esr-140.10.0esr/js/xpconnect/src/XPCJSRuntime.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -956,6 +956,8 @@ self->mWrappedJSMap->UpdateWeakPointersAfterGC(trc); self->mUAWidgetScopeMap.traceWeak(trc); + + BrowsingContext::SweepWindowProxies(trc); } /* static */ diff -Nru firefox-esr-140.9.1esr/layout/base/PresShell.cpp firefox-esr-140.10.0esr/layout/base/PresShell.cpp --- firefox-esr-140.9.1esr/layout/base/PresShell.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/base/PresShell.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -5167,6 +5167,9 @@ // XXX deal with frame being null due to display:contents for (; frame; frame = nsLayoutUtils::GetNextContinuationOrIBSplitSibling(frame)) { + if (frame->HasAnyStateBits(NS_FRAME_IS_NONDISPLAY)) { + continue; + } info->mBuilder.SetVisibleRect(frame->InkOverflowRect()); info->mBuilder.SetDirtyRect(frame->InkOverflowRect()); frame->BuildDisplayListForStackingContext(&info->mBuilder, &info->mList); @@ -7864,17 +7867,13 @@ switch (aGUIEvent->mMessage) { case eMouseDown: - case eMouseUp: { - RefPtr presContext = mPresShell->GetPresContext(); - if (NS_WARN_IF(!presContext)) { + case eMouseUp: // XXX How about eContextMenu? + { + if (NS_WARN_IF(!mPresShell->GetPresContext())) { return false; } - uint64_t framesConstructedCount = presContext->FramesConstructedCount(); - uint64_t framesReflowedCount = presContext->FramesReflowedCount(); - MOZ_KnownLive(mPresShell)->FlushPendingNotifications(FlushType::Layout); - return framesConstructedCount != presContext->FramesConstructedCount() || - framesReflowedCount != presContext->FramesReflowedCount(); + return true; } default: return false; @@ -7944,18 +7943,19 @@ // If target is in a child document, we've not flushed its layout yet. PresShell* childPresShell = targetFrame->PresShell(); EventHandler childEventHandler(*childPresShell); - bool layoutChanged = + const AutoWeakFrame targetFrameWeak(targetFrame); + const DebugOnly flushedPendingNotifications = childEventHandler.MaybeFlushPendingNotifications(aGUIEvent); if (!aWeakRootFrameToHandleEvent.IsAlive()) { // Stop handling the event if the root frame to handle event is destroyed // by the reflow. (but why?) return nullptr; } - if (!layoutChanged) { - // If the layout in the child PresShell hasn't been changed, we don't - // need to recompute the target. + if (targetFrameWeak.IsAlive()) { + // If the target frame is alive, we don't need to recompute the target. return targetFrame; } + MOZ_ASSERT(flushedPendingNotifications); // Finally, we need to recompute the target with the latest layout. targetFrame = diff -Nru firefox-esr-140.9.1esr/layout/base/PresShell.h firefox-esr-140.10.0esr/layout/base/PresShell.h --- firefox-esr-140.9.1esr/layout/base/PresShell.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/base/PresShell.h 2026-04-15 01:59:54.000000000 +0000 @@ -2331,11 +2331,10 @@ * * @param aGUIEvent The handling event. * @return true if this actually flushes pending - * layout and that has caused changing the * layout. */ - MOZ_CAN_RUN_SCRIPT - bool MaybeFlushPendingNotifications(WidgetGUIEvent* aGUIEvent); + MOZ_CAN_RUN_SCRIPT bool MaybeFlushPendingNotifications( + WidgetGUIEvent* aGUIEvent); /** * GetFrameToHandleNonTouchEvent() returns a frame to handle the event. diff -Nru firefox-esr-140.9.1esr/layout/base/tests/mochitest.toml firefox-esr-140.10.0esr/layout/base/tests/mochitest.toml --- firefox-esr-140.9.1esr/layout/base/tests/mochitest.toml 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/base/tests/mochitest.toml 2026-04-15 01:59:54.000000000 +0000 @@ -273,8 +273,6 @@ "file_getBoxQuads_convertPointRectQuad_frame2.html", ] -["test_getClientRects_emptytext.html"] - ["test_interactive_widget.html"] run-if = ["os == 'android'"] diff -Nru firefox-esr-140.9.1esr/layout/base/tests/test_getClientRects_emptytext.html firefox-esr-140.10.0esr/layout/base/tests/test_getClientRects_emptytext.html --- firefox-esr-140.9.1esr/layout/base/tests/test_getClientRects_emptytext.html 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/base/tests/test_getClientRects_emptytext.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ - - - - - - - - - -

- -
- - - diff -Nru firefox-esr-140.9.1esr/layout/forms/nsRangeFrame.cpp firefox-esr-140.10.0esr/layout/forms/nsRangeFrame.cpp --- firefox-esr-140.9.1esr/layout/forms/nsRangeFrame.cpp 2026-04-03 15:52:24.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/forms/nsRangeFrame.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -429,13 +429,9 @@ } auto min = input.GetMinimum(); auto max = input.GetMaximum(); - auto* options = list->Options(); - nsAutoString label; - for (uint32_t i = 0; i < options->Length(); ++i) { - auto* item = options->Item(i); - auto* option = HTMLOptionElement::FromNode(item); - MOZ_ASSERT(option); - if (option->Disabled()) { + for (nsINode* n = list->GetFirstChild(); n; n = n->GetNextNode(list)) { + auto* option = HTMLOptionElement::FromNode(n); + if (!option || option->Disabled()) { continue; } nsAutoString str; diff -Nru firefox-esr-140.9.1esr/layout/forms/nsTextControlFrame.cpp firefox-esr-140.10.0esr/layout/forms/nsTextControlFrame.cpp --- firefox-esr-140.9.1esr/layout/forms/nsTextControlFrame.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/forms/nsTextControlFrame.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -754,7 +754,7 @@ return; } - mozilla::PresShell* presShell = PresShell(); + RefPtr presShell = PresShell(); RefPtr caret = presShell->GetCaret(); if (!caret) { return; @@ -776,6 +776,9 @@ if (!docSel->IsCollapsed()) { docSel->RemoveAllRanges(IgnoreErrors()); } + if (presShell->IsDestroying()) { + return; + } // If the focus moved to a text control during text selection by pointer // device, stop extending the selection. diff -Nru firefox-esr-140.9.1esr/layout/generic/ScrollbarActivity.cpp firefox-esr-140.10.0esr/layout/generic/ScrollbarActivity.cpp --- firefox-esr-140.9.1esr/layout/generic/ScrollbarActivity.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/generic/ScrollbarActivity.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -37,6 +37,7 @@ } void ScrollbarActivity::ActivityOccurred() { + nsAutoScriptBlocker scriptBlocker; ActivityStarted(); ActivityStopped(); } diff -Nru firefox-esr-140.9.1esr/layout/generic/nsFrameSelection.cpp firefox-esr-140.10.0esr/layout/generic/nsFrameSelection.cpp --- firefox-esr-140.9.1esr/layout/generic/nsFrameSelection.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/generic/nsFrameSelection.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -1487,7 +1487,7 @@ } case FocusMode::kExtendSelection: { // Now update the range list: - nsINode* inclusiveTableCellAncestor = + nsCOMPtr inclusiveTableCellAncestor = GetClosestInclusiveTableCellAncestor(&aNewFocus); if (mTableSelection.mClosestInclusiveTableCellAncestor && inclusiveTableCellAncestor && @@ -1641,8 +1641,7 @@ } } -void nsFrameSelection::RepaintHighlightSelection( - nsAtom* aHighlightName) { +void nsFrameSelection::RepaintHighlightSelection(nsAtom* aHighlightName) { if (auto iter = std::find_if(mHighlightSelections.begin(), mHighlightSelections.end(), [&aHighlightName](auto const& aElm) { @@ -1817,76 +1816,84 @@ SelectionIntoView aSelectionIntoView) { MOZ_ASSERT(aFrame); - // expected behavior for PageMove is to scroll AND move the caret - // and remain relative position of the caret in view. see Bug 4302. - - // Get the scroll container frame. If aFrame is not scrollable, this is - // nullptr. - ScrollContainerFrame* scrollContainerFrame = aFrame->GetScrollTargetFrame(); - // Get the scrolled frame. If aFrame is not scrollable, this is aFrame - // itself. - nsIFrame* scrolledFrame = - scrollContainerFrame ? scrollContainerFrame->GetScrolledFrame() : aFrame; - if (!scrolledFrame) { + if (MOZ_UNLIKELY(!IsAvailable())) { return NS_OK; } + // expected behavior for PageMove is to scroll AND move the caret + // and remain relative position of the caret in view. see Bug 4302. + // find out where the caret is. // we should know mDesiredCaretPos.mValue value of nsFrameSelection, but I - // havent seen that behavior in other windows applications yet. - RefPtr selection = &NormalSelection(); - if (!selection) { - return NS_OK; - } + // haven't seen that behavior in other windows applications yet. + MOZ_DIAGNOSTIC_ASSERT(GetSelection(mozilla::SelectionType::eNormal)); + const OwningNonNull selection = NormalSelection(); - nsRect caretPos; - nsIFrame* caretFrame = nsCaret::GetGeometry(selection, &caretPos); - if (!caretFrame) { - return NS_OK; - } + // Get the scroll container frame. If aFrame is not scrollable, this is + // nullptr. + ScrollContainerFrame* scrollContainerFrame = aFrame->GetScrollTargetFrame(); + const AutoWeakFrame scrollContainerFrameWeak(scrollContainerFrame); - // If the scrolled frame is outside of current selection limiter, - // we need to scroll the frame but keep moving selection in the limiter. - nsIFrame* frameToClick = scrolledFrame; - if (!NodeIsInLimiters(scrolledFrame->GetContent())) { - frameToClick = GetFrameToPageSelect(); - if (NS_WARN_IF(!frameToClick)) { - return NS_OK; + bool scrolledFrameIsInLimiter = true; + const auto offsets = [&]() + MOZ_NEVER_INLINE_DEBUG -> nsIFrame::ContentOffsets { + // Get the scrolled frame. If aFrame is not scrollable, this is aFrame + // itself. + nsIFrame* scrolledFrame = scrollContainerFrame + ? scrollContainerFrame->GetScrolledFrame() + : aFrame; + if (MOZ_UNLIKELY(!scrolledFrame)) { + return {}; + } + + nsRect caretPos; + nsIFrame* caretFrame = nsCaret::GetGeometry(selection, &caretPos); + if (MOZ_UNLIKELY(!caretFrame)) { + return {}; + } + + // If the scrolled frame is outside of current selection limiter, + // we need to scroll the frame but keep moving selection in the limiter. + nsIFrame* frameToClick = scrolledFrame; + if (!NodeIsInLimiters(scrolledFrame->GetContent())) { + frameToClick = GetFrameToPageSelect(); + scrolledFrameIsInLimiter = scrolledFrame == frameToClick; + if (NS_WARN_IF(!frameToClick)) { + return {}; + } } - } - if (scrollContainerFrame) { - // If there is a scrollable frame, adjust pseudo-click position with page - // scroll amount. - // XXX This may scroll more than one page if ScrollSelectionIntoView is - // called later because caret may not fully visible. E.g., if - // clicking line will be visible only half height with scrolling - // the frame, ScrollSelectionIntoView additionally scrolls to show - // the caret entirely. - if (aForward) { - caretPos.y += scrollContainerFrame->GetPageScrollAmount().height; - } else { - caretPos.y -= scrollContainerFrame->GetPageScrollAmount().height; - } - } else { - // Otherwise, adjust pseudo-click position with the frame size. - if (aForward) { - caretPos.y += frameToClick->GetSize().height; + if (scrollContainerFrame) { + // If there is a scrollable frame, adjust pseudo-click position with page + // scroll amount. + // XXX This may scroll more than one page if ScrollSelectionIntoView is + // called later because caret may not fully visible. E.g., if + // clicking line will be visible only half height with scrolling + // the frame, ScrollSelectionIntoView additionally scrolls to show + // the caret entirely. + if (aForward) { + caretPos.y += scrollContainerFrame->GetPageScrollAmount().height; + } else { + caretPos.y -= scrollContainerFrame->GetPageScrollAmount().height; + } } else { - caretPos.y -= frameToClick->GetSize().height; + // Otherwise, adjust pseudo-click position with the frame size. + if (aForward) { + caretPos.y += frameToClick->GetSize().height; + } else { + caretPos.y -= frameToClick->GetSize().height; + } } - } - - caretPos += caretFrame->GetOffsetTo(frameToClick); - // get a content at desired location - nsPoint desiredPoint; - desiredPoint.x = caretPos.x; - desiredPoint.y = caretPos.y + caretPos.height / 2; - nsIFrame::ContentOffsets offsets = - frameToClick->GetContentOffsetsFromPoint(desiredPoint); + caretPos += caretFrame->GetOffsetTo(frameToClick); - if (!offsets.content) { + // get a content at desired location + nsPoint desiredPoint; + desiredPoint.x = caretPos.x; + desiredPoint.y = caretPos.y + caretPos.height / 2; + return frameToClick->GetContentOffsetsFromPoint(desiredPoint); + }(); + if (MOZ_UNLIKELY(!offsets.content)) { // XXX Do we need to handle ScrollSelectionIntoView in this case? return NS_OK; } @@ -1896,7 +1903,7 @@ { // We don't want any script to run until we check whether selection is // modified by HandleClick. - SelectionBatcher ensureNoSelectionChangeNotifications(selection, + SelectionBatcher ensureNoSelectionChangeNotifications(selection.ref(), __FUNCTION__); RangeBoundary oldAnchor = selection->AnchorRef(); @@ -1916,7 +1923,7 @@ aSelectionIntoView == SelectionIntoView::IfChanged && !selectionChanged); // Then, scroll the given frame one page. - if (scrollContainerFrame) { + if (scrollContainerFrameWeak.IsAlive()) { // If we'll call ScrollSelectionIntoView later and selection wasn't // changed and we scroll outside of selection limiter, we shouldn't use // smooth scroll here because ScrollContainerFrame uses normal runnable, @@ -1925,9 +1932,10 @@ // case, ScrollSelectionIntoView would scroll to show caret instead of // page scroll of an element outside selection limiter. ScrollMode scrollMode = doScrollSelectionIntoView && !selectionChanged && - scrolledFrame != frameToClick + !scrolledFrameIsInLimiter ? ScrollMode::Instant : ScrollMode::Smooth; + MOZ_ASSERT(scrollContainerFrameWeak.GetFrame() == scrollContainerFrame); scrollContainerFrame->ScrollBy(nsIntPoint(0, aForward ? 1 : -1), ScrollUnit::PAGES, scrollMode); } diff -Nru firefox-esr-140.9.1esr/layout/generic/nsFrameSelection.h firefox-esr-140.10.0esr/layout/generic/nsFrameSelection.h --- firefox-esr-140.9.1esr/layout/generic/nsFrameSelection.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/generic/nsFrameSelection.h 2026-04-15 01:59:54.000000000 +0000 @@ -279,6 +279,13 @@ CaretAssociationHint aHint); public: + [[nodiscard]] bool IsAvailable() const { + // mDomSelections is initialized at construction and cleared if the cycle + // collector unlink them so that if the first selection is available, the + // others should be fine. + return !!mDomSelections[0]; + } + /** * Sets the type of the selection based on whether a selection is created * by doubleclick, long tapping a word or tripleclick. diff -Nru firefox-esr-140.9.1esr/layout/generic/nsIFrame.cpp firefox-esr-140.10.0esr/layout/generic/nsIFrame.cpp --- firefox-esr-140.9.1esr/layout/generic/nsIFrame.cpp 2026-04-03 15:52:24.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/generic/nsIFrame.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -1324,12 +1324,7 @@ } if (handleStickyChange && !HasAnyStateBits(NS_FRAME_IS_NONDISPLAY) && - !GetPrevInFlow()) { - // Note that we only add first continuations, but we really only - // want to add first continuation-or-ib-split-siblings. But since we don't - // yet know if we're a later part of a block-in-inline split, we'll just - // add later members of a block-in-inline split here, and then - // StickyScrollContainer will remove them later. + nsLayoutUtils::IsFirstContinuationOrIBSplitSibling(this)) { if (auto* ssc = StickyScrollContainer::GetStickyScrollContainerForFrame(this)) { if (disp->mPosition == StylePositionProperty::Sticky) { @@ -3179,7 +3174,8 @@ return; } - if (HasAnyStateBits(NS_FRAME_TOO_DEEP_IN_FRAME_TREE)) { + if (HasAnyStateBits(NS_FRAME_TOO_DEEP_IN_FRAME_TREE | + NS_FRAME_IS_NONDISPLAY)) { return; } diff -Nru firefox-esr-140.9.1esr/layout/printing/ipc/RemotePrintJobParent.cpp firefox-esr-140.10.0esr/layout/printing/ipc/RemotePrintJobParent.cpp --- firefox-esr-140.9.1esr/layout/printing/ipc/RemotePrintJobParent.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/printing/ipc/RemotePrintJobParent.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -26,15 +26,18 @@ namespace mozilla::layout { RemotePrintJobParent::RemotePrintJobParent(nsIPrintSettings* aPrintSettings) - : mPrintSettings(aPrintSettings), - mIsDoingPrinting(false), - mStatus(NS_ERROR_UNEXPECTED) { + : mPrintSettings(aPrintSettings), mStatus(NS_ERROR_UNEXPECTED) { MOZ_COUNT_CTOR(RemotePrintJobParent); } mozilla::ipc::IPCResult RemotePrintJobParent::RecvInitializePrint( const nsAString& aDocumentTitle, const int32_t& aStartPage, const int32_t& aEndPage) { + if (mInitializeReceived) { + MOZ_ASSERT_UNREACHABLE("Unexpected redundant call to RecvInitializePrint"); + return IPC_FAIL(this, "Unexpected redundant call to RecvInitializePrint"); + } + mInitializeReceived = true; PROFILER_MARKER_TEXT("RemotePrintJobParent", LAYOUT_Printing, {}, "RemotePrintJobParent::RecvInitializePrint"_ns); diff -Nru firefox-esr-140.9.1esr/layout/printing/ipc/RemotePrintJobParent.h firefox-esr-140.10.0esr/layout/printing/ipc/RemotePrintJobParent.h --- firefox-esr-140.9.1esr/layout/printing/ipc/RemotePrintJobParent.h 2026-04-03 15:52:24.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/printing/ipc/RemotePrintJobParent.h 2026-04-15 01:59:54.000000000 +0000 @@ -92,8 +92,10 @@ UniquePtr mPrintTranslator; nsCOMArray mPrintProgressListeners; PRFileDescStream mCurrentPageStream; - bool mIsDoingPrinting; nsresult mStatus; + bool mIsDoingPrinting = false; + bool mInitializeReceived = + false; // True after RecvInitializePrint is called. }; } // namespace layout diff -Nru firefox-esr-140.9.1esr/layout/style/FontFaceSet.cpp firefox-esr-140.10.0esr/layout/style/FontFaceSet.cpp --- firefox-esr-140.9.1esr/layout/style/FontFaceSet.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/style/FontFaceSet.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -394,18 +394,18 @@ // refcounting. (Also, the Promise object creation must be done on // the main thread.) set->AppendTask( - PostTraversalTask::DispatchLoadingEventAndReplaceReadyPromise(this)); + PostTraversalTask::DispatchLoadingEventAndReplaceReadyPromise( + do_AddRef(mImpl))); return; } (new AsyncEventDispatcher(this, u"loading"_ns, CanBubble::eNo)) ->PostDOMEvent(); - if (mReady && mReady->State() != Promise::PromiseState::Pending) { - if (GetParentObject()) { - ErrorResult rv; - mReady = Promise::Create(GetParentObject(), rv); - } + if (mReady && mReady->State() != Promise::PromiseState::Pending && + GetParentObject()) { + IgnoredErrorResult rv; + mReady = Promise::Create(GetParentObject(), rv); } // We may previously have been in a state where all fonts had finished diff -Nru firefox-esr-140.9.1esr/layout/style/FontFaceSetDocumentImpl.cpp firefox-esr-140.10.0esr/layout/style/FontFaceSetDocumentImpl.cpp --- firefox-esr-140.9.1esr/layout/style/FontFaceSetDocumentImpl.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/style/FontFaceSetDocumentImpl.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -469,8 +469,8 @@ RefPtr f = record.mFontFace; if (gfxUserFontEntry* userFontEntry = f->GetUserFontEntry()) { if (nsFontFaceLoader* loader = userFontEntry->GetLoader()) { + // Cancel() removes the loader from its registering set's mLoaders. loader->Cancel(); - RemoveLoader(loader); } } diff -Nru firefox-esr-140.9.1esr/layout/style/FontFaceSetImpl.cpp firefox-esr-140.10.0esr/layout/style/FontFaceSetImpl.cpp --- firefox-esr-140.9.1esr/layout/style/FontFaceSetImpl.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/style/FontFaceSetImpl.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -93,10 +93,12 @@ return; } if (NS_IsMainThread()) { - for (const auto& key : mLoaders.Keys()) { + // Move mLoaders to a local, because Cancel() calls RemoveLoader() which + // would otherwise mutate the table during the iteration. + auto loaders = std::move(mLoaders); + for (const auto& key : loaders.Keys()) { key->Cancel(); } - mLoaders.Clear(); return; } @@ -800,7 +802,7 @@ [self = RefPtr{this}]() { self->OnLoadingStarted(); }); } -void FontFaceSetImpl::OnLoadingStarted() { +void FontFaceSetImpl::DispatchLoadingEventAndReplaceReadyPromise() { RecursiveMutexAutoLock lock(mMutex); if (mOwner) { mOwner->DispatchLoadingEventAndReplaceReadyPromise(); diff -Nru firefox-esr-140.9.1esr/layout/style/FontFaceSetImpl.h firefox-esr-140.10.0esr/layout/style/FontFaceSetImpl.h --- firefox-esr-140.9.1esr/layout/style/FontFaceSetImpl.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/style/FontFaceSetImpl.h 2026-04-15 01:59:54.000000000 +0000 @@ -171,6 +171,7 @@ ErrorResult& aRv); virtual void DispatchCheckLoadingFinishedAfterDelay(); + void DispatchLoadingEventAndReplaceReadyPromise(); protected: ~FontFaceSetImpl() override; @@ -200,7 +201,9 @@ */ void CheckLoadingFinishedAfterDelay(); - void OnLoadingStarted(); + void OnLoadingStarted() { + DispatchLoadingEventAndReplaceReadyPromise(); + } void OnLoadingFinished(); // Note: if you add new cycle collected objects to FontFaceRecord, diff -Nru firefox-esr-140.9.1esr/layout/style/PostTraversalTask.cpp firefox-esr-140.10.0esr/layout/style/PostTraversalTask.cpp --- firefox-esr-140.9.1esr/layout/style/PostTraversalTask.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/style/PostTraversalTask.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -18,26 +18,28 @@ using namespace dom; -void PostTraversalTask::Run() { +PostTraversalTask::~PostTraversalTask() { + if (!mTarget) { + return; + } switch (mType) { case Type::DispatchLoadingEventAndReplaceReadyPromise: - static_cast(mTarget) - ->DispatchLoadingEventAndReplaceReadyPromise(); + static_cast(mTarget)->Release(); break; - case Type::LoadFontEntry: - static_cast(mTarget)->ContinueLoad(); + static_cast(mTarget)->Release(); break; + } +} - case Type::InitializeFamily: - Unused << gfxPlatformFontList::PlatformFontList()->InitializeFamily( - static_cast(mTarget)); +void PostTraversalTask::Run() { + switch (mType) { + case Type::DispatchLoadingEventAndReplaceReadyPromise: + static_cast(mTarget) + ->DispatchLoadingEventAndReplaceReadyPromise(); break; - - case Type::FontInfoUpdate: - if (auto* pc = static_cast(mTarget)->GetPresContext()) { - pc->ForceReflowForFontInfoUpdateFromStyle(); - } + case Type::LoadFontEntry: + static_cast(mTarget)->ContinueLoad(); break; } } diff -Nru firefox-esr-140.9.1esr/layout/style/PostTraversalTask.h firefox-esr-140.10.0esr/layout/style/PostTraversalTask.h --- firefox-esr-140.9.1esr/layout/style/PostTraversalTask.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/style/PostTraversalTask.h 2026-04-15 01:59:55.000000000 +0000 @@ -7,7 +7,7 @@ #ifndef mozilla_PostTraversalTask_h #define mozilla_PostTraversalTask_h -#include "nscore.h" +#include "mozilla/AlreadyAddRefed.h" /* a task to be performed immediately after a Servo traversal */ @@ -36,54 +36,44 @@ class PostTraversalTask { public: static PostTraversalTask DispatchLoadingEventAndReplaceReadyPromise( - dom::FontFaceSet* aFontFaceSet) { - auto task = - PostTraversalTask(Type::DispatchLoadingEventAndReplaceReadyPromise); - task.mTarget = aFontFaceSet; + already_AddRefed aFontFaceSetImpl) { + PostTraversalTask task(Type::DispatchLoadingEventAndReplaceReadyPromise); + task.mTarget = aFontFaceSetImpl.take(); return task; } - static PostTraversalTask LoadFontEntry(gfxUserFontEntry* aFontEntry) { - auto task = PostTraversalTask(Type::LoadFontEntry); - task.mTarget = aFontEntry; + static PostTraversalTask LoadFontEntry( + already_AddRefed aFontEntry) { + PostTraversalTask task(Type::LoadFontEntry); + task.mTarget = aFontEntry.take(); return task; } - static PostTraversalTask InitializeFamily(fontlist::Family* aFamily) { - auto task = PostTraversalTask(Type::InitializeFamily); - task.mTarget = aFamily; - return task; - } + void Run(); - static PostTraversalTask FontInfoUpdate(ServoStyleSet* aSet) { - auto task = PostTraversalTask(Type::FontInfoUpdate); - task.mTarget = aSet; - return task; - } + PostTraversalTask(const PostTraversalTask&) = delete; + PostTraversalTask(PostTraversalTask&& aOther) + : PostTraversalTask(aOther.mType) { + mTarget = aOther.mTarget; + aOther.mTarget = nullptr; + }; - void Run(); + ~PostTraversalTask(); private: - // For any new raw pointer type that we need to store in a PostTraversalTask, - // please add an assertion that class' destructor that we are not in a Servo - // traversal, to protect against the possibility of having dangling pointers. enum class Type { - // mTarget (FontFaceSet*) + // mTarget (FontFaceSetImpl*) DispatchLoadingEventAndReplaceReadyPromise, // mTarget (gfxUserFontEntry*) LoadFontEntry, - - // mTarget (fontlist::Family*) - InitializeFamily, - - // mTarget (ServoStyleSet*) - FontInfoUpdate, }; - explicit PostTraversalTask(Type aType) : mType(aType), mTarget(nullptr) {} + explicit PostTraversalTask(Type aType) + : mType(aType), mTarget(nullptr) {} const Type mType; + // Note that this is a strong reference of the relevant target void* mTarget = nullptr; }; diff -Nru firefox-esr-140.9.1esr/layout/style/ServoStyleSet.cpp firefox-esr-140.10.0esr/layout/style/ServoStyleSet.cpp --- firefox-esr-140.9.1esr/layout/style/ServoStyleSet.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/style/ServoStyleSet.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -7,6 +7,7 @@ #include "mozilla/ServoStyleSet.h" #include "mozilla/ServoStyleSetInlines.h" +#include "COLRFonts.h" #include "mozilla/DocumentStyleRootIterator.h" #include "mozilla/AttributeStyles.h" #include "mozilla/EffectCompositor.h" diff -Nru firefox-esr-140.9.1esr/layout/style/ServoStyleSet.h firefox-esr-140.10.0esr/layout/style/ServoStyleSet.h --- firefox-esr-140.9.1esr/layout/style/ServoStyleSet.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/style/ServoStyleSet.h 2026-04-15 01:59:55.000000000 +0000 @@ -425,7 +425,7 @@ // synchronization measures. AssertIsMainThreadOrServoFontMetricsLocked(); - mPostTraversalTasks.AppendElement(aTask); + mPostTraversalTasks.AppendElement(std::move(aTask)); } // Returns true if a restyle of the document is needed due to cloning diff -Nru firefox-esr-140.9.1esr/layout/style/nsFontFaceLoader.cpp firefox-esr-140.10.0esr/layout/style/nsFontFaceLoader.cpp --- firefox-esr-140.9.1esr/layout/style/nsFontFaceLoader.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/style/nsFontFaceLoader.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -350,6 +350,9 @@ if (doc) { doc->UnblockOnload(false); } + // Remove ourselves from the set that registered us, so it never holds a + // dangling raw pointer to us after we're freed. + mFontFaceSet->RemoveLoader(this); mFontFaceSet = nullptr; if (mLoadTimer) { mLoadTimer->Cancel(); diff -Nru firefox-esr-140.9.1esr/layout/svg/CSSFilterInstance.cpp firefox-esr-140.10.0esr/layout/svg/CSSFilterInstance.cpp --- firefox-esr-140.9.1esr/layout/svg/CSSFilterInstance.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/svg/CSSFilterInstance.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -127,15 +127,15 @@ ComponentTransferAttributes atts; // Set transfer functions for RGB. - atts.mTypes[kChannelROrRGB] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_LINEAR; - atts.mTypes[kChannelG] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; - atts.mTypes[kChannelB] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; + atts.mTypes[kChannelROrRGB] = SVGFEComponentTransferType::Linear; + atts.mTypes[kChannelG] = SVGFEComponentTransferType::SameAsR; + atts.mTypes[kChannelB] = SVGFEComponentTransferType::SameAsR; std::array slopeIntercept; slopeIntercept[kComponentTransferSlopeIndex] = value; slopeIntercept[kComponentTransferInterceptIndex] = intercept; atts.mValues[kChannelROrRGB].AppendElements(Span(slopeIntercept)); - atts.mTypes[kChannelA] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + atts.mTypes[kChannelA] = SVGFEComponentTransferType::Identity; aDescr.Attributes() = AsVariant(std::move(atts)); return NS_OK; @@ -148,15 +148,15 @@ ComponentTransferAttributes atts; // Set transfer functions for RGB. - atts.mTypes[kChannelROrRGB] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_LINEAR; - atts.mTypes[kChannelG] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; - atts.mTypes[kChannelB] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; + atts.mTypes[kChannelROrRGB] = SVGFEComponentTransferType::Linear; + atts.mTypes[kChannelG] = SVGFEComponentTransferType::SameAsR; + atts.mTypes[kChannelB] = SVGFEComponentTransferType::SameAsR; std::array slopeIntercept; slopeIntercept[kComponentTransferSlopeIndex] = value; slopeIntercept[kComponentTransferInterceptIndex] = intercept; atts.mValues[kChannelROrRGB].AppendElements(Span(slopeIntercept)); - atts.mTypes[kChannelA] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + atts.mTypes[kChannelA] = SVGFEComponentTransferType::Identity; aDescr.Attributes() = AsVariant(std::move(atts)); return NS_OK; @@ -189,7 +189,7 @@ FilterPrimitiveDescription& aDescr) { ColorMatrixAttributes atts; // Set color matrix type. - atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_SATURATE; + atts.mType = SVGFEColorMatrixType::Saturate; // Set color matrix value. atts.mValues.AppendElement(1 - ClampFactor(mFilter.AsGrayscale())); @@ -202,7 +202,7 @@ FilterPrimitiveDescription& aDescr) { ColorMatrixAttributes atts; // Set color matrix type. - atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_HUE_ROTATE; + atts.mType = SVGFEColorMatrixType::HueRotate; // Set color matrix value. atts.mValues.AppendElement(mFilter.AsHueRotate().ToDegrees()); @@ -220,12 +220,12 @@ std::array invertTableValues = {value, 1 - value}; // Set transfer functions for RGB. - atts.mTypes[kChannelROrRGB] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_TABLE; - atts.mTypes[kChannelG] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; - atts.mTypes[kChannelB] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; + atts.mTypes[kChannelROrRGB] = SVGFEComponentTransferType::Table; + atts.mTypes[kChannelG] = SVGFEComponentTransferType::SameAsR; + atts.mTypes[kChannelB] = SVGFEComponentTransferType::SameAsR; atts.mValues[kChannelROrRGB].AppendElements(Span(invertTableValues)); - atts.mTypes[kChannelA] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + atts.mTypes[kChannelA] = SVGFEComponentTransferType::Identity; aDescr.Attributes() = AsVariant(std::move(atts)); return NS_OK; @@ -245,7 +245,7 @@ FilterPrimitiveDescription& aDescr) { ColorMatrixAttributes atts; // Set color matrix type. - atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_SATURATE; + atts.mType = SVGFEColorMatrixType::Saturate; // Set color matrix value. atts.mValues.AppendElement(mFilter.AsSaturate()); @@ -258,7 +258,7 @@ FilterPrimitiveDescription& aDescr) { ColorMatrixAttributes atts; // Set color matrix type. - atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_SEPIA; + atts.mType = SVGFEColorMatrixType::Sepia; // Set color matrix value. atts.mValues.AppendElement(ClampFactor(mFilter.AsSepia())); diff -Nru firefox-esr-140.9.1esr/layout/svg/FilterInstance.cpp firefox-esr-140.10.0esr/layout/svg/FilterInstance.cpp --- firefox-esr-140.9.1esr/layout/svg/FilterInstance.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/svg/FilterInstance.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -114,18 +114,19 @@ } } -static mozilla::wr::ComponentTransferFuncType FuncTypeToWr(uint8_t aFuncType) { - MOZ_ASSERT(aFuncType != SVG_FECOMPONENTTRANSFER_SAME_AS_R); +static mozilla::wr::ComponentTransferFuncType FuncTypeToWr( + SVGFEComponentTransferType aFuncType) { + MOZ_ASSERT(aFuncType != SVGFEComponentTransferType::SameAsR); switch (aFuncType) { - case SVG_FECOMPONENTTRANSFER_TYPE_TABLE: + case SVGFEComponentTransferType::Table: return mozilla::wr::ComponentTransferFuncType::Table; - case SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: + case SVGFEComponentTransferType::Discrete: return mozilla::wr::ComponentTransferFuncType::Discrete; - case SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: + case SVGFEComponentTransferType::Linear: return mozilla::wr::ComponentTransferFuncType::Linear; - case SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: + case SVGFEComponentTransferType::Gamma: return mozilla::wr::ComponentTransferFuncType::Gamma; - case SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: + case SVGFEComponentTransferType::Identity: default: return mozilla::wr::ComponentTransferFuncType::Identity; } @@ -333,14 +334,14 @@ filterData.R_values_count = attributes.mValues[0].Length(); size_t indexToUse = - attributes.mTypes[1] == SVG_FECOMPONENTTRANSFER_SAME_AS_R ? 0 : 1; + attributes.mTypes[1] == SVGFEComponentTransferType::SameAsR ? 0 : 1; filterData.funcG_type = FuncTypeToWr(attributes.mTypes[indexToUse]); size_t G_startindex = values->Length(); values->AppendElements(attributes.mValues[indexToUse]); filterData.G_values_count = attributes.mValues[indexToUse].Length(); indexToUse = - attributes.mTypes[2] == SVG_FECOMPONENTTRANSFER_SAME_AS_R ? 0 : 2; + attributes.mTypes[2] == SVGFEComponentTransferType::SameAsR ? 0 : 2; filterData.funcB_type = FuncTypeToWr(attributes.mTypes[indexToUse]); size_t B_startindex = values->Length(); values->AppendElements(attributes.mValues[indexToUse]); @@ -487,66 +488,66 @@ return WrFiltersStatus::BLOB_FALLBACK; } switch (aAttributes.mBlendMode) { - case SVG_FEBLEND_MODE_COLOR: + case SVGFEBlendMode::Color: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendColor(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_COLOR_BURN: + case SVGFEBlendMode::ColorBurn: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendColorBurn(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_COLOR_DODGE: + case SVGFEBlendMode::ColorDodge: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendColorDodge(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_DARKEN: + case SVGFEBlendMode::Darken: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendDarken(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_DIFFERENCE: + case SVGFEBlendMode::Difference: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendDifference(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_EXCLUSION: + case SVGFEBlendMode::Exclusion: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendExclusion(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_HARD_LIGHT: + case SVGFEBlendMode::HardLight: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendHardLight(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_HUE: + case SVGFEBlendMode::Hue: aWrFilters.filters.AppendElement(wr::FilterOp::SVGFEBlendHue(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_LIGHTEN: + case SVGFEBlendMode::Lighten: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendLighten(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_LUMINOSITY: + case SVGFEBlendMode::Luminosity: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendLuminosity(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_MULTIPLY: + case SVGFEBlendMode::Multiply: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendMultiply(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_NORMAL: + case SVGFEBlendMode::Normal: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendNormal(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_OVERLAY: + case SVGFEBlendMode::Overlay: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendOverlay(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_SATURATION: + case SVGFEBlendMode::Saturation: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendSaturation(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_SCREEN: + case SVGFEBlendMode::Screen: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendScreen(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_SOFT_LIGHT: + case SVGFEBlendMode::SoftLight: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendSoftLight(aGraphNode)); return WrFiltersStatus::SVGFE; @@ -566,33 +567,33 @@ return WrFiltersStatus::BLOB_FALLBACK; } switch (aAttributes.mOperator) { - case SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: + case SVGFECompositeOperator::Arithmetic: aWrFilters.filters.AppendElement(wr::FilterOp::SVGFECompositeArithmetic( aGraphNode, aAttributes.mCoefficients[0], aAttributes.mCoefficients[1], aAttributes.mCoefficients[2], aAttributes.mCoefficients[3])); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_ATOP: + case SVGFECompositeOperator::Atop: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeATop(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_IN: + case SVGFECompositeOperator::In: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeIn(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_LIGHTER: + case SVGFECompositeOperator::Lighter: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeLighter(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_OUT: + case SVGFECompositeOperator::Out: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeOut(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_OVER: + case SVGFECompositeOperator::Over: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeOver(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_XOR: + case SVGFECompositeOperator::Xor: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeXOR(aGraphNode)); return WrFiltersStatus::SVGFE; @@ -653,19 +654,19 @@ // The only type that doesn't use interpolation is discrete. wr::WrFilterData filterData{}; filterData.funcR_type = - aAttributes.mTypes[0] != SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE + aAttributes.mTypes[0] != SVGFEComponentTransferType::Discrete ? mozilla::wr::ComponentTransferFuncType::Table : mozilla::wr::ComponentTransferFuncType::Discrete; filterData.funcG_type = - aAttributes.mTypes[1] != SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE + aAttributes.mTypes[1] != SVGFEComponentTransferType::Discrete ? mozilla::wr::ComponentTransferFuncType::Table : mozilla::wr::ComponentTransferFuncType::Discrete; filterData.funcB_type = - aAttributes.mTypes[2] != SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE + aAttributes.mTypes[2] != SVGFEComponentTransferType::Discrete ? mozilla::wr::ComponentTransferFuncType::Table : mozilla::wr::ComponentTransferFuncType::Discrete; filterData.funcA_type = - aAttributes.mTypes[3] != SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE + aAttributes.mTypes[3] != SVGFEComponentTransferType::Discrete ? mozilla::wr::ComponentTransferFuncType::Table : mozilla::wr::ComponentTransferFuncType::Discrete; @@ -691,15 +692,15 @@ auto f = aAttributes.mTypes[c]; // Check if there's no data (we have crashtests for this). if (aAttributes.mValues[c].Length() < 1 && - f != SVG_FECOMPONENTTRANSFER_SAME_AS_R) { - f = SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + f != SVGFEComponentTransferType::SameAsR) { + f = SVGFEComponentTransferType::Identity; } - // Check for misuse of SVG_FECOMPONENTTRANSFER_SAME_AS_R. - if (c == 0 && f == SVG_FECOMPONENTTRANSFER_SAME_AS_R) { - f = SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + // Check for misuse of SVGFEComponentTransferType::SameAsR. + if (c == 0 && f == SVGFEComponentTransferType::SameAsR) { + f = SVGFEComponentTransferType::Identity; } switch (f) { - case SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: { + case SVGFEComponentTransferType::Discrete: { size_t length = (size_t)aAttributes.mValues[c].Length(); size_t length1 = length - 1; float step = (float)length / (float)stops; @@ -716,7 +717,7 @@ } break; } - case SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: { + case SVGFEComponentTransferType::Gamma: { float step = 1.0f / (float)(stops - 1); float amplitude = aAttributes.mValues[c][0]; float exponent = aAttributes.mValues[c][1]; @@ -728,7 +729,7 @@ } break; } - case SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: { + case SVGFEComponentTransferType::Identity: { float step = 1.0f / (float)(stops - 1); for (size_t i = 0; i < stops; i++) { float v = (float)i * step; @@ -737,7 +738,7 @@ } break; } - case SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: { + case SVGFEComponentTransferType::Linear: { float step = aAttributes.mValues[c][0] / (float)(stops - 1); float intercept = aAttributes.mValues[c][1]; for (size_t i = 0; i < stops; i++) { @@ -747,7 +748,7 @@ } break; } - case SVG_FECOMPONENTTRANSFER_TYPE_TABLE: { + case SVGFEComponentTransferType::Table: { size_t length1 = (size_t)aAttributes.mValues[c].Length() - 1; float step = (float)length1 / (float)(stops - 1); for (size_t i = 0; i < stops; i++) { @@ -763,7 +764,7 @@ } break; } - case SVG_FECOMPONENTTRANSFER_SAME_AS_R: { + case SVGFEComponentTransferType::SameAsR: { // We already checked c > 0 above. for (size_t i = 0; i < stops; i++) { values[i * 4 + c] = values[i * 4]; @@ -824,8 +825,8 @@ } } switch (aAttributes.mEdgeMode) { - case SVG_EDGEMODE_UNKNOWN: - case SVG_EDGEMODE_DUPLICATE: + case SVGEdgeMode::Unknown: + case SVGEdgeMode::Duplicate: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEConvolveMatrixEdgeModeDuplicate( aGraphNode, aAttributes.mKernelSize.Width(), @@ -836,7 +837,7 @@ aAttributes.mKernelUnitLength.Height(), aAttributes.mPreserveAlpha)); return WrFiltersStatus::SVGFE; - case SVG_EDGEMODE_NONE: + case SVGEdgeMode::None: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEConvolveMatrixEdgeModeNone( aGraphNode, aAttributes.mKernelSize.Width(), @@ -847,7 +848,7 @@ aAttributes.mKernelUnitLength.Height(), aAttributes.mPreserveAlpha)); return WrFiltersStatus::SVGFE; - case SVG_EDGEMODE_WRAP: + case SVGEdgeMode::Wrap: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEConvolveMatrixEdgeModeWrap( aGraphNode, aAttributes.mKernelSize.Width(), @@ -924,8 +925,9 @@ return WrFiltersStatus::BLOB_FALLBACK; } aWrFilters.filters.AppendElement(wr::FilterOp::SVGFEDisplacementMap( - aGraphNode, aAttributes.mScale, aAttributes.mXChannel, - aAttributes.mYChannel)); + aGraphNode, aAttributes.mScale, + static_cast(aAttributes.mXChannel), + static_cast(aAttributes.mYChannel))); return WrFiltersStatus::SVGFE; } @@ -1065,11 +1067,11 @@ return WrFiltersStatus::BLOB_FALLBACK; } switch (aAttributes.mOperator) { - case SVG_OPERATOR_DILATE: + case SVGMorphologyOperator::Dilate: aWrFilters.filters.AppendElement(wr::FilterOp::SVGFEMorphologyDilate( aGraphNode, aAttributes.mRadii.width, aAttributes.mRadii.height)); return WrFiltersStatus::SVGFE; - case SVG_OPERATOR_ERODE: + case SVGMorphologyOperator::Erode: aWrFilters.filters.AppendElement(wr::FilterOp::SVGFEMorphologyErode( aGraphNode, aAttributes.mRadii.width, aAttributes.mRadii.height)); return WrFiltersStatus::SVGFE; @@ -1177,7 +1179,7 @@ seed = m1; } switch (aAttributes.mType) { - case SVG_TURBULENCE_TYPE_FRACTALNOISE: + case SVGTurbulenceType::FractalNoise: if (aAttributes.mStitchable) { aWrFilters.filters.AppendElement( wr::FilterOp::SVGFETurbulenceWithFractalNoiseWithStitching( @@ -1190,7 +1192,7 @@ aAttributes.mBaseFrequency.height, aAttributes.mOctaves, seed)); } return WrFiltersStatus::SVGFE; - case SVG_TURBULENCE_TYPE_TURBULENCE: + case SVGTurbulenceType::Turbulence: if (aAttributes.mStitchable) { aWrFilters.filters.AppendElement( wr::FilterOp::SVGFETurbulenceWithTurbulenceNoiseWithStitching( diff -Nru firefox-esr-140.9.1esr/layout/svg/SVGObserverUtils.cpp firefox-esr-140.10.0esr/layout/svg/SVGObserverUtils.cpp --- firefox-esr-140.9.1esr/layout/svg/SVGObserverUtils.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/layout/svg/SVGObserverUtils.cpp 2026-04-15 01:59:54.000000000 +0000 @@ -1738,8 +1738,10 @@ // anonymous block frame, then we look up to its parent (the SVGTextFrame). nsIFrame* paintedFrame = aPaintedFrame; if (paintedFrame->IsInSVGTextSubtree()) { - paintedFrame = paintedFrame->GetParent(); - nsIFrame* grandparent = paintedFrame->GetParent(); + // Continuations can come and go during reflow, and we don't need to + // observe the referenced element more than once for a given node. + paintedFrame = paintedFrame->GetParent()->FirstContinuation(); + nsIFrame* grandparent = paintedFrame->GetParent()->FirstContinuation(); if (grandparent && grandparent->IsSVGTextFrame()) { paintedFrame = grandparent; } diff -Nru firefox-esr-140.9.1esr/media/ffvpx/README_MOZILLA firefox-esr-140.10.0esr/media/ffvpx/README_MOZILLA --- firefox-esr-140.9.1esr/media/ffvpx/README_MOZILLA 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/ffvpx/README_MOZILLA 2026-04-15 01:59:55.000000000 +0000 @@ -128,6 +128,10 @@ issue being that it's included instead of the system header, causing all sorts of issues. +Additionally, `jni.h` and `jni.c` in ffmpeg sources need to be renamed to +`fffjni.h` and `fffjni.c`, and `#include` to those files need to be updated. +This is because there are header collisions with the JDK. + `moz.build` files might need to be modified as well, in light of compilation and link errors. @@ -141,3 +145,4 @@ stdio.h function, that causes bug 1879740 issue on Windows. - opusenc-dtx.patch to allow enabling DTX in the opus encoder. - libaomenc-svc.patch to allow configuring SVC in the libaom encoder. +- vp9-get-format-rollback.patch to fix a VP9 decoder error handling issue. diff -Nru firefox-esr-140.9.1esr/media/ffvpx/libavcodec/vp9.c firefox-esr-140.10.0esr/media/ffvpx/libavcodec/vp9.c --- firefox-esr-140.9.1esr/media/ffvpx/libavcodec/vp9.c 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/ffvpx/libavcodec/vp9.c 2026-04-15 01:59:54.000000000 +0000 @@ -235,8 +235,10 @@ *fmtp = AV_PIX_FMT_NONE; ret = ff_get_format(avctx, pix_fmts); - if (ret < 0) + if (ret < 0) { + ff_set_dimensions(avctx, s->w, s->h); return ret; + } avctx->pix_fmt = ret; s->gf_fmt = s->pix_fmt; diff -Nru firefox-esr-140.9.1esr/media/ffvpx/vp9-get-format-rollback.patch firefox-esr-140.10.0esr/media/ffvpx/vp9-get-format-rollback.patch --- firefox-esr-140.9.1esr/media/ffvpx/vp9-get-format-rollback.patch 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/media/ffvpx/vp9-get-format-rollback.patch 2026-04-15 01:59:55.000000000 +0000 @@ -0,0 +1,16 @@ +diff --git a/media/ffvpx/libavcodec/vp9.c b/media/ffvpx/libavcodec/vp9.c +--- a/media/ffvpx/libavcodec/vp9.c ++++ b/media/ffvpx/libavcodec/vp9.c +@@ -235,8 +235,11 @@ static int update_size(AVCodecContext *avctx, int w, int h) + *fmtp++ = s->pix_fmt; + *fmtp = AV_PIX_FMT_NONE; + + ret = ff_get_format(avctx, pix_fmts); +- if (ret < 0) ++ if (ret < 0) { ++ ff_set_dimensions(avctx, s->w, s->h); + return ret; ++ } + + avctx->pix_fmt = ret; + s->gf_fmt = s->pix_fmt; diff -Nru firefox-esr-140.9.1esr/media/gmp-clearkey/0.1/VideoDecoder.cpp firefox-esr-140.10.0esr/media/gmp-clearkey/0.1/VideoDecoder.cpp --- firefox-esr-140.9.1esr/media/gmp-clearkey/0.1/VideoDecoder.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/media/gmp-clearkey/0.1/VideoDecoder.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -131,7 +131,8 @@ CK_LOGD("VideoDecoder::OutputFrame Decoder output ret=0x%x", hr); - mOutputQueue.push(output); + mOutputQueue.push({output, mDecoder->GetPictureRegion(), + mDecoder->GetStride(), mDecoder->GetFrameHeight()}); CK_LOGD("VideoDecoder::OutputFrame: Queue size: %u", mOutputQueue.size()); } @@ -148,20 +149,19 @@ return cdm::Status::kDecodeError; } - CComPtr result = mOutputQueue.front(); + OutputData result = std::move(mOutputQueue.front()); mOutputQueue.pop(); // The Chromium CDM API doesn't have support for negative strides, though // they are theoretically possible in real world data. - if (mDecoder->GetStride() <= 0) { + if (result.mStride <= 0) { CK_LOGD("VideoDecoder::OutputFrame Failed! (negative stride)"); return cdm::Status::kDecodeError; } - const IntRect& picture = mDecoder->GetPictureRegion(); - hr = SampleToVideoFrame(result, picture.width, picture.height, - mDecoder->GetStride(), mDecoder->GetFrameHeight(), - aVideoFrame); + const IntRect& picture = result.mPictureRegion; + hr = SampleToVideoFrame(result.mSample, picture.width, picture.height, + result.mStride, result.mFrameHeight, aVideoFrame); if (FAILED(hr)) { CK_LOGD("VideoDecoder::OutputFrame Failed!"); return cdm::Status::kDecodeError; diff -Nru firefox-esr-140.9.1esr/media/gmp-clearkey/0.1/VideoDecoder.h firefox-esr-140.10.0esr/media/gmp-clearkey/0.1/VideoDecoder.h --- firefox-esr-140.9.1esr/media/gmp-clearkey/0.1/VideoDecoder.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/media/gmp-clearkey/0.1/VideoDecoder.h 2026-04-15 01:59:55.000000000 +0000 @@ -64,7 +64,13 @@ cdm::Host_11* mHost; wmf::AutoPtr mDecoder; - std::queue> mOutputQueue; + struct OutputData { + wmf::CComPtr mSample; + wmf::IntRect mPictureRegion; + int32_t mStride; + int32_t mFrameHeight; + }; + std::queue mOutputQueue; bool mHasShutdown; }; diff -Nru firefox-esr-140.9.1esr/media/gmp-clearkey/0.1/WMFH264Decoder.cpp firefox-esr-140.10.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.cpp --- firefox-esr-140.9.1esr/media/gmp-clearkey/0.1/WMFH264Decoder.cpp 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -22,13 +22,6 @@ namespace wmf { -WMFH264Decoder::WMFH264Decoder() : mDecoder(nullptr) { - memset(&mInputStreamInfo, 0, sizeof(MFT_INPUT_STREAM_INFO)); - memset(&mOutputStreamInfo, 0, sizeof(MFT_OUTPUT_STREAM_INFO)); -} - -WMFH264Decoder::~WMFH264Decoder() {} - HRESULT WMFH264Decoder::Init(int32_t aCoreCount) { HRESULT hr; @@ -103,14 +96,6 @@ return S_OK; } -int32_t WMFH264Decoder::GetFrameHeight() const { return mVideoHeight; } - -const IntRect& WMFH264Decoder::GetPictureRegion() const { - return mPictureRegion; -} - -int32_t WMFH264Decoder::GetStride() const { return mStride; } - HRESULT WMFH264Decoder::SetDecoderInputType() { HRESULT hr; @@ -263,7 +248,10 @@ hr = SetDecoderOutputType(); ENSURE(SUCCEEDED(hr), hr); - return GetOutputSample(aOutSample); + hr = mDecoder->GetOutputStreamInfo(0, &mOutputStreamInfo); + ENSURE(SUCCEEDED(hr), hr); + + return MF_E_TRANSFORM_STREAM_CHANGE; } else if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { return MF_E_TRANSFORM_NEED_MORE_INPUT; } @@ -300,15 +288,21 @@ WMFH264Decoder::Output(IMFSample** aOutput) { HRESULT hr; CComPtr outputSample; - hr = GetOutputSample(&outputSample); + do { + hr = GetOutputSample(&outputSample); + } while (hr == MF_E_TRANSFORM_STREAM_CHANGE); + if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { return MF_E_TRANSFORM_NEED_MORE_INPUT; } - // Treat other errors as fatal. - ENSURE(SUCCEEDED(hr) && outputSample, hr); - *aOutput = outputSample.Detach(); + ENSURE(SUCCEEDED(hr), hr); + if (!outputSample) { + LOG("GetOutputSample returned success without sample\n"); + return E_UNEXPECTED; + } + *aOutput = outputSample.Detach(); return S_OK; } diff -Nru firefox-esr-140.9.1esr/media/gmp-clearkey/0.1/WMFH264Decoder.h firefox-esr-140.10.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.h --- firefox-esr-140.9.1esr/media/gmp-clearkey/0.1/WMFH264Decoder.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.h 2026-04-15 01:59:55.000000000 +0000 @@ -23,8 +23,8 @@ class WMFH264Decoder { public: - WMFH264Decoder(); - ~WMFH264Decoder(); + WMFH264Decoder() = default; + ~WMFH264Decoder() = default; HRESULT Init(int32_t aCoreCount); @@ -35,9 +35,9 @@ HRESULT Reset(); - int32_t GetFrameHeight() const; - const IntRect& GetPictureRegion() const; - int32_t GetStride() const; + int32_t GetFrameHeight() const { return mVideoHeight; } + const IntRect& GetPictureRegion() const { return mPictureRegion; } + int32_t GetStride() const { return mStride; } HRESULT Drain(); @@ -54,15 +54,15 @@ HRESULT GetOutputSample(IMFSample** aOutSample); HRESULT ConfigureVideoFrameGeometry(IMFMediaType* aMediaType); - MFT_INPUT_STREAM_INFO mInputStreamInfo; - MFT_OUTPUT_STREAM_INFO mOutputStreamInfo; + MFT_INPUT_STREAM_INFO mInputStreamInfo{}; + MFT_OUTPUT_STREAM_INFO mOutputStreamInfo{}; CComPtr mDecoder; - int32_t mVideoWidth; - int32_t mVideoHeight; + int32_t mVideoWidth = 0; + int32_t mVideoHeight = 0; IntRect mPictureRegion; - int32_t mStride; + int32_t mStride = 0; }; } // namespace wmf diff -Nru firefox-esr-140.9.1esr/media/libpng/ANNOUNCE firefox-esr-140.10.0esr/media/libpng/ANNOUNCE --- firefox-esr-140.9.1esr/media/libpng/ANNOUNCE 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/ANNOUNCE 2026-04-15 01:59:55.000000000 +0000 @@ -1,5 +1,5 @@ -libpng 1.6.56 - March 25, 2026 -============================== +libpng 1.6.57 - April 8, 2026 +============================= This is a public release of libpng, intended for use in production code. @@ -9,10 +9,10 @@ Source files: - * libpng-1.6.56.tar.xz (LZMA-compressed, recommended) - * libpng-1.6.56.tar.gz (deflate-compressed) - * lpng1656.7z (LZMA-compressed) - * lpng1656.zip (deflate-compressed) + * libpng-1.6.57.tar.xz (LZMA-compressed, recommended) + * libpng-1.6.57.tar.gz (deflate-compressed) + * lpng1657.7z (LZMA-compressed) + * lpng1657.zip (deflate-compressed) Other information: @@ -22,38 +22,18 @@ * TRADEMARK.md -Changes from version 1.6.55 to version 1.6.56 +Changes from version 1.6.56 to version 1.6.57 --------------------------------------------- - * Fixed CVE-2026-33416 (high severity): - Use-after-free via pointer aliasing in `png_set_tRNS` and `png_set_PLTE`. - (Reported by Halil Oktay and Ryo Shimada; - fixed by Halil Oktay and Cosmin Truta.) - * Fixed CVE-2026-33636 (high severity): - Out-of-bounds read/write in the palette expansion on ARM Neon. - (Reported by Taegu Ha; fixed by Taegu Ha and Cosmin Truta.) - * Fixed uninitialized reads beyond `num_trans` in `trans_alpha` buffers. - (Contributed by Halil Oktay.) - * Fixed stale `info_ptr->palette` after in-place gamma and background - transforms. - * Fixed wrong channel indices in `png_image_read_and_map` RGB_ALPHA path. - (Contributed by Yuelin Wang.) - * Fixed wrong background color in colormap read. - (Contributed by Yuelin Wang.) - * Fixed dead loop in sPLT write. - (Contributed by Yuelin Wang.) - * Added missing null pointer checks in four public API functions. - (Contributed by Yuelin Wang.) - * Validated shift bit depths in `png_set_shift` to prevent infinite loop. - (Contributed by Yuelin Wang.) - * Avoided undefined behavior in library and tests. - * Deprecated the hardly-ever-tested POINTER_INDEXING config option. - * Added negative-stride test coverage for the simplified API. - * Fixed memory leaks and API misuse in oss-fuzz. - (Contributed by Owen Sanzas.) - * Implemented various fixes and improvements in oss-fuzz. - (Contributed by Bob Friesenhahn and Philippe Antoine.) - * Performed various refactorings and cleanups. + * Fixed CVE-2026-34757 (medium severity): + Use-after-free in `png_set_PLTE`, `png_set_tRNS` and `png_set_hIST` + leading to corrupted chunk data and potential heap information disclosure. + Also hardened the append-style setters (`png_set_text`, `png_set_sPLT`, + `png_set_unknown_chunks`) against a theoretical variant of the same + aliasing pattern. + (Reported by Iv4n .) + * Fixed integer overflow in rowbytes computation in read transforms. + (Contributed by Mohammad Seet.) Send comments/corrections/commendations to png-mng-implement at lists.sf.net. diff -Nru firefox-esr-140.9.1esr/media/libpng/AUTHORS firefox-esr-140.10.0esr/media/libpng/AUTHORS --- firefox-esr-140.9.1esr/media/libpng/AUTHORS 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/AUTHORS 2026-04-15 01:59:55.000000000 +0000 @@ -27,6 +27,7 @@ * Mans Rullgard * Matt Sarett * Mike Klein + * Mohammad Seet * Pascal Massimino * Paul Schmidt * Petr Simecek diff -Nru firefox-esr-140.9.1esr/media/libpng/CHANGES firefox-esr-140.10.0esr/media/libpng/CHANGES --- firefox-esr-140.9.1esr/media/libpng/CHANGES 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/CHANGES 2026-04-15 01:59:55.000000000 +0000 @@ -6368,6 +6368,17 @@ (Contributed by Bob Friesenhahn and Philippe Antoine.) Performed various refactorings and cleanups. +Version 1.6.57 [April 8, 2026] + Fixed CVE-2026-34757 (medium severity): + Use-after-free in `png_set_PLTE`, `png_set_tRNS` and `png_set_hIST` + leading to corrupted chunk data and potential heap information disclosure. + Also hardened the append-style setters (`png_set_text`, `png_set_sPLT`, + `png_set_unknown_chunks`) against a theoretical variant of the same + aliasing pattern. + (Reported by Iv4n .) + Fixed integer overflow in rowbytes computation in read transforms. + (Contributed by Mohammad Seet.) + Send comments/corrections/commendations to png-mng-implement at lists.sf.net. Subscription is required; visit diff -Nru firefox-esr-140.9.1esr/media/libpng/README firefox-esr-140.10.0esr/media/libpng/README --- firefox-esr-140.9.1esr/media/libpng/README 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/README 2026-04-15 01:59:55.000000000 +0000 @@ -1,4 +1,4 @@ -README for libpng version 1.6.56 +README for libpng version 1.6.57 ================================ See the note about version numbers near the top of `png.h`. diff -Nru firefox-esr-140.9.1esr/media/libpng/libpng-manual.txt firefox-esr-140.10.0esr/media/libpng/libpng-manual.txt --- firefox-esr-140.9.1esr/media/libpng/libpng-manual.txt 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/libpng-manual.txt 2026-04-15 01:59:55.000000000 +0000 @@ -9,7 +9,7 @@ Based on: - libpng version 1.6.36, December 2018, through 1.6.56 - March 2026 + libpng version 1.6.36, December 2018, through 1.6.57 - April 2026 Updated and distributed by Cosmin Truta Copyright (c) 2018-2026 Cosmin Truta diff -Nru firefox-esr-140.9.1esr/media/libpng/moz.yaml firefox-esr-140.10.0esr/media/libpng/moz.yaml --- firefox-esr-140.9.1esr/media/libpng/moz.yaml 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/moz.yaml 2026-04-15 01:59:54.000000000 +0000 @@ -11,9 +11,9 @@ url: "http://www.libpng.org/pub/png/libpng.html" license: libpng - release: v1.6.56 (2026-03-25T22:47:06+02:00). + release: v1.6.57 (2026-04-08T23:49:24+03:00). - revision: v1.6.56 + revision: "v1.6.57" license-file: LICENSE diff -Nru firefox-esr-140.9.1esr/media/libpng/png.c firefox-esr-140.10.0esr/media/libpng/png.c --- firefox-esr-140.9.1esr/media/libpng/png.c 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/png.c 2026-04-15 01:59:54.000000000 +0000 @@ -13,7 +13,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_56 Your_png_h_is_not_version_1_6_56; +typedef png_libpng_version_1_6_57 Your_png_h_is_not_version_1_6_57; /* Sanity check the chunks definitions - PNG_KNOWN_CHUNKS from pngpriv.h and the * corresponding macro definitions. This causes a compile time failure if @@ -820,7 +820,7 @@ return PNG_STRING_COPYRIGHT #else return PNG_STRING_NEWLINE \ - "libpng version 1.6.56" PNG_STRING_NEWLINE \ + "libpng version 1.6.57" PNG_STRING_NEWLINE \ "Copyright (c) 2018-2026 Cosmin Truta" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \ PNG_STRING_NEWLINE \ diff -Nru firefox-esr-140.9.1esr/media/libpng/png.h firefox-esr-140.10.0esr/media/libpng/png.h --- firefox-esr-140.9.1esr/media/libpng/png.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/png.h 2026-04-15 01:59:54.000000000 +0000 @@ -1,6 +1,6 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.56 + * libpng version 1.6.57 * * Copyright (c) 2018-2026 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson @@ -14,7 +14,7 @@ * libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.6.35, July 2018: * Glenn Randers-Pehrson - * libpng versions 1.6.36, December 2018, through 1.6.56, March 2026: + * libpng versions 1.6.36, December 2018, through 1.6.57, April 2026: * Cosmin Truta * See also "Contributing Authors", below. */ @@ -238,7 +238,7 @@ * ... * 1.5.30 15 10530 15.so.15.30[.0] * ... - * 1.6.56 16 10656 16.so.16.56[.0] + * 1.6.57 16 10657 16.so.16.57[.0] * * Henceforth the source version will match the shared-library major and * minor numbers; the shared-library major version number will be used for @@ -274,7 +274,7 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.56" +#define PNG_LIBPNG_VER_STRING "1.6.57" #define PNG_HEADER_VERSION_STRING " libpng version " PNG_LIBPNG_VER_STRING "\n" /* The versions of shared library builds should stay in sync, going forward */ @@ -285,7 +285,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 6 -#define PNG_LIBPNG_VER_RELEASE 56 +#define PNG_LIBPNG_VER_RELEASE 57 /* This should be zero for a public release, or non-zero for a * development version. @@ -316,7 +316,7 @@ * From version 1.0.1 it is: * XXYYZZ, where XX=major, YY=minor, ZZ=release */ -#define PNG_LIBPNG_VER 10656 /* 1.6.56 */ +#define PNG_LIBPNG_VER 10657 /* 1.6.57 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -441,7 +441,7 @@ /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char *png_libpng_version_1_6_56; +typedef char *png_libpng_version_1_6_57; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * diff -Nru firefox-esr-140.9.1esr/media/libpng/pngconf.h firefox-esr-140.10.0esr/media/libpng/pngconf.h --- firefox-esr-140.9.1esr/media/libpng/pngconf.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/pngconf.h 2026-04-15 01:59:55.000000000 +0000 @@ -1,6 +1,6 @@ /* pngconf.h - machine-configurable file for libpng * - * libpng version 1.6.56 + * libpng version 1.6.57 * * Copyright (c) 2018-2026 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson diff -Nru firefox-esr-140.9.1esr/media/libpng/pngrtran.c firefox-esr-140.10.0esr/media/libpng/pngrtran.c --- firefox-esr-140.9.1esr/media/libpng/pngrtran.c 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/pngrtran.c 2026-04-15 01:59:55.000000000 +0000 @@ -2379,7 +2379,7 @@ } row_info->bit_depth = 8; row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_width * row_info->channels; + row_info->rowbytes = (size_t)row_width * row_info->channels; } } #endif @@ -2581,7 +2581,7 @@ row_info->bit_depth = 8; row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_info->width * row_info->channels; + row_info->rowbytes = (size_t)row_info->width * row_info->channels; } } #endif @@ -2609,7 +2609,7 @@ row_info->bit_depth = 8; row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_info->width * row_info->channels; + row_info->rowbytes = (size_t)row_info->width * row_info->channels; } } #endif @@ -2845,7 +2845,7 @@ *(--dp) = lo_filler; row_info->channels = 2; row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; + row_info->rowbytes = (size_t)row_width * 2; } else @@ -2860,7 +2860,7 @@ } row_info->channels = 2; row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; + row_info->rowbytes = (size_t)row_width * 2; } } @@ -2883,7 +2883,7 @@ *(--dp) = hi_filler; row_info->channels = 2; row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; + row_info->rowbytes = (size_t)row_width * 4; } else @@ -2900,7 +2900,7 @@ } row_info->channels = 2; row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; + row_info->rowbytes = (size_t)row_width * 4; } } #endif @@ -2924,7 +2924,7 @@ *(--dp) = lo_filler; row_info->channels = 4; row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; + row_info->rowbytes = (size_t)row_width * 4; } else @@ -2941,7 +2941,7 @@ } row_info->channels = 4; row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; + row_info->rowbytes = (size_t)row_width * 4; } } @@ -2968,7 +2968,7 @@ *(--dp) = hi_filler; row_info->channels = 4; row_info->pixel_depth = 64; - row_info->rowbytes = row_width * 8; + row_info->rowbytes = (size_t)row_width * 8; } else @@ -2990,7 +2990,7 @@ row_info->channels = 4; row_info->pixel_depth = 64; - row_info->rowbytes = row_width * 8; + row_info->rowbytes = (size_t)row_width * 8; } } #endif @@ -4484,7 +4484,7 @@ } row_info->bit_depth = 8; row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; + row_info->rowbytes = (size_t)row_width * 4; row_info->color_type = 6; row_info->channels = 4; } @@ -4492,7 +4492,7 @@ else { sp = row + (size_t)row_width - 1; - dp = row + (size_t)(row_width * 3) - 1; + dp = row + (size_t)row_width * 3 - 1; i = 0; #ifdef PNG_ARM_NEON_INTRINSICS_AVAILABLE i = png_do_expand_palette_rgb8_neon(png_ptr, row_info, row, @@ -4511,7 +4511,7 @@ row_info->bit_depth = 8; row_info->pixel_depth = 24; - row_info->rowbytes = row_width * 3; + row_info->rowbytes = (size_t)row_width * 3; row_info->color_type = 2; row_info->channels = 3; } diff -Nru firefox-esr-140.9.1esr/media/libpng/pngset.c firefox-esr-140.10.0esr/media/libpng/pngset.c --- firefox-esr-140.9.1esr/media/libpng/pngset.c 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libpng/pngset.c 2026-04-15 01:59:54.000000000 +0000 @@ -385,6 +385,7 @@ png_set_hIST(png_const_structrp png_ptr, png_inforp info_ptr, png_const_uint_16p hist) { + png_uint_16 safe_hist[PNG_MAX_PALETTE_LENGTH]; int i; png_debug1(1, "in %s storage function", "hIST"); @@ -401,6 +402,13 @@ return; } + /* Snapshot the caller's hist before freeing, in case it points to + * info_ptr->hist (getter-to-setter aliasing). + */ + memcpy(safe_hist, hist, (unsigned int)info_ptr->num_palette * + (sizeof (png_uint_16))); + hist = safe_hist; + png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in @@ -747,7 +755,7 @@ png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_const_colorp palette, int num_palette) { - + png_color safe_palette[PNG_MAX_PALETTE_LENGTH]; png_uint_32 max_palette_length; png_debug1(1, "in %s storage function", "PLTE"); @@ -781,6 +789,15 @@ png_error(png_ptr, "Invalid palette"); } + /* Snapshot the caller's palette before freeing, in case it points to + * info_ptr->palette (getter-to-setter aliasing). + */ + if (num_palette > 0) + memcpy(safe_palette, palette, (unsigned int)num_palette * + (sizeof (png_color))); + + palette = safe_palette; + png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead @@ -942,6 +959,7 @@ png_const_textp text_ptr, int num_text) { int i; + png_textp old_text = NULL; png_debug1(1, "in text storage function, chunk typeid = 0x%lx", png_ptr == NULL ? 0xabadca11UL : (unsigned long)png_ptr->chunk_name); @@ -989,7 +1007,10 @@ return 1; } - png_free(png_ptr, info_ptr->text); + /* Defer freeing the old array until after the copy loop below, + * in case text_ptr aliases info_ptr->text (getter-to-setter). + */ + old_text = info_ptr->text; info_ptr->text = new_text; info_ptr->free_me |= PNG_FREE_TEXT; @@ -1074,6 +1095,7 @@ { png_chunk_report(png_ptr, "text chunk: out of memory", PNG_CHUNK_WRITE_ERROR); + png_free(png_ptr, old_text); return 1; } @@ -1127,6 +1149,8 @@ png_debug1(3, "transferred text chunk %d", info_ptr->num_text); } + png_free(png_ptr, old_text); + return 0; } #endif @@ -1170,6 +1194,16 @@ if (trans_alpha != NULL) { + /* Snapshot the caller's trans_alpha before freeing, in case it + * points to info_ptr->trans_alpha (getter-to-setter aliasing). + */ + png_byte safe_trans[PNG_MAX_PALETTE_LENGTH]; + + if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) + memcpy(safe_trans, trans_alpha, (size_t)num_trans); + + trans_alpha = safe_trans; + png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) @@ -1254,6 +1288,7 @@ */ { png_sPLT_tp np; + png_sPLT_tp old_spalettes; png_debug1(1, "in %s storage function", "sPLT"); @@ -1274,7 +1309,10 @@ return; } - png_free(png_ptr, info_ptr->splt_palettes); + /* Defer freeing the old array until after the copy loop below, + * in case entries aliases info_ptr->splt_palettes (getter-to-setter). + */ + old_spalettes = info_ptr->splt_palettes; info_ptr->splt_palettes = np; info_ptr->free_me |= PNG_FREE_SPLT; @@ -1338,6 +1376,8 @@ } while (--nentries); + png_free(png_ptr, old_spalettes); + if (nentries > 0) png_chunk_report(png_ptr, "sPLT out of memory", PNG_CHUNK_WRITE_ERROR); } @@ -1526,6 +1566,7 @@ png_inforp info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns) { png_unknown_chunkp np; + png_unknown_chunkp old_unknowns; if (png_ptr == NULL || info_ptr == NULL || num_unknowns <= 0 || unknowns == NULL) @@ -1572,7 +1613,10 @@ return; } - png_free(png_ptr, info_ptr->unknown_chunks); + /* Defer freeing the old array until after the copy loop below, + * in case unknowns aliases info_ptr->unknown_chunks (getter-to-setter). + */ + old_unknowns = info_ptr->unknown_chunks; info_ptr->unknown_chunks = np; /* safe because it is initialized */ info_ptr->free_me |= PNG_FREE_UNKN; @@ -1618,6 +1662,8 @@ ++np; ++(info_ptr->unknown_chunks_num); } + + png_free(png_ptr, old_unknowns); } void PNGAPI diff -Nru firefox-esr-140.9.1esr/media/libvpx/libvpx/vp8/common/alloccommon.c firefox-esr-140.10.0esr/media/libvpx/libvpx/vp8/common/alloccommon.c --- firefox-esr-140.9.1esr/media/libvpx/libvpx/vp8/common/alloccommon.c 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libvpx/libvpx/vp8/common/alloccommon.c 2026-04-15 01:59:55.000000000 +0000 @@ -34,7 +34,7 @@ oci->pp_limits_buffer = NULL; vpx_free(oci->postproc_state.generated_noise); - oci->postproc_state.generated_noise = NULL; + memset(&oci->postproc_state, 0, sizeof(oci->postproc_state)); #endif vpx_free(oci->above_context); @@ -42,10 +42,14 @@ #if CONFIG_ERROR_CONCEALMENT vpx_free(oci->prev_mip); oci->prev_mip = NULL; + oci->prev_mi = NULL; #endif oci->above_context = NULL; oci->mip = NULL; + oci->mi = NULL; + oci->show_frame_mi = NULL; + oci->frame_to_show = NULL; } int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height) { diff -Nru firefox-esr-140.9.1esr/media/libvpx/moz.yaml firefox-esr-140.10.0esr/media/libvpx/moz.yaml --- firefox-esr-140.9.1esr/media/libvpx/moz.yaml 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libvpx/moz.yaml 2026-04-15 01:59:54.000000000 +0000 @@ -56,6 +56,7 @@ - arm_cpu_runtime_detection_code_on_openbsd.patch - input_frame_validation.patch - input_frame_validation_vp9.patch + - reset_post_proc_state.patch update-actions: - action: move-file diff -Nru firefox-esr-140.9.1esr/media/libvpx/reset_post_proc_state.patch firefox-esr-140.10.0esr/media/libvpx/reset_post_proc_state.patch --- firefox-esr-140.9.1esr/media/libvpx/reset_post_proc_state.patch 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/media/libvpx/reset_post_proc_state.patch 2026-04-15 01:59:55.000000000 +0000 @@ -0,0 +1,32 @@ +# HG changeset patch +# User Jan-Ivar Bruaroey + +Bug 2029423 - Reset post_proc state. + +diff --git a/vp8/common/alloccommon.c b/vp8/common/alloccommon.c +--- a/vp8/common/alloccommon.c ++++ b/vp8/common/alloccommon.c +@@ -34,7 +34,7 @@ void vp8_de_alloc_frame_buffers(VP8_COMM + oci->pp_limits_buffer = NULL; + + vpx_free(oci->postproc_state.generated_noise); +- oci->postproc_state.generated_noise = NULL; ++ memset(&oci->postproc_state, 0, sizeof(oci->postproc_state)); + #endif + + vpx_free(oci->above_context); +@@ -42,10 +42,14 @@ void vp8_de_alloc_frame_buffers(VP8_COMM + #if CONFIG_ERROR_CONCEALMENT + vpx_free(oci->prev_mip); + oci->prev_mip = NULL; ++ oci->prev_mi = NULL; + #endif + + oci->above_context = NULL; + oci->mip = NULL; ++ oci->mi = NULL; ++ oci->show_frame_mi = NULL; ++ oci->frame_to_show = NULL; + } + + int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height) { diff -Nru firefox-esr-140.9.1esr/mfbt/CheckedInt.h firefox-esr-140.10.0esr/mfbt/CheckedInt.h --- firefox-esr-140.9.1esr/mfbt/CheckedInt.h 2026-04-03 15:52:25.000000000 +0000 +++ firefox-esr-140.10.0esr/mfbt/CheckedInt.h 2026-04-15 01:59:55.000000000 +0000 @@ -557,7 +557,7 @@ /** @returns the actual value */ constexpr T value() const { - MOZ_DIAGNOSTIC_ASSERT( + MOZ_RELEASE_ASSERT( mIsValid, "Invalid checked integer (division by zero or integer overflow)"); return mValue; diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/constants.c firefox-esr-140.10.0esr/modules/brotli/common/constants.c --- firefox-esr-140.9.1esr/modules/brotli/common/constants.c 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/constants.c 2026-04-15 01:59:56.000000000 +0000 @@ -6,10 +6,10 @@ #include "constants.h" -const BrotliPrefixCodeRange - _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS] = { - {1, 2}, {5, 2}, {9, 2}, {13, 2}, {17, 3}, {25, 3}, - {33, 3}, {41, 3}, {49, 4}, {65, 4}, {81, 4}, {97, 4}, - {113, 5}, {145, 5}, {177, 5}, {209, 5}, {241, 6}, {305, 6}, - {369, 7}, {497, 8}, {753, 9}, {1265, 10}, {2289, 11}, {4337, 12}, - {8433, 13}, {16625, 24}}; +const BROTLI_MODEL("small") +BrotliPrefixCodeRange _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS] = { + {1, 2}, {5, 2}, {9, 2}, {13, 2}, {17, 3}, {25, 3}, + {33, 3}, {41, 3}, {49, 4}, {65, 4}, {81, 4}, {97, 4}, + {113, 5}, {145, 5}, {177, 5}, {209, 5}, {241, 6}, {305, 6}, + {369, 7}, {497, 8}, {753, 9}, {1265, 10}, {2289, 11}, {4337, 12}, + {8433, 13}, {16625, 24}}; diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/constants.h firefox-esr-140.10.0esr/modules/brotli/common/constants.h --- firefox-esr-140.9.1esr/modules/brotli/common/constants.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/constants.h 2026-04-15 01:59:56.000000000 +0000 @@ -12,9 +12,6 @@ #ifndef BROTLI_COMMON_CONSTANTS_H_ #define BROTLI_COMMON_CONSTANTS_H_ -#include -#include - #include "platform.h" /* Specification: 7.3. Encoding of the context map */ @@ -195,7 +192,7 @@ } BrotliPrefixCodeRange; /* "Soft-private", it is exported, but not "advertised" as API. */ -BROTLI_COMMON_API extern const BrotliPrefixCodeRange - _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS]; +BROTLI_COMMON_API extern const BROTLI_MODEL("small") +BrotliPrefixCodeRange _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS]; #endif /* BROTLI_COMMON_CONSTANTS_H_ */ diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/context.c firefox-esr-140.10.0esr/modules/brotli/common/context.c --- firefox-esr-140.9.1esr/modules/brotli/common/context.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/context.c 2026-04-15 01:59:56.000000000 +0000 @@ -1,9 +1,9 @@ #include "context.h" -#include +#include "platform.h" /* Common context lookup table for all context modes. */ -const uint8_t _kBrotliContextLookupTable[2048] = { +const BROTLI_MODEL("small") uint8_t _kBrotliContextLookupTable[2048] = { /* CONTEXT_LSB6, last byte. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/context.h firefox-esr-140.10.0esr/modules/brotli/common/context.h --- firefox-esr-140.9.1esr/modules/brotli/common/context.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/context.h 2026-04-15 01:59:56.000000000 +0000 @@ -88,8 +88,7 @@ #ifndef BROTLI_COMMON_CONTEXT_H_ #define BROTLI_COMMON_CONTEXT_H_ -#include -#include +#include "platform.h" typedef enum ContextType { CONTEXT_LSB6 = 0, diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/dictionary.c firefox-esr-140.10.0esr/modules/brotli/common/dictionary.c --- firefox-esr-140.9.1esr/modules/brotli/common/dictionary.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/dictionary.c 2026-04-15 01:59:56.000000000 +0000 @@ -12,5863 +12,11 @@ #endif #if !defined(BROTLI_EXTERNAL_DICTIONARY_DATA) -static const uint8_t kBrotliDictionaryData[] = -/* GENERATED CODE START */ -{ -116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99, -111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105 -,116,121,111,112,101,110,106,117,115,116,108,105,107,101,102,114,101,101,119,111 -,114,107,116,101,120,116,121,101,97,114,111,118,101,114,98,111,100,121,108,111, -118,101,102,111,114,109,98,111,111,107,112,108,97,121,108,105,118,101,108,105, -110,101,104,101,108,112,104,111,109,101,115,105,100,101,109,111,114,101,119,111, -114,100,108,111,110,103,116,104,101,109,118,105,101,119,102,105,110,100,112,97, -103,101,100,97,121,115,102,117,108,108,104,101,97,100,116,101,114,109,101,97,99, -104,97,114,101,97,102,114,111,109,116,114,117,101,109,97,114,107,97,98,108,101, -117,112,111,110,104,105,103,104,100,97,116,101,108,97,110,100,110,101,119,115, -101,118,101,110,110,101,120,116,99,97,115,101,98,111,116,104,112,111,115,116,117 -,115,101,100,109,97,100,101,104,97,110,100,104,101,114,101,119,104,97,116,110,97 -,109,101,76,105,110,107,98,108,111,103,115,105,122,101,98,97,115,101,104,101,108 -,100,109,97,107,101,109,97,105,110,117,115,101,114,39,41,32,43,104,111,108,100, -101,110,100,115,119,105,116,104,78,101,119,115,114,101,97,100,119,101,114,101, -115,105,103,110,116,97,107,101,104,97,118,101,103,97,109,101,115,101,101,110,99, -97,108,108,112,97,116,104,119,101,108,108,112,108,117,115,109,101,110,117,102, -105,108,109,112,97,114,116,106,111,105,110,116,104,105,115,108,105,115,116,103, -111,111,100,110,101,101,100,119,97,121,115,119,101,115,116,106,111,98,115,109, -105,110,100,97,108,115,111,108,111,103,111,114,105,99,104,117,115,101,115,108,97 -,115,116,116,101,97,109,97,114,109,121,102,111,111,100,107,105,110,103,119,105, -108,108,101,97,115,116,119,97,114,100,98,101,115,116,102,105,114,101,80,97,103, -101,107,110,111,119,97,119,97,121,46,112,110,103,109,111,118,101,116,104,97,110, -108,111,97,100,103,105,118,101,115,101,108,102,110,111,116,101,109,117,99,104, -102,101,101,100,109,97,110,121,114,111,99,107,105,99,111,110,111,110,99,101,108, -111,111,107,104,105,100,101,100,105,101,100,72,111,109,101,114,117,108,101,104, -111,115,116,97,106,97,120,105,110,102,111,99,108,117,98,108,97,119,115,108,101, -115,115,104,97,108,102,115,111,109,101,115,117,99,104,122,111,110,101,49,48,48, -37,111,110,101,115,99,97,114,101,84,105,109,101,114,97,99,101,98,108,117,101,102 -,111,117,114,119,101,101,107,102,97,99,101,104,111,112,101,103,97,118,101,104,97 -,114,100,108,111,115,116,119,104,101,110,112,97,114,107,107,101,112,116,112,97, -115,115,115,104,105,112,114,111,111,109,72,84,77,76,112,108,97,110,84,121,112, -101,100,111,110,101,115,97,118,101,107,101,101,112,102,108,97,103,108,105,110, -107,115,111,108,100,102,105,118,101,116,111,111,107,114,97,116,101,116,111,119, -110,106,117,109,112,116,104,117,115,100,97,114,107,99,97,114,100,102,105,108,101 -,102,101,97,114,115,116,97,121,107,105,108,108,116,104,97,116,102,97,108,108,97, -117,116,111,101,118,101,114,46,99,111,109,116,97,108,107,115,104,111,112,118,111 -,116,101,100,101,101,112,109,111,100,101,114,101,115,116,116,117,114,110,98,111, -114,110,98,97,110,100,102,101,108,108,114,111,115,101,117,114,108,40,115,107,105 -,110,114,111,108,101,99,111,109,101,97,99,116,115,97,103,101,115,109,101,101,116 -,103,111,108,100,46,106,112,103,105,116,101,109,118,97,114,121,102,101,108,116, -116,104,101,110,115,101,110,100,100,114,111,112,86,105,101,119,99,111,112,121,49 -,46,48,34,60,47,97,62,115,116,111,112,101,108,115,101,108,105,101,115,116,111, -117,114,112,97,99,107,46,103,105,102,112,97,115,116,99,115,115,63,103,114,97,121 -,109,101,97,110,38,103,116,59,114,105,100,101,115,104,111,116,108,97,116,101,115 -,97,105,100,114,111,97,100,118,97,114,32,102,101,101,108,106,111,104,110,114,105 -,99,107,112,111,114,116,102,97,115,116,39,85,65,45,100,101,97,100,60,47,98,62, -112,111,111,114,98,105,108,108,116,121,112,101,85,46,83,46,119,111,111,100,109, -117,115,116,50,112,120,59,73,110,102,111,114,97,110,107,119,105,100,101,119,97, -110,116,119,97,108,108,108,101,97,100,91,48,93,59,112,97,117,108,119,97,118,101, -115,117,114,101,36,40,39,35,119,97,105,116,109,97,115,115,97,114,109,115,103,111 -,101,115,103,97,105,110,108,97,110,103,112,97,105,100,33,45,45,32,108,111,99,107 -,117,110,105,116,114,111,111,116,119,97,108,107,102,105,114,109,119,105,102,101, -120,109,108,34,115,111,110,103,116,101,115,116,50,48,112,120,107,105,110,100,114 -,111,119,115,116,111,111,108,102,111,110,116,109,97,105,108,115,97,102,101,115, -116,97,114,109,97,112,115,99,111,114,101,114,97,105,110,102,108,111,119,98,97,98 -,121,115,112,97,110,115,97,121,115,52,112,120,59,54,112,120,59,97,114,116,115, -102,111,111,116,114,101,97,108,119,105,107,105,104,101,97,116,115,116,101,112, -116,114,105,112,111,114,103,47,108,97,107,101,119,101,97,107,116,111,108,100,70, -111,114,109,99,97,115,116,102,97,110,115,98,97,110,107,118,101,114,121,114,117, -110,115,106,117,108,121,116,97,115,107,49,112,120,59,103,111,97,108,103,114,101, -119,115,108,111,119,101,100,103,101,105,100,61,34,115,101,116,115,53,112,120,59, -46,106,115,63,52,48,112,120,105,102,32,40,115,111,111,110,115,101,97,116,110,111 -,110,101,116,117,98,101,122,101,114,111,115,101,110,116,114,101,101,100,102,97, -99,116,105,110,116,111,103,105,102,116,104,97,114,109,49,56,112,120,99,97,109, -101,104,105,108,108,98,111,108,100,122,111,111,109,118,111,105,100,101,97,115, -121,114,105,110,103,102,105,108,108,112,101,97,107,105,110,105,116,99,111,115, -116,51,112,120,59,106,97,99,107,116,97,103,115,98,105,116,115,114,111,108,108, -101,100,105,116,107,110,101,119,110,101,97,114,60,33,45,45,103,114,111,119,74,83 -,79,78,100,117,116,121,78,97,109,101,115,97,108,101,121,111,117,32,108,111,116, -115,112,97,105,110,106,97,122,122,99,111,108,100,101,121,101,115,102,105,115,104 -,119,119,119,46,114,105,115,107,116,97,98,115,112,114,101,118,49,48,112,120,114, -105,115,101,50,53,112,120,66,108,117,101,100,105,110,103,51,48,48,44,98,97,108, -108,102,111,114,100,101,97,114,110,119,105,108,100,98,111,120,46,102,97,105,114, -108,97,99,107,118,101,114,115,112,97,105,114,106,117,110,101,116,101,99,104,105, -102,40,33,112,105,99,107,101,118,105,108,36,40,34,35,119,97,114,109,108,111,114, -100,100,111,101,115,112,117,108,108,44,48,48,48,105,100,101,97,100,114,97,119, -104,117,103,101,115,112,111,116,102,117,110,100,98,117,114,110,104,114,101,102, -99,101,108,108,107,101,121,115,116,105,99,107,104,111,117,114,108,111,115,115, -102,117,101,108,49,50,112,120,115,117,105,116,100,101,97,108,82,83,83,34,97,103, -101,100,103,114,101,121,71,69,84,34,101,97,115,101,97,105,109,115,103,105,114, -108,97,105,100,115,56,112,120,59,110,97,118,121,103,114,105,100,116,105,112,115, -35,57,57,57,119,97,114,115,108,97,100,121,99,97,114,115,41,59,32,125,112,104,112 -,63,104,101,108,108,116,97,108,108,119,104,111,109,122,104,58,229,42,47,13,10,32 -,49,48,48,104,97,108,108,46,10,10,65,55,112,120,59,112,117,115,104,99,104,97,116 -,48,112,120,59,99,114,101,119,42,47,60,47,104,97,115,104,55,53,112,120,102,108, -97,116,114,97,114,101,32,38,38,32,116,101,108,108,99,97,109,112,111,110,116,111, -108,97,105,100,109,105,115,115,115,107,105,112,116,101,110,116,102,105,110,101, -109,97,108,101,103,101,116,115,112,108,111,116,52,48,48,44,13,10,13,10,99,111, -111,108,102,101,101,116,46,112,104,112,60,98,114,62,101,114,105,99,109,111,115, -116,103,117,105,100,98,101,108,108,100,101,115,99,104,97,105,114,109,97,116,104, -97,116,111,109,47,105,109,103,38,35,56,50,108,117,99,107,99,101,110,116,48,48,48 -,59,116,105,110,121,103,111,110,101,104,116,109,108,115,101,108,108,100,114,117, -103,70,82,69,69,110,111,100,101,110,105,99,107,63,105,100,61,108,111,115,101,110 -,117,108,108,118,97,115,116,119,105,110,100,82,83,83,32,119,101,97,114,114,101, -108,121,98,101,101,110,115,97,109,101,100,117,107,101,110,97,115,97,99,97,112, -101,119,105,115,104,103,117,108,102,84,50,51,58,104,105,116,115,115,108,111,116, -103,97,116,101,107,105,99,107,98,108,117,114,116,104,101,121,49,53,112,120,39,39 -,41,59,41,59,34,62,109,115,105,101,119,105,110,115,98,105,114,100,115,111,114, -116,98,101,116,97,115,101,101,107,84,49,56,58,111,114,100,115,116,114,101,101, -109,97,108,108,54,48,112,120,102,97,114,109,226,128,153,115,98,111,121,115,91,48 -,93,46,39,41,59,34,80,79,83,84,98,101,97,114,107,105,100,115,41,59,125,125,109, -97,114,121,116,101,110,100,40,85,75,41,113,117,97,100,122,104,58,230,45,115,105, -122,45,45,45,45,112,114,111,112,39,41,59,13,108,105,102,116,84,49,57,58,118,105, -99,101,97,110,100,121,100,101,98,116,62,82,83,83,112,111,111,108,110,101,99,107, -98,108,111,119,84,49,54,58,100,111,111,114,101,118,97,108,84,49,55,58,108,101, -116,115,102,97,105,108,111,114,97,108,112,111,108,108,110,111,118,97,99,111,108, -115,103,101,110,101,32,226,128,148,115,111,102,116,114,111,109,101,116,105,108, -108,114,111,115,115,60,104,51,62,112,111,117,114,102,97,100,101,112,105,110,107, -60,116,114,62,109,105,110,105,41,124,33,40,109,105,110,101,122,104,58,232,98,97, -114,115,104,101,97,114,48,48,41,59,109,105,108,107,32,45,45,62,105,114,111,110, -102,114,101,100,100,105,115,107,119,101,110,116,115,111,105,108,112,117,116,115, -47,106,115,47,104,111,108,121,84,50,50,58,73,83,66,78,84,50,48,58,97,100,97,109, -115,101,101,115,60,104,50,62,106,115,111,110,39,44,32,39,99,111,110,116,84,50,49 -,58,32,82,83,83,108,111,111,112,97,115,105,97,109,111,111,110,60,47,112,62,115, -111,117,108,76,73,78,69,102,111,114,116,99,97,114,116,84,49,52,58,60,104,49,62, -56,48,112,120,33,45,45,60,57,112,120,59,84,48,52,58,109,105,107,101,58,52,54,90, -110,105,99,101,105,110,99,104,89,111,114,107,114,105,99,101,122,104,58,228,39,41 -,41,59,112,117,114,101,109,97,103,101,112,97,114,97,116,111,110,101,98,111,110, -100,58,51,55,90,95,111,102,95,39,93,41,59,48,48,48,44,122,104,58,231,116,97,110, -107,121,97,114,100,98,111,119,108,98,117,115,104,58,53,54,90,74,97,118,97,51,48, -112,120,10,124,125,10,37,67,51,37,58,51,52,90,106,101,102,102,69,88,80,73,99,97, -115,104,118,105,115,97,103,111,108,102,115,110,111,119,122,104,58,233,113,117, -101,114,46,99,115,115,115,105,99,107,109,101,97,116,109,105,110,46,98,105,110, -100,100,101,108,108,104,105,114,101,112,105,99,115,114,101,110,116,58,51,54,90, -72,84,84,80,45,50,48,49,102,111,116,111,119,111,108,102,69,78,68,32,120,98,111, -120,58,53,52,90,66,79,68,89,100,105,99,107,59,10,125,10,101,120,105,116,58,51,53 -,90,118,97,114,115,98,101,97,116,39,125,41,59,100,105,101,116,57,57,57,59,97,110 -,110,101,125,125,60,47,91,105,93,46,76,97,110,103,107,109,194,178,119,105,114, -101,116,111,121,115,97,100,100,115,115,101,97,108,97,108,101,120,59,10,9,125,101 -,99,104,111,110,105,110,101,46,111,114,103,48,48,53,41,116,111,110,121,106,101, -119,115,115,97,110,100,108,101,103,115,114,111,111,102,48,48,48,41,32,50,48,48, -119,105,110,101,103,101,97,114,100,111,103,115,98,111,111,116,103,97,114,121,99, -117,116,115,116,121,108,101,116,101,109,112,116,105,111,110,46,120,109,108,99, -111,99,107,103,97,110,103,36,40,39,46,53,48,112,120,80,104,46,68,109,105,115,99, -97,108,97,110,108,111,97,110,100,101,115,107,109,105,108,101,114,121,97,110,117, -110,105,120,100,105,115,99,41,59,125,10,100,117,115,116,99,108,105,112,41,46,10, -10,55,48,112,120,45,50,48,48,68,86,68,115,55,93,62,60,116,97,112,101,100,101,109 -,111,105,43,43,41,119,97,103,101,101,117,114,111,112,104,105,108,111,112,116,115 -,104,111,108,101,70,65,81,115,97,115,105,110,45,50,54,84,108,97,98,115,112,101, -116,115,85,82,76,32,98,117,108,107,99,111,111,107,59,125,13,10,72,69,65,68,91,48 -,93,41,97,98,98,114,106,117,97,110,40,49,57,56,108,101,115,104,116,119,105,110, -60,47,105,62,115,111,110,121,103,117,121,115,102,117,99,107,112,105,112,101,124, -45,10,33,48,48,50,41,110,100,111,119,91,49,93,59,91,93,59,10,76,111,103,32,115, -97,108,116,13,10,9,9,98,97,110,103,116,114,105,109,98,97,116,104,41,123,13,10,48 -,48,112,120,10,125,41,59,107,111,58,236,102,101,101,115,97,100,62,13,115,58,47, -47,32,91,93,59,116,111,108,108,112,108,117,103,40,41,123,10,123,13,10,32,46,106, -115,39,50,48,48,112,100,117,97,108,98,111,97,116,46,74,80,71,41,59,10,125,113, -117,111,116,41,59,10,10,39,41,59,10,13,10,125,13,50,48,49,52,50,48,49,53,50,48, -49,54,50,48,49,55,50,48,49,56,50,48,49,57,50,48,50,48,50,48,50,49,50,48,50,50,50 -,48,50,51,50,48,50,52,50,48,50,53,50,48,50,54,50,48,50,55,50,48,50,56,50,48,50, -57,50,48,51,48,50,48,51,49,50,48,51,50,50,48,51,51,50,48,51,52,50,48,51,53,50,48 -,51,54,50,48,51,55,50,48,49,51,50,48,49,50,50,48,49,49,50,48,49,48,50,48,48,57, -50,48,48,56,50,48,48,55,50,48,48,54,50,48,48,53,50,48,48,52,50,48,48,51,50,48,48 -,50,50,48,48,49,50,48,48,48,49,57,57,57,49,57,57,56,49,57,57,55,49,57,57,54,49, -57,57,53,49,57,57,52,49,57,57,51,49,57,57,50,49,57,57,49,49,57,57,48,49,57,56,57 -,49,57,56,56,49,57,56,55,49,57,56,54,49,57,56,53,49,57,56,52,49,57,56,51,49,57, -56,50,49,57,56,49,49,57,56,48,49,57,55,57,49,57,55,56,49,57,55,55,49,57,55,54,49 -,57,55,53,49,57,55,52,49,57,55,51,49,57,55,50,49,57,55,49,49,57,55,48,49,57,54, -57,49,57,54,56,49,57,54,55,49,57,54,54,49,57,54,53,49,57,54,52,49,57,54,51,49,57 -,54,50,49,57,54,49,49,57,54,48,49,57,53,57,49,57,53,56,49,57,53,55,49,57,53,54, -49,57,53,53,49,57,53,52,49,57,53,51,49,57,53,50,49,57,53,49,49,57,53,48,49,48,48 -,48,49,48,50,52,49,51,57,52,48,48,48,48,57,57,57,57,99,111,109,111,109,195,161, -115,101,115,116,101,101,115,116,97,112,101,114,111,116,111,100,111,104,97,99,101 -,99,97,100,97,97,195,177,111,98,105,101,110,100,195,173,97,97,115,195,173,118, -105,100,97,99,97,115,111,111,116,114,111,102,111,114,111,115,111,108,111,111,116 -,114,97,99,117,97,108,100,105,106,111,115,105,100,111,103,114,97,110,116,105,112 -,111,116,101,109,97,100,101,98,101,97,108,103,111,113,117,195,169,101,115,116, -111,110,97,100,97,116,114,101,115,112,111,99,111,99,97,115,97,98,97,106,111,116, -111,100,97,115,105,110,111,97,103,117,97,112,117,101,115,117,110,111,115,97,110, -116,101,100,105,99,101,108,117,105,115,101,108,108,97,109,97,121,111,122,111,110 -,97,97,109,111,114,112,105,115,111,111,98,114,97,99,108,105,99,101,108,108,111, -100,105,111,115,104,111,114,97,99,97,115,105,208,183,208,176,208,189,208,176,208 -,190,208,188,209,128,208,176,209,128,209,131,209,130,208,176,208,189,208,181,208 -,191,208,190,208,190,209,130,208,184,208,183,208,189,208,190,208,180,208,190,209 -,130,208,190,208,182,208,181,208,190,208,189,208,184,209,133,208,157,208,176,208 -,181,208,181,208,177,209,139,208,188,209,139,208,146,209,139,209,129,208,190,208 -,178,209,139,208,178,208,190,208,157,208,190,208,190,208,177,208,159,208,190,208 -,187,208,184,208,189,208,184,208,160,208,164,208,157,208,181,208,156,209,139,209 -,130,209,139,208,158,208,189,208,184,208,188,208,180,208,176,208,151,208,176,208 -,148,208,176,208,157,209,131,208,158,208,177,209,130,208,181,208,152,208,183,208 -,181,208,185,208,189,209,131,208,188,208,188,208,162,209,139,209,131,208,182,217 -,129,217,138,216,163,217,134,217,133,216,167,217,133,216,185,217,131,217,132,216 -,163,217,136,216,177,216,175,217,138,216,167,217,129,217,137,217,135,217,136,217 -,132,217,133,217,132,217,131,216,167,217,136,217,132,217,135,216,168,216,179,216 -,167,217,132,216,165,217,134,217,135,217,138,216,163,217,138,217,130,216,175,217 -,135,217,132,216,171,217,133,216,168,217,135,217,132,217,136,217,132,217,138,216 -,168,217,132,216,167,217,138,216,168,217,131,216,180,217,138,216,167,217,133,216 -,163,217,133,217,134,216,170,216,168,217,138,217,132,217,134,216,173,216,168,217 -,135,217,133,217,133,216,180,217,136,216,180,102,105,114,115,116,118,105,100,101 -,111,108,105,103,104,116,119,111,114,108,100,109,101,100,105,97,119,104,105,116, -101,99,108,111,115,101,98,108,97,99,107,114,105,103,104,116,115,109,97,108,108, -98,111,111,107,115,112,108,97,99,101,109,117,115,105,99,102,105,101,108,100,111, -114,100,101,114,112,111,105,110,116,118,97,108,117,101,108,101,118,101,108,116, -97,98,108,101,98,111,97,114,100,104,111,117,115,101,103,114,111,117,112,119,111, -114,107,115,121,101,97,114,115,115,116,97,116,101,116,111,100,97,121,119,97,116, -101,114,115,116,97,114,116,115,116,121,108,101,100,101,97,116,104,112,111,119, -101,114,112,104,111,110,101,110,105,103,104,116,101,114,114,111,114,105,110,112, -117,116,97,98,111,117,116,116,101,114,109,115,116,105,116,108,101,116,111,111, -108,115,101,118,101,110,116,108,111,99,97,108,116,105,109,101,115,108,97,114,103 -,101,119,111,114,100,115,103,97,109,101,115,115,104,111,114,116,115,112,97,99, -101,102,111,99,117,115,99,108,101,97,114,109,111,100,101,108,98,108,111,99,107, -103,117,105,100,101,114,97,100,105,111,115,104,97,114,101,119,111,109,101,110,97 -,103,97,105,110,109,111,110,101,121,105,109,97,103,101,110,97,109,101,115,121, -111,117,110,103,108,105,110,101,115,108,97,116,101,114,99,111,108,111,114,103, -114,101,101,110,102,114,111,110,116,38,97,109,112,59,119,97,116,99,104,102,111, -114,99,101,112,114,105,99,101,114,117,108,101,115,98,101,103,105,110,97,102,116, -101,114,118,105,115,105,116,105,115,115,117,101,97,114,101,97,115,98,101,108,111 -,119,105,110,100,101,120,116,111,116,97,108,104,111,117,114,115,108,97,98,101, -108,112,114,105,110,116,112,114,101,115,115,98,117,105,108,116,108,105,110,107, -115,115,112,101,101,100,115,116,117,100,121,116,114,97,100,101,102,111,117,110, -100,115,101,110,115,101,117,110,100,101,114,115,104,111,119,110,102,111,114,109, -115,114,97,110,103,101,97,100,100,101,100,115,116,105,108,108,109,111,118,101, -100,116,97,107,101,110,97,98,111,118,101,102,108,97,115,104,102,105,120,101,100, -111,102,116,101,110,111,116,104,101,114,118,105,101,119,115,99,104,101,99,107, -108,101,103,97,108,114,105,118,101,114,105,116,101,109,115,113,117,105,99,107, -115,104,97,112,101,104,117,109,97,110,101,120,105,115,116,103,111,105,110,103, -109,111,118,105,101,116,104,105,114,100,98,97,115,105,99,112,101,97,99,101,115, -116,97,103,101,119,105,100,116,104,108,111,103,105,110,105,100,101,97,115,119, -114,111,116,101,112,97,103,101,115,117,115,101,114,115,100,114,105,118,101,115, -116,111,114,101,98,114,101,97,107,115,111,117,116,104,118,111,105,99,101,115,105 -,116,101,115,109,111,110,116,104,119,104,101,114,101,98,117,105,108,100,119,104, -105,99,104,101,97,114,116,104,102,111,114,117,109,116,104,114,101,101,115,112, -111,114,116,112,97,114,116,121,67,108,105,99,107,108,111,119,101,114,108,105,118 -,101,115,99,108,97,115,115,108,97,121,101,114,101,110,116,114,121,115,116,111, -114,121,117,115,97,103,101,115,111,117,110,100,99,111,117,114,116,121,111,117, -114,32,98,105,114,116,104,112,111,112,117,112,116,121,112,101,115,97,112,112,108 -,121,73,109,97,103,101,98,101,105,110,103,117,112,112,101,114,110,111,116,101, -115,101,118,101,114,121,115,104,111,119,115,109,101,97,110,115,101,120,116,114, -97,109,97,116,99,104,116,114,97,99,107,107,110,111,119,110,101,97,114,108,121,98 -,101,103,97,110,115,117,112,101,114,112,97,112,101,114,110,111,114,116,104,108, -101,97,114,110,103,105,118,101,110,110,97,109,101,100,101,110,100,101,100,84,101 -,114,109,115,112,97,114,116,115,71,114,111,117,112,98,114,97,110,100,117,115,105 -,110,103,119,111,109,97,110,102,97,108,115,101,114,101,97,100,121,97,117,100,105 -,111,116,97,107,101,115,119,104,105,108,101,46,99,111,109,47,108,105,118,101,100 -,99,97,115,101,115,100,97,105,108,121,99,104,105,108,100,103,114,101,97,116,106, -117,100,103,101,116,104,111,115,101,117,110,105,116,115,110,101,118,101,114,98, -114,111,97,100,99,111,97,115,116,99,111,118,101,114,97,112,112,108,101,102,105, -108,101,115,99,121,99,108,101,115,99,101,110,101,112,108,97,110,115,99,108,105, -99,107,119,114,105,116,101,113,117,101,101,110,112,105,101,99,101,101,109,97,105 -,108,102,114,97,109,101,111,108,100,101,114,112,104,111,116,111,108,105,109,105, -116,99,97,99,104,101,99,105,118,105,108,115,99,97,108,101,101,110,116,101,114, -116,104,101,109,101,116,104,101,114,101,116,111,117,99,104,98,111,117,110,100, -114,111,121,97,108,97,115,107,101,100,119,104,111,108,101,115,105,110,99,101,115 -,116,111,99,107,32,110,97,109,101,102,97,105,116,104,104,101,97,114,116,101,109, -112,116,121,111,102,102,101,114,115,99,111,112,101,111,119,110,101,100,109,105, -103,104,116,97,108,98,117,109,116,104,105,110,107,98,108,111,111,100,97,114,114, -97,121,109,97,106,111,114,116,114,117,115,116,99,97,110,111,110,117,110,105,111, -110,99,111,117,110,116,118,97,108,105,100,115,116,111,110,101,83,116,121,108,101 -,76,111,103,105,110,104,97,112,112,121,111,99,99,117,114,108,101,102,116,58,102, -114,101,115,104,113,117,105,116,101,102,105,108,109,115,103,114,97,100,101,110, -101,101,100,115,117,114,98,97,110,102,105,103,104,116,98,97,115,105,115,104,111, -118,101,114,97,117,116,111,59,114,111,117,116,101,46,104,116,109,108,109,105,120 -,101,100,102,105,110,97,108,89,111,117,114,32,115,108,105,100,101,116,111,112, -105,99,98,114,111,119,110,97,108,111,110,101,100,114,97,119,110,115,112,108,105, -116,114,101,97,99,104,82,105,103,104,116,100,97,116,101,115,109,97,114,99,104, -113,117,111,116,101,103,111,111,100,115,76,105,110,107,115,100,111,117,98,116,97 -,115,121,110,99,116,104,117,109,98,97,108,108,111,119,99,104,105,101,102,121,111 -,117,116,104,110,111,118,101,108,49,48,112,120,59,115,101,114,118,101,117,110, -116,105,108,104,97,110,100,115,67,104,101,99,107,83,112,97,99,101,113,117,101, -114,121,106,97,109,101,115,101,113,117,97,108,116,119,105,99,101,48,44,48,48,48, -83,116,97,114,116,112,97,110,101,108,115,111,110,103,115,114,111,117,110,100,101 -,105,103,104,116,115,104,105,102,116,119,111,114,116,104,112,111,115,116,115,108 -,101,97,100,115,119,101,101,107,115,97,118,111,105,100,116,104,101,115,101,109, -105,108,101,115,112,108,97,110,101,115,109,97,114,116,97,108,112,104,97,112,108, -97,110,116,109,97,114,107,115,114,97,116,101,115,112,108,97,121,115,99,108,97, -105,109,115,97,108,101,115,116,101,120,116,115,115,116,97,114,115,119,114,111, -110,103,60,47,104,51,62,116,104,105,110,103,46,111,114,103,47,109,117,108,116, -105,104,101,97,114,100,80,111,119,101,114,115,116,97,110,100,116,111,107,101,110 -,115,111,108,105,100,40,116,104,105,115,98,114,105,110,103,115,104,105,112,115, -115,116,97,102,102,116,114,105,101,100,99,97,108,108,115,102,117,108,108,121,102 -,97,99,116,115,97,103,101,110,116,84,104,105,115,32,47,47,45,45,62,97,100,109, -105,110,101,103,121,112,116,69,118,101,110,116,49,53,112,120,59,69,109,97,105, -108,116,114,117,101,34,99,114,111,115,115,115,112,101,110,116,98,108,111,103,115 -,98,111,120,34,62,110,111,116,101,100,108,101,97,118,101,99,104,105,110,97,115, -105,122,101,115,103,117,101,115,116,60,47,104,52,62,114,111,98,111,116,104,101, -97,118,121,116,114,117,101,44,115,101,118,101,110,103,114,97,110,100,99,114,105, -109,101,115,105,103,110,115,97,119,97,114,101,100,97,110,99,101,112,104,97,115, -101,62,60,33,45,45,101,110,95,85,83,38,35,51,57,59,50,48,48,112,120,95,110,97, -109,101,108,97,116,105,110,101,110,106,111,121,97,106,97,120,46,97,116,105,111, -110,115,109,105,116,104,85,46,83,46,32,104,111,108,100,115,112,101,116,101,114, -105,110,100,105,97,110,97,118,34,62,99,104,97,105,110,115,99,111,114,101,99,111, -109,101,115,100,111,105,110,103,112,114,105,111,114,83,104,97,114,101,49,57,57, -48,115,114,111,109,97,110,108,105,115,116,115,106,97,112,97,110,102,97,108,108, -115,116,114,105,97,108,111,119,110,101,114,97,103,114,101,101,60,47,104,50,62,97 -,98,117,115,101,97,108,101,114,116,111,112,101,114,97,34,45,47,47,87,99,97,114, -100,115,104,105,108,108,115,116,101,97,109,115,80,104,111,116,111,116,114,117, -116,104,99,108,101,97,110,46,112,104,112,63,115,97,105,110,116,109,101,116,97, -108,108,111,117,105,115,109,101,97,110,116,112,114,111,111,102,98,114,105,101, -102,114,111,119,34,62,103,101,110,114,101,116,114,117,99,107,108,111,111,107,115 -,86,97,108,117,101,70,114,97,109,101,46,110,101,116,47,45,45,62,10,60,116,114, -121,32,123,10,118,97,114,32,109,97,107,101,115,99,111,115,116,115,112,108,97,105 -,110,97,100,117,108,116,113,117,101,115,116,116,114,97,105,110,108,97,98,111,114 -,104,101,108,112,115,99,97,117,115,101,109,97,103,105,99,109,111,116,111,114,116 -,104,101,105,114,50,53,48,112,120,108,101,97,115,116,115,116,101,112,115,67,111, -117,110,116,99,111,117,108,100,103,108,97,115,115,115,105,100,101,115,102,117, -110,100,115,104,111,116,101,108,97,119,97,114,100,109,111,117,116,104,109,111, -118,101,115,112,97,114,105,115,103,105,118,101,115,100,117,116,99,104,116,101, -120,97,115,102,114,117,105,116,110,117,108,108,44,124,124,91,93,59,116,111,112, -34,62,10,60,33,45,45,80,79,83,84,34,111,99,101,97,110,60,98,114,47,62,102,108, -111,111,114,115,112,101,97,107,100,101,112,116,104,32,115,105,122,101,98,97,110, -107,115,99,97,116,99,104,99,104,97,114,116,50,48,112,120,59,97,108,105,103,110, -100,101,97,108,115,119,111,117,108,100,53,48,112,120,59,117,114,108,61,34,112,97 -,114,107,115,109,111,117,115,101,77,111,115,116,32,46,46,46,60,47,97,109,111,110 -,103,98,114,97,105,110,98,111,100,121,32,110,111,110,101,59,98,97,115,101,100,99 -,97,114,114,121,100,114,97,102,116,114,101,102,101,114,112,97,103,101,95,104,111 -,109,101,46,109,101,116,101,114,100,101,108,97,121,100,114,101,97,109,112,114, -111,118,101,106,111,105,110,116,60,47,116,114,62,100,114,117,103,115,60,33,45,45 -,32,97,112,114,105,108,105,100,101,97,108,97,108,108,101,110,101,120,97,99,116, -102,111,114,116,104,99,111,100,101,115,108,111,103,105,99,86,105,101,119,32,115, -101,101,109,115,98,108,97,110,107,112,111,114,116,115,32,40,50,48,48,115,97,118, -101,100,95,108,105,110,107,103,111,97,108,115,103,114,97,110,116,103,114,101,101 -,107,104,111,109,101,115,114,105,110,103,115,114,97,116,101,100,51,48,112,120,59 -,119,104,111,115,101,112,97,114,115,101,40,41,59,34,32,66,108,111,99,107,108,105 -,110,117,120,106,111,110,101,115,112,105,120,101,108,39,41,59,34,62,41,59,105, -102,40,45,108,101,102,116,100,97,118,105,100,104,111,114,115,101,70,111,99,117, -115,114,97,105,115,101,98,111,120,101,115,84,114,97,99,107,101,109,101,110,116, -60,47,101,109,62,98,97,114,34,62,46,115,114,99,61,116,111,119,101,114,97,108,116 -,61,34,99,97,98,108,101,104,101,110,114,121,50,52,112,120,59,115,101,116,117,112 -,105,116,97,108,121,115,104,97,114,112,109,105,110,111,114,116,97,115,116,101, -119,97,110,116,115,116,104,105,115,46,114,101,115,101,116,119,104,101,101,108, -103,105,114,108,115,47,99,115,115,47,49,48,48,37,59,99,108,117,98,115,115,116, -117,102,102,98,105,98,108,101,118,111,116,101,115,32,49,48,48,48,107,111,114,101 -,97,125,41,59,13,10,98,97,110,100,115,113,117,101,117,101,61,32,123,125,59,56,48 -,112,120,59,99,107,105,110,103,123,13,10,9,9,97,104,101,97,100,99,108,111,99,107 -,105,114,105,115,104,108,105,107,101,32,114,97,116,105,111,115,116,97,116,115,70 -,111,114,109,34,121,97,104,111,111,41,91,48,93,59,65,98,111,117,116,102,105,110, -100,115,60,47,104,49,62,100,101,98,117,103,116,97,115,107,115,85,82,76,32,61,99, -101,108,108,115,125,41,40,41,59,49,50,112,120,59,112,114,105,109,101,116,101,108 -,108,115,116,117,114,110,115,48,120,54,48,48,46,106,112,103,34,115,112,97,105, -110,98,101,97,99,104,116,97,120,101,115,109,105,99,114,111,97,110,103,101,108,45 -,45,62,60,47,103,105,102,116,115,115,116,101,118,101,45,108,105,110,107,98,111, -100,121,46,125,41,59,10,9,109,111,117,110,116,32,40,49,57,57,70,65,81,60,47,114, -111,103,101,114,102,114,97,110,107,67,108,97,115,115,50,56,112,120,59,102,101, -101,100,115,60,104,49,62,60,115,99,111,116,116,116,101,115,116,115,50,50,112,120 -,59,100,114,105,110,107,41,32,124,124,32,108,101,119,105,115,115,104,97,108,108, -35,48,51,57,59,32,102,111,114,32,108,111,118,101,100,119,97,115,116,101,48,48, -112,120,59,106,97,58,227,130,115,105,109,111,110,60,102,111,110,116,114,101,112, -108,121,109,101,101,116,115,117,110,116,101,114,99,104,101,97,112,116,105,103, -104,116,66,114,97,110,100,41,32,33,61,32,100,114,101,115,115,99,108,105,112,115, -114,111,111,109,115,111,110,107,101,121,109,111,98,105,108,109,97,105,110,46,78, -97,109,101,32,112,108,97,116,101,102,117,110,110,121,116,114,101,101,115,99,111, -109,47,34,49,46,106,112,103,119,109,111,100,101,112,97,114,97,109,83,84,65,82,84 -,108,101,102,116,32,105,100,100,101,110,44,32,50,48,49,41,59,10,125,10,102,111, -114,109,46,118,105,114,117,115,99,104,97,105,114,116,114,97,110,115,119,111,114, -115,116,80,97,103,101,115,105,116,105,111,110,112,97,116,99,104,60,33,45,45,10, -111,45,99,97,99,102,105,114,109,115,116,111,117,114,115,44,48,48,48,32,97,115, -105,97,110,105,43,43,41,123,97,100,111,98,101,39,41,91,48,93,105,100,61,49,48,98 -,111,116,104,59,109,101,110,117,32,46,50,46,109,105,46,112,110,103,34,107,101, -118,105,110,99,111,97,99,104,67,104,105,108,100,98,114,117,99,101,50,46,106,112, -103,85,82,76,41,43,46,106,112,103,124,115,117,105,116,101,115,108,105,99,101,104 -,97,114,114,121,49,50,48,34,32,115,119,101,101,116,116,114,62,13,10,110,97,109, -101,61,100,105,101,103,111,112,97,103,101,32,115,119,105,115,115,45,45,62,10,10, -35,102,102,102,59,34,62,76,111,103,46,99,111,109,34,116,114,101,97,116,115,104, -101,101,116,41,32,38,38,32,49,52,112,120,59,115,108,101,101,112,110,116,101,110, -116,102,105,108,101,100,106,97,58,227,131,105,100,61,34,99,78,97,109,101,34,119, -111,114,115,101,115,104,111,116,115,45,98,111,120,45,100,101,108,116,97,10,38, -108,116,59,98,101,97,114,115,58,52,56,90,60,100,97,116,97,45,114,117,114,97,108, -60,47,97,62,32,115,112,101,110,100,98,97,107,101,114,115,104,111,112,115,61,32, -34,34,59,112,104,112,34,62,99,116,105,111,110,49,51,112,120,59,98,114,105,97,110 -,104,101,108,108,111,115,105,122,101,61,111,61,37,50,70,32,106,111,105,110,109, -97,121,98,101,60,105,109,103,32,105,109,103,34,62,44,32,102,106,115,105,109,103, -34,32,34,41,91,48,93,77,84,111,112,66,84,121,112,101,34,110,101,119,108,121,68, -97,110,115,107,99,122,101,99,104,116,114,97,105,108,107,110,111,119,115,60,47, -104,53,62,102,97,113,34,62,122,104,45,99,110,49,48,41,59,10,45,49,34,41,59,116, -121,112,101,61,98,108,117,101,115,116,114,117,108,121,100,97,118,105,115,46,106, -115,39,59,62,13,10,60,33,115,116,101,101,108,32,121,111,117,32,104,50,62,13,10, -102,111,114,109,32,106,101,115,117,115,49,48,48,37,32,109,101,110,117,46,13,10,9 -,13,10,119,97,108,101,115,114,105,115,107,115,117,109,101,110,116,100,100,105, -110,103,98,45,108,105,107,116,101,97,99,104,103,105,102,34,32,118,101,103,97,115 -,100,97,110,115,107,101,101,115,116,105,115,104,113,105,112,115,117,111,109,105, -115,111,98,114,101,100,101,115,100,101,101,110,116,114,101,116,111,100,111,115, -112,117,101,100,101,97,195,177,111,115,101,115,116,195,161,116,105,101,110,101, -104,97,115,116,97,111,116,114,111,115,112,97,114,116,101,100,111,110,100,101,110 -,117,101,118,111,104,97,99,101,114,102,111,114,109,97,109,105,115,109,111,109, -101,106,111,114,109,117,110,100,111,97,113,117,195,173,100,195,173,97,115,115, -195,179,108,111,97,121,117,100,97,102,101,99,104,97,116,111,100,97,115,116,97, -110,116,111,109,101,110,111,115,100,97,116,111,115,111,116,114,97,115,115,105, -116,105,111,109,117,99,104,111,97,104,111,114,97,108,117,103,97,114,109,97,121, -111,114,101,115,116,111,115,104,111,114,97,115,116,101,110,101,114,97,110,116, -101,115,102,111,116,111,115,101,115,116,97,115,112,97,195,173,115,110,117,101, -118,97,115,97,108,117,100,102,111,114,111,115,109,101,100,105,111,113,117,105, -101,110,109,101,115,101,115,112,111,100,101,114,99,104,105,108,101,115,101,114, -195,161,118,101,99,101,115,100,101,99,105,114,106,111,115,195,169,101,115,116,97 -,114,118,101,110,116,97,103,114,117,112,111,104,101,99,104,111,101,108,108,111, -115,116,101,110,103,111,97,109,105,103,111,99,111,115,97,115,110,105,118,101,108 -,103,101,110,116,101,109,105,115,109,97,97,105,114,101,115,106,117,108,105,111, -116,101,109,97,115,104,97,99,105,97,102,97,118,111,114,106,117,110,105,111,108, -105,98,114,101,112,117,110,116,111,98,117,101,110,111,97,117,116,111,114,97,98, -114,105,108,98,117,101,110,97,116,101,120,116,111,109,97,114,122,111,115,97,98, -101,114,108,105,115,116,97,108,117,101,103,111,99,195,179,109,111,101,110,101, -114,111,106,117,101,103,111,112,101,114,195,186,104,97,98,101,114,101,115,116, -111,121,110,117,110,99,97,109,117,106,101,114,118,97,108,111,114,102,117,101,114 -,97,108,105,98,114,111,103,117,115,116,97,105,103,117,97,108,118,111,116,111,115 -,99,97,115,111,115,103,117,195,173,97,112,117,101,100,111,115,111,109,111,115,97 -,118,105,115,111,117,115,116,101,100,100,101,98,101,110,110,111,99,104,101,98, -117,115,99,97,102,97,108,116,97,101,117,114,111,115,115,101,114,105,101,100,105, -99,104,111,99,117,114,115,111,99,108,97,118,101,99,97,115,97,115,108,101,195,179 -,110,112,108,97,122,111,108,97,114,103,111,111,98,114,97,115,118,105,115,116,97, -97,112,111,121,111,106,117,110,116,111,116,114,97,116,97,118,105,115,116,111,99, -114,101,97,114,99,97,109,112,111,104,101,109,111,115,99,105,110,99,111,99,97,114 -,103,111,112,105,115,111,115,111,114,100,101,110,104,97,99,101,110,195,161,114, -101,97,100,105,115,99,111,112,101,100,114,111,99,101,114,99,97,112,117,101,100, -97,112,97,112,101,108,109,101,110,111,114,195,186,116,105,108,99,108,97,114,111, -106,111,114,103,101,99,97,108,108,101,112,111,110,101,114,116,97,114,100,101,110 -,97,100,105,101,109,97,114,99,97,115,105,103,117,101,101,108,108,97,115,115,105, -103,108,111,99,111,99,104,101,109,111,116,111,115,109,97,100,114,101,99,108,97, -115,101,114,101,115,116,111,110,105,195,177,111,113,117,101,100,97,112,97,115,97 -,114,98,97,110,99,111,104,105,106,111,115,118,105,97,106,101,112,97,98,108,111, -195,169,115,116,101,118,105,101,110,101,114,101,105,110,111,100,101,106,97,114, -102,111,110,100,111,99,97,110,97,108,110,111,114,116,101,108,101,116,114,97,99, -97,117,115,97,116,111,109,97,114,109,97,110,111,115,108,117,110,101,115,97,117, -116,111,115,118,105,108,108,97,118,101,110,100,111,112,101,115,97,114,116,105, -112,111,115,116,101,110,103,97,109,97,114,99,111,108,108,101,118,97,112,97,100, -114,101,117,110,105,100,111,118,97,109,111,115,122,111,110,97,115,97,109,98,111, -115,98,97,110,100,97,109,97,114,105,97,97,98,117,115,111,109,117,99,104,97,115, -117,98,105,114,114,105,111,106,97,118,105,118,105,114,103,114,97,100,111,99,104, -105,99,97,97,108,108,195,173,106,111,118,101,110,100,105,99,104,97,101,115,116, -97,110,116,97,108,101,115,115,97,108,105,114,115,117,101,108,111,112,101,115,111 -,115,102,105,110,101,115,108,108,97,109,97,98,117,115,99,111,195,169,115,116,97, -108,108,101,103,97,110,101,103,114,111,112,108,97,122,97,104,117,109,111,114,112 -,97,103,97,114,106,117,110,116,97,100,111,98,108,101,105,115,108,97,115,98,111, -108,115,97,98,97,195,177,111,104,97,98,108,97,108,117,99,104,97,195,129,114,101, -97,100,105,99,101,110,106,117,103,97,114,110,111,116,97,115,118,97,108,108,101, -97,108,108,195,161,99,97,114,103,97,100,111,108,111,114,97,98,97,106,111,101,115 -,116,195,169,103,117,115,116,111,109,101,110,116,101,109,97,114,105,111,102,105, -114,109,97,99,111,115,116,111,102,105,99,104,97,112,108,97,116,97,104,111,103,97 -,114,97,114,116,101,115,108,101,121,101,115,97,113,117,101,108,109,117,115,101, -111,98,97,115,101,115,112,111,99,111,115,109,105,116,97,100,99,105,101,108,111, -99,104,105,99,111,109,105,101,100,111,103,97,110,97,114,115,97,110,116,111,101, -116,97,112,97,100,101,98,101,115,112,108,97,121,97,114,101,100,101,115,115,105, -101,116,101,99,111,114,116,101,99,111,114,101,97,100,117,100,97,115,100,101,115, -101,111,118,105,101,106,111,100,101,115,101,97,97,103,117,97,115,38,113,117,111, -116,59,100,111,109,97,105,110,99,111,109,109,111,110,115,116,97,116,117,115,101, -118,101,110,116,115,109,97,115,116,101,114,115,121,115,116,101,109,97,99,116,105 -,111,110,98,97,110,110,101,114,114,101,109,111,118,101,115,99,114,111,108,108, -117,112,100,97,116,101,103,108,111,98,97,108,109,101,100,105,117,109,102,105,108 -,116,101,114,110,117,109,98,101,114,99,104,97,110,103,101,114,101,115,117,108, -116,112,117,98,108,105,99,115,99,114,101,101,110,99,104,111,111,115,101,110,111, -114,109,97,108,116,114,97,118,101,108,105,115,115,117,101,115,115,111,117,114,99 -,101,116,97,114,103,101,116,115,112,114,105,110,103,109,111,100,117,108,101,109, -111,98,105,108,101,115,119,105,116,99,104,112,104,111,116,111,115,98,111,114,100 -,101,114,114,101,103,105,111,110,105,116,115,101,108,102,115,111,99,105,97,108, -97,99,116,105,118,101,99,111,108,117,109,110,114,101,99,111,114,100,102,111,108, -108,111,119,116,105,116,108,101,62,101,105,116,104,101,114,108,101,110,103,116, -104,102,97,109,105,108,121,102,114,105,101,110,100,108,97,121,111,117,116,97,117 -,116,104,111,114,99,114,101,97,116,101,114,101,118,105,101,119,115,117,109,109, -101,114,115,101,114,118,101,114,112,108,97,121,101,100,112,108,97,121,101,114, -101,120,112,97,110,100,112,111,108,105,99,121,102,111,114,109,97,116,100,111,117 -,98,108,101,112,111,105,110,116,115,115,101,114,105,101,115,112,101,114,115,111, -110,108,105,118,105,110,103,100,101,115,105,103,110,109,111,110,116,104,115,102, -111,114,99,101,115,117,110,105,113,117,101,119,101,105,103,104,116,112,101,111, -112,108,101,101,110,101,114,103,121,110,97,116,117,114,101,115,101,97,114,99,104 -,102,105,103,117,114,101,104,97,118,105,110,103,99,117,115,116,111,109,111,102, -102,115,101,116,108,101,116,116,101,114,119,105,110,100,111,119,115,117,98,109, -105,116,114,101,110,100,101,114,103,114,111,117,112,115,117,112,108,111,97,100, -104,101,97,108,116,104,109,101,116,104,111,100,118,105,100,101,111,115,115,99, -104,111,111,108,102,117,116,117,114,101,115,104,97,100,111,119,100,101,98,97,116 -,101,118,97,108,117,101,115,79,98,106,101,99,116,111,116,104,101,114,115,114,105 -,103,104,116,115,108,101,97,103,117,101,99,104,114,111,109,101,115,105,109,112, -108,101,110,111,116,105,99,101,115,104,97,114,101,100,101,110,100,105,110,103, -115,101,97,115,111,110,114,101,112,111,114,116,111,110,108,105,110,101,115,113, -117,97,114,101,98,117,116,116,111,110,105,109,97,103,101,115,101,110,97,98,108, -101,109,111,118,105,110,103,108,97,116,101,115,116,119,105,110,116,101,114,70, -114,97,110,99,101,112,101,114,105,111,100,115,116,114,111,110,103,114,101,112, -101,97,116,76,111,110,100,111,110,100,101,116,97,105,108,102,111,114,109,101,100 -,100,101,109,97,110,100,115,101,99,117,114,101,112,97,115,115,101,100,116,111, -103,103,108,101,112,108,97,99,101,115,100,101,118,105,99,101,115,116,97,116,105, -99,99,105,116,105,101,115,115,116,114,101,97,109,121,101,108,108,111,119,97,116, -116,97,99,107,115,116,114,101,101,116,102,108,105,103,104,116,104,105,100,100, -101,110,105,110,102,111,34,62,111,112,101,110,101,100,117,115,101,102,117,108, -118,97,108,108,101,121,99,97,117,115,101,115,108,101,97,100,101,114,115,101,99, -114,101,116,115,101,99,111,110,100,100,97,109,97,103,101,115,112,111,114,116,115 -,101,120,99,101,112,116,114,97,116,105,110,103,115,105,103,110,101,100,116,104, -105,110,103,115,101,102,102,101,99,116,102,105,101,108,100,115,115,116,97,116, -101,115,111,102,102,105,99,101,118,105,115,117,97,108,101,100,105,116,111,114, -118,111,108,117,109,101,82,101,112,111,114,116,109,117,115,101,117,109,109,111, -118,105,101,115,112,97,114,101,110,116,97,99,99,101,115,115,109,111,115,116,108, -121,109,111,116,104,101,114,34,32,105,100,61,34,109,97,114,107,101,116,103,114, -111,117,110,100,99,104,97,110,99,101,115,117,114,118,101,121,98,101,102,111,114, -101,115,121,109,98,111,108,109,111,109,101,110,116,115,112,101,101,99,104,109, -111,116,105,111,110,105,110,115,105,100,101,109,97,116,116,101,114,67,101,110, -116,101,114,111,98,106,101,99,116,101,120,105,115,116,115,109,105,100,100,108, -101,69,117,114,111,112,101,103,114,111,119,116,104,108,101,103,97,99,121,109,97, -110,110,101,114,101,110,111,117,103,104,99,97,114,101,101,114,97,110,115,119,101 -,114,111,114,105,103,105,110,112,111,114,116,97,108,99,108,105,101,110,116,115, -101,108,101,99,116,114,97,110,100,111,109,99,108,111,115,101,100,116,111,112,105 -,99,115,99,111,109,105,110,103,102,97,116,104,101,114,111,112,116,105,111,110, -115,105,109,112,108,121,114,97,105,115,101,100,101,115,99,97,112,101,99,104,111, -115,101,110,99,104,117,114,99,104,100,101,102,105,110,101,114,101,97,115,111,110 -,99,111,114,110,101,114,111,117,116,112,117,116,109,101,109,111,114,121,105,102, -114,97,109,101,112,111,108,105,99,101,109,111,100,101,108,115,78,117,109,98,101, -114,100,117,114,105,110,103,111,102,102,101,114,115,115,116,121,108,101,115,107, -105,108,108,101,100,108,105,115,116,101,100,99,97,108,108,101,100,115,105,108, -118,101,114,109,97,114,103,105,110,100,101,108,101,116,101,98,101,116,116,101, -114,98,114,111,119,115,101,108,105,109,105,116,115,71,108,111,98,97,108,115,105, -110,103,108,101,119,105,100,103,101,116,99,101,110,116,101,114,98,117,100,103, -101,116,110,111,119,114,97,112,99,114,101,100,105,116,99,108,97,105,109,115,101, -110,103,105,110,101,115,97,102,101,116,121,99,104,111,105,99,101,115,112,105,114 -,105,116,45,115,116,121,108,101,115,112,114,101,97,100,109,97,107,105,110,103, -110,101,101,100,101,100,114,117,115,115,105,97,112,108,101,97,115,101,101,120, -116,101,110,116,83,99,114,105,112,116,98,114,111,107,101,110,97,108,108,111,119, -115,99,104,97,114,103,101,100,105,118,105,100,101,102,97,99,116,111,114,109,101, -109,98,101,114,45,98,97,115,101,100,116,104,101,111,114,121,99,111,110,102,105, -103,97,114,111,117,110,100,119,111,114,107,101,100,104,101,108,112,101,100,67, -104,117,114,99,104,105,109,112,97,99,116,115,104,111,117,108,100,97,108,119,97, -121,115,108,111,103,111,34,32,98,111,116,116,111,109,108,105,115,116,34,62,41, -123,118,97,114,32,112,114,101,102,105,120,111,114,97,110,103,101,72,101,97,100, -101,114,46,112,117,115,104,40,99,111,117,112,108,101,103,97,114,100,101,110,98, -114,105,100,103,101,108,97,117,110,99,104,82,101,118,105,101,119,116,97,107,105, -110,103,118,105,115,105,111,110,108,105,116,116,108,101,100,97,116,105,110,103, -66,117,116,116,111,110,98,101,97,117,116,121,116,104,101,109,101,115,102,111,114 -,103,111,116,83,101,97,114,99,104,97,110,99,104,111,114,97,108,109,111,115,116, -108,111,97,100,101,100,67,104,97,110,103,101,114,101,116,117,114,110,115,116,114 -,105,110,103,114,101,108,111,97,100,77,111,98,105,108,101,105,110,99,111,109,101 -,115,117,112,112,108,121,83,111,117,114,99,101,111,114,100,101,114,115,118,105, -101,119,101,100,38,110,98,115,112,59,99,111,117,114,115,101,65,98,111,117,116,32 -,105,115,108,97,110,100,60,104,116,109,108,32,99,111,111,107,105,101,110,97,109, -101,61,34,97,109,97,122,111,110,109,111,100,101,114,110,97,100,118,105,99,101, -105,110,60,47,97,62,58,32,84,104,101,32,100,105,97,108,111,103,104,111,117,115, -101,115,66,69,71,73,78,32,77,101,120,105,99,111,115,116,97,114,116,115,99,101, -110,116,114,101,104,101,105,103,104,116,97,100,100,105,110,103,73,115,108,97,110 -,100,97,115,115,101,116,115,69,109,112,105,114,101,83,99,104,111,111,108,101,102 -,102,111,114,116,100,105,114,101,99,116,110,101,97,114,108,121,109,97,110,117,97 -,108,83,101,108,101,99,116,46,10,10,79,110,101,106,111,105,110,101,100,109,101, -110,117,34,62,80,104,105,108,105,112,97,119,97,114,100,115,104,97,110,100,108, -101,105,109,112,111,114,116,79,102,102,105,99,101,114,101,103,97,114,100,115,107 -,105,108,108,115,110,97,116,105,111,110,83,112,111,114,116,115,100,101,103,114, -101,101,119,101,101,107,108,121,32,40,101,46,103,46,98,101,104,105,110,100,100, -111,99,116,111,114,108,111,103,103,101,100,117,110,105,116,101,100,60,47,98,62, -60,47,98,101,103,105,110,115,112,108,97,110,116,115,97,115,115,105,115,116,97, -114,116,105,115,116,105,115,115,117,101,100,51,48,48,112,120,124,99,97,110,97, -100,97,97,103,101,110,99,121,115,99,104,101,109,101,114,101,109,97,105,110,66, -114,97,122,105,108,115,97,109,112,108,101,108,111,103,111,34,62,98,101,121,111, -110,100,45,115,99,97,108,101,97,99,99,101,112,116,115,101,114,118,101,100,109,97 -,114,105,110,101,70,111,111,116,101,114,99,97,109,101,114,97,60,47,104,49,62,10, -95,102,111,114,109,34,108,101,97,118,101,115,115,116,114,101,115,115,34,32,47,62 -,13,10,46,103,105,102,34,32,111,110,108,111,97,100,108,111,97,100,101,114,79,120 -,102,111,114,100,115,105,115,116,101,114,115,117,114,118,105,118,108,105,115,116 -,101,110,102,101,109,97,108,101,68,101,115,105,103,110,115,105,122,101,61,34,97, -112,112,101,97,108,116,101,120,116,34,62,108,101,118,101,108,115,116,104,97,110, -107,115,104,105,103,104,101,114,102,111,114,99,101,100,97,110,105,109,97,108,97, -110,121,111,110,101,65,102,114,105,99,97,97,103,114,101,101,100,114,101,99,101, -110,116,80,101,111,112,108,101,60,98,114,32,47,62,119,111,110,100,101,114,112, -114,105,99,101,115,116,117,114,110,101,100,124,124,32,123,125,59,109,97,105,110, -34,62,105,110,108,105,110,101,115,117,110,100,97,121,119,114,97,112,34,62,102,97 -,105,108,101,100,99,101,110,115,117,115,109,105,110,117,116,101,98,101,97,99,111 -,110,113,117,111,116,101,115,49,53,48,112,120,124,101,115,116,97,116,101,114,101 -,109,111,116,101,101,109,97,105,108,34,108,105,110,107,101,100,114,105,103,104, -116,59,115,105,103,110,97,108,102,111,114,109,97,108,49,46,104,116,109,108,115, -105,103,110,117,112,112,114,105,110,99,101,102,108,111,97,116,58,46,112,110,103, -34,32,102,111,114,117,109,46,65,99,99,101,115,115,112,97,112,101,114,115,115,111 -,117,110,100,115,101,120,116,101,110,100,72,101,105,103,104,116,115,108,105,100, -101,114,85,84,70,45,56,34,38,97,109,112,59,32,66,101,102,111,114,101,46,32,87, -105,116,104,115,116,117,100,105,111,111,119,110,101,114,115,109,97,110,97,103, -101,112,114,111,102,105,116,106,81,117,101,114,121,97,110,110,117,97,108,112,97, -114,97,109,115,98,111,117,103,104,116,102,97,109,111,117,115,103,111,111,103,108 -,101,108,111,110,103,101,114,105,43,43,41,32,123,105,115,114,97,101,108,115,97, -121,105,110,103,100,101,99,105,100,101,104,111,109,101,34,62,104,101,97,100,101, -114,101,110,115,117,114,101,98,114,97,110,99,104,112,105,101,99,101,115,98,108, -111,99,107,59,115,116,97,116,101,100,116,111,112,34,62,60,114,97,99,105,110,103, -114,101,115,105,122,101,45,45,38,103,116,59,112,97,99,105,116,121,115,101,120, -117,97,108,98,117,114,101,97,117,46,106,112,103,34,32,49,48,44,48,48,48,111,98, -116,97,105,110,116,105,116,108,101,115,97,109,111,117,110,116,44,32,73,110,99,46 -,99,111,109,101,100,121,109,101,110,117,34,32,108,121,114,105,99,115,116,111,100 -,97,121,46,105,110,100,101,101,100,99,111,117,110,116,121,95,108,111,103,111,46, -70,97,109,105,108,121,108,111,111,107,101,100,77,97,114,107,101,116,108,115,101, -32,105,102,80,108,97,121,101,114,116,117,114,107,101,121,41,59,118,97,114,32,102 -,111,114,101,115,116,103,105,118,105,110,103,101,114,114,111,114,115,68,111,109, -97,105,110,125,101,108,115,101,123,105,110,115,101,114,116,66,108,111,103,60,47, -102,111,111,116,101,114,108,111,103,105,110,46,102,97,115,116,101,114,97,103,101 -,110,116,115,60,98,111,100,121,32,49,48,112,120,32,48,112,114,97,103,109,97,102, -114,105,100,97,121,106,117,110,105,111,114,100,111,108,108,97,114,112,108,97,99, -101,100,99,111,118,101,114,115,112,108,117,103,105,110,53,44,48,48,48,32,112,97, -103,101,34,62,98,111,115,116,111,110,46,116,101,115,116,40,97,118,97,116,97,114, -116,101,115,116,101,100,95,99,111,117,110,116,102,111,114,117,109,115,115,99,104 -,101,109,97,105,110,100,101,120,44,102,105,108,108,101,100,115,104,97,114,101, -115,114,101,97,100,101,114,97,108,101,114,116,40,97,112,112,101,97,114,83,117,98 -,109,105,116,108,105,110,101,34,62,98,111,100,121,34,62,10,42,32,84,104,101,84, -104,111,117,103,104,115,101,101,105,110,103,106,101,114,115,101,121,78,101,119, -115,60,47,118,101,114,105,102,121,101,120,112,101,114,116,105,110,106,117,114, -121,119,105,100,116,104,61,67,111,111,107,105,101,83,84,65,82,84,32,97,99,114, -111,115,115,95,105,109,97,103,101,116,104,114,101,97,100,110,97,116,105,118,101, -112,111,99,107,101,116,98,111,120,34,62,10,83,121,115,116,101,109,32,68,97,118, -105,100,99,97,110,99,101,114,116,97,98,108,101,115,112,114,111,118,101,100,65, -112,114,105,108,32,114,101,97,108,108,121,100,114,105,118,101,114,105,116,101, -109,34,62,109,111,114,101,34,62,98,111,97,114,100,115,99,111,108,111,114,115,99, -97,109,112,117,115,102,105,114,115,116,32,124,124,32,91,93,59,109,101,100,105,97 -,46,103,117,105,116,97,114,102,105,110,105,115,104,119,105,100,116,104,58,115, -104,111,119,101,100,79,116,104,101,114,32,46,112,104,112,34,32,97,115,115,117, -109,101,108,97,121,101,114,115,119,105,108,115,111,110,115,116,111,114,101,115, -114,101,108,105,101,102,115,119,101,100,101,110,67,117,115,116,111,109,101,97, -115,105,108,121,32,121,111,117,114,32,83,116,114,105,110,103,10,10,87,104,105, -108,116,97,121,108,111,114,99,108,101,97,114,58,114,101,115,111,114,116,102,114, -101,110,99,104,116,104,111,117,103,104,34,41,32,43,32,34,60,98,111,100,121,62,98 -,117,121,105,110,103,98,114,97,110,100,115,77,101,109,98,101,114,110,97,109,101, -34,62,111,112,112,105,110,103,115,101,99,116,111,114,53,112,120,59,34,62,118,115 -,112,97,99,101,112,111,115,116,101,114,109,97,106,111,114,32,99,111,102,102,101, -101,109,97,114,116,105,110,109,97,116,117,114,101,104,97,112,112,101,110,60,47, -110,97,118,62,107,97,110,115,97,115,108,105,110,107,34,62,73,109,97,103,101,115, -61,102,97,108,115,101,119,104,105,108,101,32,104,115,112,97,99,101,48,38,97,109, -112,59,32,10,10,73,110,32,32,112,111,119,101,114,80,111,108,115,107,105,45,99, -111,108,111,114,106,111,114,100,97,110,66,111,116,116,111,109,83,116,97,114,116, -32,45,99,111,117,110,116,50,46,104,116,109,108,110,101,119,115,34,62,48,49,46, -106,112,103,79,110,108,105,110,101,45,114,105,103,104,116,109,105,108,108,101, -114,115,101,110,105,111,114,73,83,66,78,32,48,48,44,48,48,48,32,103,117,105,100, -101,115,118,97,108,117,101,41,101,99,116,105,111,110,114,101,112,97,105,114,46, -120,109,108,34,32,32,114,105,103,104,116,115,46,104,116,109,108,45,98,108,111,99 -,107,114,101,103,69,120,112,58,104,111,118,101,114,119,105,116,104,105,110,118, -105,114,103,105,110,112,104,111,110,101,115,60,47,116,114,62,13,117,115,105,110, -103,32,10,9,118,97,114,32,62,39,41,59,10,9,60,47,116,100,62,10,60,47,116,114,62, -10,98,97,104,97,115,97,98,114,97,115,105,108,103,97,108,101,103,111,109,97,103, -121,97,114,112,111,108,115,107,105,115,114,112,115,107,105,216,177,216,175,217, -136,228,184,173,230,150,135,231,174,128,228,189,147,231,185,129,233,171,148,228, -191,161,230,129,175,228,184,173,229,155,189,230,136,145,228,187,172,228,184,128, -228,184,170,229,133,172,229,143,184,231,174,161,231,144,134,232,174,186,229,157, -155,229,143,175,228,187,165,230,156,141,229,138,161,230,151,182,233,151,180,228, -184,170,228,186,186,228,186,167,229,147,129,232,135,170,229,183,177,228,188,129, -228,184,154,230,159,165,231,156,139,229,183,165,228,189,156,232,129,148,231,179, -187,230,178,161,230,156,137,231,189,145,231,171,153,230,137,128,230,156,137,232, -175,132,232,174,186,228,184,173,229,191,131,230,150,135,231,171,160,231,148,168, -230,136,183,233,166,150,233,161,181,228,189,156,232,128,133,230,138,128,230,156, -175,233,151,174,233,162,152,231,155,184,229,133,179,228,184,139,232,189,189,230, -144,156,231,180,162,228,189,191,231,148,168,232,189,175,228,187,182,229,156,168, -231,186,191,228,184,187,233,162,152,232,181,132,230,150,153,232,167,134,233,162, -145,229,155,158,229,164,141,230,179,168,229,134,140,231,189,145,231,187,156,230, -148,182,232,151,143,229,134,133,229,174,185,230,142,168,232,141,144,229,184,130, -229,156,186,230,182,136,230,129,175,231,169,186,233,151,180,229,143,145,229,184, -131,228,187,128,228,185,136,229,165,189,229,143,139,231,148,159,230,180,187,229, -155,190,231,137,135,229,143,145,229,177,149,229,166,130,230,158,156,230,137,139, -230,156,186,230,150,176,233,151,187,230,156,128,230,150,176,230,150,185,229,188, -143,229,140,151,228,186,172,230,143,144,228,190,155,229,133,179,228,186,142,230, -155,180,229,164,154,232,191,153,228,184,170,231,179,187,231,187,159,231,159,165, -233,129,147,230,184,184,230,136,143,229,185,191,229,145,138,229,133,182,228,187, -150,229,143,145,232,161,168,229,174,137,229,133,168,231,172,172,228,184,128,228, -188,154,229,145,152,232,191,155,232,161,140,231,130,185,229,135,187,231,137,136, -230,157,131,231,148,181,229,173,144,228,184,150,231,149,140,232,174,190,232,174, -161,229,133,141,232,180,185,230,149,153,232,130,178,229,138,160,229,133,165,230, -180,187,229,138,168,228,187,150,228,187,172,229,149,134,229,147,129,229,141,154, -229,174,162,231,142,176,229,156,168,228,184,138,230,181,183,229,166,130,228,189, -149,229,183,178,231,187,143,231,149,153,232,168,128,232,175,166,231,187,134,231, -164,190,229,140,186,231,153,187,229,189,149,230,156,172,231,171,153,233,156,128, -232,166,129,228,187,183,230,160,188,230,148,175,230,140,129,229,155,189,233,153, -133,233,147,190,230,142,165,229,155,189,229,174,182,229,187,186,232,174,190,230, -156,139,229,143,139,233,152,133,232,175,187,230,179,149,229,190,139,228,189,141, -231,189,174,231,187,143,230,181,142,233,128,137,230,139,169,232,191,153,230,160, -183,229,189,147,229,137,141,229,136,134,231,177,187,230,142,146,232,161,140,229, -155,160,228,184,186,228,186,164,230,152,147,230,156,128,229,144,142,233,159,179, -228,185,144,228,184,141,232,131,189,233,128,154,232,191,135,232,161,140,228,184, -154,231,167,145,230,138,128,229,143,175,232,131,189,232,174,190,229,164,135,229, -144,136,228,189,156,229,164,167,229,174,182,231,164,190,228,188,154,231,160,148, -231,169,182,228,184,147,228,184,154,229,133,168,233,131,168,233,161,185,231,155, -174,232,191,153,233,135,140,232,191,152,230,152,175,229,188,128,229,167,139,230, -131,133,229,134,181,231,148,181,232,132,145,230,150,135,228,187,182,229,147,129, -231,137,140,229,184,174,229,138,169,230,150,135,229,140,150,232,181,132,230,186, -144,229,164,167,229,173,166,229,173,166,228,185,160,229,156,176,229,157,128,230, -181,143,232,167,136,230,138,149,232,181,132,229,183,165,231,168,139,232,166,129, -230,177,130,230,128,142,228,185,136,230,151,182,229,128,153,229,138,159,232,131, -189,228,184,187,232,166,129,231,155,174,229,137,141,232,181,132,232,174,175,229, -159,142,229,184,130,230,150,185,230,179,149,231,148,181,229,189,177,230,139,155, -232,129,152,229,163,176,230,152,142,228,187,187,228,189,149,229,129,165,229,186, -183,230,149,176,230,141,174,231,190,142,229,155,189,230,177,189,232,189,166,228, -187,139,231,187,141,228,189,134,230,152,175,228,186,164,230,181,129,231,148,159, -228,186,167,230,137,128,228,187,165,231,148,181,232,175,157,230,152,190,231,164, -186,228,184,128,228,186,155,229,141,149,228,189,141,228,186,186,229,145,152,229, -136,134,230,158,144,229,156,176,229,155,190,230,151,133,230,184,184,229,183,165, -229,133,183,229,173,166,231,148,159,231,179,187,229,136,151,231,189,145,229,143, -139,229,184,150,229,173,144,229,175,134,231,160,129,233,162,145,233,129,147,230, -142,167,229,136,182,229,156,176,229,140,186,229,159,186,230,156,172,229,133,168, -229,155,189,231,189,145,228,184,138,233,135,141,232,166,129,231,172,172,228,186, -140,229,150,156,230,172,162,232,191,155,229,133,165,229,143,139,230,131,133,232, -191,153,228,186,155,232,128,131,232,175,149,229,143,145,231,142,176,229,159,185, -232,174,173,228,187,165,228,184,138,230,148,191,229,186,156,230,136,144,228,184, -186,231,142,175,229,162,131,233,166,153,230,184,175,229,144,140,230,151,182,229, -168,177,228,185,144,229,143,145,233,128,129,228,184,128,229,174,154,229,188,128, -229,143,145,228,189,156,229,147,129,230,160,135,229,135,134,230,172,162,232,191, -142,232,167,163,229,134,179,229,156,176,230,150,185,228,184,128,228,184,139,228, -187,165,229,143,138,232,180,163,228,187,187,230,136,150,232,128,133,229,174,162, -230,136,183,228,187,163,232,161,168,231,167,175,229,136,134,229,165,179,228,186, -186,230,149,176,231,160,129,233,148,128,229,148,174,229,135,186,231,142,176,231, -166,187,231,186,191,229,186,148,231,148,168,229,136,151,232,161,168,228,184,141, -229,144,140,231,188,150,232,190,145,231,187,159,232,174,161,230,159,165,232,175, -162,228,184,141,232,166,129,230,156,137,229,133,179,230,156,186,230,158,132,229, -190,136,229,164,154,230,146,173,230,148,190,231,187,132,231,187,135,230,148,191, -231,173,150,231,155,180,230,142,165,232,131,189,229,138,155,230,157,165,230,186, -144,230,153,130,233,150,147,231,156,139,229,136,176,231,131,173,233,151,168,229, -133,179,233,148,174,228,184,147,229,140,186,233,157,158,229,184,184,232,139,177, -232,175,173,231,153,190,229,186,166,229,184,140,230,156,155,231,190,142,229,165, -179,230,175,148,232,190,131,231,159,165,232,175,134,232,167,132,229,174,154,229, -187,186,232,174,174,233,131,168,233,151,168,230,132,143,232,167,129,231,178,190, -229,189,169,230,151,165,230,156,172,230,143,144,233,171,152,229,143,145,232,168, -128,230,150,185,233,157,162,229,159,186,233,135,145,229,164,132,231,144,134,230, -157,131,233,153,144,229,189,177,231,137,135,233,147,182,232,161,140,232,191,152, -230,156,137,229,136,134,228,186,171,231,137,169,229,147,129,231,187,143,232,144, -165,230,183,187,229,138,160,228,184,147,229,174,182,232,191,153,231,167,141,232, -175,157,233,162,152,232,181,183,230,157,165,228,184,154,229,138,161,229,133,172, -229,145,138,232,174,176,229,189,149,231,174,128,228,187,139,232,180,168,233,135, -143,231,148,183,228,186,186,229,189,177,229,147,141,229,188,149,231,148,168,230, -138,165,229,145,138,233,131,168,229,136,134,229,191,171,233,128,159,229,146,168, -232,175,162,230,151,182,229,176,154,230,179,168,230,132,143,231,148,179,232,175, -183,229,173,166,230,160,161,229,186,148,232,175,165,229,142,134,229,143,178,229, -143,170,230,152,175,232,191,148,229,155,158,232,180,173,228,185,176,229,144,141, -231,167,176,228,184,186,228,186,134,230,136,144,229,138,159,232,175,180,230,152, -142,228,190,155,229,186,148,229,173,169,229,173,144,228,184,147,233,162,152,231, -168,139,229,186,143,228,184,128,232,136,172,230,156,131,229,147,161,229,143,170, -230,156,137,229,133,182,229,174,131,228,191,157,230,138,164,232,128,140,228,184, -148,228,187,138,229,164,169,231,170,151,229,143,163,229,138,168,230,128,129,231, -138,182,230,128,129,231,137,185,229,136,171,232,174,164,228,184,186,229,191,133, -233,161,187,230,155,180,230,150,176,229,176,143,232,175,180,230,136,145,229,128, -145,228,189,156,228,184,186,229,170,146,228,189,147,229,140,133,230,139,172,233, -130,163,228,185,136,228,184,128,230,160,183,229,155,189,229,134,133,230,152,175, -229,144,166,230,160,185,230,141,174,231,148,181,232,167,134,229,173,166,233,153, -162,229,133,183,230,156,137,232,191,135,231,168,139,231,148,177,228,186,142,228, -186,186,230,137,141,229,135,186,230,157,165,228,184,141,232,191,135,230,173,163, -229,156,168,230,152,142,230,152,159,230,149,133,228,186,139,229,133,179,231,179, -187,230,160,135,233,162,152,229,149,134,229,138,161,232,190,147,229,133,165,228, -184,128,231,155,180,229,159,186,231,161,128,230,149,153,229,173,166,228,186,134, -232,167,163,229,187,186,231,173,145,231,187,147,230,158,156,229,133,168,231,144, -131,233,128,154,231,159,165,232,174,161,229,136,146,229,175,185,228,186,142,232, -137,186,230,156,175,231,155,184,229,134,140,229,143,145,231,148,159,231,156,159, -231,154,132,229,187,186,231,171,139,231,173,137,231,186,167,231,177,187,229,158, -139,231,187,143,233,170,140,229,174,158,231,142,176,229,136,182,228,189,156,230, -157,165,232,135,170,230,160,135,231,173,190,228,187,165,228,184,139,229,142,159, -229,136,155,230,151,160,230,179,149,229,133,182,228,184,173,229,128,139,228,186, -186,228,184,128,229,136,135,230,140,135,229,141,151,229,133,179,233,151,173,233, -155,134,229,155,162,231,172,172,228,184,137,229,133,179,230,179,168,229,155,160, -230,173,164,231,133,167,231,137,135,230,183,177,229,156,179,229,149,134,228,184, -154,229,185,191,229,183,158,230,151,165,230,156,159,233,171,152,231,186,167,230, -156,128,232,191,145,231,187,188,229,144,136,232,161,168,231,164,186,228,184,147, -232,190,145,232,161,140,228,184,186,228,186,164,233,128,154,232,175,132,228,187, -183,232,167,137,229,190,151,231,178,190,229,141,142,229,174,182,229,186,173,229, -174,140,230,136,144,230,132,159,232,167,137,229,174,137,232,163,133,229,190,151, -229,136,176,233,130,174,228,187,182,229,136,182,229,186,166,233,163,159,229,147, -129,232,153,189,231,132,182,232,189,172,232,189,189,230,138,165,228,187,183,232, -174,176,232,128,133,230,150,185,230,161,136,232,161,140,230,148,191,228,186,186, -230,176,145,231,148,168,229,147,129,228,184,156,232,165,191,230,143,144,229,135, -186,233,133,146,229,186,151,231,132,182,229,144,142,228,187,152,230,172,190,231, -131,173,231,130,185,228,187,165,229,137,141,229,174,140,229,133,168,229,143,145, -229,184,150,232,174,190,231,189,174,233,162,134,229,175,188,229,183,165,228,184, -154,229,140,187,233,153,162,231,156,139,231,156,139,231,187,143,229,133,184,229, -142,159,229,155,160,229,185,179,229,143,176,229,144,132,231,167,141,229,162,158, -229,138,160,230,157,144,230,150,153,230,150,176,229,162,158,228,185,139,229,144, -142,232,129,140,228,184,154,230,149,136,230,158,156,228,187,138,229,185,180,232, -174,186,230,150,135,230,136,145,229,155,189,229,145,138,232,175,137,231,137,136, -228,184,187,228,191,174,230,148,185,229,143,130,228,184,142,230,137,147,229,141, -176,229,191,171,228,185,144,230,156,186,230,162,176,232,167,130,231,130,185,229, -173,152,229,156,168,231,178,190,231,165,158,232,142,183,229,190,151,229,136,169, -231,148,168,231,187,167,231,187,173,228,189,160,228,187,172,232,191,153,228,185, -136,230,168,161,229,188,143,232,175,173,232,168,128,232,131,189,229,164,159,233, -155,133,232,153,142,230,147,141,228,189,156,233,163,142,230,160,188,228,184,128, -232,181,183,231,167,145,229,173,166,228,189,147,232,130,178,231,159,173,228,191, -161,230,157,161,228,187,182,230,178,187,231,150,151,232,191,144,229,138,168,228, -186,167,228,184,154,228,188,154,232,174,174,229,175,188,232,136,170,229,133,136, -231,148,159,232,129,148,231,155,159,229,143,175,230,152,175,229,149,143,233,161, -140,231,187,147,230,158,132,228,189,156,231,148,168,232,176,131,230,159,165,232, -179,135,230,150,153,232,135,170,229,138,168,232,180,159,232,180,163,229,134,156, -228,184,154,232,174,191,233,151,174,229,174,158,230,150,189,230,142,165,229,143, -151,232,174,168,232,174,186,233,130,163,228,184,170,229,143,141,233,166,136,229, -138,160,229,188,186,229,165,179,230,128,167,232,140,131,229,155,180,230,156,141, -229,139,153,228,188,145,233,151,178,228,187,138,230,151,165,229,174,162,230,156, -141,232,167,128,231,156,139,229,143,130,229,138,160,231,154,132,232,175,157,228, -184,128,231,130,185,228,191,157,232,175,129,229,155,190,228,185,166,230,156,137, -230,149,136,230,181,139,232,175,149,231,167,187,229,138,168,230,137,141,232,131, -189,229,134,179,229,174,154,232,130,161,231,165,168,228,184,141,230,150,173,233, -156,128,230,177,130,228,184,141,229,190,151,229,138,158,230,179,149,228,185,139, -233,151,180,233,135,135,231,148,168,232,144,165,233,148,128,230,138,149,232,175, -137,231,155,174,230,160,135,231,136,177,230,131,133,230,145,132,229,189,177,230, -156,137,228,186,155,232,164,135,232,163,189,230,150,135,229,173,166,230,156,186, -228,188,154,230,149,176,229,173,151,232,163,133,228,191,174,232,180,173,231,137, -169,229,134,156,230,157,145,229,133,168,233,157,162,231,178,190,229,147,129,229, -133,182,229,174,158,228,186,139,230,131,133,230,176,180,229,185,179,230,143,144, -231,164,186,228,184,138,229,184,130,232,176,162,232,176,162,230,153,174,233,128, -154,230,149,153,229,184,136,228,184,138,228,188,160,231,177,187,229,136,171,230, -173,140,230,155,178,230,139,165,230,156,137,229,136,155,230,150,176,233,133,141, -228,187,182,229,143,170,232,166,129,230,151,182,228,187,163,232,179,135,232,168, -138,232,190,190,229,136,176,228,186,186,231,148,159,232,174,162,233,152,133,232, -128,129,229,184,136,229,177,149,231,164,186,229,191,131,231,144,134,232,180,180, -229,173,144,231,182,178,231,171,153,228,184,187,233,161,140,232,135,170,231,132, -182,231,186,167,229,136,171,231,174,128,229,141,149,230,148,185,233,157,169,233, -130,163,228,186,155,230,157,165,232,175,180,230,137,147,229,188,128,228,187,163, -231,160,129,229,136,160,233,153,164,232,175,129,229,136,184,232,138,130,231,155, -174,233,135,141,231,130,185,230,172,161,230,149,184,229,164,154,229,176,145,232, -167,132,229,136,146,232,181,132,233,135,145,230,137,190,229,136,176,228,187,165, -229,144,142,229,164,167,229,133,168,228,184,187,233,161,181,230,156,128,228,189, -179,229,155,158,231,173,148,229,164,169,228,184,139,228,191,157,233,154,156,231, -142,176,228,187,163,230,163,128,230,159,165,230,138,149,231,165,168,229,176,143, -230,151,182,230,178,146,230,156,137,230,173,163,229,184,184,231,148,154,232,135, -179,228,187,163,231,144,134,231,155,174,229,189,149,229,133,172,229,188,128,229, -164,141,229,136,182,233,135,145,232,158,141,229,185,184,231,166,143,231,137,136, -230,156,172,229,189,162,230,136,144,229,135,134,229,164,135,232,161,140,230,131, -133,229,155,158,229,136,176,230,128,157,230,131,179,230,128,142,230,160,183,229, -141,143,232,174,174,232,174,164,232,175,129,230,156,128,229,165,189,228,186,167, -231,148,159,230,140,137,231,133,167,230,156,141,232,163,133,229,185,191,228,184, -156,229,138,168,230,188,171,233,135,135,232,180,173,230,150,176,230,137,139,231, -187,132,229,155,190,233,157,162,230,157,191,229,143,130,232,128,131,230,148,191, -230,178,187,229,174,185,230,152,147,229,164,169,229,156,176,229,138,170,229,138, -155,228,186,186,228,187,172,229,141,135,231,186,167,233,128,159,229,186,166,228, -186,186,231,137,169,232,176,131,230,149,180,230,181,129,232,161,140,233,128,160, -230,136,144,230,150,135,229,173,151,233,159,169,229,155,189,232,180,184,230,152, -147,229,188,128,229,177,149,231,155,184,233,151,156,232,161,168,231,142,176,229, -189,177,232,167,134,229,166,130,230,173,164,231,190,142,229,174,185,229,164,167, -229,176,143,230,138,165,233,129,147,230,157,161,230,172,190,229,191,131,230,131, -133,232,174,184,229,164,154,230,179,149,232,167,132,229,174,182,229,177,133,228, -185,166,229,186,151,232,191,158,230,142,165,231,171,139,229,141,179,228,184,190, -230,138,165,230,138,128,229,183,167,229,165,165,232,191,144,231,153,187,229,133, -165,228,187,165,230,157,165,231,144,134,232,174,186,228,186,139,228,187,182,232, -135,170,231,148,177,228,184,173,229,141,142,229,138,158,229,133,172,229,166,136, -229,166,136,231,156,159,230,173,163,228,184,141,233,148,153,229,133,168,230,150, -135,229,144,136,229,144,140,228,187,183,229,128,188,229,136,171,228,186,186,231, -155,145,231,157,163,229,133,183,228,189,147,228,184,150,231,186,170,229,155,162, -233,152,159,229,136,155,228,184,154,230,137,191,230,139,133,229,162,158,233,149, -191,230,156,137,228,186,186,228,191,157,230,140,129,229,149,134,229,174,182,231, -187,180,228,191,174,229,143,176,230,185,190,229,183,166,229,143,179,232,130,161, -228,187,189,231,173,148,230,161,136,229,174,158,233,153,133,231,148,181,228,191, -161,231,187,143,231,144,134,231,148,159,229,145,189,229,174,163,228,188,160,228, -187,187,229,138,161,230,173,163,229,188,143,231,137,185,232,137,178,228,184,139, -230,157,165,229,141,143,228,188,154,229,143,170,232,131,189,229,189,147,231,132, -182,233,135,141,230,150,176,229,133,167,229,174,185,230,140,135,229,175,188,232, -191,144,232,161,140,230,151,165,229,191,151,232,179,163,229,174,182,232,182,133, -232,191,135,229,156,159,229,156,176,230,181,153,230,177,159,230,148,175,228,187, -152,230,142,168,229,135,186,231,171,153,233,149,191,230,157,173,229,183,158,230, -137,167,232,161,140,229,136,182,233,128,160,228,185,139,228,184,128,230,142,168, -229,185,191,231,142,176,229,156,186,230,143,143,232,191,176,229,143,152,229,140, -150,228,188,160,231,187,159,230,173,140,230,137,139,228,191,157,233,153,169,232, -175,190,231,168,139,229,140,187,231,150,151,231,187,143,232,191,135,232,191,135, -229,142,187,228,185,139,229,137,141,230,148,182,229,133,165,229,185,180,229,186, -166,230,157,130,229,191,151,231,190,142,228,184,189,230,156,128,233,171,152,231, -153,187,233,153,134,230,156,170,230,157,165,229,138,160,229,183,165,229,133,141, -232,180,163,230,149,153,231,168,139,231,137,136,229,157,151,232,186,171,228,189, -147,233,135,141,229,186,134,229,135,186,229,148,174,230,136,144,230,156,172,229, -189,162,229,188,143,229,156,159,232,177,134,229,135,186,229,131,185,228,184,156, -230,150,185,233,130,174,231,174,177,229,141,151,228,186,172,230,177,130,232,129, -140,229,143,150,229,190,151,232,129,140,228,189,141,231,155,184,228,191,161,233, -161,181,233,157,162,229,136,134,233,146,159,231,189,145,233,161,181,231,161,174, -229,174,154,229,155,190,228,190,139,231,189,145,229,157,128,231,167,175,230,158, -129,233,148,153,232,175,175,231,155,174,231,154,132,229,174,157,232,180,157,230, -156,186,229,133,179,233,163,142,233,153,169,230,142,136,230,157,131,231,151,133, -230,175,146,229,174,160,231,137,169,233,153,164,228,186,134,232,169,149,232,171, -150,231,150,190,231,151,133,229,143,138,230,151,182,230,177,130,232,180,173,231, -171,153,231,130,185,229,132,191,231,171,165,230,175,143,229,164,169,228,184,173, -229,164,174,232,174,164,232,175,134,230,175,143,228,184,170,229,164,169,230,180, -165,229,173,151,228,189,147,229,143,176,231,129,163,231,187,180,230,138,164,230, -156,172,233,161,181,228,184,170,230,128,167,229,174,152,230,150,185,229,184,184, -232,167,129,231,155,184,230,156,186,230,136,152,231,149,165,229,186,148,229,189, -147,229,190,139,229,184,136,230,150,185,228,190,191,230,160,161,229,155,173,232, -130,161,229,184,130,230,136,191,229,177,139,230,160,143,231,155,174,229,145,152, -229,183,165,229,175,188,232,135,180,231,170,129,231,132,182,233,129,147,229,133, -183,230,156,172,231,189,145,231,187,147,229,144,136,230,161,163,230,161,136,229, -138,179,229,138,168,229,143,166,229,164,150,231,190,142,229,133,131,229,188,149, -232,181,183,230,148,185,229,143,152,231,172,172,229,155,155,228,188,154,232,174, -161,232,170,170,230,152,142,233,154,144,231,167,129,229,174,157,229,174,157,232, -167,132,232,140,131,230,182,136,232,180,185,229,133,177,229,144,140,229,191,152, -232,174,176,228,189,147,231,179,187,229,184,166,230,157,165,229,144,141,229,173, -151,231,153,188,232,161,168,229,188,128,230,148,190,229,138,160,231,155,159,229, -143,151,229,136,176,228,186,140,230,137,139,229,164,167,233,135,143,230,136,144, -228,186,186,230,149,176,233,135,143,229,133,177,228,186,171,229,140,186,229,159, -159,229,165,179,229,173,169,229,142,159,229,136,153,230,137,128,229,156,168,231, -187,147,230,157,159,233,128,154,228,191,161,232,182,133,231,186,167,233,133,141, -231,189,174,229,189,147,230,151,182,228,188,152,231,167,128,230,128,167,230,132, -159,230,136,191,228,186,167,233,129,138,230,136,178,229,135,186,229,143,163,230, -143,144,228,186,164,229,176,177,228,184,154,228,191,157,229,129,165,231,168,139, -229,186,166,229,143,130,230,149,176,228,186,139,228,184,154,230,149,180,228,184, -170,229,177,177,228,184,156,230,131,133,230,132,159,231,137,185,230,174,138,229, -136,134,233,161,158,230,144,156,229,176,139,229,177,158,228,186,142,233,151,168, -230,136,183,232,180,162,229,138,161,229,163,176,233,159,179,229,143,138,229,133, -182,232,180,162,231,187,143,229,157,154,230,140,129,229,185,178,233,131,168,230, -136,144,231,171,139,229,136,169,231,155,138,232,128,131,232,153,145,230,136,144, -233,131,189,229,140,133,232,163,133,231,148,168,230,136,182,230,175,148,232,181, -155,230,150,135,230,152,142,230,139,155,229,149,134,229,174,140,230,149,180,231, -156,159,230,152,175,231,156,188,231,157,155,228,188,153,228,188,180,229,168,129, -230,156,155,233,162,134,229,159,159,229,141,171,231,148,159,228,188,152,230,131, -160,232,171,150,229,163,135,229,133,172,229,133,177,232,137,175,229,165,189,229, -133,133,229,136,134,231,172,166,229,144,136,233,153,132,228,187,182,231,137,185, -231,130,185,228,184,141,229,143,175,232,139,177,230,150,135,232,181,132,228,186, -167,230,160,185,230,156,172,230,152,142,230,152,190,229,175,134,231,162,188,229, -133,172,228,188,151,230,176,145,230,151,143,230,155,180,229,138,160,228,186,171, -229,143,151,229,144,140,229,173,166,229,144,175,229,138,168,233,128,130,229,144, -136,229,142,159,230,157,165,233,151,174,231,173,148,230,156,172,230,150,135,231, -190,142,233,163,159,231,187,191,232,137,178,231,168,179,229,174,154,231,187,136, -228,186,142,231,148,159,231,137,169,228,190,155,230,177,130,230,144,156,231,139, -144,229,138,155,233,135,143,228,184,165,233,135,141,230,176,184,232,191,156,229, -134,153,231,156,159,230,156,137,233,153,144,231,171,158,228,186,137,229,175,185, -232,177,161,232,180,185,231,148,168,228,184,141,229,165,189,231,187,157,229,175, -185,229,141,129,229,136,134,228,191,131,232,191,155,231,130,185,232,175,132,229, -189,177,233,159,179,228,188,152,229,138,191,228,184,141,229,176,145,230,172,163, -232,181,143,229,185,182,228,184,148,230,156,137,231,130,185,230,150,185,229,144, -145,229,133,168,230,150,176,228,191,161,231,148,168,232,174,190,230,150,189,229, -189,162,232,177,161,232,181,132,230,160,188,231,170,129,231,160,180,233,154,143, -231,157,128,233,135,141,229,164,167,228,186,142,230,152,175,230,175,149,228,184, -154,230,153,186,232,131,189,229,140,150,229,183,165,229,174,140,231,190,142,229, -149,134,229,159,142,231,187,159,228,184,128,229,135,186,231,137,136,230,137,147, -233,128,160,231,148,162,229,147,129,230,166,130,229,134,181,231,148,168,228,186, -142,228,191,157,231,149,153,229,155,160,231,180,160,228,184,173,229,156,139,229, -173,152,229,130,168,232,180,180,229,155,190,230,156,128,230,132,155,233,149,191, -230,156,159,229,143,163,228,187,183,231,144,134,232,180,162,229,159,186,229,156, -176,229,174,137,230,142,146,230,173,166,230,177,137,233,135,140,233,157,162,229, -136,155,229,187,186,229,164,169,231,169,186,233,166,150,229,133,136,229,174,140, -229,150,132,233,169,177,229,138,168,228,184,139,233,157,162,228,184,141,229,134, -141,232,175,154,228,191,161,230,132,143,228,185,137,233,152,179,229,133,137,232, -139,177,229,155,189,230,188,130,228,186,174,229,134,155,228,186,139,231,142,169, -229,174,182,231,190,164,228,188,151,229,134,156,230,176,145,229,141,179,229,143, -175,229,144,141,231,168,177,229,174,182,229,133,183,229,138,168,231,148,187,230, -131,179,229,136,176,230,179,168,230,152,142,229,176,143,229,173,166,230,128,167, -232,131,189,232,128,131,231,160,148,231,161,172,228,187,182,232,167,130,231,156, -139,230,184,133,230,165,154,230,144,158,231,172,145,233,166,150,233,160,129,233, -187,132,233,135,145,233,128,130,231,148,168,230,177,159,232,139,143,231,156,159, -229,174,158,228,184,187,231,174,161,233,152,182,230,174,181,232,168,187,229,134, -138,231,191,187,232,175,145,230,157,131,229,136,169,229,129,154,229,165,189,228, -188,188,228,185,142,233,128,154,232,174,175,230,150,189,229,183,165,231,139,128, -230,133,139,228,185,159,232,174,184,231,142,175,228,191,157,229,159,185,229,133, -187,230,166,130,229,191,181,229,164,167,229,158,139,230,156,186,231,165,168,231, -144,134,232,167,163,229,140,191,229,144,141,99,117,97,110,100,111,101,110,118, -105,97,114,109,97,100,114,105,100,98,117,115,99,97,114,105,110,105,99,105,111, -116,105,101,109,112,111,112,111,114,113,117,101,99,117,101,110,116,97,101,115, -116,97,100,111,112,117,101,100,101,110,106,117,101,103,111,115,99,111,110,116, -114,97,101,115,116,195,161,110,110,111,109,98,114,101,116,105,101,110,101,110, -112,101,114,102,105,108,109,97,110,101,114,97,97,109,105,103,111,115,99,105,117, -100,97,100,99,101,110,116,114,111,97,117,110,113,117,101,112,117,101,100,101,115 -,100,101,110,116,114,111,112,114,105,109,101,114,112,114,101,99,105,111,115,101, -103,195,186,110,98,117,101,110,111,115,118,111,108,118,101,114,112,117,110,116, -111,115,115,101,109,97,110,97,104,97,98,195,173,97,97,103,111,115,116,111,110, -117,101,118,111,115,117,110,105,100,111,115,99,97,114,108,111,115,101,113,117, -105,112,111,110,105,195,177,111,115,109,117,99,104,111,115,97,108,103,117,110,97 -,99,111,114,114,101,111,105,109,97,103,101,110,112,97,114,116,105,114,97,114,114 -,105,98,97,109,97,114,195,173,97,104,111,109,98,114,101,101,109,112,108,101,111, -118,101,114,100,97,100,99,97,109,98,105,111,109,117,99,104,97,115,102,117,101, -114,111,110,112,97,115,97,100,111,108,195,173,110,101,97,112,97,114,101,99,101, -110,117,101,118,97,115,99,117,114,115,111,115,101,115,116,97,98,97,113,117,105, -101,114,111,108,105,98,114,111,115,99,117,97,110,116,111,97,99,99,101,115,111, -109,105,103,117,101,108,118,97,114,105,111,115,99,117,97,116,114,111,116,105,101 -,110,101,115,103,114,117,112,111,115,115,101,114,195,161,110,101,117,114,111,112 -,97,109,101,100,105,111,115,102,114,101,110,116,101,97,99,101,114,99,97,100,101, -109,195,161,115,111,102,101,114,116,97,99,111,99,104,101,115,109,111,100,101,108 -,111,105,116,97,108,105,97,108,101,116,114,97,115,97,108,103,195,186,110,99,111, -109,112,114,97,99,117,97,108,101,115,101,120,105,115,116,101,99,117,101,114,112, -111,115,105,101,110,100,111,112,114,101,110,115,97,108,108,101,103,97,114,118, -105,97,106,101,115,100,105,110,101,114,111,109,117,114,99,105,97,112,111,100,114 -,195,161,112,117,101,115,116,111,100,105,97,114,105,111,112,117,101,98,108,111, -113,117,105,101,114,101,109,97,110,117,101,108,112,114,111,112,105,111,99,114, -105,115,105,115,99,105,101,114,116,111,115,101,103,117,114,111,109,117,101,114, -116,101,102,117,101,110,116,101,99,101,114,114,97,114,103,114,97,110,100,101,101 -,102,101,99,116,111,112,97,114,116,101,115,109,101,100,105,100,97,112,114,111, -112,105,97,111,102,114,101,99,101,116,105,101,114,114,97,101,45,109,97,105,108, -118,97,114,105,97,115,102,111,114,109,97,115,102,117,116,117,114,111,111,98,106, -101,116,111,115,101,103,117,105,114,114,105,101,115,103,111,110,111,114,109,97, -115,109,105,115,109,111,115,195,186,110,105,99,111,99,97,109,105,110,111,115,105 -,116,105,111,115,114,97,122,195,179,110,100,101,98,105,100,111,112,114,117,101, -98,97,116,111,108,101,100,111,116,101,110,195,173,97,106,101,115,195,186,115,101 -,115,112,101,114,111,99,111,99,105,110,97,111,114,105,103,101,110,116,105,101, -110,100,97,99,105,101,110,116,111,99,195,161,100,105,122,104,97,98,108,97,114, -115,101,114,195,173,97,108,97,116,105,110,97,102,117,101,114,122,97,101,115,116, -105,108,111,103,117,101,114,114,97,101,110,116,114,97,114,195,169,120,105,116, -111,108,195,179,112,101,122,97,103,101,110,100,97,118,195,173,100,101,111,101, -118,105,116,97,114,112,97,103,105,110,97,109,101,116,114,111,115,106,97,118,105, -101,114,112,97,100,114,101,115,102,195,161,99,105,108,99,97,98,101,122,97,195, -161,114,101,97,115,115,97,108,105,100,97,101,110,118,195,173,111,106,97,112,195, -179,110,97,98,117,115,111,115,98,105,101,110,101,115,116,101,120,116,111,115,108 -,108,101,118,97,114,112,117,101,100,97,110,102,117,101,114,116,101,99,111,109, -195,186,110,99,108,97,115,101,115,104,117,109,97,110,111,116,101,110,105,100,111 -,98,105,108,98,97,111,117,110,105,100,97,100,101,115,116,195,161,115,101,100,105 -,116,97,114,99,114,101,97,100,111,208,180,208,187,209,143,209,135,209,130,208, -190,208,186,208,176,208,186,208,184,208,187,208,184,209,141,209,130,208,190,208, -178,209,129,208,181,208,181,208,179,208,190,208,191,209,128,208,184,209,130,208, -176,208,186,208,181,209,137,208,181,209,131,208,182,208,181,208,154,208,176,208, -186,208,177,208,181,208,183,208,177,209,139,208,187,208,190,208,189,208,184,208, -146,209,129,208,181,208,191,208,190,208,180,208,173,209,130,208,190,209,130,208, -190,208,188,209,135,208,181,208,188,208,189,208,181,209,130,208,187,208,181,209, -130,209,128,208,176,208,183,208,190,208,189,208,176,208,179,208,180,208,181,208, -188,208,189,208,181,208,148,208,187,209,143,208,159,209,128,208,184,208,189,208, -176,209,129,208,189,208,184,209,133,209,130,208,181,208,188,208,186,209,130,208, -190,208,179,208,190,208,180,208,178,208,190,209,130,209,130,208,176,208,188,208, -161,208,168,208,144,208,188,208,176,209,143,208,167,209,130,208,190,208,178,208, -176,209,129,208,178,208,176,208,188,208,181,208,188,209,131,208,162,208,176,208, -186,208,180,208,178,208,176,208,189,208,176,208,188,209,141,209,130,208,184,209, -141,209,130,209,131,208,146,208,176,208,188,209,130,208,181,209,133,208,191,209, -128,208,190,209,130,209,131,209,130,208,189,208,176,208,180,208,180,208,189,209, -143,208,146,208,190,209,130,209,130,209,128,208,184,208,189,208,181,208,185,208, -146,208,176,209,129,208,189,208,184,208,188,209,129,208,176,208,188,209,130,208, -190,209,130,209,128,209,131,208,177,208,158,208,189,208,184,208,188,208,184,209, -128,208,189,208,181,208,181,208,158,208,158,208,158,208,187,208,184,209,134,209, -141,209,130,208,176,208,158,208,189,208,176,208,189,208,181,208,188,208,180,208, -190,208,188,208,188,208,190,208,185,208,180,208,178,208,181,208,190,208,189,208, -190,209,129,209,131,208,180,224,164,149,224,165,135,224,164,185,224,165,136,224, -164,149,224,165,128,224,164,184,224,165,135,224,164,149,224,164,190,224,164,149, -224,165,139,224,164,148,224,164,176,224,164,170,224,164,176,224,164,168,224,165, -135,224,164,143,224,164,149,224,164,149,224,164,191,224,164,173,224,165,128,224, -164,135,224,164,184,224,164,149,224,164,176,224,164,164,224,165,139,224,164,185, -224,165,139,224,164,134,224,164,170,224,164,185,224,165,128,224,164,175,224,164, -185,224,164,175,224,164,190,224,164,164,224,164,149,224,164,165,224,164,190,106, -97,103,114,97,110,224,164,134,224,164,156,224,164,156,224,165,139,224,164,133, -224,164,172,224,164,166,224,165,139,224,164,151,224,164,136,224,164,156,224,164, -190,224,164,151,224,164,143,224,164,185,224,164,174,224,164,135,224,164,168,224, -164,181,224,164,185,224,164,175,224,165,135,224,164,165,224,165,135,224,164,165, -224,165,128,224,164,152,224,164,176,224,164,156,224,164,172,224,164,166,224,165, -128,224,164,149,224,164,136,224,164,156,224,165,128,224,164,181,224,165,135,224, -164,168,224,164,136,224,164,168,224,164,143,224,164,185,224,164,176,224,164,137, -224,164,184,224,164,174,224,165,135,224,164,149,224,164,174,224,164,181,224,165, -139,224,164,178,224,165,135,224,164,184,224,164,172,224,164,174,224,164,136,224, -164,166,224,165,135,224,164,147,224,164,176,224,164,134,224,164,174,224,164,172, -224,164,184,224,164,173,224,164,176,224,164,172,224,164,168,224,164,154,224,164, -178,224,164,174,224,164,168,224,164,134,224,164,151,224,164,184,224,165,128,224, -164,178,224,165,128,216,185,217,132,217,137,216,165,217,132,217,137,217,135,216, -176,216,167,216,162,216,174,216,177,216,185,216,175,216,175,216,167,217,132,217, -137,217,135,216,176,217,135,216,181,217,136,216,177,216,186,217,138,216,177,217, -131,216,167,217,134,217,136,217,132,216,167,216,168,217,138,217,134,216,185,216, -177,216,182,216,176,217,132,217,131,217,135,217,134,216,167,217,138,217,136,217, -133,217,130,216,167,217,132,216,185,217,132,217,138,216,167,217,134,216,167,217, -132,217,131,217,134,216,173,216,170,217,137,217,130,216,168,217,132,217,136,216, -173,216,169,216,167,216,174,216,177,217,129,217,130,216,183,216,185,216,168,216, -175,216,177,217,131,217,134,216,165,216,176,216,167,217,131,217,133,216,167,216, -167,216,173,216,175,216,165,217,132,216,167,217,129,217,138,217,135,216,168,216, -185,216,182,217,131,217,138,217,129,216,168,216,173,216,171,217,136,217,133,217, -134,217,136,217,135,217,136,216,163,217,134,216,167,216,172,216,175,216,167,217, -132,217,135,216,167,216,179,217,132,217,133,216,185,217,134,216,175,217,132,217, -138,216,179,216,185,216,168,216,177,216,181,217,132,217,137,217,133,217,134,216, -176,216,168,217,135,216,167,216,163,217,134,217,135,217,133,216,171,217,132,217, -131,217,134,216,170,216,167,217,132,216,167,216,173,217,138,216,171,217,133,216, -181,216,177,216,180,216,177,216,173,216,173,217,136,217,132,217,136,217,129,217, -138,216,167,216,176,216,167,217,132,217,131,217,132,217,133,216,177,216,169,216, -167,217,134,216,170,216,167,217,132,217,129,216,163,216,168,217,136,216,174,216, -167,216,181,216,163,217,134,216,170,216,167,217,134,217,135,216,167,217,132,217, -138,216,185,216,182,217,136,217,136,217,130,216,175,216,167,216,168,217,134,216, -174,217,138,216,177,216,168,217,134,216,170,217,132,217,131,217,133,216,180,216, -167,216,161,217,136,217,135,217,138,216,167,216,168,217,136,217,130,216,181,216, -181,217,136,217,133,216,167,216,177,217,130,217,133,216,163,216,173,216,175,217, -134,216,173,217,134,216,185,216,175,217,133,216,177,216,163,217,138,216,167,216, -173,216,169,217,131,216,170,216,168,216,175,217,136,217,134,217,138,216,172,216, -168,217,133,217,134,217,135,216,170,216,173,216,170,216,172,217,135,216,169,216, -179,217,134,216,169,217,138,216,170,217,133,217,131,216,177,216,169,216,186,216, -178,216,169,217,134,217,129,216,179,216,168,217,138,216,170,217,132,217,132,217, -135,217,132,217,134,216,167,216,170,217,132,217,131,217,130,217,132,216,168,217, -132,217,133,216,167,216,185,217,134,217,135,216,163,217,136,217,132,216,180,217, -138,216,161,217,134,217,136,216,177,216,163,217,133,216,167,217,129,217,138,217, -131,216,168,217,131,217,132,216,176,216,167,216,170,216,177,216,170,216,168,216, -168,216,163,217,134,217,135,217,133,216,179,216,167,217,134,217,131,216,168,217, -138,216,185,217,129,217,130,216,175,216,173,216,179,217,134,217,132,217,135,217, -133,216,180,216,185,216,177,216,163,217,135,217,132,216,180,217,135,216,177,217, -130,216,183,216,177,216,183,217,132,216,168,112,114,111,102,105,108,101,115,101, -114,118,105,99,101,100,101,102,97,117,108,116,104,105,109,115,101,108,102,100, -101,116,97,105,108,115,99,111,110,116,101,110,116,115,117,112,112,111,114,116, -115,116,97,114,116,101,100,109,101,115,115,97,103,101,115,117,99,99,101,115,115, -102,97,115,104,105,111,110,60,116,105,116,108,101,62,99,111,117,110,116,114,121, -97,99,99,111,117,110,116,99,114,101,97,116,101,100,115,116,111,114,105,101,115, -114,101,115,117,108,116,115,114,117,110,110,105,110,103,112,114,111,99,101,115, -115,119,114,105,116,105,110,103,111,98,106,101,99,116,115,118,105,115,105,98,108 -,101,119,101,108,99,111,109,101,97,114,116,105,99,108,101,117,110,107,110,111, -119,110,110,101,116,119,111,114,107,99,111,109,112,97,110,121,100,121,110,97,109 -,105,99,98,114,111,119,115,101,114,112,114,105,118,97,99,121,112,114,111,98,108, -101,109,83,101,114,118,105,99,101,114,101,115,112,101,99,116,100,105,115,112,108 -,97,121,114,101,113,117,101,115,116,114,101,115,101,114,118,101,119,101,98,115, -105,116,101,104,105,115,116,111,114,121,102,114,105,101,110,100,115,111,112,116, -105,111,110,115,119,111,114,107,105,110,103,118,101,114,115,105,111,110,109,105, -108,108,105,111,110,99,104,97,110,110,101,108,119,105,110,100,111,119,46,97,100, -100,114,101,115,115,118,105,115,105,116,101,100,119,101,97,116,104,101,114,99, -111,114,114,101,99,116,112,114,111,100,117,99,116,101,100,105,114,101,99,116,102 -,111,114,119,97,114,100,121,111,117,32,99,97,110,114,101,109,111,118,101,100,115 -,117,98,106,101,99,116,99,111,110,116,114,111,108,97,114,99,104,105,118,101,99, -117,114,114,101,110,116,114,101,97,100,105,110,103,108,105,98,114,97,114,121,108 -,105,109,105,116,101,100,109,97,110,97,103,101,114,102,117,114,116,104,101,114, -115,117,109,109,97,114,121,109,97,99,104,105,110,101,109,105,110,117,116,101,115 -,112,114,105,118,97,116,101,99,111,110,116,101,120,116,112,114,111,103,114,97, -109,115,111,99,105,101,116,121,110,117,109,98,101,114,115,119,114,105,116,116, -101,110,101,110,97,98,108,101,100,116,114,105,103,103,101,114,115,111,117,114,99 -,101,115,108,111,97,100,105,110,103,101,108,101,109,101,110,116,112,97,114,116, -110,101,114,102,105,110,97,108,108,121,112,101,114,102,101,99,116,109,101,97,110 -,105,110,103,115,121,115,116,101,109,115,107,101,101,112,105,110,103,99,117,108, -116,117,114,101,38,113,117,111,116,59,44,106,111,117,114,110,97,108,112,114,111, -106,101,99,116,115,117,114,102,97,99,101,115,38,113,117,111,116,59,101,120,112, -105,114,101,115,114,101,118,105,101,119,115,98,97,108,97,110,99,101,69,110,103, -108,105,115,104,67,111,110,116,101,110,116,116,104,114,111,117,103,104,80,108, -101,97,115,101,32,111,112,105,110,105,111,110,99,111,110,116,97,99,116,97,118, -101,114,97,103,101,112,114,105,109,97,114,121,118,105,108,108,97,103,101,83,112, -97,110,105,115,104,103,97,108,108,101,114,121,100,101,99,108,105,110,101,109,101 -,101,116,105,110,103,109,105,115,115,105,111,110,112,111,112,117,108,97,114,113, -117,97,108,105,116,121,109,101,97,115,117,114,101,103,101,110,101,114,97,108,115 -,112,101,99,105,101,115,115,101,115,115,105,111,110,115,101,99,116,105,111,110, -119,114,105,116,101,114,115,99,111,117,110,116,101,114,105,110,105,116,105,97, -108,114,101,112,111,114,116,115,102,105,103,117,114,101,115,109,101,109,98,101, -114,115,104,111,108,100,105,110,103,100,105,115,112,117,116,101,101,97,114,108, -105,101,114,101,120,112,114,101,115,115,100,105,103,105,116,97,108,112,105,99, -116,117,114,101,65,110,111,116,104,101,114,109,97,114,114,105,101,100,116,114,97 -,102,102,105,99,108,101,97,100,105,110,103,99,104,97,110,103,101,100,99,101,110, -116,114,97,108,118,105,99,116,111,114,121,105,109,97,103,101,115,47,114,101,97, -115,111,110,115,115,116,117,100,105,101,115,102,101,97,116,117,114,101,108,105, -115,116,105,110,103,109,117,115,116,32,98,101,115,99,104,111,111,108,115,86,101, -114,115,105,111,110,117,115,117,97,108,108,121,101,112,105,115,111,100,101,112, -108,97,121,105,110,103,103,114,111,119,105,110,103,111,98,118,105,111,117,115, -111,118,101,114,108,97,121,112,114,101,115,101,110,116,97,99,116,105,111,110,115 -,60,47,117,108,62,13,10,119,114,97,112,112,101,114,97,108,114,101,97,100,121,99, -101,114,116,97,105,110,114,101,97,108,105,116,121,115,116,111,114,97,103,101,97, -110,111,116,104,101,114,100,101,115,107,116,111,112,111,102,102,101,114,101,100, -112,97,116,116,101,114,110,117,110,117,115,117,97,108,68,105,103,105,116,97,108, -99,97,112,105,116,97,108,87,101,98,115,105,116,101,102,97,105,108,117,114,101,99 -,111,110,110,101,99,116,114,101,100,117,99,101,100,65,110,100,114,111,105,100, -100,101,99,97,100,101,115,114,101,103,117,108,97,114,32,38,97,109,112,59,32,97, -110,105,109,97,108,115,114,101,108,101,97,115,101,65,117,116,111,109,97,116,103, -101,116,116,105,110,103,109,101,116,104,111,100,115,110,111,116,104,105,110,103, -80,111,112,117,108,97,114,99,97,112,116,105,111,110,108,101,116,116,101,114,115, -99,97,112,116,117,114,101,115,99,105,101,110,99,101,108,105,99,101,110,115,101, -99,104,97,110,103,101,115,69,110,103,108,97,110,100,61,49,38,97,109,112,59,72, -105,115,116,111,114,121,32,61,32,110,101,119,32,67,101,110,116,114,97,108,117, -112,100,97,116,101,100,83,112,101,99,105,97,108,78,101,116,119,111,114,107,114, -101,113,117,105,114,101,99,111,109,109,101,110,116,119,97,114,110,105,110,103,67 -,111,108,108,101,103,101,116,111,111,108,98,97,114,114,101,109,97,105,110,115,98 -,101,99,97,117,115,101,101,108,101,99,116,101,100,68,101,117,116,115,99,104,102, -105,110,97,110,99,101,119,111,114,107,101,114,115,113,117,105,99,107,108,121,98, -101,116,119,101,101,110,101,120,97,99,116,108,121,115,101,116,116,105,110,103, -100,105,115,101,97,115,101,83,111,99,105,101,116,121,119,101,97,112,111,110,115, -101,120,104,105,98,105,116,38,108,116,59,33,45,45,67,111,110,116,114,111,108,99, -108,97,115,115,101,115,99,111,118,101,114,101,100,111,117,116,108,105,110,101,97 -,116,116,97,99,107,115,100,101,118,105,99,101,115,40,119,105,110,100,111,119,112 -,117,114,112,111,115,101,116,105,116,108,101,61,34,77,111,98,105,108,101,32,107, -105,108,108,105,110,103,115,104,111,119,105,110,103,73,116,97,108,105,97,110,100 -,114,111,112,112,101,100,104,101,97,118,105,108,121,101,102,102,101,99,116,115, -45,49,39,93,41,59,10,99,111,110,102,105,114,109,67,117,114,114,101,110,116,97, -100,118,97,110,99,101,115,104,97,114,105,110,103,111,112,101,110,105,110,103,100 -,114,97,119,105,110,103,98,105,108,108,105,111,110,111,114,100,101,114,101,100, -71,101,114,109,97,110,121,114,101,108,97,116,101,100,60,47,102,111,114,109,62, -105,110,99,108,117,100,101,119,104,101,116,104,101,114,100,101,102,105,110,101, -100,83,99,105,101,110,99,101,99,97,116,97,108,111,103,65,114,116,105,99,108,101, -98,117,116,116,111,110,115,108,97,114,103,101,115,116,117,110,105,102,111,114, -109,106,111,117,114,110,101,121,115,105,100,101,98,97,114,67,104,105,99,97,103, -111,104,111,108,105,100,97,121,71,101,110,101,114,97,108,112,97,115,115,97,103, -101,44,38,113,117,111,116,59,97,110,105,109,97,116,101,102,101,101,108,105,110, -103,97,114,114,105,118,101,100,112,97,115,115,105,110,103,110,97,116,117,114,97, -108,114,111,117,103,104,108,121,46,10,10,84,104,101,32,98,117,116,32,110,111,116 -,100,101,110,115,105,116,121,66,114,105,116,97,105,110,67,104,105,110,101,115, -101,108,97,99,107,32,111,102,116,114,105,98,117,116,101,73,114,101,108,97,110, -100,34,32,100,97,116,97,45,102,97,99,116,111,114,115,114,101,99,101,105,118,101, -116,104,97,116,32,105,115,76,105,98,114,97,114,121,104,117,115,98,97,110,100,105 -,110,32,102,97,99,116,97,102,102,97,105,114,115,67,104,97,114,108,101,115,114,97 -,100,105,99,97,108,98,114,111,117,103,104,116,102,105,110,100,105,110,103,108,97 -,110,100,105,110,103,58,108,97,110,103,61,34,114,101,116,117,114,110,32,108,101, -97,100,101,114,115,112,108,97,110,110,101,100,112,114,101,109,105,117,109,112,97 -,99,107,97,103,101,65,109,101,114,105,99,97,69,100,105,116,105,111,110,93,38,113 -,117,111,116,59,77,101,115,115,97,103,101,110,101,101,100,32,116,111,118,97,108, -117,101,61,34,99,111,109,112,108,101,120,108,111,111,107,105,110,103,115,116,97, -116,105,111,110,98,101,108,105,101,118,101,115,109,97,108,108,101,114,45,109,111 -,98,105,108,101,114,101,99,111,114,100,115,119,97,110,116,32,116,111,107,105,110 -,100,32,111,102,70,105,114,101,102,111,120,121,111,117,32,97,114,101,115,105,109 -,105,108,97,114,115,116,117,100,105,101,100,109,97,120,105,109,117,109,104,101, -97,100,105,110,103,114,97,112,105,100,108,121,99,108,105,109,97,116,101,107,105, -110,103,100,111,109,101,109,101,114,103,101,100,97,109,111,117,110,116,115,102, -111,117,110,100,101,100,112,105,111,110,101,101,114,102,111,114,109,117,108,97, -100,121,110,97,115,116,121,104,111,119,32,116,111,32,83,117,112,112,111,114,116, -114,101,118,101,110,117,101,101,99,111,110,111,109,121,82,101,115,117,108,116, -115,98,114,111,116,104,101,114,115,111,108,100,105,101,114,108,97,114,103,101, -108,121,99,97,108,108,105,110,103,46,38,113,117,111,116,59,65,99,99,111,117,110, -116,69,100,119,97,114,100,32,115,101,103,109,101,110,116,82,111,98,101,114,116, -32,101,102,102,111,114,116,115,80,97,99,105,102,105,99,108,101,97,114,110,101, -100,117,112,32,119,105,116,104,104,101,105,103,104,116,58,119,101,32,104,97,118, -101,65,110,103,101,108,101,115,110,97,116,105,111,110,115,95,115,101,97,114,99, -104,97,112,112,108,105,101,100,97,99,113,117,105,114,101,109,97,115,115,105,118, -101,103,114,97,110,116,101,100,58,32,102,97,108,115,101,116,114,101,97,116,101, -100,98,105,103,103,101,115,116,98,101,110,101,102,105,116,100,114,105,118,105, -110,103,83,116,117,100,105,101,115,109,105,110,105,109,117,109,112,101,114,104, -97,112,115,109,111,114,110,105,110,103,115,101,108,108,105,110,103,105,115,32, -117,115,101,100,114,101,118,101,114,115,101,118,97,114,105,97,110,116,32,114,111 -,108,101,61,34,109,105,115,115,105,110,103,97,99,104,105,101,118,101,112,114,111 -,109,111,116,101,115,116,117,100,101,110,116,115,111,109,101,111,110,101,101,120 -,116,114,101,109,101,114,101,115,116,111,114,101,98,111,116,116,111,109,58,101, -118,111,108,118,101,100,97,108,108,32,116,104,101,115,105,116,101,109,97,112,101 -,110,103,108,105,115,104,119,97,121,32,116,111,32,32,65,117,103,117,115,116,115, -121,109,98,111,108,115,67,111,109,112,97,110,121,109,97,116,116,101,114,115,109, -117,115,105,99,97,108,97,103,97,105,110,115,116,115,101,114,118,105,110,103,125, -41,40,41,59,13,10,112,97,121,109,101,110,116,116,114,111,117,98,108,101,99,111, -110,99,101,112,116,99,111,109,112,97,114,101,112,97,114,101,110,116,115,112,108, -97,121,101,114,115,114,101,103,105,111,110,115,109,111,110,105,116,111,114,32,39 -,39,84,104,101,32,119,105,110,110,105,110,103,101,120,112,108,111,114,101,97,100 -,97,112,116,101,100,71,97,108,108,101,114,121,112,114,111,100,117,99,101,97,98, -105,108,105,116,121,101,110,104,97,110,99,101,99,97,114,101,101,114,115,41,46,32 -,84,104,101,32,99,111,108,108,101,99,116,83,101,97,114,99,104,32,97,110,99,105, -101,110,116,101,120,105,115,116,101,100,102,111,111,116,101,114,32,104,97,110, -100,108,101,114,112,114,105,110,116,101,100,99,111,110,115,111,108,101,69,97,115 -,116,101,114,110,101,120,112,111,114,116,115,119,105,110,100,111,119,115,67,104, -97,110,110,101,108,105,108,108,101,103,97,108,110,101,117,116,114,97,108,115,117 -,103,103,101,115,116,95,104,101,97,100,101,114,115,105,103,110,105,110,103,46, -104,116,109,108,34,62,115,101,116,116,108,101,100,119,101,115,116,101,114,110,99 -,97,117,115,105,110,103,45,119,101,98,107,105,116,99,108,97,105,109,101,100,74, -117,115,116,105,99,101,99,104,97,112,116,101,114,118,105,99,116,105,109,115,84, -104,111,109,97,115,32,109,111,122,105,108,108,97,112,114,111,109,105,115,101,112 -,97,114,116,105,101,115,101,100,105,116,105,111,110,111,117,116,115,105,100,101, -58,102,97,108,115,101,44,104,117,110,100,114,101,100,79,108,121,109,112,105,99, -95,98,117,116,116,111,110,97,117,116,104,111,114,115,114,101,97,99,104,101,100, -99,104,114,111,110,105,99,100,101,109,97,110,100,115,115,101,99,111,110,100,115, -112,114,111,116,101,99,116,97,100,111,112,116,101,100,112,114,101,112,97,114,101 -,110,101,105,116,104,101,114,103,114,101,97,116,108,121,103,114,101,97,116,101, -114,111,118,101,114,97,108,108,105,109,112,114,111,118,101,99,111,109,109,97,110 -,100,115,112,101,99,105,97,108,115,101,97,114,99,104,46,119,111,114,115,104,105, -112,102,117,110,100,105,110,103,116,104,111,117,103,104,116,104,105,103,104,101, -115,116,105,110,115,116,101,97,100,117,116,105,108,105,116,121,113,117,97,114, -116,101,114,67,117,108,116,117,114,101,116,101,115,116,105,110,103,99,108,101,97 -,114,108,121,101,120,112,111,115,101,100,66,114,111,119,115,101,114,108,105,98, -101,114,97,108,125,32,99,97,116,99,104,80,114,111,106,101,99,116,101,120,97,109, -112,108,101,104,105,100,101,40,41,59,70,108,111,114,105,100,97,97,110,115,119, -101,114,115,97,108,108,111,119,101,100,69,109,112,101,114,111,114,100,101,102, -101,110,115,101,115,101,114,105,111,117,115,102,114,101,101,100,111,109,83,101, -118,101,114,97,108,45,98,117,116,116,111,110,70,117,114,116,104,101,114,111,117, -116,32,111,102,32,33,61,32,110,117,108,108,116,114,97,105,110,101,100,68,101,110 -,109,97,114,107,118,111,105,100,40,48,41,47,97,108,108,46,106,115,112,114,101, -118,101,110,116,82,101,113,117,101,115,116,83,116,101,112,104,101,110,10,10,87, -104,101,110,32,111,98,115,101,114,118,101,60,47,104,50,62,13,10,77,111,100,101, -114,110,32,112,114,111,118,105,100,101,34,32,97,108,116,61,34,98,111,114,100,101 -,114,115,46,10,10,70,111,114,32,10,10,77,97,110,121,32,97,114,116,105,115,116, -115,112,111,119,101,114,101,100,112,101,114,102,111,114,109,102,105,99,116,105, -111,110,116,121,112,101,32,111,102,109,101,100,105,99,97,108,116,105,99,107,101, -116,115,111,112,112,111,115,101,100,67,111,117,110,99,105,108,119,105,116,110, -101,115,115,106,117,115,116,105,99,101,71,101,111,114,103,101,32,66,101,108,103, -105,117,109,46,46,46,60,47,97,62,116,119,105,116,116,101,114,110,111,116,97,98, -108,121,119,97,105,116,105,110,103,119,97,114,102,97,114,101,32,79,116,104,101, -114,32,114,97,110,107,105,110,103,112,104,114,97,115,101,115,109,101,110,116,105 -,111,110,115,117,114,118,105,118,101,115,99,104,111,108,97,114,60,47,112,62,13, -10,32,67,111,117,110,116,114,121,105,103,110,111,114,101,100,108,111,115,115,32, -111,102,106,117,115,116,32,97,115,71,101,111,114,103,105,97,115,116,114,97,110, -103,101,60,104,101,97,100,62,60,115,116,111,112,112,101,100,49,39,93,41,59,13,10 -,105,115,108,97,110,100,115,110,111,116,97,98,108,101,98,111,114,100,101,114,58, -108,105,115,116,32,111,102,99,97,114,114,105,101,100,49,48,48,44,48,48,48,60,47, -104,51,62,10,32,115,101,118,101,114,97,108,98,101,99,111,109,101,115,115,101,108 -,101,99,116,32,119,101,100,100,105,110,103,48,48,46,104,116,109,108,109,111,110, -97,114,99,104,111,102,102,32,116,104,101,116,101,97,99,104,101,114,104,105,103, -104,108,121,32,98,105,111,108,111,103,121,108,105,102,101,32,111,102,111,114,32, -101,118,101,110,114,105,115,101,32,111,102,38,114,97,113,117,111,59,112,108,117, -115,111,110,101,104,117,110,116,105,110,103,40,116,104,111,117,103,104,68,111, -117,103,108,97,115,106,111,105,110,105,110,103,99,105,114,99,108,101,115,70,111, -114,32,116,104,101,65,110,99,105,101,110,116,86,105,101,116,110,97,109,118,101, -104,105,99,108,101,115,117,99,104,32,97,115,99,114,121,115,116,97,108,118,97,108 -,117,101,32,61,87,105,110,100,111,119,115,101,110,106,111,121,101,100,97,32,115, -109,97,108,108,97,115,115,117,109,101,100,60,97,32,105,100,61,34,102,111,114,101 -,105,103,110,32,65,108,108,32,114,105,104,111,119,32,116,104,101,68,105,115,112, -108,97,121,114,101,116,105,114,101,100,104,111,119,101,118,101,114,104,105,100, -100,101,110,59,98,97,116,116,108,101,115,115,101,101,107,105,110,103,99,97,98, -105,110,101,116,119,97,115,32,110,111,116,108,111,111,107,32,97,116,99,111,110, -100,117,99,116,103,101,116,32,116,104,101,74,97,110,117,97,114,121,104,97,112, -112,101,110,115,116,117,114,110,105,110,103,97,58,104,111,118,101,114,79,110,108 -,105,110,101,32,70,114,101,110,99,104,32,108,97,99,107,105,110,103,116,121,112, -105,99,97,108,101,120,116,114,97,99,116,101,110,101,109,105,101,115,101,118,101, -110,32,105,102,103,101,110,101,114,97,116,100,101,99,105,100,101,100,97,114,101, -32,110,111,116,47,115,101,97,114,99,104,98,101,108,105,101,102,115,45,105,109,97 -,103,101,58,108,111,99,97,116,101,100,115,116,97,116,105,99,46,108,111,103,105, -110,34,62,99,111,110,118,101,114,116,118,105,111,108,101,110,116,101,110,116,101 -,114,101,100,102,105,114,115,116,34,62,99,105,114,99,117,105,116,70,105,110,108, -97,110,100,99,104,101,109,105,115,116,115,104,101,32,119,97,115,49,48,112,120,59 -,34,62,97,115,32,115,117,99,104,100,105,118,105,100,101,100,60,47,115,112,97,110 -,62,119,105,108,108,32,98,101,108,105,110,101,32,111,102,97,32,103,114,101,97, -116,109,121,115,116,101,114,121,47,105,110,100,101,120,46,102,97,108,108,105,110 -,103,100,117,101,32,116,111,32,114,97,105,108,119,97,121,99,111,108,108,101,103, -101,109,111,110,115,116,101,114,100,101,115,99,101,110,116,105,116,32,119,105, -116,104,110,117,99,108,101,97,114,74,101,119,105,115,104,32,112,114,111,116,101, -115,116,66,114,105,116,105,115,104,102,108,111,119,101,114,115,112,114,101,100, -105,99,116,114,101,102,111,114,109,115,98,117,116,116,111,110,32,119,104,111,32, -119,97,115,108,101,99,116,117,114,101,105,110,115,116,97,110,116,115,117,105,99, -105,100,101,103,101,110,101,114,105,99,112,101,114,105,111,100,115,109,97,114, -107,101,116,115,83,111,99,105,97,108,32,102,105,115,104,105,110,103,99,111,109, -98,105,110,101,103,114,97,112,104,105,99,119,105,110,110,101,114,115,60,98,114, -32,47,62,60,98,121,32,116,104,101,32,78,97,116,117,114,97,108,80,114,105,118,97, -99,121,99,111,111,107,105,101,115,111,117,116,99,111,109,101,114,101,115,111,108 -,118,101,83,119,101,100,105,115,104,98,114,105,101,102,108,121,80,101,114,115, -105,97,110,115,111,32,109,117,99,104,67,101,110,116,117,114,121,100,101,112,105, -99,116,115,99,111,108,117,109,110,115,104,111,117,115,105,110,103,115,99,114,105 -,112,116,115,110,101,120,116,32,116,111,98,101,97,114,105,110,103,109,97,112,112 -,105,110,103,114,101,118,105,115,101,100,106,81,117,101,114,121,40,45,119,105, -100,116,104,58,116,105,116,108,101,34,62,116,111,111,108,116,105,112,83,101,99, -116,105,111,110,100,101,115,105,103,110,115,84,117,114,107,105,115,104,121,111, -117,110,103,101,114,46,109,97,116,99,104,40,125,41,40,41,59,10,10,98,117,114,110 -,105,110,103,111,112,101,114,97,116,101,100,101,103,114,101,101,115,115,111,117, -114,99,101,61,82,105,99,104,97,114,100,99,108,111,115,101,108,121,112,108,97,115 -,116,105,99,101,110,116,114,105,101,115,60,47,116,114,62,13,10,99,111,108,111, -114,58,35,117,108,32,105,100,61,34,112,111,115,115,101,115,115,114,111,108,108, -105,110,103,112,104,121,115,105,99,115,102,97,105,108,105,110,103,101,120,101,99 -,117,116,101,99,111,110,116,101,115,116,108,105,110,107,32,116,111,68,101,102,97 -,117,108,116,60,98,114,32,47,62,10,58,32,116,114,117,101,44,99,104,97,114,116, -101,114,116,111,117,114,105,115,109,99,108,97,115,115,105,99,112,114,111,99,101, -101,100,101,120,112,108,97,105,110,60,47,104,49,62,13,10,111,110,108,105,110,101 -,46,63,120,109,108,32,118,101,104,101,108,112,105,110,103,100,105,97,109,111,110 -,100,117,115,101,32,116,104,101,97,105,114,108,105,110,101,101,110,100,32,45,45, -62,41,46,97,116,116,114,40,114,101,97,100,101,114,115,104,111,115,116,105,110, -103,35,102,102,102,102,102,102,114,101,97,108,105,122,101,86,105,110,99,101,110, -116,115,105,103,110,97,108,115,32,115,114,99,61,34,47,80,114,111,100,117,99,116, -100,101,115,112,105,116,101,100,105,118,101,114,115,101,116,101,108,108,105,110, -103,80,117,98,108,105,99,32,104,101,108,100,32,105,110,74,111,115,101,112,104,32 -,116,104,101,97,116,114,101,97,102,102,101,99,116,115,60,115,116,121,108,101,62, -97,32,108,97,114,103,101,100,111,101,115,110,39,116,108,97,116,101,114,44,32,69, -108,101,109,101,110,116,102,97,118,105,99,111,110,99,114,101,97,116,111,114,72, -117,110,103,97,114,121,65,105,114,112,111,114,116,115,101,101,32,116,104,101,115 -,111,32,116,104,97,116,77,105,99,104,97,101,108,83,121,115,116,101,109,115,80, -114,111,103,114,97,109,115,44,32,97,110,100,32,32,119,105,100,116,104,61,101,38, -113,117,111,116,59,116,114,97,100,105,110,103,108,101,102,116,34,62,10,112,101, -114,115,111,110,115,71,111,108,100,101,110,32,65,102,102,97,105,114,115,103,114, -97,109,109,97,114,102,111,114,109,105,110,103,100,101,115,116,114,111,121,105, -100,101,97,32,111,102,99,97,115,101,32,111,102,111,108,100,101,115,116,32,116, -104,105,115,32,105,115,46,115,114,99,32,61,32,99,97,114,116,111,111,110,114,101, -103,105,115,116,114,67,111,109,109,111,110,115,77,117,115,108,105,109,115,87,104 -,97,116,32,105,115,105,110,32,109,97,110,121,109,97,114,107,105,110,103,114,101, -118,101,97,108,115,73,110,100,101,101,100,44,101,113,117,97,108,108,121,47,115, -104,111,119,95,97,111,117,116,100,111,111,114,101,115,99,97,112,101,40,65,117, -115,116,114,105,97,103,101,110,101,116,105,99,115,121,115,116,101,109,44,73,110, -32,116,104,101,32,115,105,116,116,105,110,103,72,101,32,97,108,115,111,73,115, -108,97,110,100,115,65,99,97,100,101,109,121,10,9,9,60,33,45,45,68,97,110,105,101 -,108,32,98,105,110,100,105,110,103,98,108,111,99,107,34,62,105,109,112,111,115, -101,100,117,116,105,108,105,122,101,65,98,114,97,104,97,109,40,101,120,99,101, -112,116,123,119,105,100,116,104,58,112,117,116,116,105,110,103,41,46,104,116,109 -,108,40,124,124,32,91,93,59,10,68,65,84,65,91,32,42,107,105,116,99,104,101,110, -109,111,117,110,116,101,100,97,99,116,117,97,108,32,100,105,97,108,101,99,116, -109,97,105,110,108,121,32,95,98,108,97,110,107,39,105,110,115,116,97,108,108,101 -,120,112,101,114,116,115,105,102,40,116,121,112,101,73,116,32,97,108,115,111,38, -99,111,112,121,59,32,34,62,84,101,114,109,115,98,111,114,110,32,105,110,79,112, -116,105,111,110,115,101,97,115,116,101,114,110,116,97,108,107,105,110,103,99,111 -,110,99,101,114,110,103,97,105,110,101,100,32,111,110,103,111,105,110,103,106, -117,115,116,105,102,121,99,114,105,116,105,99,115,102,97,99,116,111,114,121,105, -116,115,32,111,119,110,97,115,115,97,117,108,116,105,110,118,105,116,101,100,108 -,97,115,116,105,110,103,104,105,115,32,111,119,110,104,114,101,102,61,34,47,34, -32,114,101,108,61,34,100,101,118,101,108,111,112,99,111,110,99,101,114,116,100, -105,97,103,114,97,109,100,111,108,108,97,114,115,99,108,117,115,116,101,114,112, -104,112,63,105,100,61,97,108,99,111,104,111,108,41,59,125,41,40,41,59,117,115, -105,110,103,32,97,62,60,115,112,97,110,62,118,101,115,115,101,108,115,114,101, -118,105,118,97,108,65,100,100,114,101,115,115,97,109,97,116,101,117,114,97,110, -100,114,111,105,100,97,108,108,101,103,101,100,105,108,108,110,101,115,115,119, -97,108,107,105,110,103,99,101,110,116,101,114,115,113,117,97,108,105,102,121,109 -,97,116,99,104,101,115,117,110,105,102,105,101,100,101,120,116,105,110,99,116,68 -,101,102,101,110,115,101,100,105,101,100,32,105,110,10,9,60,33,45,45,32,99,117, -115,116,111,109,115,108,105,110,107,105,110,103,76,105,116,116,108,101,32,66,111 -,111,107,32,111,102,101,118,101,110,105,110,103,109,105,110,46,106,115,63,97,114 -,101,32,116,104,101,107,111,110,116,97,107,116,116,111,100,97,121,39,115,46,104, -116,109,108,34,32,116,97,114,103,101,116,61,119,101,97,114,105,110,103,65,108, -108,32,82,105,103,59,10,125,41,40,41,59,114,97,105,115,105,110,103,32,65,108,115 -,111,44,32,99,114,117,99,105,97,108,97,98,111,117,116,34,62,100,101,99,108,97, -114,101,45,45,62,10,60,115,99,102,105,114,101,102,111,120,97,115,32,109,117,99, -104,97,112,112,108,105,101,115,105,110,100,101,120,44,32,115,44,32,98,117,116,32 -,116,121,112,101,32,61,32,10,13,10,60,33,45,45,116,111,119,97,114,100,115,82,101 -,99,111,114,100,115,80,114,105,118,97,116,101,70,111,114,101,105,103,110,80,114, -101,109,105,101,114,99,104,111,105,99,101,115,86,105,114,116,117,97,108,114,101, -116,117,114,110,115,67,111,109,109,101,110,116,80,111,119,101,114,101,100,105, -110,108,105,110,101,59,112,111,118,101,114,116,121,99,104,97,109,98,101,114,76, -105,118,105,110,103,32,118,111,108,117,109,101,115,65,110,116,104,111,110,121, -108,111,103,105,110,34,32,82,101,108,97,116,101,100,69,99,111,110,111,109,121, -114,101,97,99,104,101,115,99,117,116,116,105,110,103,103,114,97,118,105,116,121, -108,105,102,101,32,105,110,67,104,97,112,116,101,114,45,115,104,97,100,111,119, -78,111,116,97,98,108,101,60,47,116,100,62,13,10,32,114,101,116,117,114,110,115, -116,97,100,105,117,109,119,105,100,103,101,116,115,118,97,114,121,105,110,103, -116,114,97,118,101,108,115,104,101,108,100,32,98,121,119,104,111,32,97,114,101, -119,111,114,107,32,105,110,102,97,99,117,108,116,121,97,110,103,117,108,97,114, -119,104,111,32,104,97,100,97,105,114,112,111,114,116,116,111,119,110,32,111,102, -10,10,83,111,109,101,32,39,99,108,105,99,107,39,99,104,97,114,103,101,115,107, -101,121,119,111,114,100,105,116,32,119,105,108,108,99,105,116,121,32,111,102,40, -116,104,105,115,41,59,65,110,100,114,101,119,32,117,110,105,113,117,101,32,99, -104,101,99,107,101,100,111,114,32,109,111,114,101,51,48,48,112,120,59,32,114,101 -,116,117,114,110,59,114,115,105,111,110,61,34,112,108,117,103,105,110,115,119, -105,116,104,105,110,32,104,101,114,115,101,108,102,83,116,97,116,105,111,110,70, -101,100,101,114,97,108,118,101,110,116,117,114,101,112,117,98,108,105,115,104, -115,101,110,116,32,116,111,116,101,110,115,105,111,110,97,99,116,114,101,115,115 -,99,111,109,101,32,116,111,102,105,110,103,101,114,115,68,117,107,101,32,111,102 -,112,101,111,112,108,101,44,101,120,112,108,111,105,116,119,104,97,116,32,105, -115,104,97,114,109,111,110,121,97,32,109,97,106,111,114,34,58,34,104,116,116,112 -,105,110,32,104,105,115,32,109,101,110,117,34,62,10,109,111,110,116,104,108,121, -111,102,102,105,99,101,114,99,111,117,110,99,105,108,103,97,105,110,105,110,103, -101,118,101,110,32,105,110,83,117,109,109,97,114,121,100,97,116,101,32,111,102, -108,111,121,97,108,116,121,102,105,116,110,101,115,115,97,110,100,32,119,97,115, -101,109,112,101,114,111,114,115,117,112,114,101,109,101,83,101,99,111,110,100,32 -,104,101,97,114,105,110,103,82,117,115,115,105,97,110,108,111,110,103,101,115, -116,65,108,98,101,114,116,97,108,97,116,101,114,97,108,115,101,116,32,111,102,32 -,115,109,97,108,108,34,62,46,97,112,112,101,110,100,100,111,32,119,105,116,104, -102,101,100,101,114,97,108,98,97,110,107,32,111,102,98,101,110,101,97,116,104,68 -,101,115,112,105,116,101,67,97,112,105,116,97,108,103,114,111,117,110,100,115,41 -,44,32,97,110,100,32,112,101,114,99,101,110,116,105,116,32,102,114,111,109,99, -108,111,115,105,110,103,99,111,110,116,97,105,110,73,110,115,116,101,97,100,102, -105,102,116,101,101,110,97,115,32,119,101,108,108,46,121,97,104,111,111,46,114, -101,115,112,111,110,100,102,105,103,104,116,101,114,111,98,115,99,117,114,101, -114,101,102,108,101,99,116,111,114,103,97,110,105,99,61,32,77,97,116,104,46,101, -100,105,116,105,110,103,111,110,108,105,110,101,32,112,97,100,100,105,110,103,97 -,32,119,104,111,108,101,111,110,101,114,114,111,114,121,101,97,114,32,111,102, -101,110,100,32,111,102,32,98,97,114,114,105,101,114,119,104,101,110,32,105,116, -104,101,97,100,101,114,32,104,111,109,101,32,111,102,114,101,115,117,109,101,100 -,114,101,110,97,109,101,100,115,116,114,111,110,103,62,104,101,97,116,105,110, -103,114,101,116,97,105,110,115,99,108,111,117,100,102,114,119,97,121,32,111,102, -32,77,97,114,99,104,32,49,107,110,111,119,105,110,103,105,110,32,112,97,114,116, -66,101,116,119,101,101,110,108,101,115,115,111,110,115,99,108,111,115,101,115, -116,118,105,114,116,117,97,108,108,105,110,107,115,34,62,99,114,111,115,115,101, -100,69,78,68,32,45,45,62,102,97,109,111,117,115,32,97,119,97,114,100,101,100,76, -105,99,101,110,115,101,72,101,97,108,116,104,32,102,97,105,114,108,121,32,119, -101,97,108,116,104,121,109,105,110,105,109,97,108,65,102,114,105,99,97,110,99, -111,109,112,101,116,101,108,97,98,101,108,34,62,115,105,110,103,105,110,103,102, -97,114,109,101,114,115,66,114,97,115,105,108,41,100,105,115,99,117,115,115,114, -101,112,108,97,99,101,71,114,101,103,111,114,121,102,111,110,116,32,99,111,112, -117,114,115,117,101,100,97,112,112,101,97,114,115,109,97,107,101,32,117,112,114, -111,117,110,100,101,100,98,111,116,104,32,111,102,98,108,111,99,107,101,100,115, -97,119,32,116,104,101,111,102,102,105,99,101,115,99,111,108,111,117,114,115,105, -102,40,100,111,99,117,119,104,101,110,32,104,101,101,110,102,111,114,99,101,112, -117,115,104,40,102,117,65,117,103,117,115,116,32,85,84,70,45,56,34,62,70,97,110, -116,97,115,121,105,110,32,109,111,115,116,105,110,106,117,114,101,100,85,115,117 -,97,108,108,121,102,97,114,109,105,110,103,99,108,111,115,117,114,101,111,98,106 -,101,99,116,32,100,101,102,101,110,99,101,117,115,101,32,111,102,32,77,101,100, -105,99,97,108,60,98,111,100,121,62,10,101,118,105,100,101,110,116,98,101,32,117, -115,101,100,107,101,121,67,111,100,101,115,105,120,116,101,101,110,73,115,108,97 -,109,105,99,35,48,48,48,48,48,48,101,110,116,105,114,101,32,119,105,100,101,108, -121,32,97,99,116,105,118,101,32,40,116,121,112,101,111,102,111,110,101,32,99,97, -110,99,111,108,111,114,32,61,115,112,101,97,107,101,114,101,120,116,101,110,100, -115,80,104,121,115,105,99,115,116,101,114,114,97,105,110,60,116,98,111,100,121, -62,102,117,110,101,114,97,108,118,105,101,119,105,110,103,109,105,100,100,108, -101,32,99,114,105,99,107,101,116,112,114,111,112,104,101,116,115,104,105,102,116 -,101,100,100,111,99,116,111,114,115,82,117,115,115,101,108,108,32,116,97,114,103 -,101,116,99,111,109,112,97,99,116,97,108,103,101,98,114,97,115,111,99,105,97,108 -,45,98,117,108,107,32,111,102,109,97,110,32,97,110,100,60,47,116,100,62,10,32, -104,101,32,108,101,102,116,41,46,118,97,108,40,41,102,97,108,115,101,41,59,108, -111,103,105,99,97,108,98,97,110,107,105,110,103,104,111,109,101,32,116,111,110, -97,109,105,110,103,32,65,114,105,122,111,110,97,99,114,101,100,105,116,115,41,59 -,10,125,41,59,10,102,111,117,110,100,101,114,105,110,32,116,117,114,110,67,111, -108,108,105,110,115,98,101,102,111,114,101,32,66,117,116,32,116,104,101,99,104, -97,114,103,101,100,84,105,116,108,101,34,62,67,97,112,116,97,105,110,115,112,101 -,108,108,101,100,103,111,100,100,101,115,115,84,97,103,32,45,45,62,65,100,100, -105,110,103,58,98,117,116,32,119,97,115,82,101,99,101,110,116,32,112,97,116,105, -101,110,116,98,97,99,107,32,105,110,61,102,97,108,115,101,38,76,105,110,99,111, -108,110,119,101,32,107,110,111,119,67,111,117,110,116,101,114,74,117,100,97,105, -115,109,115,99,114,105,112,116,32,97,108,116,101,114,101,100,39,93,41,59,10,32, -32,104,97,115,32,116,104,101,117,110,99,108,101,97,114,69,118,101,110,116,39,44, -98,111,116,104,32,105,110,110,111,116,32,97,108,108,10,10,60,33,45,45,32,112,108 -,97,99,105,110,103,104,97,114,100,32,116,111,32,99,101,110,116,101,114,115,111, -114,116,32,111,102,99,108,105,101,110,116,115,115,116,114,101,101,116,115,66,101 -,114,110,97,114,100,97,115,115,101,114,116,115,116,101,110,100,32,116,111,102,97 -,110,116,97,115,121,100,111,119,110,32,105,110,104,97,114,98,111,117,114,70,114, -101,101,100,111,109,106,101,119,101,108,114,121,47,97,98,111,117,116,46,46,115, -101,97,114,99,104,108,101,103,101,110,100,115,105,115,32,109,97,100,101,109,111, -100,101,114,110,32,111,110,108,121,32,111,110,111,110,108,121,32,116,111,105,109 -,97,103,101,34,32,108,105,110,101,97,114,32,112,97,105,110,116,101,114,97,110, -100,32,110,111,116,114,97,114,101,108,121,32,97,99,114,111,110,121,109,100,101, -108,105,118,101,114,115,104,111,114,116,101,114,48,48,38,97,109,112,59,97,115,32 -,109,97,110,121,119,105,100,116,104,61,34,47,42,32,60,33,91,67,116,105,116,108, -101,32,61,111,102,32,116,104,101,32,108,111,119,101,115,116,32,112,105,99,107, -101,100,32,101,115,99,97,112,101,100,117,115,101,115,32,111,102,112,101,111,112, -108,101,115,32,80,117,98,108,105,99,77,97,116,116,104,101,119,116,97,99,116,105, -99,115,100,97,109,97,103,101,100,119,97,121,32,102,111,114,108,97,119,115,32,111 -,102,101,97,115,121,32,116,111,32,119,105,110,100,111,119,115,116,114,111,110, -103,32,32,115,105,109,112,108,101,125,99,97,116,99,104,40,115,101,118,101,110, -116,104,105,110,102,111,98,111,120,119,101,110,116,32,116,111,112,97,105,110,116 -,101,100,99,105,116,105,122,101,110,73,32,100,111,110,39,116,114,101,116,114,101 -,97,116,46,32,83,111,109,101,32,119,119,46,34,41,59,10,98,111,109,98,105,110,103 -,109,97,105,108,116,111,58,109,97,100,101,32,105,110,46,32,77,97,110,121,32,99, -97,114,114,105,101,115,124,124,123,125,59,119,105,119,111,114,107,32,111,102,115 -,121,110,111,110,121,109,100,101,102,101,97,116,115,102,97,118,111,114,101,100, -111,112,116,105,99,97,108,112,97,103,101,84,114,97,117,110,108,101,115,115,32, -115,101,110,100,105,110,103,108,101,102,116,34,62,60,99,111,109,83,99,111,114,65 -,108,108,32,116,104,101,106,81,117,101,114,121,46,116,111,117,114,105,115,116,67 -,108,97,115,115,105,99,102,97,108,115,101,34,32,87,105,108,104,101,108,109,115, -117,98,117,114,98,115,103,101,110,117,105,110,101,98,105,115,104,111,112,115,46, -115,112,108,105,116,40,103,108,111,98,97,108,32,102,111,108,108,111,119,115,98, -111,100,121,32,111,102,110,111,109,105,110,97,108,67,111,110,116,97,99,116,115, -101,99,117,108,97,114,108,101,102,116,32,116,111,99,104,105,101,102,108,121,45, -104,105,100,100,101,110,45,98,97,110,110,101,114,60,47,108,105,62,10,10,46,32,87 -,104,101,110,32,105,110,32,98,111,116,104,100,105,115,109,105,115,115,69,120,112 -,108,111,114,101,97,108,119,97,121,115,32,118,105,97,32,116,104,101,115,112,97, -195,177,111,108,119,101,108,102,97,114,101,114,117,108,105,110,103,32,97,114,114 -,97,110,103,101,99,97,112,116,97,105,110,104,105,115,32,115,111,110,114,117,108, -101,32,111,102,104,101,32,116,111,111,107,105,116,115,101,108,102,44,61,48,38,97 -,109,112,59,40,99,97,108,108,101,100,115,97,109,112,108,101,115,116,111,32,109, -97,107,101,99,111,109,47,112,97,103,77,97,114,116,105,110,32,75,101,110,110,101, -100,121,97,99,99,101,112,116,115,102,117,108,108,32,111,102,104,97,110,100,108, -101,100,66,101,115,105,100,101,115,47,47,45,45,62,60,47,97,98,108,101,32,116,111 -,116,97,114,103,101,116,115,101,115,115,101,110,99,101,104,105,109,32,116,111,32 -,105,116,115,32,98,121,32,99,111,109,109,111,110,46,109,105,110,101,114,97,108, -116,111,32,116,97,107,101,119,97,121,115,32,116,111,115,46,111,114,103,47,108,97 -,100,118,105,115,101,100,112,101,110,97,108,116,121,115,105,109,112,108,101,58, -105,102,32,116,104,101,121,76,101,116,116,101,114,115,97,32,115,104,111,114,116, -72,101,114,98,101,114,116,115,116,114,105,107,101,115,32,103,114,111,117,112,115 -,46,108,101,110,103,116,104,102,108,105,103,104,116,115,111,118,101,114,108,97, -112,115,108,111,119,108,121,32,108,101,115,115,101,114,32,115,111,99,105,97,108, -32,60,47,112,62,10,9,9,105,116,32,105,110,116,111,114,97,110,107,101,100,32,114, -97,116,101,32,111,102,117,108,62,13,10,32,32,97,116,116,101,109,112,116,112,97, -105,114,32,111,102,109,97,107,101,32,105,116,75,111,110,116,97,107,116,65,110, -116,111,110,105,111,104,97,118,105,110,103,32,114,97,116,105,110,103,115,32,97, -99,116,105,118,101,115,116,114,101,97,109,115,116,114,97,112,112,101,100,34,41, -46,99,115,115,40,104,111,115,116,105,108,101,108,101,97,100,32,116,111,108,105, -116,116,108,101,32,103,114,111,117,112,115,44,80,105,99,116,117,114,101,45,45,62 -,13,10,13,10,32,114,111,119,115,61,34,32,111,98,106,101,99,116,105,110,118,101, -114,115,101,60,102,111,111,116,101,114,67,117,115,116,111,109,86,62,60,92,47,115 -,99,114,115,111,108,118,105,110,103,67,104,97,109,98,101,114,115,108,97,118,101, -114,121,119,111,117,110,100,101,100,119,104,101,114,101,97,115,33,61,32,39,117, -110,100,102,111,114,32,97,108,108,112,97,114,116,108,121,32,45,114,105,103,104, -116,58,65,114,97,98,105,97,110,98,97,99,107,101,100,32,99,101,110,116,117,114, -121,117,110,105,116,32,111,102,109,111,98,105,108,101,45,69,117,114,111,112,101, -44,105,115,32,104,111,109,101,114,105,115,107,32,111,102,100,101,115,105,114,101 -,100,67,108,105,110,116,111,110,99,111,115,116,32,111,102,97,103,101,32,111,102, -32,98,101,99,111,109,101,32,110,111,110,101,32,111,102,112,38,113,117,111,116,59 -,77,105,100,100,108,101,32,101,97,100,39,41,91,48,67,114,105,116,105,99,115,115, -116,117,100,105,111,115,62,38,99,111,112,121,59,103,114,111,117,112,34,62,97,115 -,115,101,109,98,108,109,97,107,105,110,103,32,112,114,101,115,115,101,100,119, -105,100,103,101,116,46,112,115,58,34,32,63,32,114,101,98,117,105,108,116,98,121, -32,115,111,109,101,70,111,114,109,101,114,32,101,100,105,116,111,114,115,100,101 -,108,97,121,101,100,67,97,110,111,110,105,99,104,97,100,32,116,104,101,112,117, -115,104,105,110,103,99,108,97,115,115,61,34,98,117,116,32,97,114,101,112,97,114, -116,105,97,108,66,97,98,121,108,111,110,98,111,116,116,111,109,32,99,97,114,114, -105,101,114,67,111,109,109,97,110,100,105,116,115,32,117,115,101,65,115,32,119, -105,116,104,99,111,117,114,115,101,115,97,32,116,104,105,114,100,100,101,110,111 -,116,101,115,97,108,115,111,32,105,110,72,111,117,115,116,111,110,50,48,112,120, -59,34,62,97,99,99,117,115,101,100,100,111,117,98,108,101,32,103,111,97,108,32, -111,102,70,97,109,111,117,115,32,41,46,98,105,110,100,40,112,114,105,101,115,116 -,115,32,79,110,108,105,110,101,105,110,32,74,117,108,121,115,116,32,43,32,34,103 -,99,111,110,115,117,108,116,100,101,99,105,109,97,108,104,101,108,112,102,117, -108,114,101,118,105,118,101,100,105,115,32,118,101,114,121,114,39,43,39,105,112, -116,108,111,115,105,110,103,32,102,101,109,97,108,101,115,105,115,32,97,108,115, -111,115,116,114,105,110,103,115,100,97,121,115,32,111,102,97,114,114,105,118,97, -108,102,117,116,117,114,101,32,60,111,98,106,101,99,116,102,111,114,99,105,110, -103,83,116,114,105,110,103,40,34,32,47,62,10,9,9,104,101,114,101,32,105,115,101, -110,99,111,100,101,100,46,32,32,84,104,101,32,98,97,108,108,111,111,110,100,111, -110,101,32,98,121,47,99,111,109,109,111,110,98,103,99,111,108,111,114,108,97,119 -,32,111,102,32,73,110,100,105,97,110,97,97,118,111,105,100,101,100,98,117,116,32 -,116,104,101,50,112,120,32,51,112,120,106,113,117,101,114,121,46,97,102,116,101, -114,32,97,112,111,108,105,99,121,46,109,101,110,32,97,110,100,102,111,111,116, -101,114,45,61,32,116,114,117,101,59,102,111,114,32,117,115,101,115,99,114,101, -101,110,46,73,110,100,105,97,110,32,105,109,97,103,101,32,61,102,97,109,105,108, -121,44,104,116,116,112,58,47,47,32,38,110,98,115,112,59,100,114,105,118,101,114, -115,101,116,101,114,110,97,108,115,97,109,101,32,97,115,110,111,116,105,99,101, -100,118,105,101,119,101,114,115,125,41,40,41,59,10,32,105,115,32,109,111,114,101 -,115,101,97,115,111,110,115,102,111,114,109,101,114,32,116,104,101,32,110,101, -119,105,115,32,106,117,115,116,99,111,110,115,101,110,116,32,83,101,97,114,99, -104,119,97,115,32,116,104,101,119,104,121,32,116,104,101,115,104,105,112,112,101 -,100,98,114,62,60,98,114,62,119,105,100,116,104,58,32,104,101,105,103,104,116,61 -,109,97,100,101,32,111,102,99,117,105,115,105,110,101,105,115,32,116,104,97,116, -97,32,118,101,114,121,32,65,100,109,105,114,97,108,32,102,105,120,101,100,59,110 -,111,114,109,97,108,32,77,105,115,115,105,111,110,80,114,101,115,115,44,32,111, -110,116,97,114,105,111,99,104,97,114,115,101,116,116,114,121,32,116,111,32,105, -110,118,97,100,101,100,61,34,116,114,117,101,34,115,112,97,99,105,110,103,105, -115,32,109,111,115,116,97,32,109,111,114,101,32,116,111,116,97,108,108,121,102, -97,108,108,32,111,102,125,41,59,13,10,32,32,105,109,109,101,110,115,101,116,105, -109,101,32,105,110,115,101,116,32,111,117,116,115,97,116,105,115,102,121,116,111 -,32,102,105,110,100,100,111,119,110,32,116,111,108,111,116,32,111,102,32,80,108, -97,121,101,114,115,105,110,32,74,117,110,101,113,117,97,110,116,117,109,110,111, -116,32,116,104,101,116,105,109,101,32,116,111,100,105,115,116,97,110,116,70,105, -110,110,105,115,104,115,114,99,32,61,32,40,115,105,110,103,108,101,32,104,101, -108,112,32,111,102,71,101,114,109,97,110,32,108,97,119,32,97,110,100,108,97,98, -101,108,101,100,102,111,114,101,115,116,115,99,111,111,107,105,110,103,115,112, -97,99,101,34,62,104,101,97,100,101,114,45,119,101,108,108,32,97,115,83,116,97, -110,108,101,121,98,114,105,100,103,101,115,47,103,108,111,98,97,108,67,114,111, -97,116,105,97,32,65,98,111,117,116,32,91,48,93,59,10,32,32,105,116,44,32,97,110, -100,103,114,111,117,112,101,100,98,101,105,110,103,32,97,41,123,116,104,114,111, -119,104,101,32,109,97,100,101,108,105,103,104,116,101,114,101,116,104,105,99,97, -108,70,70,70,70,70,70,34,98,111,116,116,111,109,34,108,105,107,101,32,97,32,101, -109,112,108,111,121,115,108,105,118,101,32,105,110,97,115,32,115,101,101,110,112 -,114,105,110,116,101,114,109,111,115,116,32,111,102,117,98,45,108,105,110,107, -114,101,106,101,99,116,115,97,110,100,32,117,115,101,105,109,97,103,101,34,62, -115,117,99,99,101,101,100,102,101,101,100,105,110,103,78,117,99,108,101,97,114, -105,110,102,111,114,109,97,116,111,32,104,101,108,112,87,111,109,101,110,39,115, -78,101,105,116,104,101,114,77,101,120,105,99,97,110,112,114,111,116,101,105,110, -60,116,97,98,108,101,32,98,121,32,109,97,110,121,104,101,97,108,116,104,121,108, -97,119,115,117,105,116,100,101,118,105,115,101,100,46,112,117,115,104,40,123,115 -,101,108,108,101,114,115,115,105,109,112,108,121,32,84,104,114,111,117,103,104, -46,99,111,111,107,105,101,32,73,109,97,103,101,40,111,108,100,101,114,34,62,117, -115,46,106,115,34,62,32,83,105,110,99,101,32,117,110,105,118,101,114,115,108,97, -114,103,101,114,32,111,112,101,110,32,116,111,33,45,45,32,101,110,100,108,105, -101,115,32,105,110,39,93,41,59,13,10,32,32,109,97,114,107,101,116,119,104,111,32 -,105,115,32,40,34,68,79,77,67,111,109,97,110,97,103,101,100,111,110,101,32,102, -111,114,116,121,112,101,111,102,32,75,105,110,103,100,111,109,112,114,111,102, -105,116,115,112,114,111,112,111,115,101,116,111,32,115,104,111,119,99,101,110, -116,101,114,59,109,97,100,101,32,105,116,100,114,101,115,115,101,100,119,101,114 -,101,32,105,110,109,105,120,116,117,114,101,112,114,101,99,105,115,101,97,114, -105,115,105,110,103,115,114,99,32,61,32,39,109,97,107,101,32,97,32,115,101,99, -117,114,101,100,66,97,112,116,105,115,116,118,111,116,105,110,103,32,10,9,9,118, -97,114,32,77,97,114,99,104,32,50,103,114,101,119,32,117,112,67,108,105,109,97, -116,101,46,114,101,109,111,118,101,115,107,105,108,108,101,100,119,97,121,32,116 -,104,101,60,47,104,101,97,100,62,102,97,99,101,32,111,102,97,99,116,105,110,103, -32,114,105,103,104,116,34,62,116,111,32,119,111,114,107,114,101,100,117,99,101, -115,104,97,115,32,104,97,100,101,114,101,99,116,101,100,115,104,111,119,40,41,59 -,97,99,116,105,111,110,61,98,111,111,107,32,111,102,97,110,32,97,114,101,97,61, -61,32,34,104,116,116,60,104,101,97,100,101,114,10,60,104,116,109,108,62,99,111, -110,102,111,114,109,102,97,99,105,110,103,32,99,111,111,107,105,101,46,114,101, -108,121,32,111,110,104,111,115,116,101,100,32,46,99,117,115,116,111,109,104,101, -32,119,101,110,116,98,117,116,32,102,111,114,115,112,114,101,97,100,32,70,97,109 -,105,108,121,32,97,32,109,101,97,110,115,111,117,116,32,116,104,101,102,111,114, -117,109,115,46,102,111,111,116,97,103,101,34,62,77,111,98,105,108,67,108,101,109 -,101,110,116,115,34,32,105,100,61,34,97,115,32,104,105,103,104,105,110,116,101, -110,115,101,45,45,62,60,33,45,45,102,101,109,97,108,101,32,105,115,32,115,101, -101,110,105,109,112,108,105,101,100,115,101,116,32,116,104,101,97,32,115,116,97, -116,101,97,110,100,32,104,105,115,102,97,115,116,101,115,116,98,101,115,105,100, -101,115,98,117,116,116,111,110,95,98,111,117,110,100,101,100,34,62,60,105,109, -103,32,73,110,102,111,98,111,120,101,118,101,110,116,115,44,97,32,121,111,117, -110,103,97,110,100,32,97,114,101,78,97,116,105,118,101,32,99,104,101,97,112,101, -114,84,105,109,101,111,117,116,97,110,100,32,104,97,115,101,110,103,105,110,101, -115,119,111,110,32,116,104,101,40,109,111,115,116,108,121,114,105,103,104,116,58 -,32,102,105,110,100,32,97,32,45,98,111,116,116,111,109,80,114,105,110,99,101,32, -97,114,101,97,32,111,102,109,111,114,101,32,111,102,115,101,97,114,99,104,95,110 -,97,116,117,114,101,44,108,101,103,97,108,108,121,112,101,114,105,111,100,44,108 -,97,110,100,32,111,102,111,114,32,119,105,116,104,105,110,100,117,99,101,100,112 -,114,111,118,105,110,103,109,105,115,115,105,108,101,108,111,99,97,108,108,121, -65,103,97,105,110,115,116,116,104,101,32,119,97,121,107,38,113,117,111,116,59, -112,120,59,34,62,13,10,112,117,115,104,101,100,32,97,98,97,110,100,111,110,110, -117,109,101,114,97,108,67,101,114,116,97,105,110,73,110,32,116,104,105,115,109, -111,114,101,32,105,110,111,114,32,115,111,109,101,110,97,109,101,32,105,115,97, -110,100,44,32,105,110,99,114,111,119,110,101,100,73,83,66,78,32,48,45,99,114,101 -,97,116,101,115,79,99,116,111,98,101,114,109,97,121,32,110,111,116,99,101,110, -116,101,114,32,108,97,116,101,32,105,110,68,101,102,101,110,99,101,101,110,97,99 -,116,101,100,119,105,115,104,32,116,111,98,114,111,97,100,108,121,99,111,111,108 -,105,110,103,111,110,108,111,97,100,61,105,116,46,32,84,104,101,114,101,99,111, -118,101,114,77,101,109,98,101,114,115,104,101,105,103,104,116,32,97,115,115,117, -109,101,115,60,104,116,109,108,62,10,112,101,111,112,108,101,46,105,110,32,111, -110,101,32,61,119,105,110,100,111,119,102,111,111,116,101,114,95,97,32,103,111, -111,100,32,114,101,107,108,97,109,97,111,116,104,101,114,115,44,116,111,32,116, -104,105,115,95,99,111,111,107,105,101,112,97,110,101,108,34,62,76,111,110,100, -111,110,44,100,101,102,105,110,101,115,99,114,117,115,104,101,100,98,97,112,116, -105,115,109,99,111,97,115,116,97,108,115,116,97,116,117,115,32,116,105,116,108, -101,34,32,109,111,118,101,32,116,111,108,111,115,116,32,105,110,98,101,116,116, -101,114,32,105,109,112,108,105,101,115,114,105,118,97,108,114,121,115,101,114, -118,101,114,115,32,83,121,115,116,101,109,80,101,114,104,97,112,115,101,115,32, -97,110,100,32,99,111,110,116,101,110,100,102,108,111,119,105,110,103,108,97,115, -116,101,100,32,114,105,115,101,32,105,110,71,101,110,101,115,105,115,118,105,101 -,119,32,111,102,114,105,115,105,110,103,32,115,101,101,109,32,116,111,98,117,116 -,32,105,110,32,98,97,99,107,105,110,103,104,101,32,119,105,108,108,103,105,118, -101,110,32,97,103,105,118,105,110,103,32,99,105,116,105,101,115,46,102,108,111, -119,32,111,102,32,76,97,116,101,114,32,97,108,108,32,98,117,116,72,105,103,104, -119,97,121,111,110,108,121,32,98,121,115,105,103,110,32,111,102,104,101,32,100, -111,101,115,100,105,102,102,101,114,115,98,97,116,116,101,114,121,38,97,109,112, -59,108,97,115,105,110,103,108,101,115,116,104,114,101,97,116,115,105,110,116,101 -,103,101,114,116,97,107,101,32,111,110,114,101,102,117,115,101,100,99,97,108,108 -,101,100,32,61,85,83,38,97,109,112,83,101,101,32,116,104,101,110,97,116,105,118, -101,115,98,121,32,116,104,105,115,115,121,115,116,101,109,46,104,101,97,100,32, -111,102,58,104,111,118,101,114,44,108,101,115,98,105,97,110,115,117,114,110,97, -109,101,97,110,100,32,97,108,108,99,111,109,109,111,110,47,104,101,97,100,101, -114,95,95,112,97,114,97,109,115,72,97,114,118,97,114,100,47,112,105,120,101,108, -46,114,101,109,111,118,97,108,115,111,32,108,111,110,103,114,111,108,101,32,111, -102,106,111,105,110,116,108,121,115,107,121,115,99,114,97,85,110,105,99,111,100, -101,98,114,32,47,62,13,10,65,116,108,97,110,116,97,110,117,99,108,101,117,115,67 -,111,117,110,116,121,44,112,117,114,101,108,121,32,99,111,117,110,116,34,62,101, -97,115,105,108,121,32,98,117,105,108,100,32,97,111,110,99,108,105,99,107,97,32, -103,105,118,101,110,112,111,105,110,116,101,114,104,38,113,117,111,116,59,101, -118,101,110,116,115,32,101,108,115,101,32,123,10,100,105,116,105,111,110,115,110 -,111,119,32,116,104,101,44,32,119,105,116,104,32,109,97,110,32,119,104,111,111, -114,103,47,87,101,98,111,110,101,32,97,110,100,99,97,118,97,108,114,121,72,101, -32,100,105,101,100,115,101,97,116,116,108,101,48,48,44,48,48,48,32,123,119,105, -110,100,111,119,104,97,118,101,32,116,111,105,102,40,119,105,110,100,97,110,100, -32,105,116,115,115,111,108,101,108,121,32,109,38,113,117,111,116,59,114,101,110, -101,119,101,100,68,101,116,114,111,105,116,97,109,111,110,103,115,116,101,105, -116,104,101,114,32,116,104,101,109,32,105,110,83,101,110,97,116,111,114,85,115, -60,47,97,62,60,75,105,110,103,32,111,102,70,114,97,110,99,105,115,45,112,114,111 -,100,117,99,104,101,32,117,115,101,100,97,114,116,32,97,110,100,104,105,109,32, -97,110,100,117,115,101,100,32,98,121,115,99,111,114,105,110,103,97,116,32,104, -111,109,101,116,111,32,104,97,118,101,114,101,108,97,116,101,115,105,98,105,108, -105,116,121,102,97,99,116,105,111,110,66,117,102,102,97,108,111,108,105,110,107, -34,62,60,119,104,97,116,32,104,101,102,114,101,101,32,116,111,67,105,116,121,32, -111,102,99,111,109,101,32,105,110,115,101,99,116,111,114,115,99,111,117,110,116, -101,100,111,110,101,32,100,97,121,110,101,114,118,111,117,115,115,113,117,97,114 -,101,32,125,59,105,102,40,103,111,105,110,32,119,104,97,116,105,109,103,34,32,97 -,108,105,115,32,111,110,108,121,115,101,97,114,99,104,47,116,117,101,115,100,97, -121,108,111,111,115,101,108,121,83,111,108,111,109,111,110,115,101,120,117,97, -108,32,45,32,60,97,32,104,114,109,101,100,105,117,109,34,68,79,32,78,79,84,32,70 -,114,97,110,99,101,44,119,105,116,104,32,97,32,119,97,114,32,97,110,100,115,101, -99,111,110,100,32,116,97,107,101,32,97,32,62,13,10,13,10,13,10,109,97,114,107, -101,116,46,104,105,103,104,119,97,121,100,111,110,101,32,105,110,99,116,105,118, -105,116,121,34,108,97,115,116,34,62,111,98,108,105,103,101,100,114,105,115,101, -32,116,111,34,117,110,100,101,102,105,109,97,100,101,32,116,111,32,69,97,114,108 -,121,32,112,114,97,105,115,101,100,105,110,32,105,116,115,32,102,111,114,32,104, -105,115,97,116,104,108,101,116,101,74,117,112,105,116,101,114,89,97,104,111,111, -33,32,116,101,114,109,101,100,32,115,111,32,109,97,110,121,114,101,97,108,108, -121,32,115,46,32,84,104,101,32,97,32,119,111,109,97,110,63,118,97,108,117,101,61 -,100,105,114,101,99,116,32,114,105,103,104,116,34,32,98,105,99,121,99,108,101,97 -,99,105,110,103,61,34,100,97,121,32,97,110,100,115,116,97,116,105,110,103,82,97, -116,104,101,114,44,104,105,103,104,101,114,32,79,102,102,105,99,101,32,97,114, -101,32,110,111,119,116,105,109,101,115,44,32,119,104,101,110,32,97,32,112,97,121 -,32,102,111,114,111,110,32,116,104,105,115,45,108,105,110,107,34,62,59,98,111, -114,100,101,114,97,114,111,117,110,100,32,97,110,110,117,97,108,32,116,104,101, -32,78,101,119,112,117,116,32,116,104,101,46,99,111,109,34,32,116,97,107,105,110, -32,116,111,97,32,98,114,105,101,102,40,105,110,32,116,104,101,103,114,111,117, -112,115,46,59,32,119,105,100,116,104,101,110,122,121,109,101,115,115,105,109,112 -,108,101,32,105,110,32,108,97,116,101,123,114,101,116,117,114,110,116,104,101, -114,97,112,121,97,32,112,111,105,110,116,98,97,110,110,105,110,103,105,110,107, -115,34,62,10,40,41,59,34,32,114,101,97,32,112,108,97,99,101,92,117,48,48,51,67, -97,97,98,111,117,116,32,97,116,114,62,13,10,9,9,99,99,111,117,110,116,32,103,105 -,118,101,115,32,97,60,83,67,82,73,80,84,82,97,105,108,119,97,121,116,104,101,109 -,101,115,47,116,111,111,108,98,111,120,66,121,73,100,40,34,120,104,117,109,97, -110,115,44,119,97,116,99,104,101,115,105,110,32,115,111,109,101,32,105,102,32,40 -,119,105,99,111,109,105,110,103,32,102,111,114,109,97,116,115,32,85,110,100,101, -114,32,98,117,116,32,104,97,115,104,97,110,100,101,100,32,109,97,100,101,32,98, -121,116,104,97,110,32,105,110,102,101,97,114,32,111,102,100,101,110,111,116,101, -100,47,105,102,114,97,109,101,108,101,102,116,32,105,110,118,111,108,116,97,103, -101,105,110,32,101,97,99,104,97,38,113,117,111,116,59,98,97,115,101,32,111,102, -73,110,32,109,97,110,121,117,110,100,101,114,103,111,114,101,103,105,109,101,115 -,97,99,116,105,111,110,32,60,47,112,62,13,10,60,117,115,116,111,109,86,97,59,38, -103,116,59,60,47,105,109,112,111,114,116,115,111,114,32,116,104,97,116,109,111, -115,116,108,121,32,38,97,109,112,59,114,101,32,115,105,122,101,61,34,60,47,97,62 -,60,47,104,97,32,99,108,97,115,115,112,97,115,115,105,118,101,72,111,115,116,32, -61,32,87,104,101,116,104,101,114,102,101,114,116,105,108,101,86,97,114,105,111, -117,115,61,91,93,59,40,102,117,99,97,109,101,114,97,115,47,62,60,47,116,100,62, -97,99,116,115,32,97,115,73,110,32,115,111,109,101,62,13,10,13,10,60,33,111,114, -103,97,110,105,115,32,60,98,114,32,47,62,66,101,105,106,105,110,103,99,97,116,97 -,108,195,160,100,101,117,116,115,99,104,101,117,114,111,112,101,117,101,117,115, -107,97,114,97,103,97,101,105,108,103,101,115,118,101,110,115,107,97,101,115,112, -97,195,177,97,109,101,110,115,97,106,101,117,115,117,97,114,105,111,116,114,97, -98,97,106,111,109,195,169,120,105,99,111,112,195,161,103,105,110,97,115,105,101, -109,112,114,101,115,105,115,116,101,109,97,111,99,116,117,98,114,101,100,117,114 -,97,110,116,101,97,195,177,97,100,105,114,101,109,112,114,101,115,97,109,111,109 -,101,110,116,111,110,117,101,115,116,114,111,112,114,105,109,101,114,97,116,114, -97,118,195,169,115,103,114,97,99,105,97,115,110,117,101,115,116,114,97,112,114, -111,99,101,115,111,101,115,116,97,100,111,115,99,97,108,105,100,97,100,112,101, -114,115,111,110,97,110,195,186,109,101,114,111,97,99,117,101,114,100,111,109,195 -,186,115,105,99,97,109,105,101,109,98,114,111,111,102,101,114,116,97,115,97,108, -103,117,110,111,115,112,97,195,173,115,101,115,101,106,101,109,112,108,111,100, -101,114,101,99,104,111,97,100,101,109,195,161,115,112,114,105,118,97,100,111,97, -103,114,101,103,97,114,101,110,108,97,99,101,115,112,111,115,105,98,108,101,104, -111,116,101,108,101,115,115,101,118,105,108,108,97,112,114,105,109,101,114,111, -195,186,108,116,105,109,111,101,118,101,110,116,111,115,97,114,99,104,105,118, -111,99,117,108,116,117,114,97,109,117,106,101,114,101,115,101,110,116,114,97,100 -,97,97,110,117,110,99,105,111,101,109,98,97,114,103,111,109,101,114,99,97,100, -111,103,114,97,110,100,101,115,101,115,116,117,100,105,111,109,101,106,111,114, -101,115,102,101,98,114,101,114,111,100,105,115,101,195,177,111,116,117,114,105, -115,109,111,99,195,179,100,105,103,111,112,111,114,116,97,100,97,101,115,112,97, -99,105,111,102,97,109,105,108,105,97,97,110,116,111,110,105,111,112,101,114,109, -105,116,101,103,117,97,114,100,97,114,97,108,103,117,110,97,115,112,114,101,99, -105,111,115,97,108,103,117,105,101,110,115,101,110,116,105,100,111,118,105,115, -105,116,97,115,116,195,173,116,117,108,111,99,111,110,111,99,101,114,115,101,103 -,117,110,100,111,99,111,110,115,101,106,111,102,114,97,110,99,105,97,109,105,110 -,117,116,111,115,115,101,103,117,110,100,97,116,101,110,101,109,111,115,101,102, -101,99,116,111,115,109,195,161,108,97,103,97,115,101,115,105,195,179,110,114,101 -,118,105,115,116,97,103,114,97,110,97,100,97,99,111,109,112,114,97,114,105,110, -103,114,101,115,111,103,97,114,99,195,173,97,97,99,99,105,195,179,110,101,99,117 -,97,100,111,114,113,117,105,101,110,101,115,105,110,99,108,117,115,111,100,101, -98,101,114,195,161,109,97,116,101,114,105,97,104,111,109,98,114,101,115,109,117, -101,115,116,114,97,112,111,100,114,195,173,97,109,97,195,177,97,110,97,195,186, -108,116,105,109,97,101,115,116,97,109,111,115,111,102,105,99,105,97,108,116,97, -109,98,105,101,110,110,105,110,103,195,186,110,115,97,108,117,100,111,115,112, -111,100,101,109,111,115,109,101,106,111,114,97,114,112,111,115,105,116,105,111, -110,98,117,115,105,110,101,115,115,104,111,109,101,112,97,103,101,115,101,99,117 -,114,105,116,121,108,97,110,103,117,97,103,101,115,116,97,110,100,97,114,100,99, -97,109,112,97,105,103,110,102,101,97,116,117,114,101,115,99,97,116,101,103,111, -114,121,101,120,116,101,114,110,97,108,99,104,105,108,100,114,101,110,114,101, -115,101,114,118,101,100,114,101,115,101,97,114,99,104,101,120,99,104,97,110,103, -101,102,97,118,111,114,105,116,101,116,101,109,112,108,97,116,101,109,105,108, -105,116,97,114,121,105,110,100,117,115,116,114,121,115,101,114,118,105,99,101, -115,109,97,116,101,114,105,97,108,112,114,111,100,117,99,116,115,122,45,105,110, -100,101,120,58,99,111,109,109,101,110,116,115,115,111,102,116,119,97,114,101,99, -111,109,112,108,101,116,101,99,97,108,101,110,100,97,114,112,108,97,116,102,111, -114,109,97,114,116,105,99,108,101,115,114,101,113,117,105,114,101,100,109,111, -118,101,109,101,110,116,113,117,101,115,116,105,111,110,98,117,105,108,100,105, -110,103,112,111,108,105,116,105,99,115,112,111,115,115,105,98,108,101,114,101, -108,105,103,105,111,110,112,104,121,115,105,99,97,108,102,101,101,100,98,97,99, -107,114,101,103,105,115,116,101,114,112,105,99,116,117,114,101,115,100,105,115, -97,98,108,101,100,112,114,111,116,111,99,111,108,97,117,100,105,101,110,99,101, -115,101,116,116,105,110,103,115,97,99,116,105,118,105,116,121,101,108,101,109, -101,110,116,115,108,101,97,114,110,105,110,103,97,110,121,116,104,105,110,103,97 -,98,115,116,114,97,99,116,112,114,111,103,114,101,115,115,111,118,101,114,118, -105,101,119,109,97,103,97,122,105,110,101,101,99,111,110,111,109,105,99,116,114, -97,105,110,105,110,103,112,114,101,115,115,117,114,101,118,97,114,105,111,117, -115,32,60,115,116,114,111,110,103,62,112,114,111,112,101,114,116,121,115,104,111 -,112,112,105,110,103,116,111,103,101,116,104,101,114,97,100,118,97,110,99,101, -100,98,101,104,97,118,105,111,114,100,111,119,110,108,111,97,100,102,101,97,116, -117,114,101,100,102,111,111,116,98,97,108,108,115,101,108,101,99,116,101,100,76, -97,110,103,117,97,103,101,100,105,115,116,97,110,99,101,114,101,109,101,109,98, -101,114,116,114,97,99,107,105,110,103,112,97,115,115,119,111,114,100,109,111,100 -,105,102,105,101,100,115,116,117,100,101,110,116,115,100,105,114,101,99,116,108, -121,102,105,103,104,116,105,110,103,110,111,114,116,104,101,114,110,100,97,116, -97,98,97,115,101,102,101,115,116,105,118,97,108,98,114,101,97,107,105,110,103, -108,111,99,97,116,105,111,110,105,110,116,101,114,110,101,116,100,114,111,112, -100,111,119,110,112,114,97,99,116,105,99,101,101,118,105,100,101,110,99,101,102, -117,110,99,116,105,111,110,109,97,114,114,105,97,103,101,114,101,115,112,111,110 -,115,101,112,114,111,98,108,101,109,115,110,101,103,97,116,105,118,101,112,114, -111,103,114,97,109,115,97,110,97,108,121,115,105,115,114,101,108,101,97,115,101, -100,98,97,110,110,101,114,34,62,112,117,114,99,104,97,115,101,112,111,108,105,99 -,105,101,115,114,101,103,105,111,110,97,108,99,114,101,97,116,105,118,101,97,114 -,103,117,109,101,110,116,98,111,111,107,109,97,114,107,114,101,102,101,114,114, -101,114,99,104,101,109,105,99,97,108,100,105,118,105,115,105,111,110,99,97,108, -108,98,97,99,107,115,101,112,97,114,97,116,101,112,114,111,106,101,99,116,115,99 -,111,110,102,108,105,99,116,104,97,114,100,119,97,114,101,105,110,116,101,114, -101,115,116,100,101,108,105,118,101,114,121,109,111,117,110,116,97,105,110,111, -98,116,97,105,110,101,100,61,32,102,97,108,115,101,59,102,111,114,40,118,97,114, -32,97,99,99,101,112,116,101,100,99,97,112,97,99,105,116,121,99,111,109,112,117, -116,101,114,105,100,101,110,116,105,116,121,97,105,114,99,114,97,102,116,101,109 -,112,108,111,121,101,100,112,114,111,112,111,115,101,100,100,111,109,101,115,116 -,105,99,105,110,99,108,117,100,101,115,112,114,111,118,105,100,101,100,104,111, -115,112,105,116,97,108,118,101,114,116,105,99,97,108,99,111,108,108,97,112,115, -101,97,112,112,114,111,97,99,104,112,97,114,116,110,101,114,115,108,111,103,111, -34,62,60,97,100,97,117,103,104,116,101,114,97,117,116,104,111,114,34,32,99,117, -108,116,117,114,97,108,102,97,109,105,108,105,101,115,47,105,109,97,103,101,115, -47,97,115,115,101,109,98,108,121,112,111,119,101,114,102,117,108,116,101,97,99, -104,105,110,103,102,105,110,105,115,104,101,100,100,105,115,116,114,105,99,116, -99,114,105,116,105,99,97,108,99,103,105,45,98,105,110,47,112,117,114,112,111,115 -,101,115,114,101,113,117,105,114,101,115,101,108,101,99,116,105,111,110,98,101, -99,111,109,105,110,103,112,114,111,118,105,100,101,115,97,99,97,100,101,109,105, -99,101,120,101,114,99,105,115,101,97,99,116,117,97,108,108,121,109,101,100,105, -99,105,110,101,99,111,110,115,116,97,110,116,97,99,99,105,100,101,110,116,77,97, -103,97,122,105,110,101,100,111,99,117,109,101,110,116,115,116,97,114,116,105,110 -,103,98,111,116,116,111,109,34,62,111,98,115,101,114,118,101,100,58,32,38,113, -117,111,116,59,101,120,116,101,110,100,101,100,112,114,101,118,105,111,117,115, -83,111,102,116,119,97,114,101,99,117,115,116,111,109,101,114,100,101,99,105,115, -105,111,110,115,116,114,101,110,103,116,104,100,101,116,97,105,108,101,100,115, -108,105,103,104,116,108,121,112,108,97,110,110,105,110,103,116,101,120,116,97, -114,101,97,99,117,114,114,101,110,99,121,101,118,101,114,121,111,110,101,115,116 -,114,97,105,103,104,116,116,114,97,110,115,102,101,114,112,111,115,105,116,105, -118,101,112,114,111,100,117,99,101,100,104,101,114,105,116,97,103,101,115,104, -105,112,112,105,110,103,97,98,115,111,108,117,116,101,114,101,99,101,105,118,101 -,100,114,101,108,101,118,97,110,116,98,117,116,116,111,110,34,32,118,105,111,108 -,101,110,99,101,97,110,121,119,104,101,114,101,98,101,110,101,102,105,116,115, -108,97,117,110,99,104,101,100,114,101,99,101,110,116,108,121,97,108,108,105,97, -110,99,101,102,111,108,108,111,119,101,100,109,117,108,116,105,112,108,101,98, -117,108,108,101,116,105,110,105,110,99,108,117,100,101,100,111,99,99,117,114,114 -,101,100,105,110,116,101,114,110,97,108,36,40,116,104,105,115,41,46,114,101,112, -117,98,108,105,99,62,60,116,114,62,60,116,100,99,111,110,103,114,101,115,115,114 -,101,99,111,114,100,101,100,117,108,116,105,109,97,116,101,115,111,108,117,116, -105,111,110,60,117,108,32,105,100,61,34,100,105,115,99,111,118,101,114,72,111, -109,101,60,47,97,62,119,101,98,115,105,116,101,115,110,101,116,119,111,114,107, -115,97,108,116,104,111,117,103,104,101,110,116,105,114,101,108,121,109,101,109, -111,114,105,97,108,109,101,115,115,97,103,101,115,99,111,110,116,105,110,117,101 -,97,99,116,105,118,101,34,62,115,111,109,101,119,104,97,116,118,105,99,116,111, -114,105,97,87,101,115,116,101,114,110,32,32,116,105,116,108,101,61,34,76,111,99, -97,116,105,111,110,99,111,110,116,114,97,99,116,118,105,115,105,116,111,114,115, -68,111,119,110,108,111,97,100,119,105,116,104,111,117,116,32,114,105,103,104,116 -,34,62,10,109,101,97,115,117,114,101,115,119,105,100,116,104,32,61,32,118,97,114 -,105,97,98,108,101,105,110,118,111,108,118,101,100,118,105,114,103,105,110,105, -97,110,111,114,109,97,108,108,121,104,97,112,112,101,110,101,100,97,99,99,111, -117,110,116,115,115,116,97,110,100,105,110,103,110,97,116,105,111,110,97,108,82, -101,103,105,115,116,101,114,112,114,101,112,97,114,101,100,99,111,110,116,114, -111,108,115,97,99,99,117,114,97,116,101,98,105,114,116,104,100,97,121,115,116, -114,97,116,101,103,121,111,102,102,105,99,105,97,108,103,114,97,112,104,105,99, -115,99,114,105,109,105,110,97,108,112,111,115,115,105,98,108,121,99,111,110,115, -117,109,101,114,80,101,114,115,111,110,97,108,115,112,101,97,107,105,110,103,118 -,97,108,105,100,97,116,101,97,99,104,105,101,118,101,100,46,106,112,103,34,32,47 -,62,109,97,99,104,105,110,101,115,60,47,104,50,62,10,32,32,107,101,121,119,111, -114,100,115,102,114,105,101,110,100,108,121,98,114,111,116,104,101,114,115,99, -111,109,98,105,110,101,100,111,114,105,103,105,110,97,108,99,111,109,112,111,115 -,101,100,101,120,112,101,99,116,101,100,97,100,101,113,117,97,116,101,112,97,107 -,105,115,116,97,110,102,111,108,108,111,119,34,32,118,97,108,117,97,98,108,101, -60,47,108,97,98,101,108,62,114,101,108,97,116,105,118,101,98,114,105,110,103,105 -,110,103,105,110,99,114,101,97,115,101,103,111,118,101,114,110,111,114,112,108, -117,103,105,110,115,47,76,105,115,116,32,111,102,32,72,101,97,100,101,114,34,62, -34,32,110,97,109,101,61,34,32,40,38,113,117,111,116,59,103,114,97,100,117,97,116 -,101,60,47,104,101,97,100,62,10,99,111,109,109,101,114,99,101,109,97,108,97,121, -115,105,97,100,105,114,101,99,116,111,114,109,97,105,110,116,97,105,110,59,104, -101,105,103,104,116,58,115,99,104,101,100,117,108,101,99,104,97,110,103,105,110, -103,98,97,99,107,32,116,111,32,99,97,116,104,111,108,105,99,112,97,116,116,101, -114,110,115,99,111,108,111,114,58,32,35,103,114,101,97,116,101,115,116,115,117, -112,112,108,105,101,115,114,101,108,105,97,98,108,101,60,47,117,108,62,10,9,9,60 -,115,101,108,101,99,116,32,99,105,116,105,122,101,110,115,99,108,111,116,104,105 -,110,103,119,97,116,99,104,105,110,103,60,108,105,32,105,100,61,34,115,112,101, -99,105,102,105,99,99,97,114,114,121,105,110,103,115,101,110,116,101,110,99,101, -60,99,101,110,116,101,114,62,99,111,110,116,114,97,115,116,116,104,105,110,107, -105,110,103,99,97,116,99,104,40,101,41,115,111,117,116,104,101,114,110,77,105,99 -,104,97,101,108,32,109,101,114,99,104,97,110,116,99,97,114,111,117,115,101,108, -112,97,100,100,105,110,103,58,105,110,116,101,114,105,111,114,46,115,112,108,105 -,116,40,34,108,105,122,97,116,105,111,110,79,99,116,111,98,101,114,32,41,123,114 -,101,116,117,114,110,105,109,112,114,111,118,101,100,45,45,38,103,116,59,10,10, -99,111,118,101,114,97,103,101,99,104,97,105,114,109,97,110,46,112,110,103,34,32, -47,62,115,117,98,106,101,99,116,115,82,105,99,104,97,114,100,32,119,104,97,116, -101,118,101,114,112,114,111,98,97,98,108,121,114,101,99,111,118,101,114,121,98, -97,115,101,98,97,108,108,106,117,100,103,109,101,110,116,99,111,110,110,101,99, -116,46,46,99,115,115,34,32,47,62,32,119,101,98,115,105,116,101,114,101,112,111, -114,116,101,100,100,101,102,97,117,108,116,34,47,62,60,47,97,62,13,10,101,108, -101,99,116,114,105,99,115,99,111,116,108,97,110,100,99,114,101,97,116,105,111, -110,113,117,97,110,116,105,116,121,46,32,73,83,66,78,32,48,100,105,100,32,110, -111,116,32,105,110,115,116,97,110,99,101,45,115,101,97,114,99,104,45,34,32,108, -97,110,103,61,34,115,112,101,97,107,101,114,115,67,111,109,112,117,116,101,114, -99,111,110,116,97,105,110,115,97,114,99,104,105,118,101,115,109,105,110,105,115, -116,101,114,114,101,97,99,116,105,111,110,100,105,115,99,111,117,110,116,73,116, -97,108,105,97,110,111,99,114,105,116,101,114,105,97,115,116,114,111,110,103,108, -121,58,32,39,104,116,116,112,58,39,115,99,114,105,112,116,39,99,111,118,101,114, -105,110,103,111,102,102,101,114,105,110,103,97,112,112,101,97,114,101,100,66,114 -,105,116,105,115,104,32,105,100,101,110,116,105,102,121,70,97,99,101,98,111,111, -107,110,117,109,101,114,111,117,115,118,101,104,105,99,108,101,115,99,111,110,99 -,101,114,110,115,65,109,101,114,105,99,97,110,104,97,110,100,108,105,110,103,100 -,105,118,32,105,100,61,34,87,105,108,108,105,97,109,32,112,114,111,118,105,100, -101,114,95,99,111,110,116,101,110,116,97,99,99,117,114,97,99,121,115,101,99,116, -105,111,110,32,97,110,100,101,114,115,111,110,102,108,101,120,105,98,108,101,67, -97,116,101,103,111,114,121,108,97,119,114,101,110,99,101,60,115,99,114,105,112, -116,62,108,97,121,111,117,116,61,34,97,112,112,114,111,118,101,100,32,109,97,120 -,105,109,117,109,104,101,97,100,101,114,34,62,60,47,116,97,98,108,101,62,83,101, -114,118,105,99,101,115,104,97,109,105,108,116,111,110,99,117,114,114,101,110,116 -,32,99,97,110,97,100,105,97,110,99,104,97,110,110,101,108,115,47,116,104,101,109 -,101,115,47,47,97,114,116,105,99,108,101,111,112,116,105,111,110,97,108,112,111, -114,116,117,103,97,108,118,97,108,117,101,61,34,34,105,110,116,101,114,118,97, -108,119,105,114,101,108,101,115,115,101,110,116,105,116,108,101,100,97,103,101, -110,99,105,101,115,83,101,97,114,99,104,34,32,109,101,97,115,117,114,101,100,116 -,104,111,117,115,97,110,100,115,112,101,110,100,105,110,103,38,104,101,108,108, -105,112,59,110,101,119,32,68,97,116,101,34,32,115,105,122,101,61,34,112,97,103, -101,78,97,109,101,109,105,100,100,108,101,34,32,34,32,47,62,60,47,97,62,104,105, -100,100,101,110,34,62,115,101,113,117,101,110,99,101,112,101,114,115,111,110,97, -108,111,118,101,114,102,108,111,119,111,112,105,110,105,111,110,115,105,108,108, -105,110,111,105,115,108,105,110,107,115,34,62,10,9,60,116,105,116,108,101,62,118 -,101,114,115,105,111,110,115,115,97,116,117,114,100,97,121,116,101,114,109,105, -110,97,108,105,116,101,109,112,114,111,112,101,110,103,105,110,101,101,114,115, -101,99,116,105,111,110,115,100,101,115,105,103,110,101,114,112,114,111,112,111, -115,97,108,61,34,102,97,108,115,101,34,69,115,112,97,195,177,111,108,114,101,108 -,101,97,115,101,115,115,117,98,109,105,116,34,32,101,114,38,113,117,111,116,59, -97,100,100,105,116,105,111,110,115,121,109,112,116,111,109,115,111,114,105,101, -110,116,101,100,114,101,115,111,117,114,99,101,114,105,103,104,116,34,62,60,112, -108,101,97,115,117,114,101,115,116,97,116,105,111,110,115,104,105,115,116,111, -114,121,46,108,101,97,118,105,110,103,32,32,98,111,114,100,101,114,61,99,111,110 -,116,101,110,116,115,99,101,110,116,101,114,34,62,46,10,10,83,111,109,101,32,100 -,105,114,101,99,116,101,100,115,117,105,116,97,98,108,101,98,117,108,103,97,114, -105,97,46,115,104,111,119,40,41,59,100,101,115,105,103,110,101,100,71,101,110, -101,114,97,108,32,99,111,110,99,101,112,116,115,69,120,97,109,112,108,101,115, -119,105,108,108,105,97,109,115,79,114,105,103,105,110,97,108,34,62,60,115,112,97 -,110,62,115,101,97,114,99,104,34,62,111,112,101,114,97,116,111,114,114,101,113, -117,101,115,116,115,97,32,38,113,117,111,116,59,97,108,108,111,119,105,110,103, -68,111,99,117,109,101,110,116,114,101,118,105,115,105,111,110,46,32,10,10,84,104 -,101,32,121,111,117,114,115,101,108,102,67,111,110,116,97,99,116,32,109,105,99, -104,105,103,97,110,69,110,103,108,105,115,104,32,99,111,108,117,109,98,105,97, -112,114,105,111,114,105,116,121,112,114,105,110,116,105,110,103,100,114,105,110, -107,105,110,103,102,97,99,105,108,105,116,121,114,101,116,117,114,110,101,100,67 -,111,110,116,101,110,116,32,111,102,102,105,99,101,114,115,82,117,115,115,105,97 -,110,32,103,101,110,101,114,97,116,101,45,56,56,53,57,45,49,34,105,110,100,105, -99,97,116,101,102,97,109,105,108,105,97,114,32,113,117,97,108,105,116,121,109,97 -,114,103,105,110,58,48,32,99,111,110,116,101,110,116,118,105,101,119,112,111,114 -,116,99,111,110,116,97,99,116,115,45,116,105,116,108,101,34,62,112,111,114,116, -97,98,108,101,46,108,101,110,103,116,104,32,101,108,105,103,105,98,108,101,105, -110,118,111,108,118,101,115,97,116,108,97,110,116,105,99,111,110,108,111,97,100, -61,34,100,101,102,97,117,108,116,46,115,117,112,112,108,105,101,100,112,97,121, -109,101,110,116,115,103,108,111,115,115,97,114,121,10,10,65,102,116,101,114,32, -103,117,105,100,97,110,99,101,60,47,116,100,62,60,116,100,101,110,99,111,100,105 -,110,103,109,105,100,100,108,101,34,62,99,97,109,101,32,116,111,32,100,105,115, -112,108,97,121,115,115,99,111,116,116,105,115,104,106,111,110,97,116,104,97,110, -109,97,106,111,114,105,116,121,119,105,100,103,101,116,115,46,99,108,105,110,105 -,99,97,108,116,104,97,105,108,97,110,100,116,101,97,99,104,101,114,115,60,104, -101,97,100,62,10,9,97,102,102,101,99,116,101,100,115,117,112,112,111,114,116,115 -,112,111,105,110,116,101,114,59,116,111,83,116,114,105,110,103,60,47,115,109,97, -108,108,62,111,107,108,97,104,111,109,97,119,105,108,108,32,98,101,32,105,110, -118,101,115,116,111,114,48,34,32,97,108,116,61,34,104,111,108,105,100,97,121,115 -,82,101,115,111,117,114,99,101,108,105,99,101,110,115,101,100,32,40,119,104,105, -99,104,32,46,32,65,102,116,101,114,32,99,111,110,115,105,100,101,114,118,105,115 -,105,116,105,110,103,101,120,112,108,111,114,101,114,112,114,105,109,97,114,121, -32,115,101,97,114,99,104,34,32,97,110,100,114,111,105,100,34,113,117,105,99,107, -108,121,32,109,101,101,116,105,110,103,115,101,115,116,105,109,97,116,101,59,114 -,101,116,117,114,110,32,59,99,111,108,111,114,58,35,32,104,101,105,103,104,116, -61,97,112,112,114,111,118,97,108,44,32,38,113,117,111,116,59,32,99,104,101,99, -107,101,100,46,109,105,110,46,106,115,34,109,97,103,110,101,116,105,99,62,60,47, -97,62,60,47,104,102,111,114,101,99,97,115,116,46,32,87,104,105,108,101,32,116, -104,117,114,115,100,97,121,100,118,101,114,116,105,115,101,38,101,97,99,117,116, -101,59,104,97,115,67,108,97,115,115,101,118,97,108,117,97,116,101,111,114,100, -101,114,105,110,103,101,120,105,115,116,105,110,103,112,97,116,105,101,110,116, -115,32,79,110,108,105,110,101,32,99,111,108,111,114,97,100,111,79,112,116,105, -111,110,115,34,99,97,109,112,98,101,108,108,60,33,45,45,32,101,110,100,60,47,115 -,112,97,110,62,60,60,98,114,32,47,62,13,10,95,112,111,112,117,112,115,124,115,99 -,105,101,110,99,101,115,44,38,113,117,111,116,59,32,113,117,97,108,105,116,121, -32,87,105,110,100,111,119,115,32,97,115,115,105,103,110,101,100,104,101,105,103, -104,116,58,32,60,98,32,99,108,97,115,115,108,101,38,113,117,111,116,59,32,118,97 -,108,117,101,61,34,32,67,111,109,112,97,110,121,101,120,97,109,112,108,101,115, -60,105,102,114,97,109,101,32,98,101,108,105,101,118,101,115,112,114,101,115,101, -110,116,115,109,97,114,115,104,97,108,108,112,97,114,116,32,111,102,32,112,114, -111,112,101,114,108,121,41,46,10,10,84,104,101,32,116,97,120,111,110,111,109,121 -,109,117,99,104,32,111,102,32,60,47,115,112,97,110,62,10,34,32,100,97,116,97,45, -115,114,116,117,103,117,195,170,115,115,99,114,111,108,108,84,111,32,112,114,111 -,106,101,99,116,60,104,101,97,100,62,13,10,97,116,116,111,114,110,101,121,101, -109,112,104,97,115,105,115,115,112,111,110,115,111,114,115,102,97,110,99,121,98, -111,120,119,111,114,108,100,39,115,32,119,105,108,100,108,105,102,101,99,104,101 -,99,107,101,100,61,115,101,115,115,105,111,110,115,112,114,111,103,114,97,109, -109,112,120,59,102,111,110,116,45,32,80,114,111,106,101,99,116,106,111,117,114, -110,97,108,115,98,101,108,105,101,118,101,100,118,97,99,97,116,105,111,110,116, -104,111,109,112,115,111,110,108,105,103,104,116,105,110,103,97,110,100,32,116, -104,101,32,115,112,101,99,105,97,108,32,98,111,114,100,101,114,61,48,99,104,101, -99,107,105,110,103,60,47,116,98,111,100,121,62,60,98,117,116,116,111,110,32,67, -111,109,112,108,101,116,101,99,108,101,97,114,102,105,120,10,60,104,101,97,100, -62,10,97,114,116,105,99,108,101,32,60,115,101,99,116,105,111,110,102,105,110,100 -,105,110,103,115,114,111,108,101,32,105,110,32,112,111,112,117,108,97,114,32,32, -79,99,116,111,98,101,114,119,101,98,115,105,116,101,32,101,120,112,111,115,117, -114,101,117,115,101,100,32,116,111,32,32,99,104,97,110,103,101,115,111,112,101, -114,97,116,101,100,99,108,105,99,107,105,110,103,101,110,116,101,114,105,110,103 -,99,111,109,109,97,110,100,115,105,110,102,111,114,109,101,100,32,110,117,109,98 -,101,114,115,32,32,60,47,100,105,118,62,99,114,101,97,116,105,110,103,111,110,83 -,117,98,109,105,116,109,97,114,121,108,97,110,100,99,111,108,108,101,103,101,115 -,97,110,97,108,121,116,105,99,108,105,115,116,105,110,103,115,99,111,110,116,97, -99,116,46,108,111,103,103,101,100,73,110,97,100,118,105,115,111,114,121,115,105, -98,108,105,110,103,115,99,111,110,116,101,110,116,34,115,38,113,117,111,116,59, -41,115,46,32,84,104,105,115,32,112,97,99,107,97,103,101,115,99,104,101,99,107,98 -,111,120,115,117,103,103,101,115,116,115,112,114,101,103,110,97,110,116,116,111, -109,111,114,114,111,119,115,112,97,99,105,110,103,61,105,99,111,110,46,112,110, -103,106,97,112,97,110,101,115,101,99,111,100,101,98,97,115,101,98,117,116,116, -111,110,34,62,103,97,109,98,108,105,110,103,115,117,99,104,32,97,115,32,44,32, -119,104,105,108,101,32,60,47,115,112,97,110,62,32,109,105,115,115,111,117,114, -105,115,112,111,114,116,105,110,103,116,111,112,58,49,112,120,32,46,60,47,115, -112,97,110,62,116,101,110,115,105,111,110,115,119,105,100,116,104,61,34,50,108, -97,122,121,108,111,97,100,110,111,118,101,109,98,101,114,117,115,101,100,32,105, -110,32,104,101,105,103,104,116,61,34,99,114,105,112,116,34,62,10,38,110,98,115, -112,59,60,47,60,116,114,62,60,116,100,32,104,101,105,103,104,116,58,50,47,112, -114,111,100,117,99,116,99,111,117,110,116,114,121,32,105,110,99,108,117,100,101, -32,102,111,111,116,101,114,34,32,38,108,116,59,33,45,45,32,116,105,116,108,101, -34,62,60,47,106,113,117,101,114,121,46,60,47,102,111,114,109,62,10,40,231,174, -128,228,189,147,41,40,231,185,129,233,171,148,41,104,114,118,97,116,115,107,105, -105,116,97,108,105,97,110,111,114,111,109,195,162,110,196,131,116,195,188,114, -107,195,167,101,216,167,216,177,216,175,217,136,116,97,109,98,105,195,169,110, -110,111,116,105,99,105,97,115,109,101,110,115,97,106,101,115,112,101,114,115,111 -,110,97,115,100,101,114,101,99,104,111,115,110,97,99,105,111,110,97,108,115,101, -114,118,105,99,105,111,99,111,110,116,97,99,116,111,117,115,117,97,114,105,111, -115,112,114,111,103,114,97,109,97,103,111,98,105,101,114,110,111,101,109,112,114 -,101,115,97,115,97,110,117,110,99,105,111,115,118,97,108,101,110,99,105,97,99, -111,108,111,109,98,105,97,100,101,115,112,117,195,169,115,100,101,112,111,114, -116,101,115,112,114,111,121,101,99,116,111,112,114,111,100,117,99,116,111,112, -195,186,98,108,105,99,111,110,111,115,111,116,114,111,115,104,105,115,116,111, -114,105,97,112,114,101,115,101,110,116,101,109,105,108,108,111,110,101,115,109, -101,100,105,97,110,116,101,112,114,101,103,117,110,116,97,97,110,116,101,114,105 -,111,114,114,101,99,117,114,115,111,115,112,114,111,98,108,101,109,97,115,97,110 -,116,105,97,103,111,110,117,101,115,116,114,111,115,111,112,105,110,105,195,179, -110,105,109,112,114,105,109,105,114,109,105,101,110,116,114,97,115,97,109,195, -169,114,105,99,97,118,101,110,100,101,100,111,114,115,111,99,105,101,100,97,100, -114,101,115,112,101,99,116,111,114,101,97,108,105,122,97,114,114,101,103,105,115 -,116,114,111,112,97,108,97,98,114,97,115,105,110,116,101,114,195,169,115,101,110 -,116,111,110,99,101,115,101,115,112,101,99,105,97,108,109,105,101,109,98,114,111 -,115,114,101,97,108,105,100,97,100,99,195,179,114,100,111,98,97,122,97,114,97, -103,111,122,97,112,195,161,103,105,110,97,115,115,111,99,105,97,108,101,115,98, -108,111,113,117,101,97,114,103,101,115,116,105,195,179,110,97,108,113,117,105, -108,101,114,115,105,115,116,101,109,97,115,99,105,101,110,99,105,97,115,99,111, -109,112,108,101,116,111,118,101,114,115,105,195,179,110,99,111,109,112,108,101, -116,97,101,115,116,117,100,105,111,115,112,195,186,98,108,105,99,97,111,98,106, -101,116,105,118,111,97,108,105,99,97,110,116,101,98,117,115,99,97,100,111,114,99 -,97,110,116,105,100,97,100,101,110,116,114,97,100,97,115,97,99,99,105,111,110, -101,115,97,114,99,104,105,118,111,115,115,117,112,101,114,105,111,114,109,97,121 -,111,114,195,173,97,97,108,101,109,97,110,105,97,102,117,110,99,105,195,179,110, -195,186,108,116,105,109,111,115,104,97,99,105,101,110,100,111,97,113,117,101,108 -,108,111,115,101,100,105,99,105,195,179,110,102,101,114,110,97,110,100,111,97, -109,98,105,101,110,116,101,102,97,99,101,98,111,111,107,110,117,101,115,116,114, -97,115,99,108,105,101,110,116,101,115,112,114,111,99,101,115,111,115,98,97,115, -116,97,110,116,101,112,114,101,115,101,110,116,97,114,101,112,111,114,116,97,114 -,99,111,110,103,114,101,115,111,112,117,98,108,105,99,97,114,99,111,109,101,114, -99,105,111,99,111,110,116,114,97,116,111,106,195,179,118,101,110,101,115,100,105 -,115,116,114,105,116,111,116,195,169,99,110,105,99,97,99,111,110,106,117,110,116 -,111,101,110,101,114,103,195,173,97,116,114,97,98,97,106,97,114,97,115,116,117, -114,105,97,115,114,101,99,105,101,110,116,101,117,116,105,108,105,122,97,114,98, -111,108,101,116,195,173,110,115,97,108,118,97,100,111,114,99,111,114,114,101,99, -116,97,116,114,97,98,97,106,111,115,112,114,105,109,101,114,111,115,110,101,103, -111,99,105,111,115,108,105,98,101,114,116,97,100,100,101,116,97,108,108,101,115, -112,97,110,116,97,108,108,97,112,114,195,179,120,105,109,111,97,108,109,101,114, -195,173,97,97,110,105,109,97,108,101,115,113,117,105,195,169,110,101,115,99,111, -114,97,122,195,179,110,115,101,99,99,105,195,179,110,98,117,115,99,97,110,100, -111,111,112,99,105,111,110,101,115,101,120,116,101,114,105,111,114,99,111,110,99 -,101,112,116,111,116,111,100,97,118,195,173,97,103,97,108,101,114,195,173,97,101 -,115,99,114,105,98,105,114,109,101,100,105,99,105,110,97,108,105,99,101,110,99, -105,97,99,111,110,115,117,108,116,97,97,115,112,101,99,116,111,115,99,114,195, -173,116,105,99,97,100,195,179,108,97,114,101,115,106,117,115,116,105,99,105,97, -100,101,98,101,114,195,161,110,112,101,114,195,173,111,100,111,110,101,99,101, -115,105,116,97,109,97,110,116,101,110,101,114,112,101,113,117,101,195,177,111, -114,101,99,105,98,105,100,97,116,114,105,98,117,110,97,108,116,101,110,101,114, -105,102,101,99,97,110,99,105,195,179,110,99,97,110,97,114,105,97,115,100,101,115 -,99,97,114,103,97,100,105,118,101,114,115,111,115,109,97,108,108,111,114,99,97, -114,101,113,117,105,101,114,101,116,195,169,99,110,105,99,111,100,101,98,101,114 -,195,173,97,118,105,118,105,101,110,100,97,102,105,110,97,110,122,97,115,97,100, -101,108,97,110,116,101,102,117,110,99,105,111,110,97,99,111,110,115,101,106,111, -115,100,105,102,195,173,99,105,108,99,105,117,100,97,100,101,115,97,110,116,105, -103,117,97,115,97,118,97,110,122,97,100,97,116,195,169,114,109,105,110,111,117, -110,105,100,97,100,101,115,115,195,161,110,99,104,101,122,99,97,109,112,97,195, -177,97,115,111,102,116,111,110,105,99,114,101,118,105,115,116,97,115,99,111,110, -116,105,101,110,101,115,101,99,116,111,114,101,115,109,111,109,101,110,116,111, -115,102,97,99,117,108,116,97,100,99,114,195,169,100,105,116,111,100,105,118,101, -114,115,97,115,115,117,112,117,101,115,116,111,102,97,99,116,111,114,101,115,115 -,101,103,117,110,100,111,115,112,101,113,117,101,195,177,97,208,179,208,190,208, -180,208,176,208,181,209,129,208,187,208,184,208,181,209,129,209,130,209,140,208, -177,209,139,208,187,208,190,208,177,209,139,209,130,209,140,209,141,209,130,208, -190,208,188,208,149,209,129,208,187,208,184,209,130,208,190,208,179,208,190,208, -188,208,181,208,189,209,143,208,178,209,129,208,181,209,133,209,141,209,130,208, -190,208,185,208,180,208,176,208,182,208,181,208,177,209,139,208,187,208,184,208, -179,208,190,208,180,209,131,208,180,208,181,208,189,209,140,209,141,209,130,208, -190,209,130,208,177,209,139,208,187,208,176,209,129,208,181,208,177,209,143,208, -190,208,180,208,184,208,189,209,129,208,181,208,177,208,181,208,189,208,176,208, -180,208,190,209,129,208,176,208,185,209,130,209,132,208,190,209,130,208,190,208, -189,208,181,208,179,208,190,209,129,208,178,208,190,208,184,209,129,208,178,208, -190,208,185,208,184,208,179,209,128,209,139,209,130,208,190,208,182,208,181,208, -178,209,129,208,181,208,188,209,129,208,178,208,190,209,142,208,187,208,184,209, -136,209,140,209,141,209,130,208,184,209,133,208,191,208,190,208,186,208,176,208, -180,208,189,208,181,208,185,208,180,208,190,208,188,208,176,208,188,208,184,209, -128,208,176,208,187,208,184,208,177,208,190,209,130,208,181,208,188,209,131,209, -133,208,190,209,130,209,143,208,180,208,178,209,131,209,133,209,129,208,181,209, -130,208,184,208,187,209,142,208,180,208,184,208,180,208,181,208,187,208,190,208, -188,208,184,209,128,208,181,209,130,208,181,208,177,209,143,209,129,208,178,208, -190,208,181,208,178,208,184,208,180,208,181,209,135,208,181,208,179,208,190,209, -141,209,130,208,184,208,188,209,129,209,135,208,181,209,130,209,130,208,181,208, -188,209,139,209,134,208,181,208,189,209,139,209,129,209,130,208,176,208,187,208, -178,208,181,208,180,209,140,209,130,208,181,208,188,208,181,208,178,208,190,208, -180,209,139,209,130,208,181,208,177,208,181,208,178,209,139,209,136,208,181,208, -189,208,176,208,188,208,184,209,130,208,184,208,191,208,176,209,130,208,190,208, -188,209,131,208,191,209,128,208,176,208,178,208,187,208,184,209,134,208,176,208, -190,208,180,208,189,208,176,208,179,208,190,208,180,209,139,208,183,208,189,208, -176,209,142,208,188,208,190,208,179,209,131,208,180,209,128,209,131,208,179,208, -178,209,129,208,181,208,185,208,184,208,180,208,181,209,130,208,186,208,184,208, -189,208,190,208,190,208,180,208,189,208,190,208,180,208,181,208,187,208,176,208, -180,208,181,208,187,208,181,209,129,209,128,208,190,208,186,208,184,209,142,208, -189,209,143,208,178,208,181,209,129,209,140,208,149,209,129,209,130,209,140,209, -128,208,176,208,183,208,176,208,189,208,176,209,136,208,184,216,167,217,132,217, -132,217,135,216,167,217,132,216,170,217,138,216,172,217,133,217,138,216,185,216, -174,216,167,216,181,216,169,216,167,217,132,216,176,217,138,216,185,217,132,217, -138,217,135,216,172,216,175,217,138,216,175,216,167,217,132,216,162,217,134,216, -167,217,132,216,177,216,175,216,170,216,173,217,131,217,133,216,181,217,129,216, -173,216,169,217,131,216,167,217,134,216,170,216,167,217,132,217,132,217,138,217, -138,217,131,217,136,217,134,216,180,216,168,217,131,216,169,217,129,217,138,217, -135,216,167,216,168,217,134,216,167,216,170,216,173,217,136,216,167,216,161,216, -163,217,131,216,171,216,177,216,174,217,132,216,167,217,132,216,167,217,132,216, -173,216,168,216,175,217,132,217,138,217,132,216,175,216,177,217,136,216,179,216, -167,216,182,216,186,216,183,216,170,217,131,217,136,217,134,217,135,217,134,216, -167,217,131,216,179,216,167,216,173,216,169,217,134,216,167,216,175,217,138,216, -167,217,132,216,183,216,168,216,185,217,132,217,138,217,131,216,180,217,131,216, -177,216,167,217,138,217,133,217,131,217,134,217,133,217,134,217,135,216,167,216, -180,216,177,217,131,216,169,216,177,216,166,217,138,216,179,217,134,216,180,217, -138,216,183,217,133,216,167,216,176,216,167,216,167,217,132,217,129,217,134,216, -180,216,168,216,167,216,168,216,170,216,185,216,168,216,177,216,177,216,173,217, -133,216,169,217,131,216,167,217,129,216,169,217,138,217,130,217,136,217,132,217, -133,216,177,217,131,216,178,217,131,217,132,217,133,216,169,216,163,216,173,217, -133,216,175,217,130,217,132,216,168,217,138,217,138,216,185,217,134,217,138,216, -181,217,136,216,177,216,169,216,183,216,177,217,138,217,130,216,180,216,167,216, -177,217,131,216,172,217,136,216,167,217,132,216,163,216,174,216,177,217,137,217, -133,216,185,217,134,216,167,216,167,216,168,216,173,216,171,216,185,216,177,217, -136,216,182,216,168,216,180,217,131,217,132,217,133,216,179,216,172,217,132,216, -168,217,134,216,167,217,134,216,174,216,167,217,132,216,175,217,131,216,170,216, -167,216,168,217,131,217,132,217,138,216,169,216,168,216,175,217,136,217,134,216, -163,217,138,216,182,216,167,217,138,217,136,216,172,216,175,217,129,216,177,217, -138,217,130,217,131,216,170,216,168,216,170,216,163,217,129,216,182,217,132,217, -133,216,183,216,168,216,174,216,167,217,131,216,171,216,177,216,168,216,167,216, -177,217,131,216,167,217,129,216,182,217,132,216,167,216,173,217,132,217,137,217, -134,217,129,216,179,217,135,216,163,217,138,216,167,217,133,216,177,216,175,217, -136,216,175,216,163,217,134,217,135,216,167,216,175,217,138,217,134,216,167,216, -167,217,132,216,167,217,134,217,133,216,185,216,177,216,182,216,170,216,185,217, -132,217,133,216,175,216,167,216,174,217,132,217,133,217,133,217,131,217,134,0,0, -0,0,0,0,0,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,0,1,2,3,4,5,6,7,7,6, -5,4,3,2,1,0,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,16,17,18,19,20,21,22,23, -23,22,21,20,19,18,17,16,24,25,26,27,28,29,30,31,31,30,29,28,27,26,25,24,255,255, -255,255,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0, -3,0,0,0,255,255,0,1,0,0,0,1,0,0,255,255,0,1,0,0,0,8,0,8,0,8,0,8,0,0,0,1,0,2,0,3, -0,4,0,5,0,6,0,7,114,101,115,111,117,114,99,101,115,99,111,117,110,116,114,105, -101,115,113,117,101,115,116,105,111,110,115,101,113,117,105,112,109,101,110,116, -99,111,109,109,117,110,105,116,121,97,118,97,105,108,97,98,108,101,104,105,103, -104,108,105,103,104,116,68,84,68,47,120,104,116,109,108,109,97,114,107,101,116, -105,110,103,107,110,111,119,108,101,100,103,101,115,111,109,101,116,104,105,110, -103,99,111,110,116,97,105,110,101,114,100,105,114,101,99,116,105,111,110,115,117 -,98,115,99,114,105,98,101,97,100,118,101,114,116,105,115,101,99,104,97,114,97,99 -,116,101,114,34,32,118,97,108,117,101,61,34,60,47,115,101,108,101,99,116,62,65, -117,115,116,114,97,108,105,97,34,32,99,108,97,115,115,61,34,115,105,116,117,97, -116,105,111,110,97,117,116,104,111,114,105,116,121,102,111,108,108,111,119,105, -110,103,112,114,105,109,97,114,105,108,121,111,112,101,114,97,116,105,111,110,99 -,104,97,108,108,101,110,103,101,100,101,118,101,108,111,112,101,100,97,110,111, -110,121,109,111,117,115,102,117,110,99,116,105,111,110,32,102,117,110,99,116,105 -,111,110,115,99,111,109,112,97,110,105,101,115,115,116,114,117,99,116,117,114, -101,97,103,114,101,101,109,101,110,116,34,32,116,105,116,108,101,61,34,112,111, -116,101,110,116,105,97,108,101,100,117,99,97,116,105,111,110,97,114,103,117,109, -101,110,116,115,115,101,99,111,110,100,97,114,121,99,111,112,121,114,105,103,104 -,116,108,97,110,103,117,97,103,101,115,101,120,99,108,117,115,105,118,101,99,111 -,110,100,105,116,105,111,110,60,47,102,111,114,109,62,13,10,115,116,97,116,101, -109,101,110,116,97,116,116,101,110,116,105,111,110,66,105,111,103,114,97,112,104 -,121,125,32,101,108,115,101,32,123,10,115,111,108,117,116,105,111,110,115,119, -104,101,110,32,116,104,101,32,65,110,97,108,121,116,105,99,115,116,101,109,112, -108,97,116,101,115,100,97,110,103,101,114,111,117,115,115,97,116,101,108,108,105 -,116,101,100,111,99,117,109,101,110,116,115,112,117,98,108,105,115,104,101,114, -105,109,112,111,114,116,97,110,116,112,114,111,116,111,116,121,112,101,105,110, -102,108,117,101,110,99,101,38,114,97,113,117,111,59,60,47,101,102,102,101,99,116 -,105,118,101,103,101,110,101,114,97,108,108,121,116,114,97,110,115,102,111,114, -109,98,101,97,117,116,105,102,117,108,116,114,97,110,115,112,111,114,116,111,114 -,103,97,110,105,122,101,100,112,117,98,108,105,115,104,101,100,112,114,111,109, -105,110,101,110,116,117,110,116,105,108,32,116,104,101,116,104,117,109,98,110,97 -,105,108,78,97,116,105,111,110,97,108,32,46,102,111,99,117,115,40,41,59,111,118, -101,114,32,116,104,101,32,109,105,103,114,97,116,105,111,110,97,110,110,111,117, -110,99,101,100,102,111,111,116,101,114,34,62,10,101,120,99,101,112,116,105,111, -110,108,101,115,115,32,116,104,97,110,101,120,112,101,110,115,105,118,101,102, -111,114,109,97,116,105,111,110,102,114,97,109,101,119,111,114,107,116,101,114, -114,105,116,111,114,121,110,100,105,99,97,116,105,111,110,99,117,114,114,101,110 -,116,108,121,99,108,97,115,115,78,97,109,101,99,114,105,116,105,99,105,115,109, -116,114,97,100,105,116,105,111,110,101,108,115,101,119,104,101,114,101,65,108, -101,120,97,110,100,101,114,97,112,112,111,105,110,116,101,100,109,97,116,101,114 -,105,97,108,115,98,114,111,97,100,99,97,115,116,109,101,110,116,105,111,110,101, -100,97,102,102,105,108,105,97,116,101,60,47,111,112,116,105,111,110,62,116,114, -101,97,116,109,101,110,116,100,105,102,102,101,114,101,110,116,47,100,101,102,97 -,117,108,116,46,80,114,101,115,105,100,101,110,116,111,110,99,108,105,99,107,61, -34,98,105,111,103,114,97,112,104,121,111,116,104,101,114,119,105,115,101,112,101 -,114,109,97,110,101,110,116,70,114,97,110,195,167,97,105,115,72,111,108,108,121, -119,111,111,100,101,120,112,97,110,115,105,111,110,115,116,97,110,100,97,114,100 -,115,60,47,115,116,121,108,101,62,10,114,101,100,117,99,116,105,111,110,68,101, -99,101,109,98,101,114,32,112,114,101,102,101,114,114,101,100,67,97,109,98,114, -105,100,103,101,111,112,112,111,110,101,110,116,115,66,117,115,105,110,101,115, -115,32,99,111,110,102,117,115,105,111,110,62,10,60,116,105,116,108,101,62,112, -114,101,115,101,110,116,101,100,101,120,112,108,97,105,110,101,100,100,111,101, -115,32,110,111,116,32,119,111,114,108,100,119,105,100,101,105,110,116,101,114, -102,97,99,101,112,111,115,105,116,105,111,110,115,110,101,119,115,112,97,112,101 -,114,60,47,116,97,98,108,101,62,10,109,111,117,110,116,97,105,110,115,108,105, -107,101,32,116,104,101,32,101,115,115,101,110,116,105,97,108,102,105,110,97,110, -99,105,97,108,115,101,108,101,99,116,105,111,110,97,99,116,105,111,110,61,34,47, -97,98,97,110,100,111,110,101,100,69,100,117,99,97,116,105,111,110,112,97,114,115 -,101,73,110,116,40,115,116,97,98,105,108,105,116,121,117,110,97,98,108,101,32, -116,111,60,47,116,105,116,108,101,62,10,114,101,108,97,116,105,111,110,115,78, -111,116,101,32,116,104,97,116,101,102,102,105,99,105,101,110,116,112,101,114,102 -,111,114,109,101,100,116,119,111,32,121,101,97,114,115,83,105,110,99,101,32,116, -104,101,116,104,101,114,101,102,111,114,101,119,114,97,112,112,101,114,34,62,97, -108,116,101,114,110,97,116,101,105,110,99,114,101,97,115,101,100,66,97,116,116, -108,101,32,111,102,112,101,114,99,101,105,118,101,100,116,114,121,105,110,103,32 -,116,111,110,101,99,101,115,115,97,114,121,112,111,114,116,114,97,121,101,100, -101,108,101,99,116,105,111,110,115,69,108,105,122,97,98,101,116,104,60,47,105, -102,114,97,109,101,62,100,105,115,99,111,118,101,114,121,105,110,115,117,114,97, -110,99,101,115,46,108,101,110,103,116,104,59,108,101,103,101,110,100,97,114,121, -71,101,111,103,114,97,112,104,121,99,97,110,100,105,100,97,116,101,99,111,114, -112,111,114,97,116,101,115,111,109,101,116,105,109,101,115,115,101,114,118,105, -99,101,115,46,105,110,104,101,114,105,116,101,100,60,47,115,116,114,111,110,103, -62,67,111,109,109,117,110,105,116,121,114,101,108,105,103,105,111,117,115,108, -111,99,97,116,105,111,110,115,67,111,109,109,105,116,116,101,101,98,117,105,108, -100,105,110,103,115,116,104,101,32,119,111,114,108,100,110,111,32,108,111,110, -103,101,114,98,101,103,105,110,110,105,110,103,114,101,102,101,114,101,110,99, -101,99,97,110,110,111,116,32,98,101,102,114,101,113,117,101,110,99,121,116,121, -112,105,99,97,108,108,121,105,110,116,111,32,116,104,101,32,114,101,108,97,116, -105,118,101,59,114,101,99,111,114,100,105,110,103,112,114,101,115,105,100,101, -110,116,105,110,105,116,105,97,108,108,121,116,101,99,104,110,105,113,117,101, -116,104,101,32,111,116,104,101,114,105,116,32,99,97,110,32,98,101,101,120,105, -115,116,101,110,99,101,117,110,100,101,114,108,105,110,101,116,104,105,115,32, -116,105,109,101,116,101,108,101,112,104,111,110,101,105,116,101,109,115,99,111, -112,101,112,114,97,99,116,105,99,101,115,97,100,118,97,110,116,97,103,101,41,59, -114,101,116,117,114,110,32,70,111,114,32,111,116,104,101,114,112,114,111,118,105 -,100,105,110,103,100,101,109,111,99,114,97,99,121,98,111,116,104,32,116,104,101, -32,101,120,116,101,110,115,105,118,101,115,117,102,102,101,114,105,110,103,115, -117,112,112,111,114,116,101,100,99,111,109,112,117,116,101,114,115,32,102,117, -110,99,116,105,111,110,112,114,97,99,116,105,99,97,108,115,97,105,100,32,116,104 -,97,116,105,116,32,109,97,121,32,98,101,69,110,103,108,105,115,104,60,47,102,114 -,111,109,32,116,104,101,32,115,99,104,101,100,117,108,101,100,100,111,119,110, -108,111,97,100,115,60,47,108,97,98,101,108,62,10,115,117,115,112,101,99,116,101, -100,109,97,114,103,105,110,58,32,48,115,112,105,114,105,116,117,97,108,60,47,104 -,101,97,100,62,10,10,109,105,99,114,111,115,111,102,116,103,114,97,100,117,97, -108,108,121,100,105,115,99,117,115,115,101,100,104,101,32,98,101,99,97,109,101, -101,120,101,99,117,116,105,118,101,106,113,117,101,114,121,46,106,115,104,111, -117,115,101,104,111,108,100,99,111,110,102,105,114,109,101,100,112,117,114,99, -104,97,115,101,100,108,105,116,101,114,97,108,108,121,100,101,115,116,114,111, -121,101,100,117,112,32,116,111,32,116,104,101,118,97,114,105,97,116,105,111,110, -114,101,109,97,105,110,105,110,103,105,116,32,105,115,32,110,111,116,99,101,110, -116,117,114,105,101,115,74,97,112,97,110,101,115,101,32,97,109,111,110,103,32, -116,104,101,99,111,109,112,108,101,116,101,100,97,108,103,111,114,105,116,104, -109,105,110,116,101,114,101,115,116,115,114,101,98,101,108,108,105,111,110,117, -110,100,101,102,105,110,101,100,101,110,99,111,117,114,97,103,101,114,101,115, -105,122,97,98,108,101,105,110,118,111,108,118,105,110,103,115,101,110,115,105, -116,105,118,101,117,110,105,118,101,114,115,97,108,112,114,111,118,105,115,105, -111,110,40,97,108,116,104,111,117,103,104,102,101,97,116,117,114,105,110,103,99, -111,110,100,117,99,116,101,100,41,44,32,119,104,105,99,104,32,99,111,110,116,105 -,110,117,101,100,45,104,101,97,100,101,114,34,62,70,101,98,114,117,97,114,121,32 -,110,117,109,101,114,111,117,115,32,111,118,101,114,102,108,111,119,58,99,111, -109,112,111,110,101,110,116,102,114,97,103,109,101,110,116,115,101,120,99,101, -108,108,101,110,116,99,111,108,115,112,97,110,61,34,116,101,99,104,110,105,99,97 -,108,110,101,97,114,32,116,104,101,32,65,100,118,97,110,99,101,100,32,115,111, -117,114,99,101,32,111,102,101,120,112,114,101,115,115,101,100,72,111,110,103,32, -75,111,110,103,32,70,97,99,101,98,111,111,107,109,117,108,116,105,112,108,101,32 -,109,101,99,104,97,110,105,115,109,101,108,101,118,97,116,105,111,110,111,102, -102,101,110,115,105,118,101,60,47,102,111,114,109,62,10,9,115,112,111,110,115, -111,114,101,100,100,111,99,117,109,101,110,116,46,111,114,32,38,113,117,111,116, -59,116,104,101,114,101,32,97,114,101,116,104,111,115,101,32,119,104,111,109,111, -118,101,109,101,110,116,115,112,114,111,99,101,115,115,101,115,100,105,102,102, -105,99,117,108,116,115,117,98,109,105,116,116,101,100,114,101,99,111,109,109,101 -,110,100,99,111,110,118,105,110,99,101,100,112,114,111,109,111,116,105,110,103, -34,32,119,105,100,116,104,61,34,46,114,101,112,108,97,99,101,40,99,108,97,115, -115,105,99,97,108,99,111,97,108,105,116,105,111,110,104,105,115,32,102,105,114, -115,116,100,101,99,105,115,105,111,110,115,97,115,115,105,115,116,97,110,116,105 -,110,100,105,99,97,116,101,100,101,118,111,108,117,116,105,111,110,45,119,114,97 -,112,112,101,114,34,101,110,111,117,103,104,32,116,111,97,108,111,110,103,32,116 -,104,101,100,101,108,105,118,101,114,101,100,45,45,62,13,10,60,33,45,45,65,109, -101,114,105,99,97,110,32,112,114,111,116,101,99,116,101,100,78,111,118,101,109, -98,101,114,32,60,47,115,116,121,108,101,62,60,102,117,114,110,105,116,117,114, -101,73,110,116,101,114,110,101,116,32,32,111,110,98,108,117,114,61,34,115,117, -115,112,101,110,100,101,100,114,101,99,105,112,105,101,110,116,98,97,115,101,100 -,32,111,110,32,77,111,114,101,111,118,101,114,44,97,98,111,108,105,115,104,101, -100,99,111,108,108,101,99,116,101,100,119,101,114,101,32,109,97,100,101,101,109, -111,116,105,111,110,97,108,101,109,101,114,103,101,110,99,121,110,97,114,114,97, -116,105,118,101,97,100,118,111,99,97,116,101,115,112,120,59,98,111,114,100,101, -114,99,111,109,109,105,116,116,101,100,100,105,114,61,34,108,116,114,34,101,109, -112,108,111,121,101,101,115,114,101,115,101,97,114,99,104,46,32,115,101,108,101, -99,116,101,100,115,117,99,99,101,115,115,111,114,99,117,115,116,111,109,101,114, -115,100,105,115,112,108,97,121,101,100,83,101,112,116,101,109,98,101,114,97,100, -100,67,108,97,115,115,40,70,97,99,101,98,111,111,107,32,115,117,103,103,101,115, -116,101,100,97,110,100,32,108,97,116,101,114,111,112,101,114,97,116,105,110,103, -101,108,97,98,111,114,97,116,101,83,111,109,101,116,105,109,101,115,73,110,115, -116,105,116,117,116,101,99,101,114,116,97,105,110,108,121,105,110,115,116,97,108 -,108,101,100,102,111,108,108,111,119,101,114,115,74,101,114,117,115,97,108,101, -109,116,104,101,121,32,104,97,118,101,99,111,109,112,117,116,105,110,103,103,101 -,110,101,114,97,116,101,100,112,114,111,118,105,110,99,101,115,103,117,97,114,97 -,110,116,101,101,97,114,98,105,116,114,97,114,121,114,101,99,111,103,110,105,122 -,101,119,97,110,116,101,100,32,116,111,112,120,59,119,105,100,116,104,58,116,104 -,101,111,114,121,32,111,102,98,101,104,97,118,105,111,117,114,87,104,105,108,101 -,32,116,104,101,101,115,116,105,109,97,116,101,100,98,101,103,97,110,32,116,111, -32,105,116,32,98,101,99,97,109,101,109,97,103,110,105,116,117,100,101,109,117, -115,116,32,104,97,118,101,109,111,114,101,32,116,104,97,110,68,105,114,101,99, -116,111,114,121,101,120,116,101,110,115,105,111,110,115,101,99,114,101,116,97, -114,121,110,97,116,117,114,97,108,108,121,111,99,99,117,114,114,105,110,103,118, -97,114,105,97,98,108,101,115,103,105,118,101,110,32,116,104,101,112,108,97,116, -102,111,114,109,46,60,47,108,97,98,101,108,62,60,102,97,105,108,101,100,32,116, -111,99,111,109,112,111,117,110,100,115,107,105,110,100,115,32,111,102,32,115,111 -,99,105,101,116,105,101,115,97,108,111,110,103,115,105,100,101,32,45,45,38,103, -116,59,10,10,115,111,117,116,104,119,101,115,116,116,104,101,32,114,105,103,104, -116,114,97,100,105,97,116,105,111,110,109,97,121,32,104,97,118,101,32,117,110, -101,115,99,97,112,101,40,115,112,111,107,101,110,32,105,110,34,32,104,114,101, -102,61,34,47,112,114,111,103,114,97,109,109,101,111,110,108,121,32,116,104,101, -32,99,111,109,101,32,102,114,111,109,100,105,114,101,99,116,111,114,121,98,117, -114,105,101,100,32,105,110,97,32,115,105,109,105,108,97,114,116,104,101,121,32, -119,101,114,101,60,47,102,111,110,116,62,60,47,78,111,114,119,101,103,105,97,110 -,115,112,101,99,105,102,105,101,100,112,114,111,100,117,99,105,110,103,112,97, -115,115,101,110,103,101,114,40,110,101,119,32,68,97,116,101,116,101,109,112,111, -114,97,114,121,102,105,99,116,105,111,110,97,108,65,102,116,101,114,32,116,104, -101,101,113,117,97,116,105,111,110,115,100,111,119,110,108,111,97,100,46,114,101 -,103,117,108,97,114,108,121,100,101,118,101,108,111,112,101,114,97,98,111,118, -101,32,116,104,101,108,105,110,107,101,100,32,116,111,112,104,101,110,111,109, -101,110,97,112,101,114,105,111,100,32,111,102,116,111,111,108,116,105,112,34,62, -115,117,98,115,116,97,110,99,101,97,117,116,111,109,97,116,105,99,97,115,112,101 -,99,116,32,111,102,65,109,111,110,103,32,116,104,101,99,111,110,110,101,99,116, -101,100,101,115,116,105,109,97,116,101,115,65,105,114,32,70,111,114,99,101,115, -121,115,116,101,109,32,111,102,111,98,106,101,99,116,105,118,101,105,109,109,101 -,100,105,97,116,101,109,97,107,105,110,103,32,105,116,112,97,105,110,116,105,110 -,103,115,99,111,110,113,117,101,114,101,100,97,114,101,32,115,116,105,108,108, -112,114,111,99,101,100,117,114,101,103,114,111,119,116,104,32,111,102,104,101,97 -,100,101,100,32,98,121,69,117,114,111,112,101,97,110,32,100,105,118,105,115,105, -111,110,115,109,111,108,101,99,117,108,101,115,102,114,97,110,99,104,105,115,101 -,105,110,116,101,110,116,105,111,110,97,116,116,114,97,99,116,101,100,99,104,105 -,108,100,104,111,111,100,97,108,115,111,32,117,115,101,100,100,101,100,105,99,97 -,116,101,100,115,105,110,103,97,112,111,114,101,100,101,103,114,101,101,32,111, -102,102,97,116,104,101,114,32,111,102,99,111,110,102,108,105,99,116,115,60,47,97 -,62,60,47,112,62,10,99,97,109,101,32,102,114,111,109,119,101,114,101,32,117,115, -101,100,110,111,116,101,32,116,104,97,116,114,101,99,101,105,118,105,110,103,69, -120,101,99,117,116,105,118,101,101,118,101,110,32,109,111,114,101,97,99,99,101, -115,115,32,116,111,99,111,109,109,97,110,100,101,114,80,111,108,105,116,105,99, -97,108,109,117,115,105,99,105,97,110,115,100,101,108,105,99,105,111,117,115,112, -114,105,115,111,110,101,114,115,97,100,118,101,110,116,32,111,102,85,84,70,45,56 -,34,32,47,62,60,33,91,67,68,65,84,65,91,34,62,67,111,110,116,97,99,116,83,111, -117,116,104,101,114,110,32,98,103,99,111,108,111,114,61,34,115,101,114,105,101, -115,32,111,102,46,32,73,116,32,119,97,115,32,105,110,32,69,117,114,111,112,101, -112,101,114,109,105,116,116,101,100,118,97,108,105,100,97,116,101,46,97,112,112, -101,97,114,105,110,103,111,102,102,105,99,105,97,108,115,115,101,114,105,111,117 -,115,108,121,45,108,97,110,103,117,97,103,101,105,110,105,116,105,97,116,101,100 -,101,120,116,101,110,100,105,110,103,108,111,110,103,45,116,101,114,109,105,110, -102,108,97,116,105,111,110,115,117,99,104,32,116,104,97,116,103,101,116,67,111, -111,107,105,101,109,97,114,107,101,100,32,98,121,60,47,98,117,116,116,111,110,62 -,105,109,112,108,101,109,101,110,116,98,117,116,32,105,116,32,105,115,105,110,99 -,114,101,97,115,101,115,100,111,119,110,32,116,104,101,32,114,101,113,117,105, -114,105,110,103,100,101,112,101,110,100,101,110,116,45,45,62,10,60,33,45,45,32, -105,110,116,101,114,118,105,101,119,87,105,116,104,32,116,104,101,32,99,111,112, -105,101,115,32,111,102,99,111,110,115,101,110,115,117,115,119,97,115,32,98,117, -105,108,116,86,101,110,101,122,117,101,108,97,40,102,111,114,109,101,114,108,121 -,116,104,101,32,115,116,97,116,101,112,101,114,115,111,110,110,101,108,115,116, -114,97,116,101,103,105,99,102,97,118,111,117,114,32,111,102,105,110,118,101,110, -116,105,111,110,87,105,107,105,112,101,100,105,97,99,111,110,116,105,110,101,110 -,116,118,105,114,116,117,97,108,108,121,119,104,105,99,104,32,119,97,115,112,114 -,105,110,99,105,112,108,101,67,111,109,112,108,101,116,101,32,105,100,101,110, -116,105,99,97,108,115,104,111,119,32,116,104,97,116,112,114,105,109,105,116,105, -118,101,97,119,97,121,32,102,114,111,109,109,111,108,101,99,117,108,97,114,112, -114,101,99,105,115,101,108,121,100,105,115,115,111,108,118,101,100,85,110,100, -101,114,32,116,104,101,118,101,114,115,105,111,110,61,34,62,38,110,98,115,112,59 -,60,47,73,116,32,105,115,32,116,104,101,32,84,104,105,115,32,105,115,32,119,105, -108,108,32,104,97,118,101,111,114,103,97,110,105,115,109,115,115,111,109,101,32, -116,105,109,101,70,114,105,101,100,114,105,99,104,119,97,115,32,102,105,114,115, -116,116,104,101,32,111,110,108,121,32,102,97,99,116,32,116,104,97,116,102,111, -114,109,32,105,100,61,34,112,114,101,99,101,100,105,110,103,84,101,99,104,110, -105,99,97,108,112,104,121,115,105,99,105,115,116,111,99,99,117,114,115,32,105, -110,110,97,118,105,103,97,116,111,114,115,101,99,116,105,111,110,34,62,115,112, -97,110,32,105,100,61,34,115,111,117,103,104,116,32,116,111,98,101,108,111,119,32 -,116,104,101,115,117,114,118,105,118,105,110,103,125,60,47,115,116,121,108,101, -62,104,105,115,32,100,101,97,116,104,97,115,32,105,110,32,116,104,101,99,97,117, -115,101,100,32,98,121,112,97,114,116,105,97,108,108,121,101,120,105,115,116,105, -110,103,32,117,115,105,110,103,32,116,104,101,119,97,115,32,103,105,118,101,110, -97,32,108,105,115,116,32,111,102,108,101,118,101,108,115,32,111,102,110,111,116, -105,111,110,32,111,102,79,102,102,105,99,105,97,108,32,100,105,115,109,105,115, -115,101,100,115,99,105,101,110,116,105,115,116,114,101,115,101,109,98,108,101, -115,100,117,112,108,105,99,97,116,101,101,120,112,108,111,115,105,118,101,114, -101,99,111,118,101,114,101,100,97,108,108,32,111,116,104,101,114,103,97,108,108, -101,114,105,101,115,123,112,97,100,100,105,110,103,58,112,101,111,112,108,101,32 -,111,102,114,101,103,105,111,110,32,111,102,97,100,100,114,101,115,115,101,115, -97,115,115,111,99,105,97,116,101,105,109,103,32,97,108,116,61,34,105,110,32,109, -111,100,101,114,110,115,104,111,117,108,100,32,98,101,109,101,116,104,111,100,32 -,111,102,114,101,112,111,114,116,105,110,103,116,105,109,101,115,116,97,109,112, -110,101,101,100,101,100,32,116,111,116,104,101,32,71,114,101,97,116,114,101,103, -97,114,100,105,110,103,115,101,101,109,101,100,32,116,111,118,105,101,119,101, -100,32,97,115,105,109,112,97,99,116,32,111,110,105,100,101,97,32,116,104,97,116, -116,104,101,32,87,111,114,108,100,104,101,105,103,104,116,32,111,102,101,120,112 -,97,110,100,105,110,103,84,104,101,115,101,32,97,114,101,99,117,114,114,101,110, -116,34,62,99,97,114,101,102,117,108,108,121,109,97,105,110,116,97,105,110,115,99 -,104,97,114,103,101,32,111,102,67,108,97,115,115,105,99,97,108,97,100,100,114, -101,115,115,101,100,112,114,101,100,105,99,116,101,100,111,119,110,101,114,115, -104,105,112,60,100,105,118,32,105,100,61,34,114,105,103,104,116,34,62,13,10,114, -101,115,105,100,101,110,99,101,108,101,97,118,101,32,116,104,101,99,111,110,116, -101,110,116,34,62,97,114,101,32,111,102,116,101,110,32,32,125,41,40,41,59,13,10, -112,114,111,98,97,98,108,121,32,80,114,111,102,101,115,115,111,114,45,98,117,116 -,116,111,110,34,32,114,101,115,112,111,110,100,101,100,115,97,121,115,32,116,104 -,97,116,104,97,100,32,116,111,32,98,101,112,108,97,99,101,100,32,105,110,72,117, -110,103,97,114,105,97,110,115,116,97,116,117,115,32,111,102,115,101,114,118,101, -115,32,97,115,85,110,105,118,101,114,115,97,108,101,120,101,99,117,116,105,111, -110,97,103,103,114,101,103,97,116,101,102,111,114,32,119,104,105,99,104,105,110, -102,101,99,116,105,111,110,97,103,114,101,101,100,32,116,111,104,111,119,101,118 -,101,114,44,32,112,111,112,117,108,97,114,34,62,112,108,97,99,101,100,32,111,110 -,99,111,110,115,116,114,117,99,116,101,108,101,99,116,111,114,97,108,115,121,109 -,98,111,108,32,111,102,105,110,99,108,117,100,105,110,103,114,101,116,117,114, -110,32,116,111,97,114,99,104,105,116,101,99,116,67,104,114,105,115,116,105,97, -110,112,114,101,118,105,111,117,115,32,108,105,118,105,110,103,32,105,110,101,97 -,115,105,101,114,32,116,111,112,114,111,102,101,115,115,111,114,10,38,108,116,59 -,33,45,45,32,101,102,102,101,99,116,32,111,102,97,110,97,108,121,116,105,99,115, -119,97,115,32,116,97,107,101,110,119,104,101,114,101,32,116,104,101,116,111,111, -107,32,111,118,101,114,98,101,108,105,101,102,32,105,110,65,102,114,105,107,97, -97,110,115,97,115,32,102,97,114,32,97,115,112,114,101,118,101,110,116,101,100, -119,111,114,107,32,119,105,116,104,97,32,115,112,101,99,105,97,108,60,102,105, -101,108,100,115,101,116,67,104,114,105,115,116,109,97,115,82,101,116,114,105,101 -,118,101,100,10,10,73,110,32,116,104,101,32,98,97,99,107,32,105,110,116,111,110, -111,114,116,104,101,97,115,116,109,97,103,97,122,105,110,101,115,62,60,115,116, -114,111,110,103,62,99,111,109,109,105,116,116,101,101,103,111,118,101,114,110, -105,110,103,103,114,111,117,112,115,32,111,102,115,116,111,114,101,100,32,105, -110,101,115,116,97,98,108,105,115,104,97,32,103,101,110,101,114,97,108,105,116, -115,32,102,105,114,115,116,116,104,101,105,114,32,111,119,110,112,111,112,117, -108,97,116,101,100,97,110,32,111,98,106,101,99,116,67,97,114,105,98,98,101,97, -110,97,108,108,111,119,32,116,104,101,100,105,115,116,114,105,99,116,115,119,105 -,115,99,111,110,115,105,110,108,111,99,97,116,105,111,110,46,59,32,119,105,100, -116,104,58,32,105,110,104,97,98,105,116,101,100,83,111,99,105,97,108,105,115,116 -,74,97,110,117,97,114,121,32,49,60,47,102,111,111,116,101,114,62,115,105,109,105 -,108,97,114,108,121,99,104,111,105,99,101,32,111,102,116,104,101,32,115,97,109, -101,32,115,112,101,99,105,102,105,99,32,98,117,115,105,110,101,115,115,32,84,104 -,101,32,102,105,114,115,116,46,108,101,110,103,116,104,59,32,100,101,115,105,114 -,101,32,116,111,100,101,97,108,32,119,105,116,104,115,105,110,99,101,32,116,104, -101,117,115,101,114,65,103,101,110,116,99,111,110,99,101,105,118,101,100,105,110 -,100,101,120,46,112,104,112,97,115,32,38,113,117,111,116,59,101,110,103,97,103, -101,32,105,110,114,101,99,101,110,116,108,121,44,102,101,119,32,121,101,97,114, -115,119,101,114,101,32,97,108,115,111,10,60,104,101,97,100,62,10,60,101,100,105, -116,101,100,32,98,121,97,114,101,32,107,110,111,119,110,99,105,116,105,101,115, -32,105,110,97,99,99,101,115,115,107,101,121,99,111,110,100,101,109,110,101,100, -97,108,115,111,32,104,97,118,101,115,101,114,118,105,99,101,115,44,102,97,109, -105,108,121,32,111,102,83,99,104,111,111,108,32,111,102,99,111,110,118,101,114, -116,101,100,110,97,116,117,114,101,32,111,102,32,108,97,110,103,117,97,103,101, -109,105,110,105,115,116,101,114,115,60,47,111,98,106,101,99,116,62,116,104,101, -114,101,32,105,115,32,97,32,112,111,112,117,108,97,114,115,101,113,117,101,110, -99,101,115,97,100,118,111,99,97,116,101,100,84,104,101,121,32,119,101,114,101,97 -,110,121,32,111,116,104,101,114,108,111,99,97,116,105,111,110,61,101,110,116,101 -,114,32,116,104,101,109,117,99,104,32,109,111,114,101,114,101,102,108,101,99,116 -,101,100,119,97,115,32,110,97,109,101,100,111,114,105,103,105,110,97,108,32,97, -32,116,121,112,105,99,97,108,119,104,101,110,32,116,104,101,121,101,110,103,105, -110,101,101,114,115,99,111,117,108,100,32,110,111,116,114,101,115,105,100,101, -110,116,115,119,101,100,110,101,115,100,97,121,116,104,101,32,116,104,105,114, -100,32,112,114,111,100,117,99,116,115,74,97,110,117,97,114,121,32,50,119,104,97, -116,32,116,104,101,121,97,32,99,101,114,116,97,105,110,114,101,97,99,116,105,111 -,110,115,112,114,111,99,101,115,115,111,114,97,102,116,101,114,32,104,105,115, -116,104,101,32,108,97,115,116,32,99,111,110,116,97,105,110,101,100,34,62,60,47, -100,105,118,62,10,60,47,97,62,60,47,116,100,62,100,101,112,101,110,100,32,111, -110,115,101,97,114,99,104,34,62,10,112,105,101,99,101,115,32,111,102,99,111,109, -112,101,116,105,110,103,82,101,102,101,114,101,110,99,101,116,101,110,110,101, -115,115,101,101,119,104,105,99,104,32,104,97,115,32,118,101,114,115,105,111,110, -61,60,47,115,112,97,110,62,32,60,60,47,104,101,97,100,101,114,62,103,105,118,101 -,115,32,116,104,101,104,105,115,116,111,114,105,97,110,118,97,108,117,101,61,34, -34,62,112,97,100,100,105,110,103,58,48,118,105,101,119,32,116,104,97,116,116,111 -,103,101,116,104,101,114,44,116,104,101,32,109,111,115,116,32,119,97,115,32,102, -111,117,110,100,115,117,98,115,101,116,32,111,102,97,116,116,97,99,107,32,111, -110,99,104,105,108,100,114,101,110,44,112,111,105,110,116,115,32,111,102,112,101 -,114,115,111,110,97,108,32,112,111,115,105,116,105,111,110,58,97,108,108,101,103 -,101,100,108,121,67,108,101,118,101,108,97,110,100,119,97,115,32,108,97,116,101, -114,97,110,100,32,97,102,116,101,114,97,114,101,32,103,105,118,101,110,119,97, -115,32,115,116,105,108,108,115,99,114,111,108,108,105,110,103,100,101,115,105, -103,110,32,111,102,109,97,107,101,115,32,116,104,101,109,117,99,104,32,108,101, -115,115,65,109,101,114,105,99,97,110,115,46,10,10,65,102,116,101,114,32,44,32,98 -,117,116,32,116,104,101,77,117,115,101,117,109,32,111,102,108,111,117,105,115, -105,97,110,97,40,102,114,111,109,32,116,104,101,109,105,110,110,101,115,111,116, -97,112,97,114,116,105,99,108,101,115,97,32,112,114,111,99,101,115,115,68,111,109 -,105,110,105,99,97,110,118,111,108,117,109,101,32,111,102,114,101,116,117,114, -110,105,110,103,100,101,102,101,110,115,105,118,101,48,48,112,120,124,114,105, -103,104,109,97,100,101,32,102,114,111,109,109,111,117,115,101,111,118,101,114,34 -,32,115,116,121,108,101,61,34,115,116,97,116,101,115,32,111,102,40,119,104,105, -99,104,32,105,115,99,111,110,116,105,110,117,101,115,70,114,97,110,99,105,115,99 -,111,98,117,105,108,100,105,110,103,32,119,105,116,104,111,117,116,32,97,119,105 -,116,104,32,115,111,109,101,119,104,111,32,119,111,117,108,100,97,32,102,111,114 -,109,32,111,102,97,32,112,97,114,116,32,111,102,98,101,102,111,114,101,32,105, -116,107,110,111,119,110,32,97,115,32,32,83,101,114,118,105,99,101,115,108,111,99 -,97,116,105,111,110,32,97,110,100,32,111,102,116,101,110,109,101,97,115,117,114, -105,110,103,97,110,100,32,105,116,32,105,115,112,97,112,101,114,98,97,99,107,118 -,97,108,117,101,115,32,111,102,13,10,60,116,105,116,108,101,62,61,32,119,105,110 -,100,111,119,46,100,101,116,101,114,109,105,110,101,101,114,38,113,117,111,116, -59,32,112,108,97,121,101,100,32,98,121,97,110,100,32,101,97,114,108,121,60,47,99 -,101,110,116,101,114,62,102,114,111,109,32,116,104,105,115,116,104,101,32,116, -104,114,101,101,112,111,119,101,114,32,97,110,100,111,102,32,38,113,117,111,116, -59,105,110,110,101,114,72,84,77,76,60,97,32,104,114,101,102,61,34,121,58,105,110 -,108,105,110,101,59,67,104,117,114,99,104,32,111,102,116,104,101,32,101,118,101, -110,116,118,101,114,121,32,104,105,103,104,111,102,102,105,99,105,97,108,32,45, -104,101,105,103,104,116,58,32,99,111,110,116,101,110,116,61,34,47,99,103,105,45, -98,105,110,47,116,111,32,99,114,101,97,116,101,97,102,114,105,107,97,97,110,115, -101,115,112,101,114,97,110,116,111,102,114,97,110,195,167,97,105,115,108,97,116, -118,105,101,197,161,117,108,105,101,116,117,118,105,197,179,196,140,101,197,161, -116,105,110,97,196,141,101,197,161,116,105,110,97,224,185,132,224,184,151,224, -184,162,230,151,165,230,156,172,232,170,158,231,174,128,228,189,147,229,173,151, -231,185,129,233,171,148,229,173,151,237,149,156,234,181,173,236,150,180,228,184, -186,228,187,128,228,185,136,232,174,161,231,174,151,230,156,186,231,172,148,232, -174,176,230,156,172,232,168,142,232,171,150,229,141,128,230,156,141,229,138,161, -229,153,168,228,186,146,232,129,148,231,189,145,230,136,191,229,156,176,228,186, -167,228,191,177,228,185,144,233,131,168,229,135,186,231,137,136,231,164,190,230, -142,146,232,161,140,230,166,156,233,131,168,232,144,189,230,160,188,232,191,155, -228,184,128,230,173,165,230,148,175,228,187,152,229,174,157,233,170,140,232,175, -129,231,160,129,229,167,148,229,145,152,228,188,154,230,149,176,230,141,174,229, -186,147,230,182,136,232,180,185,232,128,133,229,138,158,229,133,172,229,174,164, -232,174,168,232,174,186,229,140,186,230,183,177,229,156,179,229,184,130,230,146, -173,230,148,190,229,153,168,229,140,151,228,186,172,229,184,130,229,164,167,229, -173,166,231,148,159,232,182,138,230,157,165,232,182,138,231,174,161,231,144,134, -229,145,152,228,191,161,230,129,175,231,189,145,115,101,114,118,105,99,105,111, -115,97,114,116,195,173,99,117,108,111,97,114,103,101,110,116,105,110,97,98,97, -114,99,101,108,111,110,97,99,117,97,108,113,117,105,101,114,112,117,98,108,105, -99,97,100,111,112,114,111,100,117,99,116,111,115,112,111,108,195,173,116,105,99, -97,114,101,115,112,117,101,115,116,97,119,105,107,105,112,101,100,105,97,115,105 -,103,117,105,101,110,116,101,98,195,186,115,113,117,101,100,97,99,111,109,117, -110,105,100,97,100,115,101,103,117,114,105,100,97,100,112,114,105,110,99,105,112 -,97,108,112,114,101,103,117,110,116,97,115,99,111,110,116,101,110,105,100,111, -114,101,115,112,111,110,100,101,114,118,101,110,101,122,117,101,108,97,112,114, -111,98,108,101,109,97,115,100,105,99,105,101,109,98,114,101,114,101,108,97,99, -105,195,179,110,110,111,118,105,101,109,98,114,101,115,105,109,105,108,97,114, -101,115,112,114,111,121,101,99,116,111,115,112,114,111,103,114,97,109,97,115,105 -,110,115,116,105,116,117,116,111,97,99,116,105,118,105,100,97,100,101,110,99,117 -,101,110,116,114,97,101,99,111,110,111,109,195,173,97,105,109,195,161,103,101, -110,101,115,99,111,110,116,97,99,116,97,114,100,101,115,99,97,114,103,97,114,110 -,101,99,101,115,97,114,105,111,97,116,101,110,99,105,195,179,110,116,101,108,195 -,169,102,111,110,111,99,111,109,105,115,105,195,179,110,99,97,110,99,105,111,110 -,101,115,99,97,112,97,99,105,100,97,100,101,110,99,111,110,116,114,97,114,97,110 -,195,161,108,105,115,105,115,102,97,118,111,114,105,116,111,115,116,195,169,114, -109,105,110,111,115,112,114,111,118,105,110,99,105,97,101,116,105,113,117,101, -116,97,115,101,108,101,109,101,110,116,111,115,102,117,110,99,105,111,110,101, -115,114,101,115,117,108,116,97,100,111,99,97,114,195,161,99,116,101,114,112,114, -111,112,105,101,100,97,100,112,114,105,110,99,105,112,105,111,110,101,99,101,115 -,105,100,97,100,109,117,110,105,99,105,112,97,108,99,114,101,97,99,105,195,179, -110,100,101,115,99,97,114,103,97,115,112,114,101,115,101,110,99,105,97,99,111, -109,101,114,99,105,97,108,111,112,105,110,105,111,110,101,115,101,106,101,114,99 -,105,99,105,111,101,100,105,116,111,114,105,97,108,115,97,108,97,109,97,110,99, -97,103,111,110,122,195,161,108,101,122,100,111,99,117,109,101,110,116,111,112, -101,108,195,173,99,117,108,97,114,101,99,105,101,110,116,101,115,103,101,110,101 -,114,97,108,101,115,116,97,114,114,97,103,111,110,97,112,114,195,161,99,116,105, -99,97,110,111,118,101,100,97,100,101,115,112,114,111,112,117,101,115,116,97,112, -97,99,105,101,110,116,101,115,116,195,169,99,110,105,99,97,115,111,98,106,101, -116,105,118,111,115,99,111,110,116,97,99,116,111,115,224,164,174,224,165,135,224 -,164,130,224,164,178,224,164,191,224,164,143,224,164,185,224,165,136,224,164,130 -,224,164,151,224,164,175,224,164,190,224,164,184,224,164,190,224,164,165,224,164 -,143,224,164,181,224,164,130,224,164,176,224,164,185,224,165,135,224,164,149,224 -,165,139,224,164,136,224,164,149,224,165,129,224,164,155,224,164,176,224,164,185 -,224,164,190,224,164,172,224,164,190,224,164,166,224,164,149,224,164,185,224,164 -,190,224,164,184,224,164,173,224,165,128,224,164,185,224,165,129,224,164,143,224 -,164,176,224,164,185,224,165,128,224,164,174,224,165,136,224,164,130,224,164,166 -,224,164,191,224,164,168,224,164,172,224,164,190,224,164,164,100,105,112,108,111 -,100,111,99,115,224,164,184,224,164,174,224,164,175,224,164,176,224,165,130,224, -164,170,224,164,168,224,164,190,224,164,174,224,164,170,224,164,164,224,164,190, -224,164,171,224,164,191,224,164,176,224,164,148,224,164,184,224,164,164,224,164, -164,224,164,176,224,164,185,224,164,178,224,165,139,224,164,151,224,164,185,224, -165,129,224,164,134,224,164,172,224,164,190,224,164,176,224,164,166,224,165,135, -224,164,182,224,164,185,224,165,129,224,164,136,224,164,150,224,165,135,224,164, -178,224,164,175,224,164,166,224,164,191,224,164,149,224,164,190,224,164,174,224, -164,181,224,165,135,224,164,172,224,164,164,224,165,128,224,164,168,224,164,172, -224,165,128,224,164,154,224,164,174,224,165,140,224,164,164,224,164,184,224,164, -190,224,164,178,224,164,178,224,165,135,224,164,150,224,164,156,224,165,137,224, -164,172,224,164,174,224,164,166,224,164,166,224,164,164,224,164,165,224,164,190, -224,164,168,224,164,185,224,165,128,224,164,182,224,164,185,224,164,176,224,164, -133,224,164,178,224,164,151,224,164,149,224,164,173,224,165,128,224,164,168,224, -164,151,224,164,176,224,164,170,224,164,190,224,164,184,224,164,176,224,164,190, -224,164,164,224,164,149,224,164,191,224,164,143,224,164,137,224,164,184,224,165, -135,224,164,151,224,164,175,224,165,128,224,164,185,224,165,130,224,164,129,224, -164,134,224,164,151,224,165,135,224,164,159,224,165,128,224,164,174,224,164,150, -224,165,139,224,164,156,224,164,149,224,164,190,224,164,176,224,164,133,224,164, -173,224,165,128,224,164,151,224,164,175,224,165,135,224,164,164,224,165,129,224, -164,174,224,164,181,224,165,139,224,164,159,224,164,166,224,165,135,224,164,130, -224,164,133,224,164,151,224,164,176,224,164,144,224,164,184,224,165,135,224,164, -174,224,165,135,224,164,178,224,164,178,224,164,151,224,164,190,224,164,185,224, -164,190,224,164,178,224,164,138,224,164,170,224,164,176,224,164,154,224,164,190, -224,164,176,224,164,144,224,164,184,224,164,190,224,164,166,224,165,135,224,164, -176,224,164,156,224,164,191,224,164,184,224,164,166,224,164,191,224,164,178,224, -164,172,224,164,130,224,164,166,224,164,172,224,164,168,224,164,190,224,164,185, -224,165,130,224,164,130,224,164,178,224,164,190,224,164,150,224,164,156,224,165, -128,224,164,164,224,164,172,224,164,159,224,164,168,224,164,174,224,164,191,224, -164,178,224,164,135,224,164,184,224,165,135,224,164,134,224,164,168,224,165,135, -224,164,168,224,164,175,224,164,190,224,164,149,224,165,129,224,164,178,224,164, -178,224,165,137,224,164,151,224,164,173,224,164,190,224,164,151,224,164,176,224, -165,135,224,164,178,224,164,156,224,164,151,224,164,185,224,164,176,224,164,190, -224,164,174,224,164,178,224,164,151,224,165,135,224,164,170,224,165,135,224,164, -156,224,164,185,224,164,190,224,164,165,224,164,135,224,164,184,224,165,128,224, -164,184,224,164,185,224,165,128,224,164,149,224,164,178,224,164,190,224,164,160, -224,165,128,224,164,149,224,164,185,224,164,190,224,164,129,224,164,166,224,165, -130,224,164,176,224,164,164,224,164,185,224,164,164,224,164,184,224,164,190,224, -164,164,224,164,175,224,164,190,224,164,166,224,164,134,224,164,175,224,164,190, -224,164,170,224,164,190,224,164,149,224,164,149,224,165,140,224,164,168,224,164, -182,224,164,190,224,164,174,224,164,166,224,165,135,224,164,150,224,164,175,224, -164,185,224,165,128,224,164,176,224,164,190,224,164,175,224,164,150,224,165,129, -224,164,166,224,164,178,224,164,151,224,165,128,99,97,116,101,103,111,114,105, -101,115,101,120,112,101,114,105,101,110,99,101,60,47,116,105,116,108,101,62,13, -10,67,111,112,121,114,105,103,104,116,32,106,97,118,97,115,99,114,105,112,116,99 -,111,110,100,105,116,105,111,110,115,101,118,101,114,121,116,104,105,110,103,60, -112,32,99,108,97,115,115,61,34,116,101,99,104,110,111,108,111,103,121,98,97,99, -107,103,114,111,117,110,100,60,97,32,99,108,97,115,115,61,34,109,97,110,97,103, -101,109,101,110,116,38,99,111,112,121,59,32,50,48,49,106,97,118,97,83,99,114,105 -,112,116,99,104,97,114,97,99,116,101,114,115,98,114,101,97,100,99,114,117,109,98 -,116,104,101,109,115,101,108,118,101,115,104,111,114,105,122,111,110,116,97,108, -103,111,118,101,114,110,109,101,110,116,67,97,108,105,102,111,114,110,105,97,97, -99,116,105,118,105,116,105,101,115,100,105,115,99,111,118,101,114,101,100,78,97, -118,105,103,97,116,105,111,110,116,114,97,110,115,105,116,105,111,110,99,111,110 -,110,101,99,116,105,111,110,110,97,118,105,103,97,116,105,111,110,97,112,112,101 -,97,114,97,110,99,101,60,47,116,105,116,108,101,62,60,109,99,104,101,99,107,98, -111,120,34,32,116,101,99,104,110,105,113,117,101,115,112,114,111,116,101,99,116, -105,111,110,97,112,112,97,114,101,110,116,108,121,97,115,32,119,101,108,108,32, -97,115,117,110,116,39,44,32,39,85,65,45,114,101,115,111,108,117,116,105,111,110, -111,112,101,114,97,116,105,111,110,115,116,101,108,101,118,105,115,105,111,110, -116,114,97,110,115,108,97,116,101,100,87,97,115,104,105,110,103,116,111,110,110, -97,118,105,103,97,116,111,114,46,32,61,32,119,105,110,100,111,119,46,105,109,112 -,114,101,115,115,105,111,110,38,108,116,59,98,114,38,103,116,59,108,105,116,101, -114,97,116,117,114,101,112,111,112,117,108,97,116,105,111,110,98,103,99,111,108, -111,114,61,34,35,101,115,112,101,99,105,97,108,108,121,32,99,111,110,116,101,110 -,116,61,34,112,114,111,100,117,99,116,105,111,110,110,101,119,115,108,101,116, -116,101,114,112,114,111,112,101,114,116,105,101,115,100,101,102,105,110,105,116, -105,111,110,108,101,97,100,101,114,115,104,105,112,84,101,99,104,110,111,108,111 -,103,121,80,97,114,108,105,97,109,101,110,116,99,111,109,112,97,114,105,115,111, -110,117,108,32,99,108,97,115,115,61,34,46,105,110,100,101,120,79,102,40,34,99, -111,110,99,108,117,115,105,111,110,100,105,115,99,117,115,115,105,111,110,99,111 -,109,112,111,110,101,110,116,115,98,105,111,108,111,103,105,99,97,108,82,101,118 -,111,108,117,116,105,111,110,95,99,111,110,116,97,105,110,101,114,117,110,100, -101,114,115,116,111,111,100,110,111,115,99,114,105,112,116,62,60,112,101,114,109 -,105,115,115,105,111,110,101,97,99,104,32,111,116,104,101,114,97,116,109,111,115 -,112,104,101,114,101,32,111,110,102,111,99,117,115,61,34,60,102,111,114,109,32, -105,100,61,34,112,114,111,99,101,115,115,105,110,103,116,104,105,115,46,118,97, -108,117,101,103,101,110,101,114,97,116,105,111,110,67,111,110,102,101,114,101, -110,99,101,115,117,98,115,101,113,117,101,110,116,119,101,108,108,45,107,110,111 -,119,110,118,97,114,105,97,116,105,111,110,115,114,101,112,117,116,97,116,105, -111,110,112,104,101,110,111,109,101,110,111,110,100,105,115,99,105,112,108,105, -110,101,108,111,103,111,46,112,110,103,34,32,40,100,111,99,117,109,101,110,116, -44,98,111,117,110,100,97,114,105,101,115,101,120,112,114,101,115,115,105,111,110 -,115,101,116,116,108,101,109,101,110,116,66,97,99,107,103,114,111,117,110,100, -111,117,116,32,111,102,32,116,104,101,101,110,116,101,114,112,114,105,115,101,40 -,34,104,116,116,112,115,58,34,32,117,110,101,115,99,97,112,101,40,34,112,97,115, -115,119,111,114,100,34,32,100,101,109,111,99,114,97,116,105,99,60,97,32,104,114, -101,102,61,34,47,119,114,97,112,112,101,114,34,62,10,109,101,109,98,101,114,115, -104,105,112,108,105,110,103,117,105,115,116,105,99,112,120,59,112,97,100,100,105 -,110,103,112,104,105,108,111,115,111,112,104,121,97,115,115,105,115,116,97,110, -99,101,117,110,105,118,101,114,115,105,116,121,102,97,99,105,108,105,116,105,101 -,115,114,101,99,111,103,110,105,122,101,100,112,114,101,102,101,114,101,110,99, -101,105,102,32,40,116,121,112,101,111,102,109,97,105,110,116,97,105,110,101,100, -118,111,99,97,98,117,108,97,114,121,104,121,112,111,116,104,101,115,105,115,46, -115,117,98,109,105,116,40,41,59,38,97,109,112,59,110,98,115,112,59,97,110,110, -111,116,97,116,105,111,110,98,101,104,105,110,100,32,116,104,101,70,111,117,110, -100,97,116,105,111,110,112,117,98,108,105,115,104,101,114,34,97,115,115,117,109, -112,116,105,111,110,105,110,116,114,111,100,117,99,101,100,99,111,114,114,117, -112,116,105,111,110,115,99,105,101,110,116,105,115,116,115,101,120,112,108,105, -99,105,116,108,121,105,110,115,116,101,97,100,32,111,102,100,105,109,101,110,115 -,105,111,110,115,32,111,110,67,108,105,99,107,61,34,99,111,110,115,105,100,101, -114,101,100,100,101,112,97,114,116,109,101,110,116,111,99,99,117,112,97,116,105, -111,110,115,111,111,110,32,97,102,116,101,114,105,110,118,101,115,116,109,101, -110,116,112,114,111,110,111,117,110,99,101,100,105,100,101,110,116,105,102,105, -101,100,101,120,112,101,114,105,109,101,110,116,77,97,110,97,103,101,109,101,110 -,116,103,101,111,103,114,97,112,104,105,99,34,32,104,101,105,103,104,116,61,34, -108,105,110,107,32,114,101,108,61,34,46,114,101,112,108,97,99,101,40,47,100,101, -112,114,101,115,115,105,111,110,99,111,110,102,101,114,101,110,99,101,112,117, -110,105,115,104,109,101,110,116,101,108,105,109,105,110,97,116,101,100,114,101, -115,105,115,116,97,110,99,101,97,100,97,112,116,97,116,105,111,110,111,112,112, -111,115,105,116,105,111,110,119,101,108,108,32,107,110,111,119,110,115,117,112, -112,108,101,109,101,110,116,100,101,116,101,114,109,105,110,101,100,104,49,32,99 -,108,97,115,115,61,34,48,112,120,59,109,97,114,103,105,110,109,101,99,104,97,110 -,105,99,97,108,115,116,97,116,105,115,116,105,99,115,99,101,108,101,98,114,97, -116,101,100,71,111,118,101,114,110,109,101,110,116,10,10,68,117,114,105,110,103, -32,116,100,101,118,101,108,111,112,101,114,115,97,114,116,105,102,105,99,105,97, -108,101,113,117,105,118,97,108,101,110,116,111,114,105,103,105,110,97,116,101, -100,67,111,109,109,105,115,115,105,111,110,97,116,116,97,99,104,109,101,110,116, -60,115,112,97,110,32,105,100,61,34,116,104,101,114,101,32,119,101,114,101,78,101 -,100,101,114,108,97,110,100,115,98,101,121,111,110,100,32,116,104,101,114,101, -103,105,115,116,101,114,101,100,106,111,117,114,110,97,108,105,115,116,102,114, -101,113,117,101,110,116,108,121,97,108,108,32,111,102,32,116,104,101,108,97,110, -103,61,34,101,110,34,32,60,47,115,116,121,108,101,62,13,10,97,98,115,111,108,117 -,116,101,59,32,115,117,112,112,111,114,116,105,110,103,101,120,116,114,101,109, -101,108,121,32,109,97,105,110,115,116,114,101,97,109,60,47,115,116,114,111,110, -103,62,32,112,111,112,117,108,97,114,105,116,121,101,109,112,108,111,121,109,101 -,110,116,60,47,116,97,98,108,101,62,13,10,32,99,111,108,115,112,97,110,61,34,60, -47,102,111,114,109,62,10,32,32,99,111,110,118,101,114,115,105,111,110,97,98,111, -117,116,32,116,104,101,32,60,47,112,62,60,47,100,105,118,62,105,110,116,101,103, -114,97,116,101,100,34,32,108,97,110,103,61,34,101,110,80,111,114,116,117,103,117 -,101,115,101,115,117,98,115,116,105,116,117,116,101,105,110,100,105,118,105,100, -117,97,108,105,109,112,111,115,115,105,98,108,101,109,117,108,116,105,109,101, -100,105,97,97,108,109,111,115,116,32,97,108,108,112,120,32,115,111,108,105,100, -32,35,97,112,97,114,116,32,102,114,111,109,115,117,98,106,101,99,116,32,116,111, -105,110,32,69,110,103,108,105,115,104,99,114,105,116,105,99,105,122,101,100,101, -120,99,101,112,116,32,102,111,114,103,117,105,100,101,108,105,110,101,115,111, -114,105,103,105,110,97,108,108,121,114,101,109,97,114,107,97,98,108,101,116,104, -101,32,115,101,99,111,110,100,104,50,32,99,108,97,115,115,61,34,60,97,32,116,105 -,116,108,101,61,34,40,105,110,99,108,117,100,105,110,103,112,97,114,97,109,101, -116,101,114,115,112,114,111,104,105,98,105,116,101,100,61,32,34,104,116,116,112, -58,47,47,100,105,99,116,105,111,110,97,114,121,112,101,114,99,101,112,116,105, -111,110,114,101,118,111,108,117,116,105,111,110,102,111,117,110,100,97,116,105, -111,110,112,120,59,104,101,105,103,104,116,58,115,117,99,99,101,115,115,102,117, -108,115,117,112,112,111,114,116,101,114,115,109,105,108,108,101,110,110,105,117, -109,104,105,115,32,102,97,116,104,101,114,116,104,101,32,38,113,117,111,116,59, -110,111,45,114,101,112,101,97,116,59,99,111,109,109,101,114,99,105,97,108,105, -110,100,117,115,116,114,105,97,108,101,110,99,111,117,114,97,103,101,100,97,109, -111,117,110,116,32,111,102,32,117,110,111,102,102,105,99,105,97,108,101,102,102, -105,99,105,101,110,99,121,82,101,102,101,114,101,110,99,101,115,99,111,111,114, -100,105,110,97,116,101,100,105,115,99,108,97,105,109,101,114,101,120,112,101,100 -,105,116,105,111,110,100,101,118,101,108,111,112,105,110,103,99,97,108,99,117, -108,97,116,101,100,115,105,109,112,108,105,102,105,101,100,108,101,103,105,116, -105,109,97,116,101,115,117,98,115,116,114,105,110,103,40,48,34,32,99,108,97,115, -115,61,34,99,111,109,112,108,101,116,101,108,121,105,108,108,117,115,116,114,97, -116,101,102,105,118,101,32,121,101,97,114,115,105,110,115,116,114,117,109,101, -110,116,80,117,98,108,105,115,104,105,110,103,49,34,32,99,108,97,115,115,61,34, -112,115,121,99,104,111,108,111,103,121,99,111,110,102,105,100,101,110,99,101,110 -,117,109,98,101,114,32,111,102,32,97,98,115,101,110,99,101,32,111,102,102,111,99 -,117,115,101,100,32,111,110,106,111,105,110,101,100,32,116,104,101,115,116,114, -117,99,116,117,114,101,115,112,114,101,118,105,111,117,115,108,121,62,60,47,105, -102,114,97,109,101,62,111,110,99,101,32,97,103,97,105,110,98,117,116,32,114,97, -116,104,101,114,105,109,109,105,103,114,97,110,116,115,111,102,32,99,111,117,114 -,115,101,44,97,32,103,114,111,117,112,32,111,102,76,105,116,101,114,97,116,117, -114,101,85,110,108,105,107,101,32,116,104,101,60,47,97,62,38,110,98,115,112,59, -10,102,117,110,99,116,105,111,110,32,105,116,32,119,97,115,32,116,104,101,67,111 -,110,118,101,110,116,105,111,110,97,117,116,111,109,111,98,105,108,101,80,114, -111,116,101,115,116,97,110,116,97,103,103,114,101,115,115,105,118,101,97,102,116 -,101,114,32,116,104,101,32,83,105,109,105,108,97,114,108,121,44,34,32,47,62,60, -47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,13,10,102,117,110,99,116 -,105,111,110,118,105,115,105,98,105,108,105,116,121,116,104,101,32,117,115,101, -32,111,102,118,111,108,117,110,116,101,101,114,115,97,116,116,114,97,99,116,105, -111,110,117,110,100,101,114,32,116,104,101,32,116,104,114,101,97,116,101,110,101 -,100,42,60,33,91,67,68,65,84,65,91,105,109,112,111,114,116,97,110,99,101,105,110 -,32,103,101,110,101,114,97,108,116,104,101,32,108,97,116,116,101,114,60,47,102, -111,114,109,62,10,60,47,46,105,110,100,101,120,79,102,40,39,105,32,61,32,48,59, -32,105,32,60,100,105,102,102,101,114,101,110,99,101,100,101,118,111,116,101,100, -32,116,111,116,114,97,100,105,116,105,111,110,115,115,101,97,114,99,104,32,102, -111,114,117,108,116,105,109,97,116,101,108,121,116,111,117,114,110,97,109,101, -110,116,97,116,116,114,105,98,117,116,101,115,115,111,45,99,97,108,108,101,100, -32,125,10,60,47,115,116,121,108,101,62,101,118,97,108,117,97,116,105,111,110,101 -,109,112,104,97,115,105,122,101,100,97,99,99,101,115,115,105,98,108,101,60,47, -115,101,99,116,105,111,110,62,115,117,99,99,101,115,115,105,111,110,97,108,111, -110,103,32,119,105,116,104,77,101,97,110,119,104,105,108,101,44,105,110,100,117, -115,116,114,105,101,115,60,47,97,62,60,98,114,32,47,62,104,97,115,32,98,101,99, -111,109,101,97,115,112,101,99,116,115,32,111,102,84,101,108,101,118,105,115,105, -111,110,115,117,102,102,105,99,105,101,110,116,98,97,115,107,101,116,98,97,108, -108,98,111,116,104,32,115,105,100,101,115,99,111,110,116,105,110,117,105,110,103 -,97,110,32,97,114,116,105,99,108,101,60,105,109,103,32,97,108,116,61,34,97,100, -118,101,110,116,117,114,101,115,104,105,115,32,109,111,116,104,101,114,109,97, -110,99,104,101,115,116,101,114,112,114,105,110,99,105,112,108,101,115,112,97,114 -,116,105,99,117,108,97,114,99,111,109,109,101,110,116,97,114,121,101,102,102,101 -,99,116,115,32,111,102,100,101,99,105,100,101,100,32,116,111,34,62,60,115,116, -114,111,110,103,62,112,117,98,108,105,115,104,101,114,115,74,111,117,114,110,97, -108,32,111,102,100,105,102,102,105,99,117,108,116,121,102,97,99,105,108,105,116, -97,116,101,97,99,99,101,112,116,97,98,108,101,115,116,121,108,101,46,99,115,115, -34,9,102,117,110,99,116,105,111,110,32,105,110,110,111,118,97,116,105,111,110,62 -,67,111,112,121,114,105,103,104,116,115,105,116,117,97,116,105,111,110,115,119, -111,117,108,100,32,104,97,118,101,98,117,115,105,110,101,115,115,101,115,68,105, -99,116,105,111,110,97,114,121,115,116,97,116,101,109,101,110,116,115,111,102,116 -,101,110,32,117,115,101,100,112,101,114,115,105,115,116,101,110,116,105,110,32, -74,97,110,117,97,114,121,99,111,109,112,114,105,115,105,110,103,60,47,116,105, -116,108,101,62,10,9,100,105,112,108,111,109,97,116,105,99,99,111,110,116,97,105, -110,105,110,103,112,101,114,102,111,114,109,105,110,103,101,120,116,101,110,115, -105,111,110,115,109,97,121,32,110,111,116,32,98,101,99,111,110,99,101,112,116,32 -,111,102,32,111,110,99,108,105,99,107,61,34,73,116,32,105,115,32,97,108,115,111, -102,105,110,97,110,99,105,97,108,32,109,97,107,105,110,103,32,116,104,101,76,117 -,120,101,109,98,111,117,114,103,97,100,100,105,116,105,111,110,97,108,97,114,101 -,32,99,97,108,108,101,100,101,110,103,97,103,101,100,32,105,110,34,115,99,114, -105,112,116,34,41,59,98,117,116,32,105,116,32,119,97,115,101,108,101,99,116,114, -111,110,105,99,111,110,115,117,98,109,105,116,61,34,10,60,33,45,45,32,69,110,100 -,32,101,108,101,99,116,114,105,99,97,108,111,102,102,105,99,105,97,108,108,121, -115,117,103,103,101,115,116,105,111,110,116,111,112,32,111,102,32,116,104,101, -117,110,108,105,107,101,32,116,104,101,65,117,115,116,114,97,108,105,97,110,79, -114,105,103,105,110,97,108,108,121,114,101,102,101,114,101,110,99,101,115,10,60, -47,104,101,97,100,62,13,10,114,101,99,111,103,110,105,115,101,100,105,110,105, -116,105,97,108,105,122,101,108,105,109,105,116,101,100,32,116,111,65,108,101,120 -,97,110,100,114,105,97,114,101,116,105,114,101,109,101,110,116,65,100,118,101, -110,116,117,114,101,115,102,111,117,114,32,121,101,97,114,115,10,10,38,108,116, -59,33,45,45,32,105,110,99,114,101,97,115,105,110,103,100,101,99,111,114,97,116, -105,111,110,104,51,32,99,108,97,115,115,61,34,111,114,105,103,105,110,115,32,111 -,102,111,98,108,105,103,97,116,105,111,110,114,101,103,117,108,97,116,105,111, -110,99,108,97,115,115,105,102,105,101,100,40,102,117,110,99,116,105,111,110,40, -97,100,118,97,110,116,97,103,101,115,98,101,105,110,103,32,116,104,101,32,104, -105,115,116,111,114,105,97,110,115,60,98,97,115,101,32,104,114,101,102,114,101, -112,101,97,116,101,100,108,121,119,105,108,108,105,110,103,32,116,111,99,111,109 -,112,97,114,97,98,108,101,100,101,115,105,103,110,97,116,101,100,110,111,109,105 -,110,97,116,105,111,110,102,117,110,99,116,105,111,110,97,108,105,110,115,105, -100,101,32,116,104,101,114,101,118,101,108,97,116,105,111,110,101,110,100,32,111 -,102,32,116,104,101,115,32,102,111,114,32,116,104,101,32,97,117,116,104,111,114, -105,122,101,100,114,101,102,117,115,101,100,32,116,111,116,97,107,101,32,112,108 -,97,99,101,97,117,116,111,110,111,109,111,117,115,99,111,109,112,114,111,109,105 -,115,101,112,111,108,105,116,105,99,97,108,32,114,101,115,116,97,117,114,97,110, -116,116,119,111,32,111,102,32,116,104,101,70,101,98,114,117,97,114,121,32,50,113 -,117,97,108,105,116,121,32,111,102,115,119,102,111,98,106,101,99,116,46,117,110, -100,101,114,115,116,97,110,100,110,101,97,114,108,121,32,97,108,108,119,114,105, -116,116,101,110,32,98,121,105,110,116,101,114,118,105,101,119,115,34,32,119,105, -100,116,104,61,34,49,119,105,116,104,100,114,97,119,97,108,102,108,111,97,116,58 -,108,101,102,116,105,115,32,117,115,117,97,108,108,121,99,97,110,100,105,100,97, -116,101,115,110,101,119,115,112,97,112,101,114,115,109,121,115,116,101,114,105, -111,117,115,68,101,112,97,114,116,109,101,110,116,98,101,115,116,32,107,110,111, -119,110,112,97,114,108,105,97,109,101,110,116,115,117,112,112,114,101,115,115, -101,100,99,111,110,118,101,110,105,101,110,116,114,101,109,101,109,98,101,114, -101,100,100,105,102,102,101,114,101,110,116,32,115,121,115,116,101,109,97,116, -105,99,104,97,115,32,108,101,100,32,116,111,112,114,111,112,97,103,97,110,100,97 -,99,111,110,116,114,111,108,108,101,100,105,110,102,108,117,101,110,99,101,115, -99,101,114,101,109,111,110,105,97,108,112,114,111,99,108,97,105,109,101,100,80, -114,111,116,101,99,116,105,111,110,108,105,32,99,108,97,115,115,61,34,83,99,105, -101,110,116,105,102,105,99,99,108,97,115,115,61,34,110,111,45,116,114,97,100,101 -,109,97,114,107,115,109,111,114,101,32,116,104,97,110,32,119,105,100,101,115,112 -,114,101,97,100,76,105,98,101,114,97,116,105,111,110,116,111,111,107,32,112,108, -97,99,101,100,97,121,32,111,102,32,116,104,101,97,115,32,108,111,110,103,32,97, -115,105,109,112,114,105,115,111,110,101,100,65,100,100,105,116,105,111,110,97, -108,10,60,104,101,97,100,62,10,60,109,76,97,98,111,114,97,116,111,114,121,78,111 -,118,101,109,98,101,114,32,50,101,120,99,101,112,116,105,111,110,115,73,110,100, -117,115,116,114,105,97,108,118,97,114,105,101,116,121,32,111,102,102,108,111,97, -116,58,32,108,101,102,68,117,114,105,110,103,32,116,104,101,97,115,115,101,115, -115,109,101,110,116,104,97,118,101,32,98,101,101,110,32,100,101,97,108,115,32, -119,105,116,104,83,116,97,116,105,115,116,105,99,115,111,99,99,117,114,114,101, -110,99,101,47,117,108,62,60,47,100,105,118,62,99,108,101,97,114,102,105,120,34, -62,116,104,101,32,112,117,98,108,105,99,109,97,110,121,32,121,101,97,114,115,119 -,104,105,99,104,32,119,101,114,101,111,118,101,114,32,116,105,109,101,44,115,121 -,110,111,110,121,109,111,117,115,99,111,110,116,101,110,116,34,62,10,112,114,101 -,115,117,109,97,98,108,121,104,105,115,32,102,97,109,105,108,121,117,115,101,114 -,65,103,101,110,116,46,117,110,101,120,112,101,99,116,101,100,105,110,99,108,117 -,100,105,110,103,32,99,104,97,108,108,101,110,103,101,100,97,32,109,105,110,111, -114,105,116,121,117,110,100,101,102,105,110,101,100,34,98,101,108,111,110,103, -115,32,116,111,116,97,107,101,110,32,102,114,111,109,105,110,32,79,99,116,111,98 -,101,114,112,111,115,105,116,105,111,110,58,32,115,97,105,100,32,116,111,32,98, -101,114,101,108,105,103,105,111,117,115,32,70,101,100,101,114,97,116,105,111,110 -,32,114,111,119,115,112,97,110,61,34,111,110,108,121,32,97,32,102,101,119,109, -101,97,110,116,32,116,104,97,116,108,101,100,32,116,111,32,116,104,101,45,45,62, -13,10,60,100,105,118,32,60,102,105,101,108,100,115,101,116,62,65,114,99,104,98, -105,115,104,111,112,32,99,108,97,115,115,61,34,110,111,98,101,105,110,103,32,117 -,115,101,100,97,112,112,114,111,97,99,104,101,115,112,114,105,118,105,108,101, -103,101,115,110,111,115,99,114,105,112,116,62,10,114,101,115,117,108,116,115,32, -105,110,109,97,121,32,98,101,32,116,104,101,69,97,115,116,101,114,32,101,103,103 -,109,101,99,104,97,110,105,115,109,115,114,101,97,115,111,110,97,98,108,101,80, -111,112,117,108,97,116,105,111,110,67,111,108,108,101,99,116,105,111,110,115,101 -,108,101,99,116,101,100,34,62,110,111,115,99,114,105,112,116,62,13,47,105,110, -100,101,120,46,112,104,112,97,114,114,105,118,97,108,32,111,102,45,106,115,115, -100,107,39,41,41,59,109,97,110,97,103,101,100,32,116,111,105,110,99,111,109,112, -108,101,116,101,99,97,115,117,97,108,116,105,101,115,99,111,109,112,108,101,116, -105,111,110,67,104,114,105,115,116,105,97,110,115,83,101,112,116,101,109,98,101, -114,32,97,114,105,116,104,109,101,116,105,99,112,114,111,99,101,100,117,114,101, -115,109,105,103,104,116,32,104,97,118,101,80,114,111,100,117,99,116,105,111,110, -105,116,32,97,112,112,101,97,114,115,80,104,105,108,111,115,111,112,104,121,102, -114,105,101,110,100,115,104,105,112,108,101,97,100,105,110,103,32,116,111,103, -105,118,105,110,103,32,116,104,101,116,111,119,97,114,100,32,116,104,101,103,117 -,97,114,97,110,116,101,101,100,100,111,99,117,109,101,110,116,101,100,99,111,108 -,111,114,58,35,48,48,48,118,105,100,101,111,32,103,97,109,101,99,111,109,109,105 -,115,115,105,111,110,114,101,102,108,101,99,116,105,110,103,99,104,97,110,103, -101,32,116,104,101,97,115,115,111,99,105,97,116,101,100,115,97,110,115,45,115, -101,114,105,102,111,110,107,101,121,112,114,101,115,115,59,32,112,97,100,100,105 -,110,103,58,72,101,32,119,97,115,32,116,104,101,117,110,100,101,114,108,121,105, -110,103,116,121,112,105,99,97,108,108,121,32,44,32,97,110,100,32,116,104,101,32, -115,114,99,69,108,101,109,101,110,116,115,117,99,99,101,115,115,105,118,101,115, -105,110,99,101,32,116,104,101,32,115,104,111,117,108,100,32,98,101,32,110,101, -116,119,111,114,107,105,110,103,97,99,99,111,117,110,116,105,110,103,117,115,101 -,32,111,102,32,116,104,101,108,111,119,101,114,32,116,104,97,110,115,104,111,119 -,115,32,116,104,97,116,60,47,115,112,97,110,62,10,9,9,99,111,109,112,108,97,105, -110,116,115,99,111,110,116,105,110,117,111,117,115,113,117,97,110,116,105,116, -105,101,115,97,115,116,114,111,110,111,109,101,114,104,101,32,100,105,100,32,110 -,111,116,100,117,101,32,116,111,32,105,116,115,97,112,112,108,105,101,100,32,116 -,111,97,110,32,97,118,101,114,97,103,101,101,102,102,111,114,116,115,32,116,111, -116,104,101,32,102,117,116,117,114,101,97,116,116,101,109,112,116,32,116,111,84, -104,101,114,101,102,111,114,101,44,99,97,112,97,98,105,108,105,116,121,82,101, -112,117,98,108,105,99,97,110,119,97,115,32,102,111,114,109,101,100,69,108,101,99 -,116,114,111,110,105,99,107,105,108,111,109,101,116,101,114,115,99,104,97,108, -108,101,110,103,101,115,112,117,98,108,105,115,104,105,110,103,116,104,101,32, -102,111,114,109,101,114,105,110,100,105,103,101,110,111,117,115,100,105,114,101, -99,116,105,111,110,115,115,117,98,115,105,100,105,97,114,121,99,111,110,115,112, -105,114,97,99,121,100,101,116,97,105,108,115,32,111,102,97,110,100,32,105,110,32 -,116,104,101,97,102,102,111,114,100,97,98,108,101,115,117,98,115,116,97,110,99, -101,115,114,101,97,115,111,110,32,102,111,114,99,111,110,118,101,110,116,105,111 -,110,105,116,101,109,116,121,112,101,61,34,97,98,115,111,108,117,116,101,108,121 -,115,117,112,112,111,115,101,100,108,121,114,101,109,97,105,110,101,100,32,97,97 -,116,116,114,97,99,116,105,118,101,116,114,97,118,101,108,108,105,110,103,115, -101,112,97,114,97,116,101,108,121,102,111,99,117,115,101,115,32,111,110,101,108, -101,109,101,110,116,97,114,121,97,112,112,108,105,99,97,98,108,101,102,111,117, -110,100,32,116,104,97,116,115,116,121,108,101,115,104,101,101,116,109,97,110,117 -,115,99,114,105,112,116,115,116,97,110,100,115,32,102,111,114,32,110,111,45,114, -101,112,101,97,116,40,115,111,109,101,116,105,109,101,115,67,111,109,109,101,114 -,99,105,97,108,105,110,32,65,109,101,114,105,99,97,117,110,100,101,114,116,97, -107,101,110,113,117,97,114,116,101,114,32,111,102,97,110,32,101,120,97,109,112, -108,101,112,101,114,115,111,110,97,108,108,121,105,110,100,101,120,46,112,104, -112,63,60,47,98,117,116,116,111,110,62,10,112,101,114,99,101,110,116,97,103,101, -98,101,115,116,45,107,110,111,119,110,99,114,101,97,116,105,110,103,32,97,34,32, -100,105,114,61,34,108,116,114,76,105,101,117,116,101,110,97,110,116,10,60,100, -105,118,32,105,100,61,34,116,104,101,121,32,119,111,117,108,100,97,98,105,108, -105,116,121,32,111,102,109,97,100,101,32,117,112,32,111,102,110,111,116,101,100, -32,116,104,97,116,99,108,101,97,114,32,116,104,97,116,97,114,103,117,101,32,116, -104,97,116,116,111,32,97,110,111,116,104,101,114,99,104,105,108,100,114,101,110, -39,115,112,117,114,112,111,115,101,32,111,102,102,111,114,109,117,108,97,116,101 -,100,98,97,115,101,100,32,117,112,111,110,116,104,101,32,114,101,103,105,111,110 -,115,117,98,106,101,99,116,32,111,102,112,97,115,115,101,110,103,101,114,115,112 -,111,115,115,101,115,115,105,111,110,46,10,10,73,110,32,116,104,101,32,66,101, -102,111,114,101,32,116,104,101,97,102,116,101,114,119,97,114,100,115,99,117,114, -114,101,110,116,108,121,32,97,99,114,111,115,115,32,116,104,101,115,99,105,101, -110,116,105,102,105,99,99,111,109,109,117,110,105,116,121,46,99,97,112,105,116, -97,108,105,115,109,105,110,32,71,101,114,109,97,110,121,114,105,103,104,116,45, -119,105,110,103,116,104,101,32,115,121,115,116,101,109,83,111,99,105,101,116,121 -,32,111,102,112,111,108,105,116,105,99,105,97,110,100,105,114,101,99,116,105,111 -,110,58,119,101,110,116,32,111,110,32,116,111,114,101,109,111,118,97,108,32,111, -102,32,78,101,119,32,89,111,114,107,32,97,112,97,114,116,109,101,110,116,115,105 -,110,100,105,99,97,116,105,111,110,100,117,114,105,110,103,32,116,104,101,117, -110,108,101,115,115,32,116,104,101,104,105,115,116,111,114,105,99,97,108,104,97, -100,32,98,101,101,110,32,97,100,101,102,105,110,105,116,105,118,101,105,110,103, -114,101,100,105,101,110,116,97,116,116,101,110,100,97,110,99,101,67,101,110,116, -101,114,32,102,111,114,112,114,111,109,105,110,101,110,99,101,114,101,97,100,121 -,83,116,97,116,101,115,116,114,97,116,101,103,105,101,115,98,117,116,32,105,110, -32,116,104,101,97,115,32,112,97,114,116,32,111,102,99,111,110,115,116,105,116, -117,116,101,99,108,97,105,109,32,116,104,97,116,108,97,98,111,114,97,116,111,114 -,121,99,111,109,112,97,116,105,98,108,101,102,97,105,108,117,114,101,32,111,102, -44,32,115,117,99,104,32,97,115,32,98,101,103,97,110,32,119,105,116,104,117,115, -105,110,103,32,116,104,101,32,116,111,32,112,114,111,118,105,100,101,102,101,97, -116,117,114,101,32,111,102,102,114,111,109,32,119,104,105,99,104,47,34,32,99,108 -,97,115,115,61,34,103,101,111,108,111,103,105,99,97,108,115,101,118,101,114,97, -108,32,111,102,100,101,108,105,98,101,114,97,116,101,105,109,112,111,114,116,97, -110,116,32,104,111,108,100,115,32,116,104,97,116,105,110,103,38,113,117,111,116, -59,32,118,97,108,105,103,110,61,116,111,112,116,104,101,32,71,101,114,109,97,110 -,111,117,116,115,105,100,101,32,111,102,110,101,103,111,116,105,97,116,101,100, -104,105,115,32,99,97,114,101,101,114,115,101,112,97,114,97,116,105,111,110,105, -100,61,34,115,101,97,114,99,104,119,97,115,32,99,97,108,108,101,100,116,104,101, -32,102,111,117,114,116,104,114,101,99,114,101,97,116,105,111,110,111,116,104,101 -,114,32,116,104,97,110,112,114,101,118,101,110,116,105,111,110,119,104,105,108, -101,32,116,104,101,32,101,100,117,99,97,116,105,111,110,44,99,111,110,110,101,99 -,116,105,110,103,97,99,99,117,114,97,116,101,108,121,119,101,114,101,32,98,117, -105,108,116,119,97,115,32,107,105,108,108,101,100,97,103,114,101,101,109,101,110 -,116,115,109,117,99,104,32,109,111,114,101,32,68,117,101,32,116,111,32,116,104, -101,119,105,100,116,104,58,32,49,48,48,115,111,109,101,32,111,116,104,101,114,75 -,105,110,103,100,111,109,32,111,102,116,104,101,32,101,110,116,105,114,101,102, -97,109,111,117,115,32,102,111,114,116,111,32,99,111,110,110,101,99,116,111,98, -106,101,99,116,105,118,101,115,116,104,101,32,70,114,101,110,99,104,112,101,111, -112,108,101,32,97,110,100,102,101,97,116,117,114,101,100,34,62,105,115,32,115,97 -,105,100,32,116,111,115,116,114,117,99,116,117,114,97,108,114,101,102,101,114, -101,110,100,117,109,109,111,115,116,32,111,102,116,101,110,97,32,115,101,112,97, -114,97,116,101,45,62,10,60,100,105,118,32,105,100,32,79,102,102,105,99,105,97, -108,32,119,111,114,108,100,119,105,100,101,46,97,114,105,97,45,108,97,98,101,108 -,116,104,101,32,112,108,97,110,101,116,97,110,100,32,105,116,32,119,97,115,100, -34,32,118,97,108,117,101,61,34,108,111,111,107,105,110,103,32,97,116,98,101,110, -101,102,105,99,105,97,108,97,114,101,32,105,110,32,116,104,101,109,111,110,105, -116,111,114,105,110,103,114,101,112,111,114,116,101,100,108,121,116,104,101,32, -109,111,100,101,114,110,119,111,114,107,105,110,103,32,111,110,97,108,108,111, -119,101,100,32,116,111,119,104,101,114,101,32,116,104,101,32,105,110,110,111,118 -,97,116,105,118,101,60,47,97,62,60,47,100,105,118,62,115,111,117,110,100,116,114 -,97,99,107,115,101,97,114,99,104,70,111,114,109,116,101,110,100,32,116,111,32,98 -,101,105,110,112,117,116,32,105,100,61,34,111,112,101,110,105,110,103,32,111,102 -,114,101,115,116,114,105,99,116,101,100,97,100,111,112,116,101,100,32,98,121,97, -100,100,114,101,115,115,105,110,103,116,104,101,111,108,111,103,105,97,110,109, -101,116,104,111,100,115,32,111,102,118,97,114,105,97,110,116,32,111,102,67,104, -114,105,115,116,105,97,110,32,118,101,114,121,32,108,97,114,103,101,97,117,116, -111,109,111,116,105,118,101,98,121,32,102,97,114,32,116,104,101,114,97,110,103, -101,32,102,114,111,109,112,117,114,115,117,105,116,32,111,102,102,111,108,108, -111,119,32,116,104,101,98,114,111,117,103,104,116,32,116,111,105,110,32,69,110, -103,108,97,110,100,97,103,114,101,101,32,116,104,97,116,97,99,99,117,115,101,100 -,32,111,102,99,111,109,101,115,32,102,114,111,109,112,114,101,118,101,110,116, -105,110,103,100,105,118,32,115,116,121,108,101,61,104,105,115,32,111,114,32,104, -101,114,116,114,101,109,101,110,100,111,117,115,102,114,101,101,100,111,109,32, -111,102,99,111,110,99,101,114,110,105,110,103,48,32,49,101,109,32,49,101,109,59, -66,97,115,107,101,116,98,97,108,108,47,115,116,121,108,101,46,99,115,115,97,110, -32,101,97,114,108,105,101,114,101,118,101,110,32,97,102,116,101,114,47,34,32,116 -,105,116,108,101,61,34,46,99,111,109,47,105,110,100,101,120,116,97,107,105,110, -103,32,116,104,101,112,105,116,116,115,98,117,114,103,104,99,111,110,116,101,110 -,116,34,62,13,60,115,99,114,105,112,116,62,40,102,116,117,114,110,101,100,32,111 -,117,116,104,97,118,105,110,103,32,116,104,101,60,47,115,112,97,110,62,13,10,32, -111,99,99,97,115,105,111,110,97,108,98,101,99,97,117,115,101,32,105,116,115,116, -97,114,116,101,100,32,116,111,112,104,121,115,105,99,97,108,108,121,62,60,47,100 -,105,118,62,10,32,32,99,114,101,97,116,101,100,32,98,121,67,117,114,114,101,110, -116,108,121,44,32,98,103,99,111,108,111,114,61,34,116,97,98,105,110,100,101,120, -61,34,100,105,115,97,115,116,114,111,117,115,65,110,97,108,121,116,105,99,115,32 -,97,108,115,111,32,104,97,115,32,97,62,60,100,105,118,32,105,100,61,34,60,47,115 -,116,121,108,101,62,10,60,99,97,108,108,101,100,32,102,111,114,115,105,110,103, -101,114,32,97,110,100,46,115,114,99,32,61,32,34,47,47,118,105,111,108,97,116,105 -,111,110,115,116,104,105,115,32,112,111,105,110,116,99,111,110,115,116,97,110, -116,108,121,105,115,32,108,111,99,97,116,101,100,114,101,99,111,114,100,105,110, -103,115,100,32,102,114,111,109,32,116,104,101,110,101,100,101,114,108,97,110,100 -,115,112,111,114,116,117,103,117,195,170,115,215,162,215,145,215,168,215,153,215 -,170,217,129,216,167,216,177,216,179,219,140,100,101,115,97,114,114,111,108,108, -111,99,111,109,101,110,116,97,114,105,111,101,100,117,99,97,99,105,195,179,110, -115,101,112,116,105,101,109,98,114,101,114,101,103,105,115,116,114,97,100,111, -100,105,114,101,99,99,105,195,179,110,117,98,105,99,97,99,105,195,179,110,112, -117,98,108,105,99,105,100,97,100,114,101,115,112,117,101,115,116,97,115,114,101, -115,117,108,116,97,100,111,115,105,109,112,111,114,116,97,110,116,101,114,101, -115,101,114,118,97,100,111,115,97,114,116,195,173,99,117,108,111,115,100,105,102 -,101,114,101,110,116,101,115,115,105,103,117,105,101,110,116,101,115,114,101,112 -,195,186,98,108,105,99,97,115,105,116,117,97,99,105,195,179,110,109,105,110,105, -115,116,101,114,105,111,112,114,105,118,97,99,105,100,97,100,100,105,114,101,99, -116,111,114,105,111,102,111,114,109,97,99,105,195,179,110,112,111,98,108,97,99, -105,195,179,110,112,114,101,115,105,100,101,110,116,101,99,111,110,116,101,110, -105,100,111,115,97,99,99,101,115,111,114,105,111,115,116,101,99,104,110,111,114, -97,116,105,112,101,114,115,111,110,97,108,101,115,99,97,116,101,103,111,114,195, -173,97,101,115,112,101,99,105,97,108,101,115,100,105,115,112,111,110,105,98,108, -101,97,99,116,117,97,108,105,100,97,100,114,101,102,101,114,101,110,99,105,97, -118,97,108,108,97,100,111,108,105,100,98,105,98,108,105,111,116,101,99,97,114, -101,108,97,99,105,111,110,101,115,99,97,108,101,110,100,97,114,105,111,112,111, -108,195,173,116,105,99,97,115,97,110,116,101,114,105,111,114,101,115,100,111,99, -117,109,101,110,116,111,115,110,97,116,117,114,97,108,101,122,97,109,97,116,101, -114,105,97,108,101,115,100,105,102,101,114,101,110,99,105,97,101,99,111,110,195, -179,109,105,99,97,116,114,97,110,115,112,111,114,116,101,114,111,100,114,195,173 -,103,117,101,122,112,97,114,116,105,99,105,112,97,114,101,110,99,117,101,110,116 -,114,97,110,100,105,115,99,117,115,105,195,179,110,101,115,116,114,117,99,116, -117,114,97,102,117,110,100,97,99,105,195,179,110,102,114,101,99,117,101,110,116, -101,115,112,101,114,109,97,110,101,110,116,101,116,111,116,97,108,109,101,110, -116,101,208,188,208,190,208,182,208,189,208,190,208,177,209,131,208,180,208,181, -209,130,208,188,208,190,208,182,208,181,209,130,208,178,209,128,208,181,208,188, -209,143,209,130,208,176,208,186,208,182,208,181,209,135,209,130,208,190,208,177, -209,139,208,177,208,190,208,187,208,181,208,181,208,190,209,135,208,181,208,189, -209,140,209,141,209,130,208,190,208,179,208,190,208,186,208,190,208,179,208,180, -208,176,208,191,208,190,209,129,208,187,208,181,208,178,209,129,208,181,208,179, -208,190,209,129,208,176,208,185,209,130,208,181,209,135,208,181,209,128,208,181, -208,183,208,188,208,190,208,179,209,131,209,130,209,129,208,176,208,185,209,130, -208,176,208,182,208,184,208,183,208,189,208,184,208,188,208,181,208,182,208,180, -209,131,208,177,209,131,208,180,209,131,209,130,208,159,208,190,208,184,209,129, -208,186,208,183,208,180,208,181,209,129,209,140,208,178,208,184,208,180,208,181, -208,190,209,129,208,178,209,143,208,183,208,184,208,189,209,131,208,182,208,189, -208,190,209,129,208,178,208,190,208,181,208,185,208,187,209,142,208,180,208,181, -208,185,208,191,208,190,209,128,208,189,208,190,208,188,208,189,208,190,208,179, -208,190,208,180,208,181,209,130,208,181,208,185,209,129,208,178,208,190,208,184, -209,133,208,191,209,128,208,176,208,178,208,176,209,130,208,176,208,186,208,190, -208,185,208,188,208,181,209,129,209,130,208,190,208,184,208,188,208,181,208,181, -209,130,208,182,208,184,208,183,208,189,209,140,208,190,208,180,208,189,208,190, -208,185,208,187,209,131,209,135,209,136,208,181,208,191,208,181,209,128,208,181, -208,180,209,135,208,176,209,129,209,130,208,184,209,135,208,176,209,129,209,130, -209,140,209,128,208,176,208,177,208,190,209,130,208,189,208,190,208,178,209,139, -209,133,208,191,209,128,208,176,208,178,208,190,209,129,208,190,208,177,208,190, -208,185,208,191,208,190,209,130,208,190,208,188,208,188,208,181,208,189,208,181, -208,181,209,135,208,184,209,129,208,187,208,181,208,189,208,190,208,178,209,139, -208,181,209,131,209,129,208,187,209,131,208,179,208,190,208,186,208,190,208,187, -208,190,208,189,208,176,208,183,208,176,208,180,209,130,208,176,208,186,208,190, -208,181,209,130,208,190,208,179,208,180,208,176,208,191,208,190,209,135,209,130, -208,184,208,159,208,190,209,129,208,187,208,181,209,130,208,176,208,186,208,184, -208,181,208,189,208,190,208,178,209,139,208,185,209,129,209,130,208,190,208,184, -209,130,209,130,208,176,208,186,208,184,209,133,209,129,209,128,208,176,208,183, -209,131,208,161,208,176,208,189,208,186,209,130,209,132,208,190,209,128,209,131, -208,188,208,154,208,190,208,179,208,180,208,176,208,186,208,189,208,184,208,179, -208,184,209,129,208,187,208,190,208,178,208,176,208,189,208,176,209,136,208,181, -208,185,208,189,208,176,208,185,209,130,208,184,209,129,208,178,208,190,208,184, -208,188,209,129,208,178,209,143,208,183,209,140,208,187,209,142,208,177,208,190, -208,185,209,135,208,176,209,129,209,130,208,190,209,129,209,128,208,181,208,180, -208,184,208,154,209,128,208,190,208,188,208,181,208,164,208,190,209,128,209,131, -208,188,209,128,209,139,208,189,208,186,208,181,209,129,209,130,208,176,208,187, -208,184,208,191,208,190,208,184,209,129,208,186,209,130,209,139,209,129,209,143, -209,135,208,188,208,181,209,129,209,143,209,134,209,134,208,181,208,189,209,130, -209,128,209,130,209,128,209,131,208,180,208,176,209,129,208,176,208,188,209,139, -209,133,209,128,209,139,208,189,208,186,208,176,208,157,208,190,208,178,209,139, -208,185,209,135,208,176,209,129,208,190,208,178,208,188,208,181,209,129,209,130, -208,176,209,132,208,184,208,187,209,140,208,188,208,188,208,176,209,128,209,130, -208,176,209,129,209,130,209,128,208,176,208,189,208,188,208,181,209,129,209,130, -208,181,209,130,208,181,208,186,209,129,209,130,208,189,208,176,209,136,208,184, -209,133,208,188,208,184,208,189,209,131,209,130,208,184,208,188,208,181,208,189, -208,184,208,184,208,188,208,181,209,142,209,130,208,189,208,190,208,188,208,181, -209,128,208,179,208,190,209,128,208,190,208,180,209,129,208,176,208,188,208,190, -208,188,209,141,209,130,208,190,208,188,209,131,208,186,208,190,208,189,209,134, -208,181,209,129,208,178,208,190,208,181,208,188,208,186,208,176,208,186,208,190, -208,185,208,144,209,128,209,133,208,184,208,178,217,133,217,134,216,170,216,175, -217,137,216,165,216,177,216,179,216,167,217,132,216,177,216,179,216,167,217,132, -216,169,216,167,217,132,216,185,216,167,217,133,217,131,216,170,216,168,217,135, -216,167,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,138,217,136, -217,133,216,167,217,132,216,181,217,136,216,177,216,172,216,175,217,138,216,175, -216,169,216,167,217,132,216,185,216,182,217,136,216,165,216,182,216,167,217,129, -216,169,216,167,217,132,217,130,216,179,217,133,216,167,217,132,216,185,216,167, -216,168,216,170,216,173,217,133,217,138,217,132,217,133,217,132,217,129,216,167, -216,170,217,133,217,132,216,170,217,130,217,137,216,170,216,185,216,175,217,138, -217,132,216,167,217,132,216,180,216,185,216,177,216,163,216,174,216,168,216,167, -216,177,216,170,216,183,217,136,217,138,216,177,216,185,217,132,217,138,217,131, -217,133,216,165,216,177,217,129,216,167,217,130,216,183,217,132,216,168,216,167, -216,170,216,167,217,132,217,132,216,186,216,169,216,170,216,177,216,170,217,138, -216,168,216,167,217,132,217,134,216,167,216,179,216,167,217,132,216,180,217,138, -216,174,217,133,217,134,216,170,216,175,217,138,216,167,217,132,216,185,216,177, -216,168,216,167,217,132,217,130,216,181,216,181,216,167,217,129,217,132,216,167, -217,133,216,185,217,132,217,138,217,135,216,167,216,170,216,173,216,175,217,138, -216,171,216,167,217,132,217,132,217,135,217,133,216,167,217,132,216,185,217,133, -217,132,217,133,217,131,216,170,216,168,216,169,217,138,217,133,217,131,217,134, -217,131,216,167,217,132,216,183,217,129,217,132,217,129,217,138,216,175,217,138, -217,136,216,165,216,175,216,167,216,177,216,169,216,170,216,167,216,177,217,138, -216,174,216,167,217,132,216,181,216,173,216,169,216,170,216,179,216,172,217,138, -217,132,216,167,217,132,217,136,217,130,216,170,216,185,217,134,216,175,217,133, -216,167,217,133,216,175,217,138,217,134,216,169,216,170,216,181,217,133,217,138, -217,133,216,163,216,177,216,180,217,138,217,129,216,167,217,132,216,176,217,138, -217,134,216,185,216,177,216,168,217,138,216,169,216,168,217,136,216,167,216,168, -216,169,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,179,217,129, -216,177,217,133,216,180,216,167,217,131,217,132,216,170,216,185,216,167,217,132, -217,137,216,167,217,132,216,163,217,136,217,132,216,167,217,132,216,179,217,134, -216,169,216,172,216,167,217,133,216,185,216,169,216,167,217,132,216,181,216,173, -217,129,216,167,217,132,216,175,217,138,217,134,217,131,217,132,217,133,216,167, -216,170,216,167,217,132,216,174,216,167,216,181,216,167,217,132,217,133,217,132, -217,129,216,163,216,185,216,182,216,167,216,161,217,131,216,170,216,167,216,168, -216,169,216,167,217,132,216,174,217,138,216,177,216,177,216,179,216,167,216,166, -217,132,216,167,217,132,217,130,217,132,216,168,216,167,217,132,216,163,216,175, -216,168,217,133,217,130,216,167,216,183,216,185,217,133,216,177,216,167,216,179, -217,132,217,133,217,134,216,183,217,130,216,169,216,167,217,132,217,131,216,170, -216,168,216,167,217,132,216,177,216,172,217,132,216,167,216,180,216,170,216,177, -217,131,216,167,217,132,217,130,216,175,217,133,217,138,216,185,216,183,217,138, -217,131,115,66,121,84,97,103,78,97,109,101,40,46,106,112,103,34,32,97,108,116,61 -,34,49,112,120,32,115,111,108,105,100,32,35,46,103,105,102,34,32,97,108,116,61, -34,116,114,97,110,115,112,97,114,101,110,116,105,110,102,111,114,109,97,116,105, -111,110,97,112,112,108,105,99,97,116,105,111,110,34,32,111,110,99,108,105,99,107 -,61,34,101,115,116,97,98,108,105,115,104,101,100,97,100,118,101,114,116,105,115, -105,110,103,46,112,110,103,34,32,97,108,116,61,34,101,110,118,105,114,111,110, -109,101,110,116,112,101,114,102,111,114,109,97,110,99,101,97,112,112,114,111,112 -,114,105,97,116,101,38,97,109,112,59,109,100,97,115,104,59,105,109,109,101,100, -105,97,116,101,108,121,60,47,115,116,114,111,110,103,62,60,47,114,97,116,104,101 -,114,32,116,104,97,110,116,101,109,112,101,114,97,116,117,114,101,100,101,118, -101,108,111,112,109,101,110,116,99,111,109,112,101,116,105,116,105,111,110,112, -108,97,99,101,104,111,108,100,101,114,118,105,115,105,98,105,108,105,116,121,58, -99,111,112,121,114,105,103,104,116,34,62,48,34,32,104,101,105,103,104,116,61,34, -101,118,101,110,32,116,104,111,117,103,104,114,101,112,108,97,99,101,109,101,110 -,116,100,101,115,116,105,110,97,116,105,111,110,67,111,114,112,111,114,97,116, -105,111,110,60,117,108,32,99,108,97,115,115,61,34,65,115,115,111,99,105,97,116, -105,111,110,105,110,100,105,118,105,100,117,97,108,115,112,101,114,115,112,101, -99,116,105,118,101,115,101,116,84,105,109,101,111,117,116,40,117,114,108,40,104, -116,116,112,58,47,47,109,97,116,104,101,109,97,116,105,99,115,109,97,114,103,105 -,110,45,116,111,112,58,101,118,101,110,116,117,97,108,108,121,32,100,101,115,99, -114,105,112,116,105,111,110,41,32,110,111,45,114,101,112,101,97,116,99,111,108, -108,101,99,116,105,111,110,115,46,74,80,71,124,116,104,117,109,98,124,112,97,114 -,116,105,99,105,112,97,116,101,47,104,101,97,100,62,60,98,111,100,121,102,108, -111,97,116,58,108,101,102,116,59,60,108,105,32,99,108,97,115,115,61,34,104,117, -110,100,114,101,100,115,32,111,102,10,10,72,111,119,101,118,101,114,44,32,99,111 -,109,112,111,115,105,116,105,111,110,99,108,101,97,114,58,98,111,116,104,59,99, -111,111,112,101,114,97,116,105,111,110,119,105,116,104,105,110,32,116,104,101,32 -,108,97,98,101,108,32,102,111,114,61,34,98,111,114,100,101,114,45,116,111,112,58 -,78,101,119,32,90,101,97,108,97,110,100,114,101,99,111,109,109,101,110,100,101, -100,112,104,111,116,111,103,114,97,112,104,121,105,110,116,101,114,101,115,116, -105,110,103,38,108,116,59,115,117,112,38,103,116,59,99,111,110,116,114,111,118, -101,114,115,121,78,101,116,104,101,114,108,97,110,100,115,97,108,116,101,114,110 -,97,116,105,118,101,109,97,120,108,101,110,103,116,104,61,34,115,119,105,116,122 -,101,114,108,97,110,100,68,101,118,101,108,111,112,109,101,110,116,101,115,115, -101,110,116,105,97,108,108,121,10,10,65,108,116,104,111,117,103,104,32,60,47,116 -,101,120,116,97,114,101,97,62,116,104,117,110,100,101,114,98,105,114,100,114,101 -,112,114,101,115,101,110,116,101,100,38,97,109,112,59,110,100,97,115,104,59,115, -112,101,99,117,108,97,116,105,111,110,99,111,109,109,117,110,105,116,105,101,115 -,108,101,103,105,115,108,97,116,105,111,110,101,108,101,99,116,114,111,110,105, -99,115,10,9,60,100,105,118,32,105,100,61,34,105,108,108,117,115,116,114,97,116, -101,100,101,110,103,105,110,101,101,114,105,110,103,116,101,114,114,105,116,111, -114,105,101,115,97,117,116,104,111,114,105,116,105,101,115,100,105,115,116,114, -105,98,117,116,101,100,54,34,32,104,101,105,103,104,116,61,34,115,97,110,115,45, -115,101,114,105,102,59,99,97,112,97,98,108,101,32,111,102,32,100,105,115,97,112, -112,101,97,114,101,100,105,110,116,101,114,97,99,116,105,118,101,108,111,111,107 -,105,110,103,32,102,111,114,105,116,32,119,111,117,108,100,32,98,101,65,102,103, -104,97,110,105,115,116,97,110,119,97,115,32,99,114,101,97,116,101,100,77,97,116, -104,46,102,108,111,111,114,40,115,117,114,114,111,117,110,100,105,110,103,99,97, -110,32,97,108,115,111,32,98,101,111,98,115,101,114,118,97,116,105,111,110,109,97 -,105,110,116,101,110,97,110,99,101,101,110,99,111,117,110,116,101,114,101,100,60 -,104,50,32,99,108,97,115,115,61,34,109,111,114,101,32,114,101,99,101,110,116,105 -,116,32,104,97,115,32,98,101,101,110,105,110,118,97,115,105,111,110,32,111,102, -41,46,103,101,116,84,105,109,101,40,41,102,117,110,100,97,109,101,110,116,97,108 -,68,101,115,112,105,116,101,32,116,104,101,34,62,60,100,105,118,32,105,100,61,34 -,105,110,115,112,105,114,97,116,105,111,110,101,120,97,109,105,110,97,116,105, -111,110,112,114,101,112,97,114,97,116,105,111,110,101,120,112,108,97,110,97,116, -105,111,110,60,105,110,112,117,116,32,105,100,61,34,60,47,97,62,60,47,115,112,97 -,110,62,118,101,114,115,105,111,110,115,32,111,102,105,110,115,116,114,117,109, -101,110,116,115,98,101,102,111,114,101,32,116,104,101,32,32,61,32,39,104,116,116 -,112,58,47,47,68,101,115,99,114,105,112,116,105,111,110,114,101,108,97,116,105, -118,101,108,121,32,46,115,117,98,115,116,114,105,110,103,40,101,97,99,104,32,111 -,102,32,116,104,101,101,120,112,101,114,105,109,101,110,116,115,105,110,102,108, -117,101,110,116,105,97,108,105,110,116,101,103,114,97,116,105,111,110,109,97,110 -,121,32,112,101,111,112,108,101,100,117,101,32,116,111,32,116,104,101,32,99,111, -109,98,105,110,97,116,105,111,110,100,111,32,110,111,116,32,104,97,118,101,77, -105,100,100,108,101,32,69,97,115,116,60,110,111,115,99,114,105,112,116,62,60,99, -111,112,121,114,105,103,104,116,34,32,112,101,114,104,97,112,115,32,116,104,101, -105,110,115,116,105,116,117,116,105,111,110,105,110,32,68,101,99,101,109,98,101, -114,97,114,114,97,110,103,101,109,101,110,116,109,111,115,116,32,102,97,109,111, -117,115,112,101,114,115,111,110,97,108,105,116,121,99,114,101,97,116,105,111,110 -,32,111,102,108,105,109,105,116,97,116,105,111,110,115,101,120,99,108,117,115, -105,118,101,108,121,115,111,118,101,114,101,105,103,110,116,121,45,99,111,110, -116,101,110,116,34,62,10,60,116,100,32,99,108,97,115,115,61,34,117,110,100,101, -114,103,114,111,117,110,100,112,97,114,97,108,108,101,108,32,116,111,100,111,99, -116,114,105,110,101,32,111,102,111,99,99,117,112,105,101,100,32,98,121,116,101, -114,109,105,110,111,108,111,103,121,82,101,110,97,105,115,115,97,110,99,101,97, -32,110,117,109,98,101,114,32,111,102,115,117,112,112,111,114,116,32,102,111,114, -101,120,112,108,111,114,97,116,105,111,110,114,101,99,111,103,110,105,116,105, -111,110,112,114,101,100,101,99,101,115,115,111,114,60,105,109,103,32,115,114,99, -61,34,47,60,104,49,32,99,108,97,115,115,61,34,112,117,98,108,105,99,97,116,105, -111,110,109,97,121,32,97,108,115,111,32,98,101,115,112,101,99,105,97,108,105,122 -,101,100,60,47,102,105,101,108,100,115,101,116,62,112,114,111,103,114,101,115, -115,105,118,101,109,105,108,108,105,111,110,115,32,111,102,115,116,97,116,101, -115,32,116,104,97,116,101,110,102,111,114,99,101,109,101,110,116,97,114,111,117, -110,100,32,116,104,101,32,111,110,101,32,97,110,111,116,104,101,114,46,112,97, -114,101,110,116,78,111,100,101,97,103,114,105,99,117,108,116,117,114,101,65,108, -116,101,114,110,97,116,105,118,101,114,101,115,101,97,114,99,104,101,114,115,116 -,111,119,97,114,100,115,32,116,104,101,77,111,115,116,32,111,102,32,116,104,101, -109,97,110,121,32,111,116,104,101,114,32,40,101,115,112,101,99,105,97,108,108, -121,60,116,100,32,119,105,100,116,104,61,34,59,119,105,100,116,104,58,49,48,48, -37,105,110,100,101,112,101,110,100,101,110,116,60,104,51,32,99,108,97,115,115,61 -,34,32,111,110,99,104,97,110,103,101,61,34,41,46,97,100,100,67,108,97,115,115,40 -,105,110,116,101,114,97,99,116,105,111,110,79,110,101,32,111,102,32,116,104,101, -32,100,97,117,103,104,116,101,114,32,111,102,97,99,99,101,115,115,111,114,105, -101,115,98,114,97,110,99,104,101,115,32,111,102,13,10,60,100,105,118,32,105,100, -61,34,116,104,101,32,108,97,114,103,101,115,116,100,101,99,108,97,114,97,116,105 -,111,110,114,101,103,117,108,97,116,105,111,110,115,73,110,102,111,114,109,97, -116,105,111,110,116,114,97,110,115,108,97,116,105,111,110,100,111,99,117,109,101 -,110,116,97,114,121,105,110,32,111,114,100,101,114,32,116,111,34,62,10,60,104, -101,97,100,62,10,60,34,32,104,101,105,103,104,116,61,34,49,97,99,114,111,115,115 -,32,116,104,101,32,111,114,105,101,110,116,97,116,105,111,110,41,59,60,47,115,99 -,114,105,112,116,62,105,109,112,108,101,109,101,110,116,101,100,99,97,110,32,98, -101,32,115,101,101,110,116,104,101,114,101,32,119,97,115,32,97,100,101,109,111, -110,115,116,114,97,116,101,99,111,110,116,97,105,110,101,114,34,62,99,111,110, -110,101,99,116,105,111,110,115,116,104,101,32,66,114,105,116,105,115,104,119,97, -115,32,119,114,105,116,116,101,110,33,105,109,112,111,114,116,97,110,116,59,112, -120,59,32,109,97,114,103,105,110,45,102,111,108,108,111,119,101,100,32,98,121,97 -,98,105,108,105,116,121,32,116,111,32,99,111,109,112,108,105,99,97,116,101,100, -100,117,114,105,110,103,32,116,104,101,32,105,109,109,105,103,114,97,116,105,111 -,110,97,108,115,111,32,99,97,108,108,101,100,60,104,52,32,99,108,97,115,115,61, -34,100,105,115,116,105,110,99,116,105,111,110,114,101,112,108,97,99,101,100,32, -98,121,103,111,118,101,114,110,109,101,110,116,115,108,111,99,97,116,105,111,110 -,32,111,102,105,110,32,78,111,118,101,109,98,101,114,119,104,101,116,104,101,114 -,32,116,104,101,60,47,112,62,10,60,47,100,105,118,62,97,99,113,117,105,115,105, -116,105,111,110,99,97,108,108,101,100,32,116,104,101,32,112,101,114,115,101,99, -117,116,105,111,110,100,101,115,105,103,110,97,116,105,111,110,123,102,111,110, -116,45,115,105,122,101,58,97,112,112,101,97,114,101,100,32,105,110,105,110,118, -101,115,116,105,103,97,116,101,101,120,112,101,114,105,101,110,99,101,100,109, -111,115,116,32,108,105,107,101,108,121,119,105,100,101,108,121,32,117,115,101, -100,100,105,115,99,117,115,115,105,111,110,115,112,114,101,115,101,110,99,101,32 -,111,102,32,40,100,111,99,117,109,101,110,116,46,101,120,116,101,110,115,105,118 -,101,108,121,73,116,32,104,97,115,32,98,101,101,110,105,116,32,100,111,101,115, -32,110,111,116,99,111,110,116,114,97,114,121,32,116,111,105,110,104,97,98,105, -116,97,110,116,115,105,109,112,114,111,118,101,109,101,110,116,115,99,104,111, -108,97,114,115,104,105,112,99,111,110,115,117,109,112,116,105,111,110,105,110, -115,116,114,117,99,116,105,111,110,102,111,114,32,101,120,97,109,112,108,101,111 -,110,101,32,111,114,32,109,111,114,101,112,120,59,32,112,97,100,100,105,110,103, -116,104,101,32,99,117,114,114,101,110,116,97,32,115,101,114,105,101,115,32,111, -102,97,114,101,32,117,115,117,97,108,108,121,114,111,108,101,32,105,110,32,116, -104,101,112,114,101,118,105,111,117,115,108,121,32,100,101,114,105,118,97,116, -105,118,101,115,101,118,105,100,101,110,99,101,32,111,102,101,120,112,101,114, -105,101,110,99,101,115,99,111,108,111,114,115,99,104,101,109,101,115,116,97,116, -101,100,32,116,104,97,116,99,101,114,116,105,102,105,99,97,116,101,60,47,97,62, -60,47,100,105,118,62,10,32,115,101,108,101,99,116,101,100,61,34,104,105,103,104, -32,115,99,104,111,111,108,114,101,115,112,111,110,115,101,32,116,111,99,111,109, -102,111,114,116,97,98,108,101,97,100,111,112,116,105,111,110,32,111,102,116,104, -114,101,101,32,121,101,97,114,115,116,104,101,32,99,111,117,110,116,114,121,105, -110,32,70,101,98,114,117,97,114,121,115,111,32,116,104,97,116,32,116,104,101,112 -,101,111,112,108,101,32,119,104,111,32,112,114,111,118,105,100,101,100,32,98,121 -,60,112,97,114,97,109,32,110,97,109,101,97,102,102,101,99,116,101,100,32,98,121, -105,110,32,116,101,114,109,115,32,111,102,97,112,112,111,105,110,116,109,101,110 -,116,73,83,79,45,56,56,53,57,45,49,34,119,97,115,32,98,111,114,110,32,105,110, -104,105,115,116,111,114,105,99,97,108,32,114,101,103,97,114,100,101,100,32,97, -115,109,101,97,115,117,114,101,109,101,110,116,105,115,32,98,97,115,101,100,32, -111,110,32,97,110,100,32,111,116,104,101,114,32,58,32,102,117,110,99,116,105,111 -,110,40,115,105,103,110,105,102,105,99,97,110,116,99,101,108,101,98,114,97,116, -105,111,110,116,114,97,110,115,109,105,116,116,101,100,47,106,115,47,106,113,117 -,101,114,121,46,105,115,32,107,110,111,119,110,32,97,115,116,104,101,111,114,101 -,116,105,99,97,108,32,116,97,98,105,110,100,101,120,61,34,105,116,32,99,111,117, -108,100,32,98,101,60,110,111,115,99,114,105,112,116,62,10,104,97,118,105,110,103 -,32,98,101,101,110,13,10,60,104,101,97,100,62,13,10,60,32,38,113,117,111,116,59, -84,104,101,32,99,111,109,112,105,108,97,116,105,111,110,104,101,32,104,97,100,32 -,98,101,101,110,112,114,111,100,117,99,101,100,32,98,121,112,104,105,108,111,115 -,111,112,104,101,114,99,111,110,115,116,114,117,99,116,101,100,105,110,116,101, -110,100,101,100,32,116,111,97,109,111,110,103,32,111,116,104,101,114,99,111,109, -112,97,114,101,100,32,116,111,116,111,32,115,97,121,32,116,104,97,116,69,110,103 -,105,110,101,101,114,105,110,103,97,32,100,105,102,102,101,114,101,110,116,114, -101,102,101,114,114,101,100,32,116,111,100,105,102,102,101,114,101,110,99,101, -115,98,101,108,105,101,102,32,116,104,97,116,112,104,111,116,111,103,114,97,112, -104,115,105,100,101,110,116,105,102,121,105,110,103,72,105,115,116,111,114,121, -32,111,102,32,82,101,112,117,98,108,105,99,32,111,102,110,101,99,101,115,115,97, -114,105,108,121,112,114,111,98,97,98,105,108,105,116,121,116,101,99,104,110,105, -99,97,108,108,121,108,101,97,118,105,110,103,32,116,104,101,115,112,101,99,116, -97,99,117,108,97,114,102,114,97,99,116,105,111,110,32,111,102,101,108,101,99,116 -,114,105,99,105,116,121,104,101,97,100,32,111,102,32,116,104,101,114,101,115,116 -,97,117,114,97,110,116,115,112,97,114,116,110,101,114,115,104,105,112,101,109, -112,104,97,115,105,115,32,111,110,109,111,115,116,32,114,101,99,101,110,116,115, -104,97,114,101,32,119,105,116,104,32,115,97,121,105,110,103,32,116,104,97,116, -102,105,108,108,101,100,32,119,105,116,104,100,101,115,105,103,110,101,100,32, -116,111,105,116,32,105,115,32,111,102,116,101,110,34,62,60,47,105,102,114,97,109 -,101,62,97,115,32,102,111,108,108,111,119,115,58,109,101,114,103,101,100,32,119, -105,116,104,116,104,114,111,117,103,104,32,116,104,101,99,111,109,109,101,114,99 -,105,97,108,32,112,111,105,110,116,101,100,32,111,117,116,111,112,112,111,114, -116,117,110,105,116,121,118,105,101,119,32,111,102,32,116,104,101,114,101,113, -117,105,114,101,109,101,110,116,100,105,118,105,115,105,111,110,32,111,102,112, -114,111,103,114,97,109,109,105,110,103,104,101,32,114,101,99,101,105,118,101,100 -,115,101,116,73,110,116,101,114,118,97,108,34,62,60,47,115,112,97,110,62,60,47, -105,110,32,78,101,119,32,89,111,114,107,97,100,100,105,116,105,111,110,97,108,32 -,99,111,109,112,114,101,115,115,105,111,110,10,10,60,100,105,118,32,105,100,61, -34,105,110,99,111,114,112,111,114,97,116,101,59,60,47,115,99,114,105,112,116,62, -60,97,116,116,97,99,104,69,118,101,110,116,98,101,99,97,109,101,32,116,104,101, -32,34,32,116,97,114,103,101,116,61,34,95,99,97,114,114,105,101,100,32,111,117, -116,83,111,109,101,32,111,102,32,116,104,101,115,99,105,101,110,99,101,32,97,110 -,100,116,104,101,32,116,105,109,101,32,111,102,67,111,110,116,97,105,110,101,114 -,34,62,109,97,105,110,116,97,105,110,105,110,103,67,104,114,105,115,116,111,112, -104,101,114,77,117,99,104,32,111,102,32,116,104,101,119,114,105,116,105,110,103, -115,32,111,102,34,32,104,101,105,103,104,116,61,34,50,115,105,122,101,32,111,102 -,32,116,104,101,118,101,114,115,105,111,110,32,111,102,32,109,105,120,116,117, -114,101,32,111,102,32,98,101,116,119,101,101,110,32,116,104,101,69,120,97,109, -112,108,101,115,32,111,102,101,100,117,99,97,116,105,111,110,97,108,99,111,109, -112,101,116,105,116,105,118,101,32,111,110,115,117,98,109,105,116,61,34,100,105, -114,101,99,116,111,114,32,111,102,100,105,115,116,105,110,99,116,105,118,101,47, -68,84,68,32,88,72,84,77,76,32,114,101,108,97,116,105,110,103,32,116,111,116,101, -110,100,101,110,99,121,32,116,111,112,114,111,118,105,110,99,101,32,111,102,119, -104,105,99,104,32,119,111,117,108,100,100,101,115,112,105,116,101,32,116,104,101 -,115,99,105,101,110,116,105,102,105,99,32,108,101,103,105,115,108,97,116,117,114 -,101,46,105,110,110,101,114,72,84,77,76,32,97,108,108,101,103,97,116,105,111,110 -,115,65,103,114,105,99,117,108,116,117,114,101,119,97,115,32,117,115,101,100,32, -105,110,97,112,112,114,111,97,99,104,32,116,111,105,110,116,101,108,108,105,103, -101,110,116,121,101,97,114,115,32,108,97,116,101,114,44,115,97,110,115,45,115, -101,114,105,102,100,101,116,101,114,109,105,110,105,110,103,80,101,114,102,111, -114,109,97,110,99,101,97,112,112,101,97,114,97,110,99,101,115,44,32,119,104,105, -99,104,32,105,115,32,102,111,117,110,100,97,116,105,111,110,115,97,98,98,114,101 -,118,105,97,116,101,100,104,105,103,104,101,114,32,116,104,97,110,115,32,102,114 -,111,109,32,116,104,101,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109, -112,111,115,101,100,32,111,102,115,117,112,112,111,115,101,100,32,116,111,99,108 -,97,105,109,115,32,116,104,97,116,97,116,116,114,105,98,117,116,105,111,110,102, -111,110,116,45,115,105,122,101,58,49,101,108,101,109,101,110,116,115,32,111,102, -72,105,115,116,111,114,105,99,97,108,32,104,105,115,32,98,114,111,116,104,101, -114,97,116,32,116,104,101,32,116,105,109,101,97,110,110,105,118,101,114,115,97, -114,121,103,111,118,101,114,110,101,100,32,98,121,114,101,108,97,116,101,100,32, -116,111,32,117,108,116,105,109,97,116,101,108,121,32,105,110,110,111,118,97,116, -105,111,110,115,105,116,32,105,115,32,115,116,105,108,108,99,97,110,32,111,110, -108,121,32,98,101,100,101,102,105,110,105,116,105,111,110,115,116,111,71,77,84, -83,116,114,105,110,103,65,32,110,117,109,98,101,114,32,111,102,105,109,103,32,99 -,108,97,115,115,61,34,69,118,101,110,116,117,97,108,108,121,44,119,97,115,32,99, -104,97,110,103,101,100,111,99,99,117,114,114,101,100,32,105,110,110,101,105,103, -104,98,111,114,105,110,103,100,105,115,116,105,110,103,117,105,115,104,119,104, -101,110,32,104,101,32,119,97,115,105,110,116,114,111,100,117,99,105,110,103,116, -101,114,114,101,115,116,114,105,97,108,77,97,110,121,32,111,102,32,116,104,101, -97,114,103,117,101,115,32,116,104,97,116,97,110,32,65,109,101,114,105,99,97,110, -99,111,110,113,117,101,115,116,32,111,102,119,105,100,101,115,112,114,101,97,100 -,32,119,101,114,101,32,107,105,108,108,101,100,115,99,114,101,101,110,32,97,110, -100,32,73,110,32,111,114,100,101,114,32,116,111,101,120,112,101,99,116,101,100, -32,116,111,100,101,115,99,101,110,100,97,110,116,115,97,114,101,32,108,111,99,97 -,116,101,100,108,101,103,105,115,108,97,116,105,118,101,103,101,110,101,114,97, -116,105,111,110,115,32,98,97,99,107,103,114,111,117,110,100,109,111,115,116,32, -112,101,111,112,108,101,121,101,97,114,115,32,97,102,116,101,114,116,104,101,114 -,101,32,105,115,32,110,111,116,104,101,32,104,105,103,104,101,115,116,102,114, -101,113,117,101,110,116,108,121,32,116,104,101,121,32,100,111,32,110,111,116,97, -114,103,117,101,100,32,116,104,97,116,115,104,111,119,101,100,32,116,104,97,116, -112,114,101,100,111,109,105,110,97,110,116,116,104,101,111,108,111,103,105,99,97 -,108,98,121,32,116,104,101,32,116,105,109,101,99,111,110,115,105,100,101,114,105 -,110,103,115,104,111,114,116,45,108,105,118,101,100,60,47,115,112,97,110,62,60, -47,97,62,99,97,110,32,98,101,32,117,115,101,100,118,101,114,121,32,108,105,116, -116,108,101,111,110,101,32,111,102,32,116,104,101,32,104,97,100,32,97,108,114, -101,97,100,121,105,110,116,101,114,112,114,101,116,101,100,99,111,109,109,117, -110,105,99,97,116,101,102,101,97,116,117,114,101,115,32,111,102,103,111,118,101, -114,110,109,101,110,116,44,60,47,110,111,115,99,114,105,112,116,62,101,110,116, -101,114,101,100,32,116,104,101,34,32,104,101,105,103,104,116,61,34,51,73,110,100 -,101,112,101,110,100,101,110,116,112,111,112,117,108,97,116,105,111,110,115,108, -97,114,103,101,45,115,99,97,108,101,46,32,65,108,116,104,111,117,103,104,32,117, -115,101,100,32,105,110,32,116,104,101,100,101,115,116,114,117,99,116,105,111,110 -,112,111,115,115,105,98,105,108,105,116,121,115,116,97,114,116,105,110,103,32, -105,110,116,119,111,32,111,114,32,109,111,114,101,101,120,112,114,101,115,115, -105,111,110,115,115,117,98,111,114,100,105,110,97,116,101,108,97,114,103,101,114 -,32,116,104,97,110,104,105,115,116,111,114,121,32,97,110,100,60,47,111,112,116, -105,111,110,62,13,10,67,111,110,116,105,110,101,110,116,97,108,101,108,105,109, -105,110,97,116,105,110,103,119,105,108,108,32,110,111,116,32,98,101,112,114,97, -99,116,105,99,101,32,111,102,105,110,32,102,114,111,110,116,32,111,102,115,105, -116,101,32,111,102,32,116,104,101,101,110,115,117,114,101,32,116,104,97,116,116, -111,32,99,114,101,97,116,101,32,97,109,105,115,115,105,115,115,105,112,112,105, -112,111,116,101,110,116,105,97,108,108,121,111,117,116,115,116,97,110,100,105, -110,103,98,101,116,116,101,114,32,116,104,97,110,119,104,97,116,32,105,115,32, -110,111,119,115,105,116,117,97,116,101,100,32,105,110,109,101,116,97,32,110,97, -109,101,61,34,84,114,97,100,105,116,105,111,110,97,108,115,117,103,103,101,115, -116,105,111,110,115,84,114,97,110,115,108,97,116,105,111,110,116,104,101,32,102, -111,114,109,32,111,102,97,116,109,111,115,112,104,101,114,105,99,105,100,101,111 -,108,111,103,105,99,97,108,101,110,116,101,114,112,114,105,115,101,115,99,97,108 -,99,117,108,97,116,105,110,103,101,97,115,116,32,111,102,32,116,104,101,114,101, -109,110,97,110,116,115,32,111,102,112,108,117,103,105,110,115,112,97,103,101,47, -105,110,100,101,120,46,112,104,112,63,114,101,109,97,105,110,101,100,32,105,110, -116,114,97,110,115,102,111,114,109,101,100,72,101,32,119,97,115,32,97,108,115, -111,119,97,115,32,97,108,114,101,97,100,121,115,116,97,116,105,115,116,105,99,97 -,108,105,110,32,102,97,118,111,114,32,111,102,77,105,110,105,115,116,114,121,32, -111,102,109,111,118,101,109,101,110,116,32,111,102,102,111,114,109,117,108,97, -116,105,111,110,105,115,32,114,101,113,117,105,114,101,100,60,108,105,110,107,32 -,114,101,108,61,34,84,104,105,115,32,105,115,32,116,104,101,32,60,97,32,104,114, -101,102,61,34,47,112,111,112,117,108,97,114,105,122,101,100,105,110,118,111,108, -118,101,100,32,105,110,97,114,101,32,117,115,101,100,32,116,111,97,110,100,32, -115,101,118,101,114,97,108,109,97,100,101,32,98,121,32,116,104,101,115,101,101, -109,115,32,116,111,32,98,101,108,105,107,101,108,121,32,116,104,97,116,80,97,108 -,101,115,116,105,110,105,97,110,110,97,109,101,100,32,97,102,116,101,114,105,116 -,32,104,97,100,32,98,101,101,110,109,111,115,116,32,99,111,109,109,111,110,116, -111,32,114,101,102,101,114,32,116,111,98,117,116,32,116,104,105,115,32,105,115, -99,111,110,115,101,99,117,116,105,118,101,116,101,109,112,111,114,97,114,105,108 -,121,73,110,32,103,101,110,101,114,97,108,44,99,111,110,118,101,110,116,105,111, -110,115,116,97,107,101,115,32,112,108,97,99,101,115,117,98,100,105,118,105,115, -105,111,110,116,101,114,114,105,116,111,114,105,97,108,111,112,101,114,97,116, -105,111,110,97,108,112,101,114,109,97,110,101,110,116,108,121,119,97,115,32,108, -97,114,103,101,108,121,111,117,116,98,114,101,97,107,32,111,102,105,110,32,116, -104,101,32,112,97,115,116,102,111,108,108,111,119,105,110,103,32,97,32,120,109, -108,110,115,58,111,103,61,34,62,60,97,32,99,108,97,115,115,61,34,99,108,97,115, -115,61,34,116,101,120,116,67,111,110,118,101,114,115,105,111,110,32,109,97,121, -32,98,101,32,117,115,101,100,109,97,110,117,102,97,99,116,117,114,101,97,102,116 -,101,114,32,98,101,105,110,103,99,108,101,97,114,102,105,120,34,62,10,113,117, -101,115,116,105,111,110,32,111,102,119,97,115,32,101,108,101,99,116,101,100,116, -111,32,98,101,99,111,109,101,32,97,98,101,99,97,117,115,101,32,111,102,32,115, -111,109,101,32,112,101,111,112,108,101,105,110,115,112,105,114,101,100,32,98,121 -,115,117,99,99,101,115,115,102,117,108,32,97,32,116,105,109,101,32,119,104,101, -110,109,111,114,101,32,99,111,109,109,111,110,97,109,111,110,103,115,116,32,116, -104,101,97,110,32,111,102,102,105,99,105,97,108,119,105,100,116,104,58,49,48,48, -37,59,116,101,99,104,110,111,108,111,103,121,44,119,97,115,32,97,100,111,112,116 -,101,100,116,111,32,107,101,101,112,32,116,104,101,115,101,116,116,108,101,109, -101,110,116,115,108,105,118,101,32,98,105,114,116,104,115,105,110,100,101,120,46 -,104,116,109,108,34,67,111,110,110,101,99,116,105,99,117,116,97,115,115,105,103, -110,101,100,32,116,111,38,97,109,112,59,116,105,109,101,115,59,97,99,99,111,117, -110,116,32,102,111,114,97,108,105,103,110,61,114,105,103,104,116,116,104,101,32, -99,111,109,112,97,110,121,97,108,119,97,121,115,32,98,101,101,110,114,101,116, -117,114,110,101,100,32,116,111,105,110,118,111,108,118,101,109,101,110,116,66, -101,99,97,117,115,101,32,116,104,101,116,104,105,115,32,112,101,114,105,111,100, -34,32,110,97,109,101,61,34,113,34,32,99,111,110,102,105,110,101,100,32,116,111, -97,32,114,101,115,117,108,116,32,111,102,118,97,108,117,101,61,34,34,32,47,62, -105,115,32,97,99,116,117,97,108,108,121,69,110,118,105,114,111,110,109,101,110, -116,13,10,60,47,104,101,97,100,62,13,10,67,111,110,118,101,114,115,101,108,121, -44,62,10,60,100,105,118,32,105,100,61,34,48,34,32,119,105,100,116,104,61,34,49, -105,115,32,112,114,111,98,97,98,108,121,104,97,118,101,32,98,101,99,111,109,101, -99,111,110,116,114,111,108,108,105,110,103,116,104,101,32,112,114,111,98,108,101 -,109,99,105,116,105,122,101,110,115,32,111,102,112,111,108,105,116,105,99,105,97 -,110,115,114,101,97,99,104,101,100,32,116,104,101,97,115,32,101,97,114,108,121, -32,97,115,58,110,111,110,101,59,32,111,118,101,114,60,116,97,98,108,101,32,99, -101,108,108,118,97,108,105,100,105,116,121,32,111,102,100,105,114,101,99,116,108 -,121,32,116,111,111,110,109,111,117,115,101,100,111,119,110,119,104,101,114,101, -32,105,116,32,105,115,119,104,101,110,32,105,116,32,119,97,115,109,101,109,98, -101,114,115,32,111,102,32,114,101,108,97,116,105,111,110,32,116,111,97,99,99,111 -,109,109,111,100,97,116,101,97,108,111,110,103,32,119,105,116,104,32,73,110,32, -116,104,101,32,108,97,116,101,116,104,101,32,69,110,103,108,105,115,104,100,101, -108,105,99,105,111,117,115,34,62,116,104,105,115,32,105,115,32,110,111,116,116, -104,101,32,112,114,101,115,101,110,116,105,102,32,116,104,101,121,32,97,114,101, -97,110,100,32,102,105,110,97,108,108,121,97,32,109,97,116,116,101,114,32,111,102 -,13,10,9,60,47,100,105,118,62,13,10,13,10,60,47,115,99,114,105,112,116,62,102,97 -,115,116,101,114,32,116,104,97,110,109,97,106,111,114,105,116,121,32,111,102,97, -102,116,101,114,32,119,104,105,99,104,99,111,109,112,97,114,97,116,105,118,101, -116,111,32,109,97,105,110,116,97,105,110,105,109,112,114,111,118,101,32,116,104, -101,97,119,97,114,100,101,100,32,116,104,101,101,114,34,32,99,108,97,115,115,61, -34,102,114,97,109,101,98,111,114,100,101,114,114,101,115,116,111,114,97,116,105, -111,110,105,110,32,116,104,101,32,115,97,109,101,97,110,97,108,121,115,105,115, -32,111,102,116,104,101,105,114,32,102,105,114,115,116,68,117,114,105,110,103,32, -116,104,101,32,99,111,110,116,105,110,101,110,116,97,108,115,101,113,117,101,110 -,99,101,32,111,102,102,117,110,99,116,105,111,110,40,41,123,102,111,110,116,45, -115,105,122,101,58,32,119,111,114,107,32,111,110,32,116,104,101,60,47,115,99,114 -,105,112,116,62,10,60,98,101,103,105,110,115,32,119,105,116,104,106,97,118,97, -115,99,114,105,112,116,58,99,111,110,115,116,105,116,117,101,110,116,119,97,115, -32,102,111,117,110,100,101,100,101,113,117,105,108,105,98,114,105,117,109,97,115 -,115,117,109,101,32,116,104,97,116,105,115,32,103,105,118,101,110,32,98,121,110, -101,101,100,115,32,116,111,32,98,101,99,111,111,114,100,105,110,97,116,101,115, -116,104,101,32,118,97,114,105,111,117,115,97,114,101,32,112,97,114,116,32,111, -102,111,110,108,121,32,105,110,32,116,104,101,115,101,99,116,105,111,110,115,32, -111,102,105,115,32,97,32,99,111,109,109,111,110,116,104,101,111,114,105,101,115, -32,111,102,100,105,115,99,111,118,101,114,105,101,115,97,115,115,111,99,105,97, -116,105,111,110,101,100,103,101,32,111,102,32,116,104,101,115,116,114,101,110, -103,116,104,32,111,102,112,111,115,105,116,105,111,110,32,105,110,112,114,101, -115,101,110,116,45,100,97,121,117,110,105,118,101,114,115,97,108,108,121,116,111 -,32,102,111,114,109,32,116,104,101,98,117,116,32,105,110,115,116,101,97,100,99, -111,114,112,111,114,97,116,105,111,110,97,116,116,97,99,104,101,100,32,116,111, -105,115,32,99,111,109,109,111,110,108,121,114,101,97,115,111,110,115,32,102,111, -114,32,38,113,117,111,116,59,116,104,101,32,99,97,110,32,98,101,32,109,97,100, -101,119,97,115,32,97,98,108,101,32,116,111,119,104,105,99,104,32,109,101,97,110, -115,98,117,116,32,100,105,100,32,110,111,116,111,110,77,111,117,115,101,79,118, -101,114,97,115,32,112,111,115,115,105,98,108,101,111,112,101,114,97,116,101,100, -32,98,121,99,111,109,105,110,103,32,102,114,111,109,116,104,101,32,112,114,105, -109,97,114,121,97,100,100,105,116,105,111,110,32,111,102,102,111,114,32,115,101, -118,101,114,97,108,116,114,97,110,115,102,101,114,114,101,100,97,32,112,101,114, -105,111,100,32,111,102,97,114,101,32,97,98,108,101,32,116,111,104,111,119,101, -118,101,114,44,32,105,116,115,104,111,117,108,100,32,104,97,118,101,109,117,99, -104,32,108,97,114,103,101,114,10,9,60,47,115,99,114,105,112,116,62,97,100,111, -112,116,101,100,32,116,104,101,112,114,111,112,101,114,116,121,32,111,102,100, -105,114,101,99,116,101,100,32,98,121,101,102,102,101,99,116,105,118,101,108,121, -119,97,115,32,98,114,111,117,103,104,116,99,104,105,108,100,114,101,110,32,111, -102,80,114,111,103,114,97,109,109,105,110,103,108,111,110,103,101,114,32,116,104 -,97,110,109,97,110,117,115,99,114,105,112,116,115,119,97,114,32,97,103,97,105, -110,115,116,98,121,32,109,101,97,110,115,32,111,102,97,110,100,32,109,111,115, -116,32,111,102,115,105,109,105,108,97,114,32,116,111,32,112,114,111,112,114,105, -101,116,97,114,121,111,114,105,103,105,110,97,116,105,110,103,112,114,101,115, -116,105,103,105,111,117,115,103,114,97,109,109,97,116,105,99,97,108,101,120,112, -101,114,105,101,110,99,101,46,116,111,32,109,97,107,101,32,116,104,101,73,116,32 -,119,97,115,32,97,108,115,111,105,115,32,102,111,117,110,100,32,105,110,99,111, -109,112,101,116,105,116,111,114,115,105,110,32,116,104,101,32,85,46,83,46,114, -101,112,108,97,99,101,32,116,104,101,98,114,111,117,103,104,116,32,116,104,101, -99,97,108,99,117,108,97,116,105,111,110,102,97,108,108,32,111,102,32,116,104,101 -,116,104,101,32,103,101,110,101,114,97,108,112,114,97,99,116,105,99,97,108,108, -121,105,110,32,104,111,110,111,114,32,111,102,114,101,108,101,97,115,101,100,32, -105,110,114,101,115,105,100,101,110,116,105,97,108,97,110,100,32,115,111,109,101 -,32,111,102,107,105,110,103,32,111,102,32,116,104,101,114,101,97,99,116,105,111, -110,32,116,111,49,115,116,32,69,97,114,108,32,111,102,99,117,108,116,117,114,101 -,32,97,110,100,112,114,105,110,99,105,112,97,108,108,121,60,47,116,105,116,108, -101,62,10,32,32,116,104,101,121,32,99,97,110,32,98,101,98,97,99,107,32,116,111, -32,116,104,101,115,111,109,101,32,111,102,32,104,105,115,101,120,112,111,115,117 -,114,101,32,116,111,97,114,101,32,115,105,109,105,108,97,114,102,111,114,109,32, -111,102,32,116,104,101,97,100,100,70,97,118,111,114,105,116,101,99,105,116,105, -122,101,110,115,104,105,112,112,97,114,116,32,105,110,32,116,104,101,112,101,111 -,112,108,101,32,119,105,116,104,105,110,32,112,114,97,99,116,105,99,101,116,111, -32,99,111,110,116,105,110,117,101,38,97,109,112,59,109,105,110,117,115,59,97,112 -,112,114,111,118,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,97, -108,108,111,119,101,100,32,116,104,101,97,110,100,32,102,111,114,32,116,104,101, -102,117,110,99,116,105,111,110,105,110,103,112,108,97,121,105,110,103,32,116,104 -,101,115,111,108,117,116,105,111,110,32,116,111,104,101,105,103,104,116,61,34,48 -,34,32,105,110,32,104,105,115,32,98,111,111,107,109,111,114,101,32,116,104,97, -110,32,97,102,111,108,108,111,119,115,32,116,104,101,99,114,101,97,116,101,100, -32,116,104,101,112,114,101,115,101,110,99,101,32,105,110,38,110,98,115,112,59,60 -,47,116,100,62,110,97,116,105,111,110,97,108,105,115,116,116,104,101,32,105,100, -101,97,32,111,102,97,32,99,104,97,114,97,99,116,101,114,119,101,114,101,32,102, -111,114,99,101,100,32,99,108,97,115,115,61,34,98,116,110,100,97,121,115,32,111, -102,32,116,104,101,102,101,97,116,117,114,101,100,32,105,110,115,104,111,119,105 -,110,103,32,116,104,101,105,110,116,101,114,101,115,116,32,105,110,105,110,32, -112,108,97,99,101,32,111,102,116,117,114,110,32,111,102,32,116,104,101,116,104, -101,32,104,101,97,100,32,111,102,76,111,114,100,32,111,102,32,116,104,101,112, -111,108,105,116,105,99,97,108,108,121,104,97,115,32,105,116,115,32,111,119,110, -69,100,117,99,97,116,105,111,110,97,108,97,112,112,114,111,118,97,108,32,111,102 -,115,111,109,101,32,111,102,32,116,104,101,101,97,99,104,32,111,116,104,101,114, -44,98,101,104,97,118,105,111,114,32,111,102,97,110,100,32,98,101,99,97,117,115, -101,97,110,100,32,97,110,111,116,104,101,114,97,112,112,101,97,114,101,100,32, -111,110,114,101,99,111,114,100,101,100,32,105,110,98,108,97,99,107,38,113,117, -111,116,59,109,97,121,32,105,110,99,108,117,100,101,116,104,101,32,119,111,114, -108,100,39,115,99,97,110,32,108,101,97,100,32,116,111,114,101,102,101,114,115,32 -,116,111,32,97,98,111,114,100,101,114,61,34,48,34,32,103,111,118,101,114,110,109 -,101,110,116,32,119,105,110,110,105,110,103,32,116,104,101,114,101,115,117,108, -116,101,100,32,105,110,32,119,104,105,108,101,32,116,104,101,32,87,97,115,104, -105,110,103,116,111,110,44,116,104,101,32,115,117,98,106,101,99,116,99,105,116, -121,32,105,110,32,116,104,101,62,60,47,100,105,118,62,13,10,9,9,114,101,102,108, -101,99,116,32,116,104,101,116,111,32,99,111,109,112,108,101,116,101,98,101,99,97 -,109,101,32,109,111,114,101,114,97,100,105,111,97,99,116,105,118,101,114,101,106 -,101,99,116,101,100,32,98,121,119,105,116,104,111,117,116,32,97,110,121,104,105, -115,32,102,97,116,104,101,114,44,119,104,105,99,104,32,99,111,117,108,100,99,111 -,112,121,32,111,102,32,116,104,101,116,111,32,105,110,100,105,99,97,116,101,97, -32,112,111,108,105,116,105,99,97,108,97,99,99,111,117,110,116,115,32,111,102,99, -111,110,115,116,105,116,117,116,101,115,119,111,114,107,101,100,32,119,105,116, -104,101,114,60,47,97,62,60,47,108,105,62,111,102,32,104,105,115,32,108,105,102, -101,97,99,99,111,109,112,97,110,105,101,100,99,108,105,101,110,116,87,105,100, -116,104,112,114,101,118,101,110,116,32,116,104,101,76,101,103,105,115,108,97,116 -,105,118,101,100,105,102,102,101,114,101,110,116,108,121,116,111,103,101,116,104 -,101,114,32,105,110,104,97,115,32,115,101,118,101,114,97,108,102,111,114,32,97, -110,111,116,104,101,114,116,101,120,116,32,111,102,32,116,104,101,102,111,117, -110,100,101,100,32,116,104,101,101,32,119,105,116,104,32,116,104,101,32,105,115, -32,117,115,101,100,32,102,111,114,99,104,97,110,103,101,100,32,116,104,101,117, -115,117,97,108,108,121,32,116,104,101,112,108,97,99,101,32,119,104,101,114,101, -119,104,101,114,101,97,115,32,116,104,101,62,32,60,97,32,104,114,101,102,61,34, -34,62,60,97,32,104,114,101,102,61,34,116,104,101,109,115,101,108,118,101,115,44, -97,108,116,104,111,117,103,104,32,104,101,116,104,97,116,32,99,97,110,32,98,101, -116,114,97,100,105,116,105,111,110,97,108,114,111,108,101,32,111,102,32,116,104, -101,97,115,32,97,32,114,101,115,117,108,116,114,101,109,111,118,101,67,104,105, -108,100,100,101,115,105,103,110,101,100,32,98,121,119,101,115,116,32,111,102,32, -116,104,101,83,111,109,101,32,112,101,111,112,108,101,112,114,111,100,117,99,116 -,105,111,110,44,115,105,100,101,32,111,102,32,116,104,101,110,101,119,115,108, -101,116,116,101,114,115,117,115,101,100,32,98,121,32,116,104,101,100,111,119,110 -,32,116,111,32,116,104,101,97,99,99,101,112,116,101,100,32,98,121,108,105,118, -101,32,105,110,32,116,104,101,97,116,116,101,109,112,116,115,32,116,111,111,117, -116,115,105,100,101,32,116,104,101,102,114,101,113,117,101,110,99,105,101,115,72 -,111,119,101,118,101,114,44,32,105,110,112,114,111,103,114,97,109,109,101,114, -115,97,116,32,108,101,97,115,116,32,105,110,97,112,112,114,111,120,105,109,97, -116,101,97,108,116,104,111,117,103,104,32,105,116,119,97,115,32,112,97,114,116, -32,111,102,97,110,100,32,118,97,114,105,111,117,115,71,111,118,101,114,110,111, -114,32,111,102,116,104,101,32,97,114,116,105,99,108,101,116,117,114,110,101,100, -32,105,110,116,111,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,101,99, -111,110,111,109,121,105,115,32,116,104,101,32,109,111,115,116,109,111,115,116,32 -,119,105,100,101,108,121,119,111,117,108,100,32,108,97,116,101,114,97,110,100,32 -,112,101,114,104,97,112,115,114,105,115,101,32,116,111,32,116,104,101,111,99,99, -117,114,115,32,119,104,101,110,117,110,100,101,114,32,119,104,105,99,104,99,111, -110,100,105,116,105,111,110,115,46,116,104,101,32,119,101,115,116,101,114,110, -116,104,101,111,114,121,32,116,104,97,116,105,115,32,112,114,111,100,117,99,101, -100,116,104,101,32,99,105,116,121,32,111,102,105,110,32,119,104,105,99,104,32, -104,101,115,101,101,110,32,105,110,32,116,104,101,116,104,101,32,99,101,110,116, -114,97,108,98,117,105,108,100,105,110,103,32,111,102,109,97,110,121,32,111,102, -32,104,105,115,97,114,101,97,32,111,102,32,116,104,101,105,115,32,116,104,101,32 -,111,110,108,121,109,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111 -,102,32,116,104,101,116,104,101,32,87,101,115,116,101,114,110,84,104,101,114,101 -,32,105,115,32,110,111,101,120,116,101,110,100,101,100,32,116,111,83,116,97,116, -105,115,116,105,99,97,108,99,111,108,115,112,97,110,61,50,32,124,115,104,111,114 -,116,32,115,116,111,114,121,112,111,115,115,105,98,108,101,32,116,111,116,111, -112,111,108,111,103,105,99,97,108,99,114,105,116,105,99,97,108,32,111,102,114, -101,112,111,114,116,101,100,32,116,111,97,32,67,104,114,105,115,116,105,97,110, -100,101,99,105,115,105,111,110,32,116,111,105,115,32,101,113,117,97,108,32,116, -111,112,114,111,98,108,101,109,115,32,111,102,84,104,105,115,32,99,97,110,32,98, -101,109,101,114,99,104,97,110,100,105,115,101,102,111,114,32,109,111,115,116,32, -111,102,110,111,32,101,118,105,100,101,110,99,101,101,100,105,116,105,111,110, -115,32,111,102,101,108,101,109,101,110,116,115,32,105,110,38,113,117,111,116,59, -46,32,84,104,101,99,111,109,47,105,109,97,103,101,115,47,119,104,105,99,104,32, -109,97,107,101,115,116,104,101,32,112,114,111,99,101,115,115,114,101,109,97,105, -110,115,32,116,104,101,108,105,116,101,114,97,116,117,114,101,44,105,115,32,97, -32,109,101,109,98,101,114,116,104,101,32,112,111,112,117,108,97,114,116,104,101, -32,97,110,99,105,101,110,116,112,114,111,98,108,101,109,115,32,105,110,116,105, -109,101,32,111,102,32,116,104,101,100,101,102,101,97,116,101,100,32,98,121,98, -111,100,121,32,111,102,32,116,104,101,97,32,102,101,119,32,121,101,97,114,115, -109,117,99,104,32,111,102,32,116,104,101,116,104,101,32,119,111,114,107,32,111, -102,67,97,108,105,102,111,114,110,105,97,44,115,101,114,118,101,100,32,97,115,32 -,97,103,111,118,101,114,110,109,101,110,116,46,99,111,110,99,101,112,116,115,32, -111,102,109,111,118,101,109,101,110,116,32,105,110,9,9,60,100,105,118,32,105,100 -,61,34,105,116,34,32,118,97,108,117,101,61,34,108,97,110,103,117,97,103,101,32, -111,102,97,115,32,116,104,101,121,32,97,114,101,112,114,111,100,117,99,101,100, -32,105,110,105,115,32,116,104,97,116,32,116,104,101,101,120,112,108,97,105,110, -32,116,104,101,100,105,118,62,60,47,100,105,118,62,10,72,111,119,101,118,101,114 -,32,116,104,101,108,101,97,100,32,116,111,32,116,104,101,9,60,97,32,104,114,101, -102,61,34,47,119,97,115,32,103,114,97,110,116,101,100,112,101,111,112,108,101,32 -,104,97,118,101,99,111,110,116,105,110,117,97,108,108,121,119,97,115,32,115,101, -101,110,32,97,115,97,110,100,32,114,101,108,97,116,101,100,116,104,101,32,114, -111,108,101,32,111,102,112,114,111,112,111,115,101,100,32,98,121,111,102,32,116, -104,101,32,98,101,115,116,101,97,99,104,32,111,116,104,101,114,46,67,111,110,115 -,116,97,110,116,105,110,101,112,101,111,112,108,101,32,102,114,111,109,100,105, -97,108,101,99,116,115,32,111,102,116,111,32,114,101,118,105,115,105,111,110,119, -97,115,32,114,101,110,97,109,101,100,97,32,115,111,117,114,99,101,32,111,102,116 -,104,101,32,105,110,105,116,105,97,108,108,97,117,110,99,104,101,100,32,105,110, -112,114,111,118,105,100,101,32,116,104,101,116,111,32,116,104,101,32,119,101,115 -,116,119,104,101,114,101,32,116,104,101,114,101,97,110,100,32,115,105,109,105, -108,97,114,98,101,116,119,101,101,110,32,116,119,111,105,115,32,97,108,115,111, -32,116,104,101,69,110,103,108,105,115,104,32,97,110,100,99,111,110,100,105,116, -105,111,110,115,44,116,104,97,116,32,105,116,32,119,97,115,101,110,116,105,116, -108,101,100,32,116,111,116,104,101,109,115,101,108,118,101,115,46,113,117,97,110 -,116,105,116,121,32,111,102,114,97,110,115,112,97,114,101,110,99,121,116,104,101 -,32,115,97,109,101,32,97,115,116,111,32,106,111,105,110,32,116,104,101,99,111, -117,110,116,114,121,32,97,110,100,116,104,105,115,32,105,115,32,116,104,101,84, -104,105,115,32,108,101,100,32,116,111,97,32,115,116,97,116,101,109,101,110,116, -99,111,110,116,114,97,115,116,32,116,111,108,97,115,116,73,110,100,101,120,79, -102,116,104,114,111,117,103,104,32,104,105,115,105,115,32,100,101,115,105,103, -110,101,100,116,104,101,32,116,101,114,109,32,105,115,105,115,32,112,114,111,118 -,105,100,101,100,112,114,111,116,101,99,116,32,116,104,101,110,103,60,47,97,62, -60,47,108,105,62,84,104,101,32,99,117,114,114,101,110,116,116,104,101,32,115,105 -,116,101,32,111,102,115,117,98,115,116,97,110,116,105,97,108,101,120,112,101,114 -,105,101,110,99,101,44,105,110,32,116,104,101,32,87,101,115,116,116,104,101,121, -32,115,104,111,117,108,100,115,108,111,118,101,110,196,141,105,110,97,99,111,109 -,101,110,116,97,114,105,111,115,117,110,105,118,101,114,115,105,100,97,100,99, -111,110,100,105,99,105,111,110,101,115,97,99,116,105,118,105,100,97,100,101,115, -101,120,112,101,114,105,101,110,99,105,97,116,101,99,110,111,108,111,103,195,173 -,97,112,114,111,100,117,99,99,105,195,179,110,112,117,110,116,117,97,99,105,195, -179,110,97,112,108,105,99,97,99,105,195,179,110,99,111,110,116,114,97,115,101, -195,177,97,99,97,116,101,103,111,114,195,173,97,115,114,101,103,105,115,116,114, -97,114,115,101,112,114,111,102,101,115,105,111,110,97,108,116,114,97,116,97,109, -105,101,110,116,111,114,101,103,195,173,115,116,114,97,116,101,115,101,99,114, -101,116,97,114,195,173,97,112,114,105,110,99,105,112,97,108,101,115,112,114,111, -116,101,99,99,105,195,179,110,105,109,112,111,114,116,97,110,116,101,115,105,109 -,112,111,114,116,97,110,99,105,97,112,111,115,105,98,105,108,105,100,97,100,105, -110,116,101,114,101,115,97,110,116,101,99,114,101,99,105,109,105,101,110,116,111 -,110,101,99,101,115,105,100,97,100,101,115,115,117,115,99,114,105,98,105,114,115 -,101,97,115,111,99,105,97,99,105,195,179,110,100,105,115,112,111,110,105,98,108, -101,115,101,118,97,108,117,97,99,105,195,179,110,101,115,116,117,100,105,97,110, -116,101,115,114,101,115,112,111,110,115,97,98,108,101,114,101,115,111,108,117,99 -,105,195,179,110,103,117,97,100,97,108,97,106,97,114,97,114,101,103,105,115,116, -114,97,100,111,115,111,112,111,114,116,117,110,105,100,97,100,99,111,109,101,114 -,99,105,97,108,101,115,102,111,116,111,103,114,97,102,195,173,97,97,117,116,111, -114,105,100,97,100,101,115,105,110,103,101,110,105,101,114,195,173,97,116,101, -108,101,118,105,115,105,195,179,110,99,111,109,112,101,116,101,110,99,105,97,111 -,112,101,114,97,99,105,111,110,101,115,101,115,116,97,98,108,101,99,105,100,111, -115,105,109,112,108,101,109,101,110,116,101,97,99,116,117,97,108,109,101,110,116 -,101,110,97,118,101,103,97,99,105,195,179,110,99,111,110,102,111,114,109,105,100 -,97,100,108,105,110,101,45,104,101,105,103,104,116,58,102,111,110,116,45,102,97, -109,105,108,121,58,34,32,58,32,34,104,116,116,112,58,47,47,97,112,112,108,105,99 -,97,116,105,111,110,115,108,105,110,107,34,32,104,114,101,102,61,34,115,112,101, -99,105,102,105,99,97,108,108,121,47,47,60,33,91,67,68,65,84,65,91,10,79,114,103, -97,110,105,122,97,116,105,111,110,100,105,115,116,114,105,98,117,116,105,111,110 -,48,112,120,59,32,104,101,105,103,104,116,58,114,101,108,97,116,105,111,110,115, -104,105,112,100,101,118,105,99,101,45,119,105,100,116,104,60,100,105,118,32,99, -108,97,115,115,61,34,60,108,97,98,101,108,32,102,111,114,61,34,114,101,103,105, -115,116,114,97,116,105,111,110,60,47,110,111,115,99,114,105,112,116,62,10,47,105 -,110,100,101,120,46,104,116,109,108,34,119,105,110,100,111,119,46,111,112,101, -110,40,32,33,105,109,112,111,114,116,97,110,116,59,97,112,112,108,105,99,97,116, -105,111,110,47,105,110,100,101,112,101,110,100,101,110,99,101,47,47,119,119,119, -46,103,111,111,103,108,101,111,114,103,97,110,105,122,97,116,105,111,110,97,117, -116,111,99,111,109,112,108,101,116,101,114,101,113,117,105,114,101,109,101,110, -116,115,99,111,110,115,101,114,118,97,116,105,118,101,60,102,111,114,109,32,110, -97,109,101,61,34,105,110,116,101,108,108,101,99,116,117,97,108,109,97,114,103, -105,110,45,108,101,102,116,58,49,56,116,104,32,99,101,110,116,117,114,121,97,110 -,32,105,109,112,111,114,116,97,110,116,105,110,115,116,105,116,117,116,105,111, -110,115,97,98,98,114,101,118,105,97,116,105,111,110,60,105,109,103,32,99,108,97, -115,115,61,34,111,114,103,97,110,105,115,97,116,105,111,110,99,105,118,105,108, -105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,97,114,99 -,104,105,116,101,99,116,117,114,101,105,110,99,111,114,112,111,114,97,116,101, -100,50,48,116,104,32,99,101,110,116,117,114,121,45,99,111,110,116,97,105,110,101 -,114,34,62,109,111,115,116,32,110,111,116,97,98,108,121,47,62,60,47,97,62,60,47, -100,105,118,62,110,111,116,105,102,105,99,97,116,105,111,110,39,117,110,100,101, -102,105,110,101,100,39,41,70,117,114,116,104,101,114,109,111,114,101,44,98,101, -108,105,101,118,101,32,116,104,97,116,105,110,110,101,114,72,84,77,76,32,61,32, -112,114,105,111,114,32,116,111,32,116,104,101,100,114,97,109,97,116,105,99,97, -108,108,121,114,101,102,101,114,114,105,110,103,32,116,111,110,101,103,111,116, -105,97,116,105,111,110,115,104,101,97,100,113,117,97,114,116,101,114,115,83,111, -117,116,104,32,65,102,114,105,99,97,117,110,115,117,99,99,101,115,115,102,117, -108,80,101,110,110,115,121,108,118,97,110,105,97,65,115,32,97,32,114,101,115,117 -,108,116,44,60,104,116,109,108,32,108,97,110,103,61,34,38,108,116,59,47,115,117, -112,38,103,116,59,100,101,97,108,105,110,103,32,119,105,116,104,112,104,105,108, -97,100,101,108,112,104,105,97,104,105,115,116,111,114,105,99,97,108,108,121,41, -59,60,47,115,99,114,105,112,116,62,10,112,97,100,100,105,110,103,45,116,111,112, -58,101,120,112,101,114,105,109,101,110,116,97,108,103,101,116,65,116,116,114,105 -,98,117,116,101,105,110,115,116,114,117,99,116,105,111,110,115,116,101,99,104, -110,111,108,111,103,105,101,115,112,97,114,116,32,111,102,32,116,104,101,32,61, -102,117,110,99,116,105,111,110,40,41,123,115,117,98,115,99,114,105,112,116,105, -111,110,108,46,100,116,100,34,62,13,10,60,104,116,103,101,111,103,114,97,112,104 -,105,99,97,108,67,111,110,115,116,105,116,117,116,105,111,110,39,44,32,102,117, -110,99,116,105,111,110,40,115,117,112,112,111,114,116,101,100,32,98,121,97,103, -114,105,99,117,108,116,117,114,97,108,99,111,110,115,116,114,117,99,116,105,111, -110,112,117,98,108,105,99,97,116,105,111,110,115,102,111,110,116,45,115,105,122, -101,58,32,49,97,32,118,97,114,105,101,116,121,32,111,102,60,100,105,118,32,115, -116,121,108,101,61,34,69,110,99,121,99,108,111,112,101,100,105,97,105,102,114,97 -,109,101,32,115,114,99,61,34,100,101,109,111,110,115,116,114,97,116,101,100,97, -99,99,111,109,112,108,105,115,104,101,100,117,110,105,118,101,114,115,105,116, -105,101,115,68,101,109,111,103,114,97,112,104,105,99,115,41,59,60,47,115,99,114, -105,112,116,62,60,100,101,100,105,99,97,116,101,100,32,116,111,107,110,111,119, -108,101,100,103,101,32,111,102,115,97,116,105,115,102,97,99,116,105,111,110,112, -97,114,116,105,99,117,108,97,114,108,121,60,47,100,105,118,62,60,47,100,105,118, -62,69,110,103,108,105,115,104,32,40,85,83,41,97,112,112,101,110,100,67,104,105, -108,100,40,116,114,97,110,115,109,105,115,115,105,111,110,115,46,32,72,111,119, -101,118,101,114,44,32,105,110,116,101,108,108,105,103,101,110,99,101,34,32,116, -97,98,105,110,100,101,120,61,34,102,108,111,97,116,58,114,105,103,104,116,59,67, -111,109,109,111,110,119,101,97,108,116,104,114,97,110,103,105,110,103,32,102,114 -,111,109,105,110,32,119,104,105,99,104,32,116,104,101,97,116,32,108,101,97,115, -116,32,111,110,101,114,101,112,114,111,100,117,99,116,105,111,110,101,110,99,121 -,99,108,111,112,101,100,105,97,59,102,111,110,116,45,115,105,122,101,58,49,106, -117,114,105,115,100,105,99,116,105,111,110,97,116,32,116,104,97,116,32,116,105, -109,101,34,62,60,97,32,99,108,97,115,115,61,34,73,110,32,97,100,100,105,116,105, -111,110,44,100,101,115,99,114,105,112,116,105,111,110,43,99,111,110,118,101,114, -115,97,116,105,111,110,99,111,110,116,97,99,116,32,119,105,116,104,105,115,32, -103,101,110,101,114,97,108,108,121,114,34,32,99,111,110,116,101,110,116,61,34, -114,101,112,114,101,115,101,110,116,105,110,103,38,108,116,59,109,97,116,104,38, -103,116,59,112,114,101,115,101,110,116,97,116,105,111,110,111,99,99,97,115,105, -111,110,97,108,108,121,60,105,109,103,32,119,105,100,116,104,61,34,110,97,118, -105,103,97,116,105,111,110,34,62,99,111,109,112,101,110,115,97,116,105,111,110, -99,104,97,109,112,105,111,110,115,104,105,112,109,101,100,105,97,61,34,97,108, -108,34,32,118,105,111,108,97,116,105,111,110,32,111,102,114,101,102,101,114,101, -110,99,101,32,116,111,114,101,116,117,114,110,32,116,114,117,101,59,83,116,114, -105,99,116,47,47,69,78,34,32,116,114,97,110,115,97,99,116,105,111,110,115,105, -110,116,101,114,118,101,110,116,105,111,110,118,101,114,105,102,105,99,97,116, -105,111,110,73,110,102,111,114,109,97,116,105,111,110,32,100,105,102,102,105,99, -117,108,116,105,101,115,67,104,97,109,112,105,111,110,115,104,105,112,99,97,112, -97,98,105,108,105,116,105,101,115,60,33,91,101,110,100,105,102,93,45,45,62,125, -10,60,47,115,99,114,105,112,116,62,10,67,104,114,105,115,116,105,97,110,105,116, -121,102,111,114,32,101,120,97,109,112,108,101,44,80,114,111,102,101,115,115,105, -111,110,97,108,114,101,115,116,114,105,99,116,105,111,110,115,115,117,103,103, -101,115,116,32,116,104,97,116,119,97,115,32,114,101,108,101,97,115,101,100,40, -115,117,99,104,32,97,115,32,116,104,101,114,101,109,111,118,101,67,108,97,115, -115,40,117,110,101,109,112,108,111,121,109,101,110,116,116,104,101,32,65,109,101 -,114,105,99,97,110,115,116,114,117,99,116,117,114,101,32,111,102,47,105,110,100, -101,120,46,104,116,109,108,32,112,117,98,108,105,115,104,101,100,32,105,110,115, -112,97,110,32,99,108,97,115,115,61,34,34,62,60,97,32,104,114,101,102,61,34,47, -105,110,116,114,111,100,117,99,116,105,111,110,98,101,108,111,110,103,105,110, -103,32,116,111,99,108,97,105,109,101,100,32,116,104,97,116,99,111,110,115,101, -113,117,101,110,99,101,115,60,109,101,116,97,32,110,97,109,101,61,34,71,117,105, -100,101,32,116,111,32,116,104,101,111,118,101,114,119,104,101,108,109,105,110, -103,97,103,97,105,110,115,116,32,116,104,101,32,99,111,110,99,101,110,116,114,97 -,116,101,100,44,10,46,110,111,110,116,111,117,99,104,32,111,98,115,101,114,118, -97,116,105,111,110,115,60,47,97,62,10,60,47,100,105,118,62,10,102,32,40,100,111, -99,117,109,101,110,116,46,98,111,114,100,101,114,58,32,49,112,120,32,123,102,111 -,110,116,45,115,105,122,101,58,49,116,114,101,97,116,109,101,110,116,32,111,102, -48,34,32,104,101,105,103,104,116,61,34,49,109,111,100,105,102,105,99,97,116,105, -111,110,73,110,100,101,112,101,110,100,101,110,99,101,100,105,118,105,100,101, -100,32,105,110,116,111,103,114,101,97,116,101,114,32,116,104,97,110,97,99,104, -105,101,118,101,109,101,110,116,115,101,115,116,97,98,108,105,115,104,105,110, -103,74,97,118,97,83,99,114,105,112,116,34,32,110,101,118,101,114,116,104,101,108 -,101,115,115,115,105,103,110,105,102,105,99,97,110,99,101,66,114,111,97,100,99, -97,115,116,105,110,103,62,38,110,98,115,112,59,60,47,116,100,62,99,111,110,116, -97,105,110,101,114,34,62,10,115,117,99,104,32,97,115,32,116,104,101,32,105,110, -102,108,117,101,110,99,101,32,111,102,97,32,112,97,114,116,105,99,117,108,97,114 -,115,114,99,61,39,104,116,116,112,58,47,47,110,97,118,105,103,97,116,105,111,110 -,34,32,104,97,108,102,32,111,102,32,116,104,101,32,115,117,98,115,116,97,110,116 -,105,97,108,32,38,110,98,115,112,59,60,47,100,105,118,62,97,100,118,97,110,116, -97,103,101,32,111,102,100,105,115,99,111,118,101,114,121,32,111,102,102,117,110, -100,97,109,101,110,116,97,108,32,109,101,116,114,111,112,111,108,105,116,97,110, -116,104,101,32,111,112,112,111,115,105,116,101,34,32,120,109,108,58,108,97,110, -103,61,34,100,101,108,105,98,101,114,97,116,101,108,121,97,108,105,103,110,61,99 -,101,110,116,101,114,101,118,111,108,117,116,105,111,110,32,111,102,112,114,101, -115,101,114,118,97,116,105,111,110,105,109,112,114,111,118,101,109,101,110,116, -115,98,101,103,105,110,110,105,110,103,32,105,110,74,101,115,117,115,32,67,104, -114,105,115,116,80,117,98,108,105,99,97,116,105,111,110,115,100,105,115,97,103, -114,101,101,109,101,110,116,116,101,120,116,45,97,108,105,103,110,58,114,44,32, -102,117,110,99,116,105,111,110,40,41,115,105,109,105,108,97,114,105,116,105,101, -115,98,111,100,121,62,60,47,104,116,109,108,62,105,115,32,99,117,114,114,101,110 -,116,108,121,97,108,112,104,97,98,101,116,105,99,97,108,105,115,32,115,111,109, -101,116,105,109,101,115,116,121,112,101,61,34,105,109,97,103,101,47,109,97,110, -121,32,111,102,32,116,104,101,32,102,108,111,119,58,104,105,100,100,101,110,59, -97,118,97,105,108,97,98,108,101,32,105,110,100,101,115,99,114,105,98,101,32,116, -104,101,101,120,105,115,116,101,110,99,101,32,111,102,97,108,108,32,111,118,101, -114,32,116,104,101,116,104,101,32,73,110,116,101,114,110,101,116,9,60,117,108,32 -,99,108,97,115,115,61,34,105,110,115,116,97,108,108,97,116,105,111,110,110,101, -105,103,104,98,111,114,104,111,111,100,97,114,109,101,100,32,102,111,114,99,101, -115,114,101,100,117,99,105,110,103,32,116,104,101,99,111,110,116,105,110,117,101 -,115,32,116,111,78,111,110,101,116,104,101,108,101,115,115,44,116,101,109,112, -101,114,97,116,117,114,101,115,10,9,9,60,97,32,104,114,101,102,61,34,99,108,111, -115,101,32,116,111,32,116,104,101,101,120,97,109,112,108,101,115,32,111,102,32, -105,115,32,97,98,111,117,116,32,116,104,101,40,115,101,101,32,98,101,108,111,119 -,41,46,34,32,105,100,61,34,115,101,97,114,99,104,112,114,111,102,101,115,115,105 -,111,110,97,108,105,115,32,97,118,97,105,108,97,98,108,101,116,104,101,32,111, -102,102,105,99,105,97,108,9,9,60,47,115,99,114,105,112,116,62,10,10,9,9,60,100, -105,118,32,105,100,61,34,97,99,99,101,108,101,114,97,116,105,111,110,116,104,114 -,111,117,103,104,32,116,104,101,32,72,97,108,108,32,111,102,32,70,97,109,101,100 -,101,115,99,114,105,112,116,105,111,110,115,116,114,97,110,115,108,97,116,105, -111,110,115,105,110,116,101,114,102,101,114,101,110,99,101,32,116,121,112,101,61 -,39,116,101,120,116,47,114,101,99,101,110,116,32,121,101,97,114,115,105,110,32, -116,104,101,32,119,111,114,108,100,118,101,114,121,32,112,111,112,117,108,97,114 -,123,98,97,99,107,103,114,111,117,110,100,58,116,114,97,100,105,116,105,111,110, -97,108,32,115,111,109,101,32,111,102,32,116,104,101,32,99,111,110,110,101,99,116 -,101,100,32,116,111,101,120,112,108,111,105,116,97,116,105,111,110,101,109,101, -114,103,101,110,99,101,32,111,102,99,111,110,115,116,105,116,117,116,105,111,110 -,65,32,72,105,115,116,111,114,121,32,111,102,115,105,103,110,105,102,105,99,97, -110,116,32,109,97,110,117,102,97,99,116,117,114,101,100,101,120,112,101,99,116, -97,116,105,111,110,115,62,60,110,111,115,99,114,105,112,116,62,60,99,97,110,32, -98,101,32,102,111,117,110,100,98,101,99,97,117,115,101,32,116,104,101,32,104,97, -115,32,110,111,116,32,98,101,101,110,110,101,105,103,104,98,111,117,114,105,110, -103,119,105,116,104,111,117,116,32,116,104,101,32,97,100,100,101,100,32,116,111, -32,116,104,101,9,60,108,105,32,99,108,97,115,115,61,34,105,110,115,116,114,117, -109,101,110,116,97,108,83,111,118,105,101,116,32,85,110,105,111,110,97,99,107, -110,111,119,108,101,100,103,101,100,119,104,105,99,104,32,99,97,110,32,98,101, -110,97,109,101,32,102,111,114,32,116,104,101,97,116,116,101,110,116,105,111,110, -32,116,111,97,116,116,101,109,112,116,115,32,116,111,32,100,101,118,101,108,111, -112,109,101,110,116,115,73,110,32,102,97,99,116,44,32,116,104,101,60,108,105,32, -99,108,97,115,115,61,34,97,105,109,112,108,105,99,97,116,105,111,110,115,115,117 -,105,116,97,98,108,101,32,102,111,114,109,117,99,104,32,111,102,32,116,104,101, -32,99,111,108,111,110,105,122,97,116,105,111,110,112,114,101,115,105,100,101,110 -,116,105,97,108,99,97,110,99,101,108,66,117,98,98,108,101,32,73,110,102,111,114, -109,97,116,105,111,110,109,111,115,116,32,111,102,32,116,104,101,32,105,115,32, -100,101,115,99,114,105,98,101,100,114,101,115,116,32,111,102,32,116,104,101,32, -109,111,114,101,32,111,114,32,108,101,115,115,105,110,32,83,101,112,116,101,109, -98,101,114,73,110,116,101,108,108,105,103,101,110,99,101,115,114,99,61,34,104, -116,116,112,58,47,47,112,120,59,32,104,101,105,103,104,116,58,32,97,118,97,105, -108,97,98,108,101,32,116,111,109,97,110,117,102,97,99,116,117,114,101,114,104, -117,109,97,110,32,114,105,103,104,116,115,108,105,110,107,32,104,114,101,102,61, -34,47,97,118,97,105,108,97,98,105,108,105,116,121,112,114,111,112,111,114,116, -105,111,110,97,108,111,117,116,115,105,100,101,32,116,104,101,32,97,115,116,114, -111,110,111,109,105,99,97,108,104,117,109,97,110,32,98,101,105,110,103,115,110, -97,109,101,32,111,102,32,116,104,101,32,97,114,101,32,102,111,117,110,100,32,105 -,110,97,114,101,32,98,97,115,101,100,32,111,110,115,109,97,108,108,101,114,32, -116,104,97,110,97,32,112,101,114,115,111,110,32,119,104,111,101,120,112,97,110, -115,105,111,110,32,111,102,97,114,103,117,105,110,103,32,116,104,97,116,110,111, -119,32,107,110,111,119,110,32,97,115,73,110,32,116,104,101,32,101,97,114,108,121 -,105,110,116,101,114,109,101,100,105,97,116,101,100,101,114,105,118,101,100,32, -102,114,111,109,83,99,97,110,100,105,110,97,118,105,97,110,60,47,97,62,60,47,100 -,105,118,62,13,10,99,111,110,115,105,100,101,114,32,116,104,101,97,110,32,101, -115,116,105,109,97,116,101,100,116,104,101,32,78,97,116,105,111,110,97,108,60, -100,105,118,32,105,100,61,34,112,97,103,114,101,115,117,108,116,105,110,103,32, -105,110,99,111,109,109,105,115,115,105,111,110,101,100,97,110,97,108,111,103,111 -,117,115,32,116,111,97,114,101,32,114,101,113,117,105,114,101,100,47,117,108,62, -10,60,47,100,105,118,62,10,119,97,115,32,98,97,115,101,100,32,111,110,97,110,100 -,32,98,101,99,97,109,101,32,97,38,110,98,115,112,59,38,110,98,115,112,59,116,34, -32,118,97,108,117,101,61,34,34,32,119,97,115,32,99,97,112,116,117,114,101,100, -110,111,32,109,111,114,101,32,116,104,97,110,114,101,115,112,101,99,116,105,118, -101,108,121,99,111,110,116,105,110,117,101,32,116,111,32,62,13,10,60,104,101,97, -100,62,13,10,60,119,101,114,101,32,99,114,101,97,116,101,100,109,111,114,101,32, -103,101,110,101,114,97,108,105,110,102,111,114,109,97,116,105,111,110,32,117,115 -,101,100,32,102,111,114,32,116,104,101,105,110,100,101,112,101,110,100,101,110, -116,32,116,104,101,32,73,109,112,101,114,105,97,108,99,111,109,112,111,110,101, -110,116,32,111,102,116,111,32,116,104,101,32,110,111,114,116,104,105,110,99,108, -117,100,101,32,116,104,101,32,67,111,110,115,116,114,117,99,116,105,111,110,115, -105,100,101,32,111,102,32,116,104,101,32,119,111,117,108,100,32,110,111,116,32, -98,101,102,111,114,32,105,110,115,116,97,110,99,101,105,110,118,101,110,116,105, -111,110,32,111,102,109,111,114,101,32,99,111,109,112,108,101,120,99,111,108,108, -101,99,116,105,118,101,108,121,98,97,99,107,103,114,111,117,110,100,58,32,116, -101,120,116,45,97,108,105,103,110,58,32,105,116,115,32,111,114,105,103,105,110, -97,108,105,110,116,111,32,97,99,99,111,117,110,116,116,104,105,115,32,112,114, -111,99,101,115,115,97,110,32,101,120,116,101,110,115,105,118,101,104,111,119,101 -,118,101,114,44,32,116,104,101,116,104,101,121,32,97,114,101,32,110,111,116,114, -101,106,101,99,116,101,100,32,116,104,101,99,114,105,116,105,99,105,115,109,32, -111,102,100,117,114,105,110,103,32,119,104,105,99,104,112,114,111,98,97,98,108, -121,32,116,104,101,116,104,105,115,32,97,114,116,105,99,108,101,40,102,117,110, -99,116,105,111,110,40,41,123,73,116,32,115,104,111,117,108,100,32,98,101,97,110, -32,97,103,114,101,101,109,101,110,116,97,99,99,105,100,101,110,116,97,108,108, -121,100,105,102,102,101,114,115,32,102,114,111,109,65,114,99,104,105,116,101,99, -116,117,114,101,98,101,116,116,101,114,32,107,110,111,119,110,97,114,114,97,110, -103,101,109,101,110,116,115,105,110,102,108,117,101,110,99,101,32,111,110,97,116 -,116,101,110,100,101,100,32,116,104,101,105,100,101,110,116,105,99,97,108,32,116 -,111,115,111,117,116,104,32,111,102,32,116,104,101,112,97,115,115,32,116,104,114 -,111,117,103,104,120,109,108,34,32,116,105,116,108,101,61,34,119,101,105,103,104 -,116,58,98,111,108,100,59,99,114,101,97,116,105,110,103,32,116,104,101,100,105, -115,112,108,97,121,58,110,111,110,101,114,101,112,108,97,99,101,100,32,116,104, -101,60,105,109,103,32,115,114,99,61,34,47,105,104,116,116,112,115,58,47,47,119, -119,119,46,87,111,114,108,100,32,87,97,114,32,73,73,116,101,115,116,105,109,111, -110,105,97,108,115,102,111,117,110,100,32,105,110,32,116,104,101,114,101,113,117 -,105,114,101,100,32,116,111,32,97,110,100,32,116,104,97,116,32,116,104,101,98, -101,116,119,101,101,110,32,116,104,101,32,119,97,115,32,100,101,115,105,103,110, -101,100,99,111,110,115,105,115,116,115,32,111,102,32,99,111,110,115,105,100,101, -114,97,98,108,121,112,117,98,108,105,115,104,101,100,32,98,121,116,104,101,32, -108,97,110,103,117,97,103,101,67,111,110,115,101,114,118,97,116,105,111,110,99, -111,110,115,105,115,116,101,100,32,111,102,114,101,102,101,114,32,116,111,32,116 -,104,101,98,97,99,107,32,116,111,32,116,104,101,32,99,115,115,34,32,109,101,100, -105,97,61,34,80,101,111,112,108,101,32,102,114,111,109,32,97,118,97,105,108,97, -98,108,101,32,111,110,112,114,111,118,101,100,32,116,111,32,98,101,115,117,103, -103,101,115,116,105,111,110,115,34,119,97,115,32,107,110,111,119,110,32,97,115, -118,97,114,105,101,116,105,101,115,32,111,102,108,105,107,101,108,121,32,116,111 -,32,98,101,99,111,109,112,114,105,115,101,100,32,111,102,115,117,112,112,111,114 -,116,32,116,104,101,32,104,97,110,100,115,32,111,102,32,116,104,101,99,111,117, -112,108,101,100,32,119,105,116,104,99,111,110,110,101,99,116,32,97,110,100,32,98 -,111,114,100,101,114,58,110,111,110,101,59,112,101,114,102,111,114,109,97,110,99 -,101,115,98,101,102,111,114,101,32,98,101,105,110,103,108,97,116,101,114,32,98, -101,99,97,109,101,99,97,108,99,117,108,97,116,105,111,110,115,111,102,116,101, -110,32,99,97,108,108,101,100,114,101,115,105,100,101,110,116,115,32,111,102,109, -101,97,110,105,110,103,32,116,104,97,116,62,60,108,105,32,99,108,97,115,115,61, -34,101,118,105,100,101,110,99,101,32,102,111,114,101,120,112,108,97,110,97,116, -105,111,110,115,101,110,118,105,114,111,110,109,101,110,116,115,34,62,60,47,97, -62,60,47,100,105,118,62,119,104,105,99,104,32,97,108,108,111,119,115,73,110,116, -114,111,100,117,99,116,105,111,110,100,101,118,101,108,111,112,101,100,32,98,121 -,97,32,119,105,100,101,32,114,97,110,103,101,111,110,32,98,101,104,97,108,102,32 -,111,102,118,97,108,105,103,110,61,34,116,111,112,34,112,114,105,110,99,105,112, -108,101,32,111,102,97,116,32,116,104,101,32,116,105,109,101,44,60,47,110,111,115 -,99,114,105,112,116,62,13,115,97,105,100,32,116,111,32,104,97,118,101,105,110,32 -,116,104,101,32,102,105,114,115,116,119,104,105,108,101,32,111,116,104,101,114, -115,104,121,112,111,116,104,101,116,105,99,97,108,112,104,105,108,111,115,111, -112,104,101,114,115,112,111,119,101,114,32,111,102,32,116,104,101,99,111,110,116 -,97,105,110,101,100,32,105,110,112,101,114,102,111,114,109,101,100,32,98,121,105 -,110,97,98,105,108,105,116,121,32,116,111,119,101,114,101,32,119,114,105,116,116 -,101,110,115,112,97,110,32,115,116,121,108,101,61,34,105,110,112,117,116,32,110, -97,109,101,61,34,116,104,101,32,113,117,101,115,116,105,111,110,105,110,116,101, -110,100,101,100,32,102,111,114,114,101,106,101,99,116,105,111,110,32,111,102,105 -,109,112,108,105,101,115,32,116,104,97,116,105,110,118,101,110,116,101,100,32, -116,104,101,116,104,101,32,115,116,97,110,100,97,114,100,119,97,115,32,112,114, -111,98,97,98,108,121,108,105,110,107,32,98,101,116,119,101,101,110,112,114,111, -102,101,115,115,111,114,32,111,102,105,110,116,101,114,97,99,116,105,111,110,115 -,99,104,97,110,103,105,110,103,32,116,104,101,73,110,100,105,97,110,32,79,99,101 -,97,110,32,99,108,97,115,115,61,34,108,97,115,116,119,111,114,107,105,110,103,32 -,119,105,116,104,39,104,116,116,112,58,47,47,119,119,119,46,121,101,97,114,115, -32,98,101,102,111,114,101,84,104,105,115,32,119,97,115,32,116,104,101,114,101,99 -,114,101,97,116,105,111,110,97,108,101,110,116,101,114,105,110,103,32,116,104, -101,109,101,97,115,117,114,101,109,101,110,116,115,97,110,32,101,120,116,114,101 -,109,101,108,121,118,97,108,117,101,32,111,102,32,116,104,101,115,116,97,114,116 -,32,111,102,32,116,104,101,10,60,47,115,99,114,105,112,116,62,10,10,97,110,32, -101,102,102,111,114,116,32,116,111,105,110,99,114,101,97,115,101,32,116,104,101, -116,111,32,116,104,101,32,115,111,117,116,104,115,112,97,99,105,110,103,61,34,48 -,34,62,115,117,102,102,105,99,105,101,110,116,108,121,116,104,101,32,69,117,114, -111,112,101,97,110,99,111,110,118,101,114,116,101,100,32,116,111,99,108,101,97, -114,84,105,109,101,111,117,116,100,105,100,32,110,111,116,32,104,97,118,101,99, -111,110,115,101,113,117,101,110,116,108,121,102,111,114,32,116,104,101,32,110, -101,120,116,101,120,116,101,110,115,105,111,110,32,111,102,101,99,111,110,111, -109,105,99,32,97,110,100,97,108,116,104,111,117,103,104,32,116,104,101,97,114, -101,32,112,114,111,100,117,99,101,100,97,110,100,32,119,105,116,104,32,116,104, -101,105,110,115,117,102,102,105,99,105,101,110,116,103,105,118,101,110,32,98,121 -,32,116,104,101,115,116,97,116,105,110,103,32,116,104,97,116,101,120,112,101,110 -,100,105,116,117,114,101,115,60,47,115,112,97,110,62,60,47,97,62,10,116,104,111, -117,103,104,116,32,116,104,97,116,111,110,32,116,104,101,32,98,97,115,105,115,99 -,101,108,108,112,97,100,100,105,110,103,61,105,109,97,103,101,32,111,102,32,116, -104,101,114,101,116,117,114,110,105,110,103,32,116,111,105,110,102,111,114,109, -97,116,105,111,110,44,115,101,112,97,114,97,116,101,100,32,98,121,97,115,115,97, -115,115,105,110,97,116,101,100,115,34,32,99,111,110,116,101,110,116,61,34,97,117 -,116,104,111,114,105,116,121,32,111,102,110,111,114,116,104,119,101,115,116,101, -114,110,60,47,100,105,118,62,10,60,100,105,118,32,34,62,60,47,100,105,118,62,13, -10,32,32,99,111,110,115,117,108,116,97,116,105,111,110,99,111,109,109,117,110, -105,116,121,32,111,102,116,104,101,32,110,97,116,105,111,110,97,108,105,116,32, -115,104,111,117,108,100,32,98,101,112,97,114,116,105,99,105,112,97,110,116,115, -32,97,108,105,103,110,61,34,108,101,102,116,116,104,101,32,103,114,101,97,116, -101,115,116,115,101,108,101,99,116,105,111,110,32,111,102,115,117,112,101,114, -110,97,116,117,114,97,108,100,101,112,101,110,100,101,110,116,32,111,110,105,115 -,32,109,101,110,116,105,111,110,101,100,97,108,108,111,119,105,110,103,32,116, -104,101,119,97,115,32,105,110,118,101,110,116,101,100,97,99,99,111,109,112,97, -110,121,105,110,103,104,105,115,32,112,101,114,115,111,110,97,108,97,118,97,105, -108,97,98,108,101,32,97,116,115,116,117,100,121,32,111,102,32,116,104,101,111, -110,32,116,104,101,32,111,116,104,101,114,101,120,101,99,117,116,105,111,110,32, -111,102,72,117,109,97,110,32,82,105,103,104,116,115,116,101,114,109,115,32,111, -102,32,116,104,101,97,115,115,111,99,105,97,116,105,111,110,115,114,101,115,101, -97,114,99,104,32,97,110,100,115,117,99,99,101,101,100,101,100,32,98,121,100,101, -102,101,97,116,101,100,32,116,104,101,97,110,100,32,102,114,111,109,32,116,104, -101,98,117,116,32,116,104,101,121,32,97,114,101,99,111,109,109,97,110,100,101, -114,32,111,102,115,116,97,116,101,32,111,102,32,116,104,101,121,101,97,114,115, -32,111,102,32,97,103,101,116,104,101,32,115,116,117,100,121,32,111,102,60,117, -108,32,99,108,97,115,115,61,34,115,112,108,97,99,101,32,105,110,32,116,104,101, -119,104,101,114,101,32,104,101,32,119,97,115,60,108,105,32,99,108,97,115,115,61, -34,102,116,104,101,114,101,32,97,114,101,32,110,111,119,104,105,99,104,32,98,101 -,99,97,109,101,104,101,32,112,117,98,108,105,115,104,101,100,101,120,112,114,101 -,115,115,101,100,32,105,110,116,111,32,119,104,105,99,104,32,116,104,101,99,111, -109,109,105,115,115,105,111,110,101,114,102,111,110,116,45,119,101,105,103,104, -116,58,116,101,114,114,105,116,111,114,121,32,111,102,101,120,116,101,110,115, -105,111,110,115,34,62,82,111,109,97,110,32,69,109,112,105,114,101,101,113,117,97 -,108,32,116,111,32,116,104,101,73,110,32,99,111,110,116,114,97,115,116,44,104, -111,119,101,118,101,114,44,32,97,110,100,105,115,32,116,121,112,105,99,97,108, -108,121,97,110,100,32,104,105,115,32,119,105,102,101,40,97,108,115,111,32,99,97, -108,108,101,100,62,60,117,108,32,99,108,97,115,115,61,34,101,102,102,101,99,116, -105,118,101,108,121,32,101,118,111,108,118,101,100,32,105,110,116,111,115,101, -101,109,32,116,111,32,104,97,118,101,119,104,105,99,104,32,105,115,32,116,104, -101,116,104,101,114,101,32,119,97,115,32,110,111,97,110,32,101,120,99,101,108, -108,101,110,116,97,108,108,32,111,102,32,116,104,101,115,101,100,101,115,99,114, -105,98,101,100,32,98,121,73,110,32,112,114,97,99,116,105,99,101,44,98,114,111,97 -,100,99,97,115,116,105,110,103,99,104,97,114,103,101,100,32,119,105,116,104,114, -101,102,108,101,99,116,101,100,32,105,110,115,117,98,106,101,99,116,101,100,32, -116,111,109,105,108,105,116,97,114,121,32,97,110,100,116,111,32,116,104,101,32, -112,111,105,110,116,101,99,111,110,111,109,105,99,97,108,108,121,115,101,116,84, -97,114,103,101,116,105,110,103,97,114,101,32,97,99,116,117,97,108,108,121,118, -105,99,116,111,114,121,32,111,118,101,114,40,41,59,60,47,115,99,114,105,112,116, -62,99,111,110,116,105,110,117,111,117,115,108,121,114,101,113,117,105,114,101, -100,32,102,111,114,101,118,111,108,117,116,105,111,110,97,114,121,97,110,32,101, -102,102,101,99,116,105,118,101,110,111,114,116,104,32,111,102,32,116,104,101,44, -32,119,104,105,99,104,32,119,97,115,32,102,114,111,110,116,32,111,102,32,116,104 -,101,111,114,32,111,116,104,101,114,119,105,115,101,115,111,109,101,32,102,111, -114,109,32,111,102,104,97,100,32,110,111,116,32,98,101,101,110,103,101,110,101, -114,97,116,101,100,32,98,121,105,110,102,111,114,109,97,116,105,111,110,46,112, -101,114,109,105,116,116,101,100,32,116,111,105,110,99,108,117,100,101,115,32,116 -,104,101,100,101,118,101,108,111,112,109,101,110,116,44,101,110,116,101,114,101, -100,32,105,110,116,111,116,104,101,32,112,114,101,118,105,111,117,115,99,111,110 -,115,105,115,116,101,110,116,108,121,97,114,101,32,107,110,111,119,110,32,97,115 -,116,104,101,32,102,105,101,108,100,32,111,102,116,104,105,115,32,116,121,112, -101,32,111,102,103,105,118,101,110,32,116,111,32,116,104,101,116,104,101,32,116, -105,116,108,101,32,111,102,99,111,110,116,97,105,110,115,32,116,104,101,105,110, -115,116,97,110,99,101,115,32,111,102,105,110,32,116,104,101,32,110,111,114,116, -104,100,117,101,32,116,111,32,116,104,101,105,114,97,114,101,32,100,101,115,105, -103,110,101,100,99,111,114,112,111,114,97,116,105,111,110,115,119,97,115,32,116, -104,97,116,32,116,104,101,111,110,101,32,111,102,32,116,104,101,115,101,109,111, -114,101,32,112,111,112,117,108,97,114,115,117,99,99,101,101,100,101,100,32,105, -110,115,117,112,112,111,114,116,32,102,114,111,109,105,110,32,100,105,102,102, -101,114,101,110,116,100,111,109,105,110,97,116,101,100,32,98,121,100,101,115,105 -,103,110,101,100,32,102,111,114,111,119,110,101,114,115,104,105,112,32,111,102, -97,110,100,32,112,111,115,115,105,98,108,121,115,116,97,110,100,97,114,100,105, -122,101,100,114,101,115,112,111,110,115,101,84,101,120,116,119,97,115,32,105,110 -,116,101,110,100,101,100,114,101,99,101,105,118,101,100,32,116,104,101,97,115, -115,117,109,101,100,32,116,104,97,116,97,114,101,97,115,32,111,102,32,116,104, -101,112,114,105,109,97,114,105,108,121,32,105,110,116,104,101,32,98,97,115,105, -115,32,111,102,105,110,32,116,104,101,32,115,101,110,115,101,97,99,99,111,117, -110,116,115,32,102,111,114,100,101,115,116,114,111,121,101,100,32,98,121,97,116, -32,108,101,97,115,116,32,116,119,111,119,97,115,32,100,101,99,108,97,114,101,100 -,99,111,117,108,100,32,110,111,116,32,98,101,83,101,99,114,101,116,97,114,121,32 -,111,102,97,112,112,101,97,114,32,116,111,32,98,101,109,97,114,103,105,110,45, -116,111,112,58,49,47,94,92,115,43,124,92,115,43,36,47,103,101,41,123,116,104,114 -,111,119,32,101,125,59,116,104,101,32,115,116,97,114,116,32,111,102,116,119,111, -32,115,101,112,97,114,97,116,101,108,97,110,103,117,97,103,101,32,97,110,100,119 -,104,111,32,104,97,100,32,98,101,101,110,111,112,101,114,97,116,105,111,110,32, -111,102,100,101,97,116,104,32,111,102,32,116,104,101,114,101,97,108,32,110,117, -109,98,101,114,115,9,60,108,105,110,107,32,114,101,108,61,34,112,114,111,118,105 -,100,101,100,32,116,104,101,116,104,101,32,115,116,111,114,121,32,111,102,99,111 -,109,112,101,116,105,116,105,111,110,115,101,110,103,108,105,115,104,32,40,85,75 -,41,101,110,103,108,105,115,104,32,40,85,83,41,208,156,208,190,208,189,208,179, -208,190,208,187,208,161,209,128,208,191,209,129,208,186,208,184,209,129,209,128, -208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,190, -217,132,216,185,216,177,216,168,217,138,216,169,230,173,163,233,171,148,228,184, -173,230,150,135,231,174,128,228,189,147,228,184,173,230,150,135,231,185,129,228, -189,147,228,184,173,230,150,135,230,156,137,233,153,144,229,133,172,229,143,184, -228,186,186,230,176,145,230,148,191,229,186,156,233,152,191,233,135,140,229,183, -180,229,183,180,231,164,190,228,188,154,228,184,187,228,185,137,230,147,141,228, -189,156,231,179,187,231,187,159,230,148,191,231,173,150,230,179,149,232,167,132, -105,110,102,111,114,109,97,99,105,195,179,110,104,101,114,114,97,109,105,101,110 -,116,97,115,101,108,101,99,116,114,195,179,110,105,99,111,100,101,115,99,114,105 -,112,99,105,195,179,110,99,108,97,115,105,102,105,99,97,100,111,115,99,111,110, -111,99,105,109,105,101,110,116,111,112,117,98,108,105,99,97,99,105,195,179,110, -114,101,108,97,99,105,111,110,97,100,97,115,105,110,102,111,114,109,195,161,116, -105,99,97,114,101,108,97,99,105,111,110,97,100,111,115,100,101,112,97,114,116,97 -,109,101,110,116,111,116,114,97,98,97,106,97,100,111,114,101,115,100,105,114,101 -,99,116,97,109,101,110,116,101,97,121,117,110,116,97,109,105,101,110,116,111,109 -,101,114,99,97,100,111,76,105,98,114,101,99,111,110,116,195,161,99,116,101,110, -111,115,104,97,98,105,116,97,99,105,111,110,101,115,99,117,109,112,108,105,109, -105,101,110,116,111,114,101,115,116,97,117,114,97,110,116,101,115,100,105,115, -112,111,115,105,99,105,195,179,110,99,111,110,115,101,99,117,101,110,99,105,97, -101,108,101,99,116,114,195,179,110,105,99,97,97,112,108,105,99,97,99,105,111,110 -,101,115,100,101,115,99,111,110,101,99,116,97,100,111,105,110,115,116,97,108,97, -99,105,195,179,110,114,101,97,108,105,122,97,99,105,195,179,110,117,116,105,108, -105,122,97,99,105,195,179,110,101,110,99,105,99,108,111,112,101,100,105,97,101, -110,102,101,114,109,101,100,97,100,101,115,105,110,115,116,114,117,109,101,110, -116,111,115,101,120,112,101,114,105,101,110,99,105,97,115,105,110,115,116,105, -116,117,99,105,195,179,110,112,97,114,116,105,99,117,108,97,114,101,115,115,117, -98,99,97,116,101,103,111,114,105,97,209,130,208,190,208,187,209,140,208,186,208, -190,208,160,208,190,209,129,209,129,208,184,208,184,209,128,208,176,208,177,208, -190,209,130,209,139,208,177,208,190,208,187,209,140,209,136,208,181,208,191,209, -128,208,190,209,129,209,130,208,190,208,188,208,190,208,182,208,181,209,130,208, -181,208,180,209,128,209,131,208,179,208,184,209,133,209,129,208,187,209,131,209, -135,208,176,208,181,209,129,208,181,208,185,209,135,208,176,209,129,208,178,209, -129,208,181,208,179,208,180,208,176,208,160,208,190,209,129,209,129,208,184,209, -143,208,156,208,190,209,129,208,186,208,178,208,181,208,180,209,128,209,131,208, -179,208,184,208,181,208,179,208,190,209,128,208,190,208,180,208,176,208,178,208, -190,208,191,209,128,208,190,209,129,208,180,208,176,208,189,208,189,209,139,209, -133,208,180,208,190,208,187,208,182,208,189,209,139,208,184,208,188,208,181,208, -189,208,189,208,190,208,156,208,190,209,129,208,186,208,178,209,139,209,128,209, -131,208,177,208,187,208,181,208,185,208,156,208,190,209,129,208,186,208,178,208, -176,209,129,209,130,209,128,208,176,208,189,209,139,208,189,208,184,209,135,208, -181,208,179,208,190,209,128,208,176,208,177,208,190,209,130,208,181,208,180,208, -190,208,187,208,182,208,181,208,189,209,131,209,129,208,187,209,131,208,179,208, -184,209,130,208,181,208,191,208,181,209,128,209,140,208,158,208,180,208,189,208, -176,208,186,208,190,208,191,208,190,209,130,208,190,208,188,209,131,209,128,208, -176,208,177,208,190,209,130,209,131,208,176,208,191,209,128,208,181,208,187,209, -143,208,178,208,190,208,190,208,177,209,137,208,181,208,190,208,180,208,189,208, -190,208,179,208,190,209,129,208,178,208,190,208,181,208,179,208,190,209,129,209, -130,208,176,209,130,209,140,208,184,208,180,209,128,209,131,208,179,208,190,208, -185,209,132,208,190,209,128,209,131,208,188,208,181,209,133,208,190,209,128,208, -190,209,136,208,190,208,191,209,128,208,190,209,130,208,184,208,178,209,129,209, -129,209,139,208,187,208,186,208,176,208,186,208,176,208,182,208,180,209,139,208, -185,208,178,208,187,208,176,209,129,209,130,208,184,208,179,209,128,209,131,208, -191,208,191,209,139,208,178,208,188,208,181,209,129,209,130,208,181,209,128,208, -176,208,177,208,190,209,130,208,176,209,129,208,186,208,176,208,183,208,176,208, -187,208,191,208,181,209,128,208,178,209,139,208,185,208,180,208,181,208,187,208, -176,209,130,209,140,208,180,208,181,208,189,209,140,208,179,208,184,208,191,208, -181,209,128,208,184,208,190,208,180,208,177,208,184,208,183,208,189,208,181,209, -129,208,190,209,129,208,189,208,190,208,178,208,181,208,188,208,190,208,188,208, -181,208,189,209,130,208,186,209,131,208,191,208,184,209,130,209,140,208,180,208, -190,208,187,208,182,208,189,208,176,209,128,208,176,208,188,208,186,208,176,209, -133,208,189,208,176,209,135,208,176,208,187,208,190,208,160,208,176,208,177,208, -190,209,130,208,176,208,162,208,190,208,187,209,140,208,186,208,190,209,129,208, -190,208,178,209,129,208,181,208,188,208,178,209,130,208,190,209,128,208,190,208, -185,208,189,208,176,209,135,208,176,208,187,208,176,209,129,208,191,208,184,209, -129,208,190,208,186,209,129,208,187,209,131,208,182,208,177,209,139,209,129,208, -184,209,129,209,130,208,181,208,188,208,191,208,181,209,135,208,176,209,130,208, -184,208,189,208,190,208,178,208,190,208,179,208,190,208,191,208,190,208,188,208, -190,209,137,208,184,209,129,208,176,208,185,209,130,208,190,208,178,208,191,208, -190,209,135,208,181,208,188,209,131,208,191,208,190,208,188,208,190,209,137,209, -140,208,180,208,190,208,187,208,182,208,189,208,190,209,129,209,129,209,139,208, -187,208,186,208,184,208,177,209,139,209,129,209,130,209,128,208,190,208,180,208, -176,208,189,208,189,209,139,208,181,208,188,208,189,208,190,208,179,208,184,208, -181,208,191,209,128,208,190,208,181,208,186,209,130,208,161,208,181,208,185,209, -135,208,176,209,129,208,188,208,190,208,180,208,181,208,187,208,184,209,130,208, -176,208,186,208,190,208,179,208,190,208,190,208,189,208,187,208,176,208,185,208, -189,208,179,208,190,209,128,208,190,208,180,208,181,208,178,208,181,209,128,209, -129,208,184,209,143,209,129,209,130,209,128,208,176,208,189,208,181,209,132,208, -184,208,187,209,140,208,188,209,139,209,131,209,128,208,190,208,178,208,189,209, -143,209,128,208,176,208,183,208,189,209,139,209,133,208,184,209,129,208,186,208, -176,209,130,209,140,208,189,208,181,208,180,208,181,208,187,209,142,209,143,208, -189,208,178,208,176,209,128,209,143,208,188,208,181,208,189,209,140,209,136,208, -181,208,188,208,189,208,190,208,179,208,184,209,133,208,180,208,176,208,189,208, -189,208,190,208,185,208,183,208,189,208,176,209,135,208,184,209,130,208,189,208, -181,208,187,209,140,208,183,209,143,209,132,208,190,209,128,209,131,208,188,208, -176,208,162,208,181,208,191,208,181,209,128,209,140,208,188,208,181,209,129,209, -143,209,134,208,176,208,183,208,176,209,137,208,184,209,130,209,139,208,155,209, -131,209,135,209,136,208,184,208,181,224,164,168,224,164,185,224,165,128,224,164, -130,224,164,149,224,164,176,224,164,168,224,165,135,224,164,133,224,164,170,224, -164,168,224,165,135,224,164,149,224,164,191,224,164,175,224,164,190,224,164,149, -224,164,176,224,165,135,224,164,130,224,164,133,224,164,168,224,165,141,224,164, -175,224,164,149,224,165,141,224,164,175,224,164,190,224,164,151,224,164,190,224, -164,135,224,164,161,224,164,172,224,164,190,224,164,176,224,165,135,224,164,149, -224,164,191,224,164,184,224,165,128,224,164,166,224,164,191,224,164,175,224,164, -190,224,164,170,224,164,185,224,164,178,224,165,135,224,164,184,224,164,191,224, -164,130,224,164,185,224,164,173,224,164,190,224,164,176,224,164,164,224,164,133, -224,164,170,224,164,168,224,165,128,224,164,181,224,164,190,224,164,178,224,165, -135,224,164,184,224,165,135,224,164,181,224,164,190,224,164,149,224,164,176,224, -164,164,224,165,135,224,164,174,224,165,135,224,164,176,224,165,135,224,164,185, -224,165,139,224,164,168,224,165,135,224,164,184,224,164,149,224,164,164,224,165, -135,224,164,172,224,164,185,224,165,129,224,164,164,224,164,184,224,164,190,224, -164,135,224,164,159,224,164,185,224,165,139,224,164,151,224,164,190,224,164,156, -224,164,190,224,164,168,224,165,135,224,164,174,224,164,191,224,164,168,224,164, -159,224,164,149,224,164,176,224,164,164,224,164,190,224,164,149,224,164,176,224, -164,168,224,164,190,224,164,137,224,164,168,224,164,149,224,165,135,224,164,175, -224,164,185,224,164,190,224,164,129,224,164,184,224,164,172,224,164,184,224,165, -135,224,164,173,224,164,190,224,164,183,224,164,190,224,164,134,224,164,170,224, -164,149,224,165,135,224,164,178,224,164,191,224,164,175,224,165,135,224,164,182, -224,165,129,224,164,176,224,165,130,224,164,135,224,164,184,224,164,149,224,165, -135,224,164,152,224,164,130,224,164,159,224,165,135,224,164,174,224,165,135,224, -164,176,224,165,128,224,164,184,224,164,149,224,164,164,224,164,190,224,164,174, -224,165,135,224,164,176,224,164,190,224,164,178,224,165,135,224,164,149,224,164, -176,224,164,133,224,164,167,224,164,191,224,164,149,224,164,133,224,164,170,224, -164,168,224,164,190,224,164,184,224,164,174,224,164,190,224,164,156,224,164,174, -224,165,129,224,164,157,224,165,135,224,164,149,224,164,190,224,164,176,224,164, -163,224,164,185,224,165,139,224,164,164,224,164,190,224,164,149,224,164,161,224, -164,188,224,165,128,224,164,175,224,164,185,224,164,190,224,164,130,224,164,185, -224,165,139,224,164,159,224,164,178,224,164,182,224,164,172,224,165,141,224,164, -166,224,164,178,224,164,191,224,164,175,224,164,190,224,164,156,224,165,128,224, -164,181,224,164,168,224,164,156,224,164,190,224,164,164,224,164,190,224,164,149, -224,165,136,224,164,184,224,165,135,224,164,134,224,164,170,224,164,149,224,164, -190,224,164,181,224,164,190,224,164,178,224,165,128,224,164,166,224,165,135,224, -164,168,224,165,135,224,164,170,224,165,130,224,164,176,224,165,128,224,164,170, -224,164,190,224,164,168,224,165,128,224,164,137,224,164,184,224,164,149,224,165, -135,224,164,185,224,165,139,224,164,151,224,165,128,224,164,172,224,165,136,224, -164,160,224,164,149,224,164,134,224,164,170,224,164,149,224,165,128,224,164,181, -224,164,176,224,165,141,224,164,183,224,164,151,224,164,190,224,164,130,224,164, -181,224,164,134,224,164,170,224,164,149,224,165,139,224,164,156,224,164,191,224, -164,178,224,164,190,224,164,156,224,164,190,224,164,168,224,164,190,224,164,184, -224,164,185,224,164,174,224,164,164,224,164,185,224,164,174,224,165,135,224,164, -130,224,164,137,224,164,168,224,164,149,224,165,128,224,164,175,224,164,190,224, -164,185,224,165,130,224,164,166,224,164,176,224,165,141,224,164,156,224,164,184, -224,165,130,224,164,154,224,165,128,224,164,170,224,164,184,224,164,130,224,164, -166,224,164,184,224,164,181,224,164,190,224,164,178,224,164,185,224,165,139,224, -164,168,224,164,190,224,164,185,224,165,139,224,164,164,224,165,128,224,164,156, -224,165,136,224,164,184,224,165,135,224,164,181,224,164,190,224,164,170,224,164, -184,224,164,156,224,164,168,224,164,164,224,164,190,224,164,168,224,165,135,224, -164,164,224,164,190,224,164,156,224,164,190,224,164,176,224,165,128,224,164,152, -224,164,190,224,164,175,224,164,178,224,164,156,224,164,191,224,164,178,224,165, -135,224,164,168,224,165,128,224,164,154,224,165,135,224,164,156,224,164,190,224, -164,130,224,164,154,224,164,170,224,164,164,224,165,141,224,164,176,224,164,151, -224,165,130,224,164,151,224,164,178,224,164,156,224,164,190,224,164,164,224,165, -135,224,164,172,224,164,190,224,164,185,224,164,176,224,164,134,224,164,170,224, -164,168,224,165,135,224,164,181,224,164,190,224,164,185,224,164,168,224,164,135, -224,164,184,224,164,149,224,164,190,224,164,184,224,165,129,224,164,172,224,164, -185,224,164,176,224,164,185,224,164,168,224,165,135,224,164,135,224,164,184,224, -164,184,224,165,135,224,164,184,224,164,185,224,164,191,224,164,164,224,164,172, -224,164,161,224,164,188,224,165,135,224,164,152,224,164,159,224,164,168,224,164, -190,224,164,164,224,164,178,224,164,190,224,164,182,224,164,170,224,164,190,224, -164,130,224,164,154,224,164,182,224,165,141,224,164,176,224,165,128,224,164,172, -224,164,161,224,164,188,224,165,128,224,164,185,224,165,139,224,164,164,224,165, -135,224,164,184,224,164,190,224,164,136,224,164,159,224,164,182,224,164,190,224, -164,175,224,164,166,224,164,184,224,164,149,224,164,164,224,165,128,224,164,156, -224,164,190,224,164,164,224,165,128,224,164,181,224,164,190,224,164,178,224,164, -190,224,164,185,224,164,156,224,164,190,224,164,176,224,164,170,224,164,159,224, -164,168,224,164,190,224,164,176,224,164,150,224,164,168,224,165,135,224,164,184, -224,164,161,224,164,188,224,164,149,224,164,174,224,164,191,224,164,178,224,164, -190,224,164,137,224,164,184,224,164,149,224,165,128,224,164,149,224,165,135,224, -164,181,224,164,178,224,164,178,224,164,151,224,164,164,224,164,190,224,164,150, -224,164,190,224,164,168,224,164,190,224,164,133,224,164,176,224,165,141,224,164, -165,224,164,156,224,164,185,224,164,190,224,164,130,224,164,166,224,165,135,224, -164,150,224,164,190,224,164,170,224,164,185,224,164,178,224,165,128,224,164,168, -224,164,191,224,164,175,224,164,174,224,164,172,224,164,191,224,164,168,224,164, -190,224,164,172,224,165,136,224,164,130,224,164,149,224,164,149,224,164,185,224, -165,128,224,164,130,224,164,149,224,164,185,224,164,168,224,164,190,224,164,166, -224,165,135,224,164,164,224,164,190,224,164,185,224,164,174,224,164,178,224,165, -135,224,164,149,224,164,190,224,164,171,224,165,128,224,164,156,224,164,172,224, -164,149,224,164,191,224,164,164,224,165,129,224,164,176,224,164,164,224,164,174, -224,164,190,224,164,130,224,164,151,224,164,181,224,164,185,224,165,128,224,164, -130,224,164,176,224,165,139,224,164,156,224,164,188,224,164,174,224,164,191,224, -164,178,224,165,128,224,164,134,224,164,176,224,165,139,224,164,170,224,164,184, -224,165,135,224,164,168,224,164,190,224,164,175,224,164,190,224,164,166,224,164, -181,224,164,178,224,165,135,224,164,168,224,165,135,224,164,150,224,164,190,224, -164,164,224,164,190,224,164,149,224,164,176,224,165,128,224,164,172,224,164,137, -224,164,168,224,164,149,224,164,190,224,164,156,224,164,181,224,164,190,224,164, -172,224,164,170,224,165,130,224,164,176,224,164,190,224,164,172,224,164,161,224, -164,188,224,164,190,224,164,184,224,165,140,224,164,166,224,164,190,224,164,182, -224,165,135,224,164,175,224,164,176,224,164,149,224,164,191,224,164,175,224,165, -135,224,164,149,224,164,185,224,164,190,224,164,130,224,164,133,224,164,149,224, -164,184,224,164,176,224,164,172,224,164,168,224,164,190,224,164,143,224,164,181, -224,164,185,224,164,190,224,164,130,224,164,184,224,165,141,224,164,165,224,164, -178,224,164,174,224,164,191,224,164,178,224,165,135,224,164,178,224,165,135,224, -164,150,224,164,149,224,164,181,224,164,191,224,164,183,224,164,175,224,164,149, -224,165,141,224,164,176,224,164,130,224,164,184,224,164,174,224,165,130,224,164, -185,224,164,165,224,164,190,224,164,168,224,164,190,216,170,216,179,216,170,216, -183,217,138,216,185,217,133,216,180,216,167,216,177,217,131,216,169,216,168,217, -136,216,167,216,179,216,183,216,169,216,167,217,132,216,181,217,129,216,173,216, -169,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,174,216, -167,216,181,216,169,216,167,217,132,217,133,216,178,217,138,216,175,216,167,217, -132,216,185,216,167,217,133,216,169,216,167,217,132,217,131,216,167,216,170,216, -168,216,167,217,132,216,177,216,175,217,136,216,175,216,168,216,177,217,134,216, -167,217,133,216,172,216,167,217,132,216,175,217,136,217,132,216,169,216,167,217, -132,216,185,216,167,217,132,217,133,216,167,217,132,217,133,217,136,217,130,216, -185,216,167,217,132,216,185,216,177,216,168,217,138,216,167,217,132,216,179,216, -177,217,138,216,185,216,167,217,132,216,172,217,136,216,167,217,132,216,167,217, -132,216,176,217,135,216,167,216,168,216,167,217,132,216,173,217,138,216,167,216, -169,216,167,217,132,216,173,217,130,217,136,217,130,216,167,217,132,217,131,216, -177,217,138,217,133,216,167,217,132,216,185,216,177,216,167,217,130,217,133,216, -173,217,129,217,136,216,184,216,169,216,167,217,132,216,171,216,167,217,134,217, -138,217,133,216,180,216,167,217,135,216,175,216,169,216,167,217,132,217,133,216, -177,216,163,216,169,216,167,217,132,217,130,216,177,216,162,217,134,216,167,217, -132,216,180,216,168,216,167,216,168,216,167,217,132,216,173,217,136,216,167,216, -177,216,167,217,132,216,172,216,175,217,138,216,175,216,167,217,132,216,163,216, -179,216,177,216,169,216,167,217,132,216,185,217,132,217,136,217,133,217,133,216, -172,217,133,217,136,216,185,216,169,216,167,217,132,216,177,216,173,217,133,217, -134,216,167,217,132,217,134,217,130,216,167,216,183,217,129,217,132,216,179,216, -183,217,138,217,134,216,167,217,132,217,131,217,136,217,138,216,170,216,167,217, -132,216,175,217,134,217,138,216,167,216,168,216,177,217,131,216,167,216,170,217, -135,216,167,217,132,216,177,217,138,216,167,216,182,216,170,216,173,217,138,216, -167,216,170,217,138,216,168,216,170,217,136,217,130,217,138,216,170,216,167,217, -132,216,163,217,136,217,132,217,137,216,167,217,132,216,168,216,177,217,138,216, -175,216,167,217,132,217,131,217,132,216,167,217,133,216,167,217,132,216,177,216, -167,216,168,216,183,216,167,217,132,216,180,216,174,216,181,217,138,216,179,217, -138,216,167,216,177,216,167,216,170,216,167,217,132,216,171,216,167,217,132,216, -171,216,167,217,132,216,181,217,132,216,167,216,169,216,167,217,132,216,173,216, -175,217,138,216,171,216,167,217,132,216,178,217,136,216,167,216,177,216,167,217, -132,216,174,217,132,217,138,216,172,216,167,217,132,216,172,217,133,217,138,216, -185,216,167,217,132,216,185,216,167,217,133,217,135,216,167,217,132,216,172,217, -133,216,167,217,132,216,167,217,132,216,179,216,167,216,185,216,169,217,133,216, -180,216,167,217,135,216,175,217,135,216,167,217,132,216,177,216,166,217,138,216, -179,216,167,217,132,216,175,216,174,217,136,217,132,216,167,217,132,217,129,217, -134,217,138,216,169,216,167,217,132,217,131,216,170,216,167,216,168,216,167,217, -132,216,175,217,136,216,177,217,138,216,167,217,132,216,175,216,177,217,136,216, -179,216,167,216,179,216,170,216,186,216,177,217,130,216,170,216,181,216,167,217, -133,217,138,217,133,216,167,217,132,216,168,217,134,216,167,216,170,216,167,217, -132,216,185,216,184,217,138,217,133,101,110,116,101,114,116,97,105,110,109,101, -110,116,117,110,100,101,114,115,116,97,110,100,105,110,103,32,61,32,102,117,110, -99,116,105,111,110,40,41,46,106,112,103,34,32,119,105,100,116,104,61,34,99,111, -110,102,105,103,117,114,97,116,105,111,110,46,112,110,103,34,32,119,105,100,116, -104,61,34,60,98,111,100,121,32,99,108,97,115,115,61,34,77,97,116,104,46,114,97, -110,100,111,109,40,41,99,111,110,116,101,109,112,111,114,97,114,121,32,85,110, -105,116,101,100,32,83,116,97,116,101,115,99,105,114,99,117,109,115,116,97,110,99 -,101,115,46,97,112,112,101,110,100,67,104,105,108,100,40,111,114,103,97,110,105, -122,97,116,105,111,110,115,60,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60 -,105,109,103,32,115,114,99,61,34,47,100,105,115,116,105,110,103,117,105,115,104, -101,100,116,104,111,117,115,97,110,100,115,32,111,102,32,99,111,109,109,117,110, -105,99,97,116,105,111,110,99,108,101,97,114,34,62,60,47,100,105,118,62,105,110, -118,101,115,116,105,103,97,116,105,111,110,102,97,118,105,99,111,110,46,105,99, -111,34,32,109,97,114,103,105,110,45,114,105,103,104,116,58,98,97,115,101,100,32, -111,110,32,116,104,101,32,77,97,115,115,97,99,104,117,115,101,116,116,115,116,97 -,98,108,101,32,98,111,114,100,101,114,61,105,110,116,101,114,110,97,116,105,111, -110,97,108,97,108,115,111,32,107,110,111,119,110,32,97,115,112,114,111,110,117, -110,99,105,97,116,105,111,110,98,97,99,107,103,114,111,117,110,100,58,35,102,112 -,97,100,100,105,110,103,45,108,101,102,116,58,70,111,114,32,101,120,97,109,112, -108,101,44,32,109,105,115,99,101,108,108,97,110,101,111,117,115,38,108,116,59,47 -,109,97,116,104,38,103,116,59,112,115,121,99,104,111,108,111,103,105,99,97,108, -105,110,32,112,97,114,116,105,99,117,108,97,114,101,97,114,99,104,34,32,116,121, -112,101,61,34,102,111,114,109,32,109,101,116,104,111,100,61,34,97,115,32,111,112 -,112,111,115,101,100,32,116,111,83,117,112,114,101,109,101,32,67,111,117,114,116 -,111,99,99,97,115,105,111,110,97,108,108,121,32,65,100,100,105,116,105,111,110, -97,108,108,121,44,78,111,114,116,104,32,65,109,101,114,105,99,97,112,120,59,98, -97,99,107,103,114,111,117,110,100,111,112,112,111,114,116,117,110,105,116,105, -101,115,69,110,116,101,114,116,97,105,110,109,101,110,116,46,116,111,76,111,119, -101,114,67,97,115,101,40,109,97,110,117,102,97,99,116,117,114,105,110,103,112, -114,111,102,101,115,115,105,111,110,97,108,32,99,111,109,98,105,110,101,100,32, -119,105,116,104,70,111,114,32,105,110,115,116,97,110,99,101,44,99,111,110,115, -105,115,116,105,110,103,32,111,102,34,32,109,97,120,108,101,110,103,116,104,61, -34,114,101,116,117,114,110,32,102,97,108,115,101,59,99,111,110,115,99,105,111, -117,115,110,101,115,115,77,101,100,105,116,101,114,114,97,110,101,97,110,101,120 -,116,114,97,111,114,100,105,110,97,114,121,97,115,115,97,115,115,105,110,97,116, -105,111,110,115,117,98,115,101,113,117,101,110,116,108,121,32,98,117,116,116,111 -,110,32,116,121,112,101,61,34,116,104,101,32,110,117,109,98,101,114,32,111,102, -116,104,101,32,111,114,105,103,105,110,97,108,32,99,111,109,112,114,101,104,101, -110,115,105,118,101,114,101,102,101,114,115,32,116,111,32,116,104,101,60,47,117, -108,62,10,60,47,100,105,118,62,10,112,104,105,108,111,115,111,112,104,105,99,97, -108,108,111,99,97,116,105,111,110,46,104,114,101,102,119,97,115,32,112,117,98, -108,105,115,104,101,100,83,97,110,32,70,114,97,110,99,105,115,99,111,40,102,117, -110,99,116,105,111,110,40,41,123,10,60,100,105,118,32,105,100,61,34,109,97,105, -110,115,111,112,104,105,115,116,105,99,97,116,101,100,109,97,116,104,101,109,97, -116,105,99,97,108,32,47,104,101,97,100,62,13,10,60,98,111,100,121,115,117,103, -103,101,115,116,115,32,116,104,97,116,100,111,99,117,109,101,110,116,97,116,105, -111,110,99,111,110,99,101,110,116,114,97,116,105,111,110,114,101,108,97,116,105, -111,110,115,104,105,112,115,109,97,121,32,104,97,118,101,32,98,101,101,110,40, -102,111,114,32,101,120,97,109,112,108,101,44,84,104,105,115,32,97,114,116,105,99 -,108,101,32,105,110,32,115,111,109,101,32,99,97,115,101,115,112,97,114,116,115, -32,111,102,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102, -71,114,101,97,116,32,66,114,105,116,97,105,110,32,99,101,108,108,112,97,100,100, -105,110,103,61,101,113,117,105,118,97,108,101,110,116,32,116,111,112,108,97,99, -101,104,111,108,100,101,114,61,34,59,32,102,111,110,116,45,115,105,122,101,58,32 -,106,117,115,116,105,102,105,99,97,116,105,111,110,98,101,108,105,101,118,101, -100,32,116,104,97,116,115,117,102,102,101,114,101,100,32,102,114,111,109,97,116, -116,101,109,112,116,101,100,32,116,111,32,108,101,97,100,101,114,32,111,102,32, -116,104,101,99,114,105,112,116,34,32,115,114,99,61,34,47,40,102,117,110,99,116, -105,111,110,40,41,32,123,97,114,101,32,97,118,97,105,108,97,98,108,101,10,9,60, -108,105,110,107,32,114,101,108,61,34,32,115,114,99,61,39,104,116,116,112,58,47, -47,105,110,116,101,114,101,115,116,101,100,32,105,110,99,111,110,118,101,110,116 -,105,111,110,97,108,32,34,32,97,108,116,61,34,34,32,47,62,60,47,97,114,101,32, -103,101,110,101,114,97,108,108,121,104,97,115,32,97,108,115,111,32,98,101,101, -110,109,111,115,116,32,112,111,112,117,108,97,114,32,99,111,114,114,101,115,112, -111,110,100,105,110,103,99,114,101,100,105,116,101,100,32,119,105,116,104,116, -121,108,101,61,34,98,111,114,100,101,114,58,60,47,97,62,60,47,115,112,97,110,62, -60,47,46,103,105,102,34,32,119,105,100,116,104,61,34,60,105,102,114,97,109,101, -32,115,114,99,61,34,116,97,98,108,101,32,99,108,97,115,115,61,34,105,110,108,105 -,110,101,45,98,108,111,99,107,59,97,99,99,111,114,100,105,110,103,32,116,111,32, -116,111,103,101,116,104,101,114,32,119,105,116,104,97,112,112,114,111,120,105, -109,97,116,101,108,121,112,97,114,108,105,97,109,101,110,116,97,114,121,109,111, -114,101,32,97,110,100,32,109,111,114,101,100,105,115,112,108,97,121,58,110,111, -110,101,59,116,114,97,100,105,116,105,111,110,97,108,108,121,112,114,101,100,111 -,109,105,110,97,110,116,108,121,38,110,98,115,112,59,124,38,110,98,115,112,59,38 -,110,98,115,112,59,60,47,115,112,97,110,62,32,99,101,108,108,115,112,97,99,105, -110,103,61,60,105,110,112,117,116,32,110,97,109,101,61,34,111,114,34,32,99,111, -110,116,101,110,116,61,34,99,111,110,116,114,111,118,101,114,115,105,97,108,112, -114,111,112,101,114,116,121,61,34,111,103,58,47,120,45,115,104,111,99,107,119,97 -,118,101,45,100,101,109,111,110,115,116,114,97,116,105,111,110,115,117,114,114, -111,117,110,100,101,100,32,98,121,78,101,118,101,114,116,104,101,108,101,115,115 -,44,119,97,115,32,116,104,101,32,102,105,114,115,116,99,111,110,115,105,100,101, -114,97,98,108,101,32,65,108,116,104,111,117,103,104,32,116,104,101,32,99,111,108 -,108,97,98,111,114,97,116,105,111,110,115,104,111,117,108,100,32,110,111,116,32, -98,101,112,114,111,112,111,114,116,105,111,110,32,111,102,60,115,112,97,110,32, -115,116,121,108,101,61,34,107,110,111,119,110,32,97,115,32,116,104,101,32,115, -104,111,114,116,108,121,32,97,102,116,101,114,102,111,114,32,105,110,115,116,97, -110,99,101,44,100,101,115,99,114,105,98,101,100,32,97,115,32,47,104,101,97,100, -62,10,60,98,111,100,121,32,115,116,97,114,116,105,110,103,32,119,105,116,104,105 -,110,99,114,101,97,115,105,110,103,108,121,32,116,104,101,32,102,97,99,116,32, -116,104,97,116,100,105,115,99,117,115,115,105,111,110,32,111,102,109,105,100,100 -,108,101,32,111,102,32,116,104,101,97,110,32,105,110,100,105,118,105,100,117,97, -108,100,105,102,102,105,99,117,108,116,32,116,111,32,112,111,105,110,116,32,111, -102,32,118,105,101,119,104,111,109,111,115,101,120,117,97,108,105,116,121,97,99, -99,101,112,116,97,110,99,101,32,111,102,60,47,115,112,97,110,62,60,47,100,105, -118,62,109,97,110,117,102,97,99,116,117,114,101,114,115,111,114,105,103,105,110, -32,111,102,32,116,104,101,99,111,109,109,111,110,108,121,32,117,115,101,100,105, -109,112,111,114,116,97,110,99,101,32,111,102,100,101,110,111,109,105,110,97,116, -105,111,110,115,98,97,99,107,103,114,111,117,110,100,58,32,35,108,101,110,103, -116,104,32,111,102,32,116,104,101,100,101,116,101,114,109,105,110,97,116,105,111 -,110,97,32,115,105,103,110,105,102,105,99,97,110,116,34,32,98,111,114,100,101, -114,61,34,48,34,62,114,101,118,111,108,117,116,105,111,110,97,114,121,112,114, -105,110,99,105,112,108,101,115,32,111,102,105,115,32,99,111,110,115,105,100,101, -114,101,100,119,97,115,32,100,101,118,101,108,111,112,101,100,73,110,100,111,45, -69,117,114,111,112,101,97,110,118,117,108,110,101,114,97,98,108,101,32,116,111, -112,114,111,112,111,110,101,110,116,115,32,111,102,97,114,101,32,115,111,109,101 -,116,105,109,101,115,99,108,111,115,101,114,32,116,111,32,116,104,101,78,101,119 -,32,89,111,114,107,32,67,105,116,121,32,110,97,109,101,61,34,115,101,97,114,99, -104,97,116,116,114,105,98,117,116,101,100,32,116,111,99,111,117,114,115,101,32, -111,102,32,116,104,101,109,97,116,104,101,109,97,116,105,99,105,97,110,98,121,32 -,116,104,101,32,101,110,100,32,111,102,97,116,32,116,104,101,32,101,110,100,32, -111,102,34,32,98,111,114,100,101,114,61,34,48,34,32,116,101,99,104,110,111,108, -111,103,105,99,97,108,46,114,101,109,111,118,101,67,108,97,115,115,40,98,114,97, -110,99,104,32,111,102,32,116,104,101,101,118,105,100,101,110,99,101,32,116,104, -97,116,33,91,101,110,100,105,102,93,45,45,62,13,10,73,110,115,116,105,116,117, -116,101,32,111,102,32,105,110,116,111,32,97,32,115,105,110,103,108,101,114,101, -115,112,101,99,116,105,118,101,108,121,46,97,110,100,32,116,104,101,114,101,102, -111,114,101,112,114,111,112,101,114,116,105,101,115,32,111,102,105,115,32,108, -111,99,97,116,101,100,32,105,110,115,111,109,101,32,111,102,32,119,104,105,99, -104,84,104,101,114,101,32,105,115,32,97,108,115,111,99,111,110,116,105,110,117, -101,100,32,116,111,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,38,97, -109,112,59,110,100,97,115,104,59,32,100,101,115,99,114,105,98,101,115,32,116,104 -,101,99,111,110,115,105,100,101,114,97,116,105,111,110,97,117,116,104,111,114,32 -,111,102,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,108,121,101, -113,117,105,112,112,101,100,32,119,105,116,104,100,111,101,115,32,110,111,116,32 -,104,97,118,101,60,47,97,62,60,97,32,104,114,101,102,61,34,99,111,110,102,117, -115,101,100,32,119,105,116,104,60,108,105,110,107,32,104,114,101,102,61,34,47,97 -,116,32,116,104,101,32,97,103,101,32,111,102,97,112,112,101,97,114,32,105,110,32 -,116,104,101,84,104,101,115,101,32,105,110,99,108,117,100,101,114,101,103,97,114 -,100,108,101,115,115,32,111,102,99,111,117,108,100,32,98,101,32,117,115,101,100, -32,115,116,121,108,101,61,38,113,117,111,116,59,115,101,118,101,114,97,108,32, -116,105,109,101,115,114,101,112,114,101,115,101,110,116,32,116,104,101,98,111, -100,121,62,10,60,47,104,116,109,108,62,116,104,111,117,103,104,116,32,116,111,32 -,98,101,112,111,112,117,108,97,116,105,111,110,32,111,102,112,111,115,115,105,98 -,105,108,105,116,105,101,115,112,101,114,99,101,110,116,97,103,101,32,111,102,97 -,99,99,101,115,115,32,116,111,32,116,104,101,97,110,32,97,116,116,101,109,112, -116,32,116,111,112,114,111,100,117,99,116,105,111,110,32,111,102,106,113,117,101 -,114,121,47,106,113,117,101,114,121,116,119,111,32,100,105,102,102,101,114,101, -110,116,98,101,108,111,110,103,32,116,111,32,116,104,101,101,115,116,97,98,108, -105,115,104,109,101,110,116,114,101,112,108,97,99,105,110,103,32,116,104,101,100 -,101,115,99,114,105,112,116,105,111,110,34,32,100,101,116,101,114,109,105,110, -101,32,116,104,101,97,118,97,105,108,97,98,108,101,32,102,111,114,65,99,99,111, -114,100,105,110,103,32,116,111,32,119,105,100,101,32,114,97,110,103,101,32,111, -102,9,60,100,105,118,32,99,108,97,115,115,61,34,109,111,114,101,32,99,111,109, -109,111,110,108,121,111,114,103,97,110,105,115,97,116,105,111,110,115,102,117, -110,99,116,105,111,110,97,108,105,116,121,119,97,115,32,99,111,109,112,108,101, -116,101,100,32,38,97,109,112,59,109,100,97,115,104,59,32,112,97,114,116,105,99, -105,112,97,116,105,111,110,116,104,101,32,99,104,97,114,97,99,116,101,114,97,110 -,32,97,100,100,105,116,105,111,110,97,108,97,112,112,101,97,114,115,32,116,111, -32,98,101,102,97,99,116,32,116,104,97,116,32,116,104,101,97,110,32,101,120,97, -109,112,108,101,32,111,102,115,105,103,110,105,102,105,99,97,110,116,108,121,111 -,110,109,111,117,115,101,111,118,101,114,61,34,98,101,99,97,117,115,101,32,116, -104,101,121,32,97,115,121,110,99,32,61,32,116,114,117,101,59,112,114,111,98,108, -101,109,115,32,119,105,116,104,115,101,101,109,115,32,116,111,32,104,97,118,101, -116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,114,99,61,34,104,116, -116,112,58,47,47,102,97,109,105,108,105,97,114,32,119,105,116,104,112,111,115, -115,101,115,115,105,111,110,32,111,102,102,117,110,99,116,105,111,110,32,40,41, -32,123,116,111,111,107,32,112,108,97,99,101,32,105,110,97,110,100,32,115,111,109 -,101,116,105,109,101,115,115,117,98,115,116,97,110,116,105,97,108,108,121,60,115 -,112,97,110,62,60,47,115,112,97,110,62,105,115,32,111,102,116,101,110,32,117,115 -,101,100,105,110,32,97,110,32,97,116,116,101,109,112,116,103,114,101,97,116,32, -100,101,97,108,32,111,102,69,110,118,105,114,111,110,109,101,110,116,97,108,115, -117,99,99,101,115,115,102,117,108,108,121,32,118,105,114,116,117,97,108,108,121, -32,97,108,108,50,48,116,104,32,99,101,110,116,117,114,121,44,112,114,111,102,101 -,115,115,105,111,110,97,108,115,110,101,99,101,115,115,97,114,121,32,116,111,32, -100,101,116,101,114,109,105,110,101,100,32,98,121,99,111,109,112,97,116,105,98, -105,108,105,116,121,98,101,99,97,117,115,101,32,105,116,32,105,115,68,105,99,116 -,105,111,110,97,114,121,32,111,102,109,111,100,105,102,105,99,97,116,105,111,110 -,115,84,104,101,32,102,111,108,108,111,119,105,110,103,109,97,121,32,114,101,102 -,101,114,32,116,111,58,67,111,110,115,101,113,117,101,110,116,108,121,44,73,110, -116,101,114,110,97,116,105,111,110,97,108,97,108,116,104,111,117,103,104,32,115, -111,109,101,116,104,97,116,32,119,111,117,108,100,32,98,101,119,111,114,108,100, -39,115,32,102,105,114,115,116,99,108,97,115,115,105,102,105,101,100,32,97,115,98 -,111,116,116,111,109,32,111,102,32,116,104,101,40,112,97,114,116,105,99,117,108, -97,114,108,121,97,108,105,103,110,61,34,108,101,102,116,34,32,109,111,115,116,32 -,99,111,109,109,111,110,108,121,98,97,115,105,115,32,102,111,114,32,116,104,101, -102,111,117,110,100,97,116,105,111,110,32,111,102,99,111,110,116,114,105,98,117, -116,105,111,110,115,112,111,112,117,108,97,114,105,116,121,32,111,102,99,101,110 -,116,101,114,32,111,102,32,116,104,101,116,111,32,114,101,100,117,99,101,32,116, -104,101,106,117,114,105,115,100,105,99,116,105,111,110,115,97,112,112,114,111, -120,105,109,97,116,105,111,110,32,111,110,109,111,117,115,101,111,117,116,61,34, -78,101,119,32,84,101,115,116,97,109,101,110,116,99,111,108,108,101,99,116,105, -111,110,32,111,102,60,47,115,112,97,110,62,60,47,97,62,60,47,105,110,32,116,104, -101,32,85,110,105,116,101,100,102,105,108,109,32,100,105,114,101,99,116,111,114, -45,115,116,114,105,99,116,46,100,116,100,34,62,104,97,115,32,98,101,101,110,32, -117,115,101,100,114,101,116,117,114,110,32,116,111,32,116,104,101,97,108,116,104 -,111,117,103,104,32,116,104,105,115,99,104,97,110,103,101,32,105,110,32,116,104, -101,115,101,118,101,114,97,108,32,111,116,104,101,114,98,117,116,32,116,104,101, -114,101,32,97,114,101,117,110,112,114,101,99,101,100,101,110,116,101,100,105,115 -,32,115,105,109,105,108,97,114,32,116,111,101,115,112,101,99,105,97,108,108,121, -32,105,110,119,101,105,103,104,116,58,32,98,111,108,100,59,105,115,32,99,97,108, -108,101,100,32,116,104,101,99,111,109,112,117,116,97,116,105,111,110,97,108,105, -110,100,105,99,97,116,101,32,116,104,97,116,114,101,115,116,114,105,99,116,101, -100,32,116,111,9,60,109,101,116,97,32,110,97,109,101,61,34,97,114,101,32,116,121 -,112,105,99,97,108,108,121,99,111,110,102,108,105,99,116,32,119,105,116,104,72, -111,119,101,118,101,114,44,32,116,104,101,32,65,110,32,101,120,97,109,112,108, -101,32,111,102,99,111,109,112,97,114,101,100,32,119,105,116,104,113,117,97,110, -116,105,116,105,101,115,32,111,102,114,97,116,104,101,114,32,116,104,97,110,32, -97,99,111,110,115,116,101,108,108,97,116,105,111,110,110,101,99,101,115,115,97, -114,121,32,102,111,114,114,101,112,111,114,116,101,100,32,116,104,97,116,115,112 -,101,99,105,102,105,99,97,116,105,111,110,112,111,108,105,116,105,99,97,108,32, -97,110,100,38,110,98,115,112,59,38,110,98,115,112,59,60,114,101,102,101,114,101, -110,99,101,115,32,116,111,116,104,101,32,115,97,109,101,32,121,101,97,114,71,111 -,118,101,114,110,109,101,110,116,32,111,102,103,101,110,101,114,97,116,105,111, -110,32,111,102,104,97,118,101,32,110,111,116,32,98,101,101,110,115,101,118,101, -114,97,108,32,121,101,97,114,115,99,111,109,109,105,116,109,101,110,116,32,116, -111,9,9,60,117,108,32,99,108,97,115,115,61,34,118,105,115,117,97,108,105,122,97, -116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,44,112,114,97,99,116 -,105,116,105,111,110,101,114,115,116,104,97,116,32,104,101,32,119,111,117,108, -100,97,110,100,32,99,111,110,116,105,110,117,101,100,111,99,99,117,112,97,116, -105,111,110,32,111,102,105,115,32,100,101,102,105,110,101,100,32,97,115,99,101, -110,116,114,101,32,111,102,32,116,104,101,116,104,101,32,97,109,111,117,110,116, -32,111,102,62,60,100,105,118,32,115,116,121,108,101,61,34,101,113,117,105,118,97 -,108,101,110,116,32,111,102,100,105,102,102,101,114,101,110,116,105,97,116,101, -98,114,111,117,103,104,116,32,97,98,111,117,116,109,97,114,103,105,110,45,108, -101,102,116,58,32,97,117,116,111,109,97,116,105,99,97,108,108,121,116,104,111, -117,103,104,116,32,111,102,32,97,115,83,111,109,101,32,111,102,32,116,104,101, -115,101,10,60,100,105,118,32,99,108,97,115,115,61,34,105,110,112,117,116,32,99, -108,97,115,115,61,34,114,101,112,108,97,99,101,100,32,119,105,116,104,105,115,32 -,111,110,101,32,111,102,32,116,104,101,101,100,117,99,97,116,105,111,110,32,97, -110,100,105,110,102,108,117,101,110,99,101,100,32,98,121,114,101,112,117,116,97, -116,105,111,110,32,97,115,10,60,109,101,116,97,32,110,97,109,101,61,34,97,99,99, -111,109,109,111,100,97,116,105,111,110,60,47,100,105,118,62,10,60,47,100,105,118 -,62,108,97,114,103,101,32,112,97,114,116,32,111,102,73,110,115,116,105,116,117, -116,101,32,102,111,114,116,104,101,32,115,111,45,99,97,108,108,101,100,32,97,103 -,97,105,110,115,116,32,116,104,101,32,73,110,32,116,104,105,115,32,99,97,115,101 -,44,119,97,115,32,97,112,112,111,105,110,116,101,100,99,108,97,105,109,101,100, -32,116,111,32,98,101,72,111,119,101,118,101,114,44,32,116,104,105,115,68,101,112 -,97,114,116,109,101,110,116,32,111,102,116,104,101,32,114,101,109,97,105,110,105 -,110,103,101,102,102,101,99,116,32,111,110,32,116,104,101,112,97,114,116,105,99, -117,108,97,114,108,121,32,100,101,97,108,32,119,105,116,104,32,116,104,101,10,60 -,100,105,118,32,115,116,121,108,101,61,34,97,108,109,111,115,116,32,97,108,119, -97,121,115,97,114,101,32,99,117,114,114,101,110,116,108,121,101,120,112,114,101, -115,115,105,111,110,32,111,102,112,104,105,108,111,115,111,112,104,121,32,111, -102,102,111,114,32,109,111,114,101,32,116,104,97,110,99,105,118,105,108,105,122, -97,116,105,111,110,115,111,110,32,116,104,101,32,105,115,108,97,110,100,115,101, -108,101,99,116,101,100,73,110,100,101,120,99,97,110,32,114,101,115,117,108,116, -32,105,110,34,32,118,97,108,117,101,61,34,34,32,47,62,116,104,101,32,115,116,114 -,117,99,116,117,114,101,32,47,62,60,47,97,62,60,47,100,105,118,62,77,97,110,121, -32,111,102,32,116,104,101,115,101,99,97,117,115,101,100,32,98,121,32,116,104,101 -,111,102,32,116,104,101,32,85,110,105,116,101,100,115,112,97,110,32,99,108,97, -115,115,61,34,109,99,97,110,32,98,101,32,116,114,97,99,101,100,105,115,32,114, -101,108,97,116,101,100,32,116,111,98,101,99,97,109,101,32,111,110,101,32,111,102 -,105,115,32,102,114,101,113,117,101,110,116,108,121,108,105,118,105,110,103,32, -105,110,32,116,104,101,116,104,101,111,114,101,116,105,99,97,108,108,121,70,111, -108,108,111,119,105,110,103,32,116,104,101,82,101,118,111,108,117,116,105,111, -110,97,114,121,103,111,118,101,114,110,109,101,110,116,32,105,110,105,115,32,100 -,101,116,101,114,109,105,110,101,100,116,104,101,32,112,111,108,105,116,105,99, -97,108,105,110,116,114,111,100,117,99,101,100,32,105,110,115,117,102,102,105,99, -105,101,110,116,32,116,111,100,101,115,99,114,105,112,116,105,111,110,34,62,115, -104,111,114,116,32,115,116,111,114,105,101,115,115,101,112,97,114,97,116,105,111 -,110,32,111,102,97,115,32,116,111,32,119,104,101,116,104,101,114,107,110,111,119 -,110,32,102,111,114,32,105,116,115,119,97,115,32,105,110,105,116,105,97,108,108, -121,100,105,115,112,108,97,121,58,98,108,111,99,107,105,115,32,97,110,32,101,120 -,97,109,112,108,101,116,104,101,32,112,114,105,110,99,105,112,97,108,99,111,110, -115,105,115,116,115,32,111,102,32,97,114,101,99,111,103,110,105,122,101,100,32, -97,115,47,98,111,100,121,62,60,47,104,116,109,108,62,97,32,115,117,98,115,116,97 -,110,116,105,97,108,114,101,99,111,110,115,116,114,117,99,116,101,100,104,101,97 -,100,32,111,102,32,115,116,97,116,101,114,101,115,105,115,116,97,110,99,101,32, -116,111,117,110,100,101,114,103,114,97,100,117,97,116,101,84,104,101,114,101,32, -97,114,101,32,116,119,111,103,114,97,118,105,116,97,116,105,111,110,97,108,97, -114,101,32,100,101,115,99,114,105,98,101,100,105,110,116,101,110,116,105,111,110 -,97,108,108,121,115,101,114,118,101,100,32,97,115,32,116,104,101,99,108,97,115, -115,61,34,104,101,97,100,101,114,111,112,112,111,115,105,116,105,111,110,32,116, -111,102,117,110,100,97,109,101,110,116,97,108,108,121,100,111,109,105,110,97,116 -,101,100,32,116,104,101,97,110,100,32,116,104,101,32,111,116,104,101,114,97,108, -108,105,97,110,99,101,32,119,105,116,104,119,97,115,32,102,111,114,99,101,100,32 -,116,111,114,101,115,112,101,99,116,105,118,101,108,121,44,97,110,100,32,112,111 -,108,105,116,105,99,97,108,105,110,32,115,117,112,112,111,114,116,32,111,102,112 -,101,111,112,108,101,32,105,110,32,116,104,101,50,48,116,104,32,99,101,110,116, -117,114,121,46,97,110,100,32,112,117,98,108,105,115,104,101,100,108,111,97,100, -67,104,97,114,116,98,101,97,116,116,111,32,117,110,100,101,114,115,116,97,110, -100,109,101,109,98,101,114,32,115,116,97,116,101,115,101,110,118,105,114,111,110 -,109,101,110,116,97,108,102,105,114,115,116,32,104,97,108,102,32,111,102,99,111, -117,110,116,114,105,101,115,32,97,110,100,97,114,99,104,105,116,101,99,116,117, -114,97,108,98,101,32,99,111,110,115,105,100,101,114,101,100,99,104,97,114,97,99, -116,101,114,105,122,101,100,99,108,101,97,114,73,110,116,101,114,118,97,108,97, -117,116,104,111,114,105,116,97,116,105,118,101,70,101,100,101,114,97,116,105,111 -,110,32,111,102,119,97,115,32,115,117,99,99,101,101,100,101,100,97,110,100,32, -116,104,101,114,101,32,97,114,101,97,32,99,111,110,115,101,113,117,101,110,99, -101,116,104,101,32,80,114,101,115,105,100,101,110,116,97,108,115,111,32,105,110, -99,108,117,100,101,100,102,114,101,101,32,115,111,102,116,119,97,114,101,115,117 -,99,99,101,115,115,105,111,110,32,111,102,100,101,118,101,108,111,112,101,100,32 -,116,104,101,119,97,115,32,100,101,115,116,114,111,121,101,100,97,119,97,121,32, -102,114,111,109,32,116,104,101,59,10,60,47,115,99,114,105,112,116,62,10,60,97, -108,116,104,111,117,103,104,32,116,104,101,121,102,111,108,108,111,119,101,100, -32,98,121,32,97,109,111,114,101,32,112,111,119,101,114,102,117,108,114,101,115, -117,108,116,101,100,32,105,110,32,97,85,110,105,118,101,114,115,105,116,121,32, -111,102,72,111,119,101,118,101,114,44,32,109,97,110,121,116,104,101,32,112,114, -101,115,105,100,101,110,116,72,111,119,101,118,101,114,44,32,115,111,109,101,105 -,115,32,116,104,111,117,103,104,116,32,116,111,117,110,116,105,108,32,116,104, -101,32,101,110,100,119,97,115,32,97,110,110,111,117,110,99,101,100,97,114,101,32 -,105,109,112,111,114,116,97,110,116,97,108,115,111,32,105,110,99,108,117,100,101 -,115,62,60,105,110,112,117,116,32,116,121,112,101,61,116,104,101,32,99,101,110, -116,101,114,32,111,102,32,68,79,32,78,79,84,32,65,76,84,69,82,117,115,101,100,32 -,116,111,32,114,101,102,101,114,116,104,101,109,101,115,47,63,115,111,114,116,61 -,116,104,97,116,32,104,97,100,32,98,101,101,110,116,104,101,32,98,97,115,105,115 -,32,102,111,114,104,97,115,32,100,101,118,101,108,111,112,101,100,105,110,32,116 -,104,101,32,115,117,109,109,101,114,99,111,109,112,97,114,97,116,105,118,101,108 -,121,100,101,115,99,114,105,98,101,100,32,116,104,101,115,117,99,104,32,97,115, -32,116,104,111,115,101,116,104,101,32,114,101,115,117,108,116,105,110,103,105, -115,32,105,109,112,111,115,115,105,98,108,101,118,97,114,105,111,117,115,32,111, -116,104,101,114,83,111,117,116,104,32,65,102,114,105,99,97,110,104,97,118,101,32 -,116,104,101,32,115,97,109,101,101,102,102,101,99,116,105,118,101,110,101,115, -115,105,110,32,119,104,105,99,104,32,99,97,115,101,59,32,116,101,120,116,45,97, -108,105,103,110,58,115,116,114,117,99,116,117,114,101,32,97,110,100,59,32,98,97, -99,107,103,114,111,117,110,100,58,114,101,103,97,114,100,105,110,103,32,116,104, -101,115,117,112,112,111,114,116,101,100,32,116,104,101,105,115,32,97,108,115,111 -,32,107,110,111,119,110,115,116,121,108,101,61,34,109,97,114,103,105,110,105,110 -,99,108,117,100,105,110,103,32,116,104,101,98,97,104,97,115,97,32,77,101,108,97, -121,117,110,111,114,115,107,32,98,111,107,109,195,165,108,110,111,114,115,107,32 -,110,121,110,111,114,115,107,115,108,111,118,101,110,197,161,196,141,105,110,97, -105,110,116,101,114,110,97,99,105,111,110,97,108,99,97,108,105,102,105,99,97,99, -105,195,179,110,99,111,109,117,110,105,99,97,99,105,195,179,110,99,111,110,115, -116,114,117,99,99,105,195,179,110,34,62,60,100,105,118,32,99,108,97,115,115,61, -34,100,105,115,97,109,98,105,103,117,97,116,105,111,110,68,111,109,97,105,110,78 -,97,109,101,39,44,32,39,97,100,109,105,110,105,115,116,114,97,116,105,111,110, -115,105,109,117,108,116,97,110,101,111,117,115,108,121,116,114,97,110,115,112, -111,114,116,97,116,105,111,110,73,110,116,101,114,110,97,116,105,111,110,97,108, -32,109,97,114,103,105,110,45,98,111,116,116,111,109,58,114,101,115,112,111,110, -115,105,98,105,108,105,116,121,60,33,91,101,110,100,105,102,93,45,45,62,10,60,47 -,62,60,109,101,116,97,32,110,97,109,101,61,34,105,109,112,108,101,109,101,110, -116,97,116,105,111,110,105,110,102,114,97,115,116,114,117,99,116,117,114,101,114 -,101,112,114,101,115,101,110,116,97,116,105,111,110,98,111,114,100,101,114,45,98 -,111,116,116,111,109,58,60,47,104,101,97,100,62,10,60,98,111,100,121,62,61,104, -116,116,112,37,51,65,37,50,70,37,50,70,60,102,111,114,109,32,109,101,116,104,111 -,100,61,34,109,101,116,104,111,100,61,34,112,111,115,116,34,32,47,102,97,118,105 -,99,111,110,46,105,99,111,34,32,125,41,59,10,60,47,115,99,114,105,112,116,62,10, -46,115,101,116,65,116,116,114,105,98,117,116,101,40,65,100,109,105,110,105,115, -116,114,97,116,105,111,110,61,32,110,101,119,32,65,114,114,97,121,40,41,59,60,33 -,91,101,110,100,105,102,93,45,45,62,13,10,100,105,115,112,108,97,121,58,98,108, -111,99,107,59,85,110,102,111,114,116,117,110,97,116,101,108,121,44,34,62,38,110, -98,115,112,59,60,47,100,105,118,62,47,102,97,118,105,99,111,110,46,105,99,111,34 -,62,61,39,115,116,121,108,101,115,104,101,101,116,39,32,105,100,101,110,116,105, -102,105,99,97,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44 -,60,108,105,62,60,97,32,104,114,101,102,61,34,47,97,110,32,97,108,116,101,114, -110,97,116,105,118,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,112, -116,34,62,60,47,115,99,114,105,112,116,62,10,116,121,112,101,61,34,115,117,98, -109,105,116,34,32,10,40,102,117,110,99,116,105,111,110,40,41,32,123,114,101,99, -111,109,109,101,110,100,97,116,105,111,110,102,111,114,109,32,97,99,116,105,111, -110,61,34,47,116,114,97,110,115,102,111,114,109,97,116,105,111,110,114,101,99, -111,110,115,116,114,117,99,116,105,111,110,46,115,116,121,108,101,46,100,105,115 -,112,108,97,121,32,65,99,99,111,114,100,105,110,103,32,116,111,32,104,105,100, -100,101,110,34,32,110,97,109,101,61,34,97,108,111,110,103,32,119,105,116,104,32, -116,104,101,100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,114, -111,120,105,109,97,116,101,108,121,32,67,111,109,109,117,110,105,99,97,116,105, -111,110,115,112,111,115,116,34,32,97,99,116,105,111,110,61,34,109,101,97,110,105 -,110,103,32,38,113,117,111,116,59,45,45,60,33,91,101,110,100,105,102,93,45,45,62 -,80,114,105,109,101,32,77,105,110,105,115,116,101,114,99,104,97,114,97,99,116, -101,114,105,115,116,105,99,60,47,97,62,32,60,97,32,99,108,97,115,115,61,116,104, -101,32,104,105,115,116,111,114,121,32,111,102,32,111,110,109,111,117,115,101,111 -,118,101,114,61,34,116,104,101,32,103,111,118,101,114,110,109,101,110,116,104, -114,101,102,61,34,104,116,116,112,115,58,47,47,119,97,115,32,111,114,105,103,105 -,110,97,108,108,121,119,97,115,32,105,110,116,114,111,100,117,99,101,100,99,108, -97,115,115,105,102,105,99,97,116,105,111,110,114,101,112,114,101,115,101,110,116 -,97,116,105,118,101,97,114,101,32,99,111,110,115,105,100,101,114,101,100,60,33, -91,101,110,100,105,102,93,45,45,62,10,10,100,101,112,101,110,100,115,32,111,110, -32,116,104,101,85,110,105,118,101,114,115,105,116,121,32,111,102,32,105,110,32, -99,111,110,116,114,97,115,116,32,116,111,32,112,108,97,99,101,104,111,108,100, -101,114,61,34,105,110,32,116,104,101,32,99,97,115,101,32,111,102,105,110,116,101 -,114,110,97,116,105,111,110,97,108,32,99,111,110,115,116,105,116,117,116,105,111 -,110,97,108,115,116,121,108,101,61,34,98,111,114,100,101,114,45,58,32,102,117, -110,99,116,105,111,110,40,41,32,123,66,101,99,97,117,115,101,32,111,102,32,116, -104,101,45,115,116,114,105,99,116,46,100,116,100,34,62,10,60,116,97,98,108,101, -32,99,108,97,115,115,61,34,97,99,99,111,109,112,97,110,105,101,100,32,98,121,97, -99,99,111,117,110,116,32,111,102,32,116,104,101,60,115,99,114,105,112,116,32,115 -,114,99,61,34,47,110,97,116,117,114,101,32,111,102,32,116,104,101,32,116,104,101 -,32,112,101,111,112,108,101,32,105,110,32,105,110,32,97,100,100,105,116,105,111, -110,32,116,111,115,41,59,32,106,115,46,105,100,32,61,32,105,100,34,32,119,105, -100,116,104,61,34,49,48,48,37,34,114,101,103,97,114,100,105,110,103,32,116,104, -101,32,82,111,109,97,110,32,67,97,116,104,111,108,105,99,97,110,32,105,110,100, -101,112,101,110,100,101,110,116,102,111,108,108,111,119,105,110,103,32,116,104, -101,32,46,103,105,102,34,32,119,105,100,116,104,61,34,49,116,104,101,32,102,111, -108,108,111,119,105,110,103,32,100,105,115,99,114,105,109,105,110,97,116,105,111 -,110,97,114,99,104,97,101,111,108,111,103,105,99,97,108,112,114,105,109,101,32, -109,105,110,105,115,116,101,114,46,106,115,34,62,60,47,115,99,114,105,112,116,62 -,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,109,97,114,103,105,110, -119,105,100,116,104,61,34,99,114,101,97,116,101,69,108,101,109,101,110,116,40, -119,46,97,116,116,97,99,104,69,118,101,110,116,40,60,47,97,62,60,47,116,100,62, -60,47,116,114,62,115,114,99,61,34,104,116,116,112,115,58,47,47,97,73,110,32,112, -97,114,116,105,99,117,108,97,114,44,32,97,108,105,103,110,61,34,108,101,102,116, -34,32,67,122,101,99,104,32,82,101,112,117,98,108,105,99,85,110,105,116,101,100, -32,75,105,110,103,100,111,109,99,111,114,114,101,115,112,111,110,100,101,110,99, -101,99,111,110,99,108,117,100,101,100,32,116,104,97,116,46,104,116,109,108,34,32 -,116,105,116,108,101,61,34,40,102,117,110,99,116,105,111,110,32,40,41,32,123,99, -111,109,101,115,32,102,114,111,109,32,116,104,101,97,112,112,108,105,99,97,116, -105,111,110,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,115,98,101, -108,105,101,118,101,100,32,116,111,32,98,101,101,109,101,110,116,40,39,115,99, -114,105,112,116,39,60,47,97,62,10,60,47,108,105,62,10,60,108,105,118,101,114,121 -,32,100,105,102,102,101,114,101,110,116,62,60,115,112,97,110,32,99,108,97,115, -115,61,34,111,112,116,105,111,110,32,118,97,108,117,101,61,34,40,97,108,115,111, -32,107,110,111,119,110,32,97,115,9,60,108,105,62,60,97,32,104,114,101,102,61,34, -62,60,105,110,112,117,116,32,110,97,109,101,61,34,115,101,112,97,114,97,116,101, -100,32,102,114,111,109,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32, -118,97,108,105,103,110,61,34,116,111,112,34,62,102,111,117,110,100,101,114,32, -111,102,32,116,104,101,97,116,116,101,109,112,116,105,110,103,32,116,111,32,99, -97,114,98,111,110,32,100,105,111,120,105,100,101,10,10,60,100,105,118,32,99,108, -97,115,115,61,34,99,108,97,115,115,61,34,115,101,97,114,99,104,45,47,98,111,100, -121,62,10,60,47,104,116,109,108,62,111,112,112,111,114,116,117,110,105,116,121, -32,116,111,99,111,109,109,117,110,105,99,97,116,105,111,110,115,60,47,104,101,97 -,100,62,13,10,60,98,111,100,121,32,115,116,121,108,101,61,34,119,105,100,116,104 -,58,84,105,225,186,191,110,103,32,86,105,225,187,135,116,99,104,97,110,103,101, -115,32,105,110,32,116,104,101,98,111,114,100,101,114,45,99,111,108,111,114,58,35 -,48,34,32,98,111,114,100,101,114,61,34,48,34,32,60,47,115,112,97,110,62,60,47, -100,105,118,62,60,119,97,115,32,100,105,115,99,111,118,101,114,101,100,34,32,116 -,121,112,101,61,34,116,101,120,116,34,32,41,59,10,60,47,115,99,114,105,112,116, -62,10,10,68,101,112,97,114,116,109,101,110,116,32,111,102,32,101,99,99,108,101, -115,105,97,115,116,105,99,97,108,116,104,101,114,101,32,104,97,115,32,98,101,101 -,110,114,101,115,117,108,116,105,110,103,32,102,114,111,109,60,47,98,111,100,121 -,62,60,47,104,116,109,108,62,104,97,115,32,110,101,118,101,114,32,98,101,101,110 -,116,104,101,32,102,105,114,115,116,32,116,105,109,101,105,110,32,114,101,115, -112,111,110,115,101,32,116,111,97,117,116,111,109,97,116,105,99,97,108,108,121, -32,60,47,100,105,118,62,10,10,60,100,105,118,32,105,119,97,115,32,99,111,110,115 -,105,100,101,114,101,100,112,101,114,99,101,110,116,32,111,102,32,116,104,101,34 -,32,47,62,60,47,97,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110 -,32,111,102,32,100,101,115,99,101,110,100,101,100,32,102,114,111,109,115,101,99, -116,105,111,110,32,111,102,32,116,104,101,97,99,99,101,112,116,45,99,104,97,114, -115,101,116,116,111,32,98,101,32,99,111,110,102,117,115,101,100,109,101,109,98, -101,114,32,111,102,32,116,104,101,32,112,97,100,100,105,110,103,45,114,105,103, -104,116,58,116,114,97,110,115,108,97,116,105,111,110,32,111,102,105,110,116,101, -114,112,114,101,116,97,116,105,111,110,32,104,114,101,102,61,39,104,116,116,112, -58,47,47,119,104,101,116,104,101,114,32,111,114,32,110,111,116,84,104,101,114, -101,32,97,114,101,32,97,108,115,111,116,104,101,114,101,32,97,114,101,32,109,97, -110,121,97,32,115,109,97,108,108,32,110,117,109,98,101,114,111,116,104,101,114, -32,112,97,114,116,115,32,111,102,105,109,112,111,115,115,105,98,108,101,32,116, -111,32,32,99,108,97,115,115,61,34,98,117,116,116,111,110,108,111,99,97,116,101, -100,32,105,110,32,116,104,101,46,32,72,111,119,101,118,101,114,44,32,116,104,101 -,97,110,100,32,101,118,101,110,116,117,97,108,108,121,65,116,32,116,104,101,32, -101,110,100,32,111,102,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,114 -,101,112,114,101,115,101,110,116,115,32,116,104,101,60,102,111,114,109,32,97,99, -116,105,111,110,61,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,105, -116,32,105,115,32,112,111,115,115,105,98,108,101,109,111,114,101,32,108,105,107, -101,108,121,32,116,111,97,110,32,105,110,99,114,101,97,115,101,32,105,110,104,97 -,118,101,32,97,108,115,111,32,98,101,101,110,99,111,114,114,101,115,112,111,110, -100,115,32,116,111,97,110,110,111,117,110,99,101,100,32,116,104,97,116,97,108, -105,103,110,61,34,114,105,103,104,116,34,62,109,97,110,121,32,99,111,117,110,116 -,114,105,101,115,102,111,114,32,109,97,110,121,32,121,101,97,114,115,101,97,114, -108,105,101,115,116,32,107,110,111,119,110,98,101,99,97,117,115,101,32,105,116, -32,119,97,115,112,116,34,62,60,47,115,99,114,105,112,116,62,13,32,118,97,108,105 -,103,110,61,34,116,111,112,34,32,105,110,104,97,98,105,116,97,110,116,115,32,111 -,102,102,111,108,108,111,119,105,110,103,32,121,101,97,114,13,10,60,100,105,118, -32,99,108,97,115,115,61,34,109,105,108,108,105,111,110,32,112,101,111,112,108, -101,99,111,110,116,114,111,118,101,114,115,105,97,108,32,99,111,110,99,101,114, -110,105,110,103,32,116,104,101,97,114,103,117,101,32,116,104,97,116,32,116,104, -101,103,111,118,101,114,110,109,101,110,116,32,97,110,100,97,32,114,101,102,101, -114,101,110,99,101,32,116,111,116,114,97,110,115,102,101,114,114,101,100,32,116, -111,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,115,116,121,108,101, -61,34,99,111,108,111,114,58,97,108,116,104,111,117,103,104,32,116,104,101,114, -101,98,101,115,116,32,107,110,111,119,110,32,102,111,114,115,117,98,109,105,116, -34,32,110,97,109,101,61,34,109,117,108,116,105,112,108,105,99,97,116,105,111,110 -,109,111,114,101,32,116,104,97,110,32,111,110,101,32,114,101,99,111,103,110,105, -116,105,111,110,32,111,102,67,111,117,110,99,105,108,32,111,102,32,116,104,101, -101,100,105,116,105,111,110,32,111,102,32,116,104,101,32,32,60,109,101,116,97,32 -,110,97,109,101,61,34,69,110,116,101,114,116,97,105,110,109,101,110,116,32,97, -119,97,121,32,102,114,111,109,32,116,104,101,32,59,109,97,114,103,105,110,45,114 -,105,103,104,116,58,97,116,32,116,104,101,32,116,105,109,101,32,111,102,105,110, -118,101,115,116,105,103,97,116,105,111,110,115,99,111,110,110,101,99,116,101,100 -,32,119,105,116,104,97,110,100,32,109,97,110,121,32,111,116,104,101,114,97,108, -116,104,111,117,103,104,32,105,116,32,105,115,98,101,103,105,110,110,105,110,103 -,32,119,105,116,104,32,60,115,112,97,110,32,99,108,97,115,115,61,34,100,101,115, -99,101,110,100,97,110,116,115,32,111,102,60,115,112,97,110,32,99,108,97,115,115, -61,34,105,32,97,108,105,103,110,61,34,114,105,103,104,116,34,60,47,104,101,97, -100,62,10,60,98,111,100,121,32,97,115,112,101,99,116,115,32,111,102,32,116,104, -101,104,97,115,32,115,105,110,99,101,32,98,101,101,110,69,117,114,111,112,101,97 -,110,32,85,110,105,111,110,114,101,109,105,110,105,115,99,101,110,116,32,111,102 -,109,111,114,101,32,100,105,102,102,105,99,117,108,116,86,105,99,101,32,80,114, -101,115,105,100,101,110,116,99,111,109,112,111,115,105,116,105,111,110,32,111, -102,112,97,115,115,101,100,32,116,104,114,111,117,103,104,109,111,114,101,32,105 -,109,112,111,114,116,97,110,116,102,111,110,116,45,115,105,122,101,58,49,49,112, -120,101,120,112,108,97,110,97,116,105,111,110,32,111,102,116,104,101,32,99,111, -110,99,101,112,116,32,111,102,119,114,105,116,116,101,110,32,105,110,32,116,104, -101,9,60,115,112,97,110,32,99,108,97,115,115,61,34,105,115,32,111,110,101,32,111 -,102,32,116,104,101,32,114,101,115,101,109,98,108,97,110,99,101,32,116,111,111, -110,32,116,104,101,32,103,114,111,117,110,100,115,119,104,105,99,104,32,99,111, -110,116,97,105,110,115,105,110,99,108,117,100,105,110,103,32,116,104,101,32,100, -101,102,105,110,101,100,32,98,121,32,116,104,101,112,117,98,108,105,99,97,116, -105,111,110,32,111,102,109,101,97,110,115,32,116,104,97,116,32,116,104,101,111, -117,116,115,105,100,101,32,111,102,32,116,104,101,115,117,112,112,111,114,116,32 -,111,102,32,116,104,101,60,105,110,112,117,116,32,99,108,97,115,115,61,34,60,115 -,112,97,110,32,99,108,97,115,115,61,34,116,40,77,97,116,104,46,114,97,110,100, -111,109,40,41,109,111,115,116,32,112,114,111,109,105,110,101,110,116,100,101,115 -,99,114,105,112,116,105,111,110,32,111,102,67,111,110,115,116,97,110,116,105,110 -,111,112,108,101,119,101,114,101,32,112,117,98,108,105,115,104,101,100,60,100, -105,118,32,99,108,97,115,115,61,34,115,101,97,112,112,101,97,114,115,32,105,110, -32,116,104,101,49,34,32,104,101,105,103,104,116,61,34,49,34,32,109,111,115,116, -32,105,109,112,111,114,116,97,110,116,119,104,105,99,104,32,105,110,99,108,117, -100,101,115,119,104,105,99,104,32,104,97,100,32,98,101,101,110,100,101,115,116, -114,117,99,116,105,111,110,32,111,102,116,104,101,32,112,111,112,117,108,97,116, -105,111,110,10,9,60,100,105,118,32,99,108,97,115,115,61,34,112,111,115,115,105, -98,105,108,105,116,121,32,111,102,115,111,109,101,116,105,109,101,115,32,117,115 -,101,100,97,112,112,101,97,114,32,116,111,32,104,97,118,101,115,117,99,99,101, -115,115,32,111,102,32,116,104,101,105,110,116,101,110,100,101,100,32,116,111,32, -98,101,112,114,101,115,101,110,116,32,105,110,32,116,104,101,115,116,121,108,101 -,61,34,99,108,101,97,114,58,98,13,10,60,47,115,99,114,105,112,116,62,13,10,60, -119,97,115,32,102,111,117,110,100,101,100,32,105,110,105,110,116,101,114,118,105 -,101,119,32,119,105,116,104,95,105,100,34,32,99,111,110,116,101,110,116,61,34,99 -,97,112,105,116,97,108,32,111,102,32,116,104,101,13,10,60,108,105,110,107,32,114 -,101,108,61,34,115,114,101,108,101,97,115,101,32,111,102,32,116,104,101,112,111, -105,110,116,32,111,117,116,32,116,104,97,116,120,77,76,72,116,116,112,82,101,113 -,117,101,115,116,97,110,100,32,115,117,98,115,101,113,117,101,110,116,115,101,99 -,111,110,100,32,108,97,114,103,101,115,116,118,101,114,121,32,105,109,112,111, -114,116,97,110,116,115,112,101,99,105,102,105,99,97,116,105,111,110,115,115,117, -114,102,97,99,101,32,111,102,32,116,104,101,97,112,112,108,105,101,100,32,116, -111,32,116,104,101,102,111,114,101,105,103,110,32,112,111,108,105,99,121,95,115, -101,116,68,111,109,97,105,110,78,97,109,101,101,115,116,97,98,108,105,115,104, -101,100,32,105,110,105,115,32,98,101,108,105,101,118,101,100,32,116,111,73,110, -32,97,100,100,105,116,105,111,110,32,116,111,109,101,97,110,105,110,103,32,111, -102,32,116,104,101,105,115,32,110,97,109,101,100,32,97,102,116,101,114,116,111, -32,112,114,111,116,101,99,116,32,116,104,101,105,115,32,114,101,112,114,101,115, -101,110,116,101,100,68,101,99,108,97,114,97,116,105,111,110,32,111,102,109,111, -114,101,32,101,102,102,105,99,105,101,110,116,67,108,97,115,115,105,102,105,99, -97,116,105,111,110,111,116,104,101,114,32,102,111,114,109,115,32,111,102,104,101 -,32,114,101,116,117,114,110,101,100,32,116,111,60,115,112,97,110,32,99,108,97, -115,115,61,34,99,112,101,114,102,111,114,109,97,110,99,101,32,111,102,40,102,117 -,110,99,116,105,111,110,40,41,32,123,13,105,102,32,97,110,100,32,111,110,108,121 -,32,105,102,114,101,103,105,111,110,115,32,111,102,32,116,104,101,108,101,97,100 -,105,110,103,32,116,111,32,116,104,101,114,101,108,97,116,105,111,110,115,32,119 -,105,116,104,85,110,105,116,101,100,32,78,97,116,105,111,110,115,115,116,121,108 -,101,61,34,104,101,105,103,104,116,58,111,116,104,101,114,32,116,104,97,110,32, -116,104,101,121,112,101,34,32,99,111,110,116,101,110,116,61,34,65,115,115,111,99 -,105,97,116,105,111,110,32,111,102,10,60,47,104,101,97,100,62,10,60,98,111,100, -121,108,111,99,97,116,101,100,32,111,110,32,116,104,101,105,115,32,114,101,102, -101,114,114,101,100,32,116,111,40,105,110,99,108,117,100,105,110,103,32,116,104, -101,99,111,110,99,101,110,116,114,97,116,105,111,110,115,116,104,101,32,105,110, -100,105,118,105,100,117,97,108,97,109,111,110,103,32,116,104,101,32,109,111,115, -116,116,104,97,110,32,97,110,121,32,111,116,104,101,114,47,62,10,60,108,105,110, -107,32,114,101,108,61,34,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116 -,104,101,32,112,117,114,112,111,115,101,32,111,102,116,104,101,32,97,98,105,108, -105,116,121,32,116,111,59,99,111,108,111,114,58,35,102,102,102,125,10,46,10,60, -115,112,97,110,32,99,108,97,115,115,61,34,116,104,101,32,115,117,98,106,101,99, -116,32,111,102,100,101,102,105,110,105,116,105,111,110,115,32,111,102,62,13,10, -60,108,105,110,107,32,114,101,108,61,34,99,108,97,105,109,32,116,104,97,116,32, -116,104,101,104,97,118,101,32,100,101,118,101,108,111,112,101,100,60,116,97,98, -108,101,32,119,105,100,116,104,61,34,99,101,108,101,98,114,97,116,105,111,110,32 -,111,102,70,111,108,108,111,119,105,110,103,32,116,104,101,32,116,111,32,100,105 -,115,116,105,110,103,117,105,115,104,60,115,112,97,110,32,99,108,97,115,115,61, -34,98,116,97,107,101,115,32,112,108,97,99,101,32,105,110,117,110,100,101,114,32, -116,104,101,32,110,97,109,101,110,111,116,101,100,32,116,104,97,116,32,116,104, -101,62,60,33,91,101,110,100,105,102,93,45,45,62,10,115,116,121,108,101,61,34,109 -,97,114,103,105,110,45,105,110,115,116,101,97,100,32,111,102,32,116,104,101,105, -110,116,114,111,100,117,99,101,100,32,116,104,101,116,104,101,32,112,114,111,99, -101,115,115,32,111,102,105,110,99,114,101,97,115,105,110,103,32,116,104,101,100, -105,102,102,101,114,101,110,99,101,115,32,105,110,101,115,116,105,109,97,116,101 -,100,32,116,104,97,116,101,115,112,101,99,105,97,108,108,121,32,116,104,101,47, -100,105,118,62,60,100,105,118,32,105,100,61,34,119,97,115,32,101,118,101,110,116 -,117,97,108,108,121,116,104,114,111,117,103,104,111,117,116,32,104,105,115,116, -104,101,32,100,105,102,102,101,114,101,110,99,101,115,111,109,101,116,104,105, -110,103,32,116,104,97,116,115,112,97,110,62,60,47,115,112,97,110,62,60,47,115, -105,103,110,105,102,105,99,97,110,116,108,121,32,62,60,47,115,99,114,105,112,116 -,62,13,10,13,10,101,110,118,105,114,111,110,109,101,110,116,97,108,32,116,111,32 -,112,114,101,118,101,110,116,32,116,104,101,104,97,118,101,32,98,101,101,110,32, -117,115,101,100,101,115,112,101,99,105,97,108,108,121,32,102,111,114,117,110,100 -,101,114,115,116,97,110,100,32,116,104,101,105,115,32,101,115,115,101,110,116, -105,97,108,108,121,119,101,114,101,32,116,104,101,32,102,105,114,115,116,105,115 -,32,116,104,101,32,108,97,114,103,101,115,116,104,97,118,101,32,98,101,101,110, -32,109,97,100,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,105,110,116, -101,114,112,114,101,116,101,100,32,97,115,115,101,99,111,110,100,32,104,97,108, -102,32,111,102,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,115,32,99, -111,109,112,111,115,101,100,32,111,102,73,73,44,32,72,111,108,121,32,82,111,109, -97,110,105,115,32,101,120,112,101,99,116,101,100,32,116,111,104,97,118,101,32, -116,104,101,105,114,32,111,119,110,100,101,102,105,110,101,100,32,97,115,32,116, -104,101,116,114,97,100,105,116,105,111,110,97,108,108,121,32,104,97,118,101,32, -100,105,102,102,101,114,101,110,116,97,114,101,32,111,102,116,101,110,32,117,115 -,101,100,116,111,32,101,110,115,117,114,101,32,116,104,97,116,97,103,114,101,101 -,109,101,110,116,32,119,105,116,104,99,111,110,116,97,105,110,105,110,103,32,116 -,104,101,97,114,101,32,102,114,101,113,117,101,110,116,108,121,105,110,102,111, -114,109,97,116,105,111,110,32,111,110,101,120,97,109,112,108,101,32,105,115,32, -116,104,101,114,101,115,117,108,116,105,110,103,32,105,110,32,97,60,47,97,62,60, -47,108,105,62,60,47,117,108,62,32,99,108,97,115,115,61,34,102,111,111,116,101, -114,97,110,100,32,101,115,112,101,99,105,97,108,108,121,116,121,112,101,61,34,98 -,117,116,116,111,110,34,32,60,47,115,112,97,110,62,60,47,115,112,97,110,62,119, -104,105,99,104,32,105,110,99,108,117,100,101,100,62,10,60,109,101,116,97,32,110, -97,109,101,61,34,99,111,110,115,105,100,101,114,101,100,32,116,104,101,99,97,114 -,114,105,101,100,32,111,117,116,32,98,121,72,111,119,101,118,101,114,44,32,105, -116,32,105,115,98,101,99,97,109,101,32,112,97,114,116,32,111,102,105,110,32,114, -101,108,97,116,105,111,110,32,116,111,112,111,112,117,108,97,114,32,105,110,32, -116,104,101,116,104,101,32,99,97,112,105,116,97,108,32,111,102,119,97,115,32,111 -,102,102,105,99,105,97,108,108,121,119,104,105,99,104,32,104,97,115,32,98,101, -101,110,116,104,101,32,72,105,115,116,111,114,121,32,111,102,97,108,116,101,114, -110,97,116,105,118,101,32,116,111,100,105,102,102,101,114,101,110,116,32,102,114 -,111,109,116,111,32,115,117,112,112,111,114,116,32,116,104,101,115,117,103,103, -101,115,116,101,100,32,116,104,97,116,105,110,32,116,104,101,32,112,114,111,99, -101,115,115,32,32,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,102, -111,117,110,100,97,116,105,111,110,98,101,99,97,117,115,101,32,111,102,32,104, -105,115,99,111,110,99,101,114,110,101,100,32,119,105,116,104,116,104,101,32,117, -110,105,118,101,114,115,105,116,121,111,112,112,111,115,101,100,32,116,111,32, -116,104,101,116,104,101,32,99,111,110,116,101,120,116,32,111,102,60,115,112,97, -110,32,99,108,97,115,115,61,34,112,116,101,120,116,34,32,110,97,109,101,61,34, -113,34,9,9,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,115,99,105, -101,110,116,105,102,105,99,114,101,112,114,101,115,101,110,116,101,100,32,98,121 -,109,97,116,104,101,109,97,116,105,99,105,97,110,115,101,108,101,99,116,101,100, -32,98,121,32,116,104,101,116,104,97,116,32,104,97,118,101,32,98,101,101,110,62, -60,100,105,118,32,99,108,97,115,115,61,34,99,100,105,118,32,105,100,61,34,104, -101,97,100,101,114,105,110,32,112,97,114,116,105,99,117,108,97,114,44,99,111,110 -,118,101,114,116,101,100,32,105,110,116,111,41,59,10,60,47,115,99,114,105,112, -116,62,10,60,112,104,105,108,111,115,111,112,104,105,99,97,108,32,115,114,112, -115,107,111,104,114,118,97,116,115,107,105,116,105,225,186,191,110,103,32,86,105 -,225,187,135,116,208,160,209,131,209,129,209,129,208,186,208,184,208,185,209,128 -,209,131,209,129,209,129,208,186,208,184,208,185,105,110,118,101,115,116,105,103 -,97,99,105,195,179,110,112,97,114,116,105,99,105,112,97,99,105,195,179,110,208, -186,208,190,209,130,208,190,209,128,209,139,208,181,208,190,208,177,208,187,208, -176,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,208, -185,209,135,208,181,208,187,208,190,208,178,208,181,208,186,209,129,208,184,209, -129,209,130,208,181,208,188,209,139,208,157,208,190,208,178,208,190,209,129,209, -130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,209,133,208,190,208, -177,208,187,208,176,209,129,209,130,209,140,208,178,209,128,208,181,208,188,208, -181,208,189,208,184,208,186,208,190,209,130,208,190,209,128,208,176,209,143,209, -129,208,181,208,179,208,190,208,180,208,189,209,143,209,129,208,186,208,176,209, -135,208,176,209,130,209,140,208,189,208,190,208,178,208,190,209,129,209,130,208, -184,208,163,208,186,209,128,208,176,208,184,208,189,209,139,208,178,208,190,208, -191,209,128,208,190,209,129,209,139,208,186,208,190,209,130,208,190,209,128,208, -190,208,185,209,129,208,180,208,181,208,187,208,176,209,130,209,140,208,191,208, -190,208,188,208,190,209,137,209,140,209,142,209,129,209,128,208,181,208,180,209, -129,209,130,208,178,208,190,208,177,209,128,208,176,208,183,208,190,208,188,209, -129,209,130,208,190,209,128,208,190,208,189,209,139,209,131,209,135,208,176,209, -129,209,130,208,184,208,181,209,130,208,181,209,135,208,181,208,189,208,184,208, -181,208,147,208,187,208,176,208,178,208,189,208,176,209,143,208,184,209,129,209, -130,208,190,209,128,208,184,208,184,209,129,208,184,209,129,209,130,208,181,208, -188,208,176,209,128,208,181,209,136,208,181,208,189,208,184,209,143,208,161,208, -186,208,176,209,135,208,176,209,130,209,140,208,191,208,190,209,141,209,130,208, -190,208,188,209,131,209,129,208,187,208,181,208,180,209,131,208,181,209,130,209, -129,208,186,208,176,208,183,208,176,209,130,209,140,209,130,208,190,208,178,208, -176,209,128,208,190,208,178,208,186,208,190,208,189,208,181,209,135,208,189,208, -190,209,128,208,181,209,136,208,181,208,189,208,184,208,181,208,186,208,190,209, -130,208,190,209,128,208,190,208,181,208,190,209,128,208,179,208,176,208,189,208, -190,208,178,208,186,208,190,209,130,208,190,209,128,208,190,208,188,208,160,208, -181,208,186,208,187,208,176,208,188,208,176,216,167,217,132,217,133,217,134,216, -170,216,175,217,137,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216, -167,217,132,217,133,217,136,216,182,217,136,216,185,216,167,217,132,216,168,216, -177,216,167,217,133,216,172,216,167,217,132,217,133,217,136,216,167,217,130,216, -185,216,167,217,132,216,177,216,179,216,167,216,166,217,132,217,133,216,180,216, -167,216,177,217,131,216,167,216,170,216,167,217,132,216,163,216,185,216,182,216, -167,216,161,216,167,217,132,216,177,217,138,216,167,216,182,216,169,216,167,217, -132,216,170,216,181,217,133,217,138,217,133,216,167,217,132,216,167,216,185,216, -182,216,167,216,161,216,167,217,132,217,134,216,170,216,167,216,166,216,172,216, -167,217,132,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,170,216, -179,216,172,217,138,217,132,216,167,217,132,216,163,217,130,216,179,216,167,217, -133,216,167,217,132,216,182,216,186,216,183,216,167,216,170,216,167,217,132,217, -129,217,138,216,175,217,138,217,136,216,167,217,132,216,170,216,177,216,173,217, -138,216,168,216,167,217,132,216,172,216,175,217,138,216,175,216,169,216,167,217, -132,216,170,216,185,217,132,217,138,217,133,216,167,217,132,216,163,216,174,216, -168,216,167,216,177,216,167,217,132,216,167,217,129,217,132,216,167,217,133,216, -167,217,132,216,163,217,129,217,132,216,167,217,133,216,167,217,132,216,170,216, -167,216,177,217,138,216,174,216,167,217,132,216,170,217,130,217,134,217,138,216, -169,216,167,217,132,216,167,217,132,216,185,216,167,216,168,216,167,217,132,216, -174,217,136,216,167,216,183,216,177,216,167,217,132,217,133,216,172,216,170,217, -133,216,185,216,167,217,132,216,175,217,138,217,131,217,136,216,177,216,167,217, -132,216,179,217,138,216,167,216,173,216,169,216,185,216,168,216,175,216,167,217, -132,217,132,217,135,216,167,217,132,216,170,216,177,216,168,217,138,216,169,216, -167,217,132,216,177,217,136,216,167,216,168,216,183,216,167,217,132,216,163,216, -175,216,168,217,138,216,169,216,167,217,132,216,167,216,174,216,168,216,167,216, -177,216,167,217,132,217,133,216,170,216,173,216,175,216,169,216,167,217,132,216, -167,216,186,216,167,217,134,217,138,99,117,114,115,111,114,58,112,111,105,110, -116,101,114,59,60,47,116,105,116,108,101,62,10,60,109,101,116,97,32,34,32,104, -114,101,102,61,34,104,116,116,112,58,47,47,34,62,60,115,112,97,110,32,99,108,97, -115,115,61,34,109,101,109,98,101,114,115,32,111,102,32,116,104,101,32,119,105, -110,100,111,119,46,108,111,99,97,116,105,111,110,118,101,114,116,105,99,97,108, -45,97,108,105,103,110,58,47,97,62,32,124,32,60,97,32,104,114,101,102,61,34,60,33 -,100,111,99,116,121,112,101,32,104,116,109,108,62,109,101,100,105,97,61,34,115, -99,114,101,101,110,34,32,60,111,112,116,105,111,110,32,118,97,108,117,101,61,34, -102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,10,9,9,60,100,105,118,32,99, -108,97,115,115,61,34,99,104,97,114,97,99,116,101,114,105,115,116,105,99,115,34, -32,109,101,116,104,111,100,61,34,103,101,116,34,32,47,98,111,100,121,62,10,60,47 -,104,116,109,108,62,10,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32, -100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,112,97,100,100,105,110, -103,45,98,111,116,116,111,109,58,114,101,112,114,101,115,101,110,116,97,116,105, -118,101,115,115,117,98,109,105,116,34,32,118,97,108,117,101,61,34,97,108,105,103 -,110,61,34,99,101,110,116,101,114,34,32,116,104,114,111,117,103,104,111,117,116, -32,116,104,101,32,115,99,105,101,110,99,101,32,102,105,99,116,105,111,110,10,32, -32,60,100,105,118,32,99,108,97,115,115,61,34,115,117,98,109,105,116,34,32,99,108 -,97,115,115,61,34,111,110,101,32,111,102,32,116,104,101,32,109,111,115,116,32, -118,97,108,105,103,110,61,34,116,111,112,34,62,60,119,97,115,32,101,115,116,97, -98,108,105,115,104,101,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,114 -,101,116,117,114,110,32,102,97,108,115,101,59,34,62,41,46,115,116,121,108,101,46 -,100,105,115,112,108,97,121,98,101,99,97,117,115,101,32,111,102,32,116,104,101, -32,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,102,111,114,109, -32,97,99,116,105,111,110,61,34,47,125,98,111,100,121,123,109,97,114,103,105,110, -58,48,59,69,110,99,121,99,108,111,112,101,100,105,97,32,111,102,118,101,114,115, -105,111,110,32,111,102,32,116,104,101,32,46,99,114,101,97,116,101,69,108,101,109 -,101,110,116,40,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,60,47,100, -105,118,62,10,60,47,100,105,118,62,10,10,97,100,109,105,110,105,115,116,114,97, -116,105,118,101,32,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,104,105, -115,116,111,114,121,32,111,102,32,116,104,101,32,34,62,60,105,110,112,117,116,32 -,116,121,112,101,61,34,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32, -97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,38,110,98,115,112,59,60,97 -,32,104,114,101,102,61,34,111,116,104,101,114,32,99,111,117,110,116,114,105,101, -115,34,62,10,60,100,105,118,32,99,108,97,115,115,61,34,60,47,115,112,97,110,62, -60,47,115,112,97,110,62,60,73,110,32,111,116,104,101,114,32,119,111,114,100,115, -44,100,105,115,112,108,97,121,58,32,98,108,111,99,107,59,99,111,110,116,114,111, -108,32,111,102,32,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111,110, -32,111,102,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,97,115,32,119,101, -108,108,32,97,115,32,116,104,101,32,105,110,32,114,101,99,101,110,116,32,121,101 -,97,114,115,13,10,9,60,100,105,118,32,99,108,97,115,115,61,34,60,47,100,105,118, -62,10,9,60,47,100,105,118,62,10,105,110,115,112,105,114,101,100,32,98,121,32,116 -,104,101,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,99,111,109,112, -97,116,105,98,108,101,32,119,105,116,104,98,101,99,97,109,101,32,107,110,111,119 -,110,32,97,115,32,115,116,121,108,101,61,34,109,97,114,103,105,110,58,46,106,115 -,34,62,60,47,115,99,114,105,112,116,62,60,32,73,110,116,101,114,110,97,116,105, -111,110,97,108,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,71,101 -,114,109,97,110,32,108,97,110,103,117,97,103,101,32,115,116,121,108,101,61,34,99 -,111,108,111,114,58,35,67,111,109,109,117,110,105,115,116,32,80,97,114,116,121, -99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,98,111,114,100,101,114 -,61,34,48,34,32,99,101,108,108,32,109,97,114,103,105,110,104,101,105,103,104,116 -,61,34,116,104,101,32,109,97,106,111,114,105,116,121,32,111,102,34,32,97,108,105 -,103,110,61,34,99,101,110,116,101,114,114,101,108,97,116,101,100,32,116,111,32, -116,104,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,79,114, -116,104,111,100,111,120,32,67,104,117,114,99,104,115,105,109,105,108,97,114,32, -116,111,32,116,104,101,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,115, -119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,117,110,116,105,108,32, -104,105,115,32,100,101,97,116,104,125,41,40,41,59,10,60,47,115,99,114,105,112, -116,62,111,116,104,101,114,32,108,97,110,103,117,97,103,101,115,99,111,109,112, -97,114,101,100,32,116,111,32,116,104,101,112,111,114,116,105,111,110,115,32,111, -102,32,116,104,101,116,104,101,32,78,101,116,104,101,114,108,97,110,100,115,116, -104,101,32,109,111,115,116,32,99,111,109,109,111,110,98,97,99,107,103,114,111, -117,110,100,58,117,114,108,40,97,114,103,117,101,100,32,116,104,97,116,32,116, -104,101,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,110,99,108, -117,100,101,100,32,105,110,32,116,104,101,78,111,114,116,104,32,65,109,101,114, -105,99,97,110,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,105,110 -,116,101,114,112,114,101,116,97,116,105,111,110,115,116,104,101,32,116,114,97, -100,105,116,105,111,110,97,108,100,101,118,101,108,111,112,109,101,110,116,32, -111,102,32,102,114,101,113,117,101,110,116,108,121,32,117,115,101,100,97,32,99, -111,108,108,101,99,116,105,111,110,32,111,102,118,101,114,121,32,115,105,109,105 -,108,97,114,32,116,111,115,117,114,114,111,117,110,100,105,110,103,32,116,104, -101,101,120,97,109,112,108,101,32,111,102,32,116,104,105,115,97,108,105,103,110, -61,34,99,101,110,116,101,114,34,62,119,111,117,108,100,32,104,97,118,101,32,98, -101,101,110,105,109,97,103,101,95,99,97,112,116,105,111,110,32,61,97,116,116,97, -99,104,101,100,32,116,111,32,116,104,101,115,117,103,103,101,115,116,105,110,103 -,32,116,104,97,116,105,110,32,116,104,101,32,102,111,114,109,32,111,102,32,105, -110,118,111,108,118,101,100,32,105,110,32,116,104,101,105,115,32,100,101,114,105 -,118,101,100,32,102,114,111,109,110,97,109,101,100,32,97,102,116,101,114,32,116, -104,101,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,114,101,115,116 -,114,105,99,116,105,111,110,115,32,111,110,32,115,116,121,108,101,61,34,119,105, -100,116,104,58,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,116,104, -101,32,99,114,101,97,116,105,111,110,32,111,102,109,111,115,116,32,105,109,112, -111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,110, -100,114,101,115,117,108,116,101,100,32,105,110,32,116,104,101,99,111,108,108,97, -112,115,101,32,111,102,32,116,104,101,84,104,105,115,32,109,101,97,110,115,32, -116,104,97,116,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,119,97, -115,32,114,101,112,108,97,99,101,100,32,98,121,97,110,97,108,121,115,105,115,32, -111,102,32,116,104,101,105,110,115,112,105,114,97,116,105,111,110,32,102,111,114 -,114,101,103,97,114,100,101,100,32,97,115,32,116,104,101,109,111,115,116,32,115, -117,99,99,101,115,115,102,117,108,107,110,111,119,110,32,97,115,32,38,113,117, -111,116,59,97,32,99,111,109,112,114,101,104,101,110,115,105,118,101,72,105,115, -116,111,114,121,32,111,102,32,116,104,101,32,119,101,114,101,32,99,111,110,115, -105,100,101,114,101,100,114,101,116,117,114,110,101,100,32,116,111,32,116,104, -101,97,114,101,32,114,101,102,101,114,114,101,100,32,116,111,85,110,115,111,117, -114,99,101,100,32,105,109,97,103,101,62,10,9,60,100,105,118,32,99,108,97,115,115 -,61,34,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,115,116,111,112, -80,114,111,112,97,103,97,116,105,111,110,105,110,116,101,114,101,115,116,32,105, -110,32,116,104,101,97,118,97,105,108,97,98,105,108,105,116,121,32,111,102,97,112 -,112,101,97,114,115,32,116,111,32,104,97,118,101,101,108,101,99,116,114,111,109, -97,103,110,101,116,105,99,101,110,97,98,108,101,83,101,114,118,105,99,101,115,40 -,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,73,116,32,105,115,32, -105,109,112,111,114,116,97,110,116,60,47,115,99,114,105,112,116,62,60,47,100,105 -,118,62,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,114,101,108,97, -116,105,118,101,32,116,111,32,116,104,101,97,115,32,97,32,114,101,115,117,108, -116,32,111,102,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,70, -111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,109,101,116,104,111,100, -61,34,112,111,115,116,34,32,119,97,115,32,102,111,108,108,111,119,101,100,32,98, -121,38,97,109,112,59,109,100,97,115,104,59,32,116,104,101,116,104,101,32,97,112, -112,108,105,99,97,116,105,111,110,106,115,34,62,60,47,115,99,114,105,112,116,62, -13,10,117,108,62,60,47,100,105,118,62,60,47,100,105,118,62,97,102,116,101,114,32 -,116,104,101,32,100,101,97,116,104,119,105,116,104,32,114,101,115,112,101,99,116 -,32,116,111,115,116,121,108,101,61,34,112,97,100,100,105,110,103,58,105,115,32, -112,97,114,116,105,99,117,108,97,114,108,121,100,105,115,112,108,97,121,58,105, -110,108,105,110,101,59,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,105 -,115,32,100,105,118,105,100,101,100,32,105,110,116,111,228,184,173,230,150,135, -32,40,231,174,128,228,189,147,41,114,101,115,112,111,110,115,97,98,105,108,105, -100,97,100,97,100,109,105,110,105,115,116,114,97,99,105,195,179,110,105,110,116, -101,114,110,97,99,105,111,110,97,108,101,115,99,111,114,114,101,115,112,111,110, -100,105,101,110,116,101,224,164,137,224,164,170,224,164,175,224,165,139,224,164, -151,224,164,170,224,165,130,224,164,176,224,165,141,224,164,181,224,164,185,224, -164,174,224,164,190,224,164,176,224,165,135,224,164,178,224,165,139,224,164,151, -224,165,139,224,164,130,224,164,154,224,165,129,224,164,168,224,164,190,224,164, -181,224,164,178,224,165,135,224,164,149,224,164,191,224,164,168,224,164,184,224, -164,176,224,164,149,224,164,190,224,164,176,224,164,170,224,165,129,224,164,178, -224,164,191,224,164,184,224,164,150,224,165,139,224,164,156,224,165,135,224,164, -130,224,164,154,224,164,190,224,164,185,224,164,191,224,164,143,224,164,173,224, -165,135,224,164,156,224,165,135,224,164,130,224,164,182,224,164,190,224,164,174, -224,164,191,224,164,178,224,164,185,224,164,174,224,164,190,224,164,176,224,165, -128,224,164,156,224,164,190,224,164,151,224,164,176,224,164,163,224,164,172,224, -164,168,224,164,190,224,164,168,224,165,135,224,164,149,224,165,129,224,164,174, -224,164,190,224,164,176,224,164,172,224,165,141,224,164,178,224,165,137,224,164, -151,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,164,174,224, -164,185,224,164,191,224,164,178,224,164,190,224,164,170,224,165,131,224,164,183, -224,165,141,224,164,160,224,164,172,224,164,162,224,164,188,224,164,164,224,165, -135,224,164,173,224,164,190,224,164,156,224,164,170,224,164,190,224,164,149,224, -165,141,224,164,178,224,164,191,224,164,149,224,164,159,224,165,141,224,164,176, -224,165,135,224,164,168,224,164,150,224,164,191,224,164,178,224,164,190,224,164, -171,224,164,166,224,165,140,224,164,176,224,164,190,224,164,168,224,164,174,224, -164,190,224,164,174,224,164,178,224,165,135,224,164,174,224,164,164,224,164,166, -224,164,190,224,164,168,224,164,172,224,164,190,224,164,156,224,164,190,224,164, -176,224,164,181,224,164,191,224,164,149,224,164,190,224,164,184,224,164,149,224, -165,141,224,164,175,224,165,139,224,164,130,224,164,154,224,164,190,224,164,185, -224,164,164,224,165,135,224,164,170,224,164,185,224,165,129,224,164,129,224,164, -154,224,164,172,224,164,164,224,164,190,224,164,175,224,164,190,224,164,184,224, -164,130,224,164,181,224,164,190,224,164,166,224,164,166,224,165,135,224,164,150, -224,164,168,224,165,135,224,164,170,224,164,191,224,164,155,224,164,178,224,165, -135,224,164,181,224,164,191,224,164,182,224,165,135,224,164,183,224,164,176,224, -164,190,224,164,156,224,165,141,224,164,175,224,164,137,224,164,164,224,165,141, -224,164,164,224,164,176,224,164,174,224,165,129,224,164,130,224,164,172,224,164, -136,224,164,166,224,165,139,224,164,168,224,165,139,224,164,130,224,164,137,224, -164,170,224,164,149,224,164,176,224,164,163,224,164,170,224,164,162,224,164,188, -224,165,135,224,164,130,224,164,184,224,165,141,224,164,165,224,164,191,224,164, -164,224,164,171,224,164,191,224,164,178,224,165,141,224,164,174,224,164,174,224, -165,129,224,164,150,224,165,141,224,164,175,224,164,133,224,164,154,224,165,141, -224,164,155,224,164,190,224,164,155,224,165,130,224,164,159,224,164,164,224,165, -128,224,164,184,224,164,130,224,164,151,224,165,128,224,164,164,224,164,156,224, -164,190,224,164,143,224,164,151,224,164,190,224,164,181,224,164,191,224,164,173, -224,164,190,224,164,151,224,164,152,224,164,163,224,165,141,224,164,159,224,165, -135,224,164,166,224,165,130,224,164,184,224,164,176,224,165,135,224,164,166,224, -164,191,224,164,168,224,165,139,224,164,130,224,164,185,224,164,164,224,165,141, -224,164,175,224,164,190,224,164,184,224,165,135,224,164,149,224,165,141,224,164, -184,224,164,151,224,164,190,224,164,130,224,164,167,224,165,128,224,164,181,224, -164,191,224,164,182,224,165,141,224,164,181,224,164,176,224,164,190,224,164,164, -224,165,135,224,164,130,224,164,166,224,165,136,224,164,159,224,165,141,224,164, -184,224,164,168,224,164,149,224,165,141,224,164,182,224,164,190,224,164,184,224, -164,190,224,164,174,224,164,168,224,165,135,224,164,133,224,164,166,224,164,190, -224,164,178,224,164,164,224,164,172,224,164,191,224,164,156,224,164,178,224,165, -128,224,164,170,224,165,129,224,164,176,224,165,130,224,164,183,224,164,185,224, -164,191,224,164,130,224,164,166,224,165,128,224,164,174,224,164,191,224,164,164, -224,165,141,224,164,176,224,164,149,224,164,181,224,164,191,224,164,164,224,164, -190,224,164,176,224,165,129,224,164,170,224,164,175,224,165,135,224,164,184,224, -165,141,224,164,165,224,164,190,224,164,168,224,164,149,224,164,176,224,165,139, -224,164,161,224,164,188,224,164,174,224,165,129,224,164,149,224,165,141,224,164, -164,224,164,175,224,165,139,224,164,156,224,164,168,224,164,190,224,164,149,224, -165,131,224,164,170,224,164,175,224,164,190,224,164,170,224,165,139,224,164,184, -224,165,141,224,164,159,224,164,152,224,164,176,224,165,135,224,164,178,224,165, -130,224,164,149,224,164,190,224,164,176,224,165,141,224,164,175,224,164,181,224, -164,191,224,164,154,224,164,190,224,164,176,224,164,184,224,165,130,224,164,154, -224,164,168,224,164,190,224,164,174,224,165,130,224,164,178,224,165,141,224,164, -175,224,164,166,224,165,135,224,164,150,224,165,135,224,164,130,224,164,185,224, -164,174,224,165,135,224,164,182,224,164,190,224,164,184,224,165,141,224,164,149, -224,165,130,224,164,178,224,164,174,224,165,136,224,164,130,224,164,168,224,165, -135,224,164,164,224,165,136,224,164,175,224,164,190,224,164,176,224,164,156,224, -164,191,224,164,184,224,164,149,224,165,135,114,115,115,43,120,109,108,34,32,116 -,105,116,108,101,61,34,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34 -,116,105,116,108,101,34,32,99,111,110,116,101,110,116,61,34,97,116,32,116,104, -101,32,115,97,109,101,32,116,105,109,101,46,106,115,34,62,60,47,115,99,114,105, -112,116,62,10,60,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,60,47 -,115,112,97,110,62,60,47,97,62,60,47,108,105,62,118,101,114,116,105,99,97,108,45 -,97,108,105,103,110,58,116,47,106,113,117,101,114,121,46,109,105,110,46,106,115, -34,62,46,99,108,105,99,107,40,102,117,110,99,116,105,111,110,40,32,115,116,121, -108,101,61,34,112,97,100,100,105,110,103,45,125,41,40,41,59,10,60,47,115,99,114, -105,112,116,62,10,60,47,115,112,97,110,62,60,97,32,104,114,101,102,61,34,60,97, -32,104,114,101,102,61,34,104,116,116,112,58,47,47,41,59,32,114,101,116,117,114, -110,32,102,97,108,115,101,59,116,101,120,116,45,100,101,99,111,114,97,116,105, -111,110,58,32,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,98,111,114, -100,101,114,45,99,111,108,108,97,112,115,101,58,97,115,115,111,99,105,97,116,101 -,100,32,119,105,116,104,32,66,97,104,97,115,97,32,73,110,100,111,110,101,115,105 -,97,69,110,103,108,105,115,104,32,108,97,110,103,117,97,103,101,60,116,101,120, -116,32,120,109,108,58,115,112,97,99,101,61,46,103,105,102,34,32,98,111,114,100, -101,114,61,34,48,34,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,111, -118,101,114,102,108,111,119,58,104,105,100,100,101,110,59,105,109,103,32,115,114 -,99,61,34,104,116,116,112,58,47,47,97,100,100,69,118,101,110,116,76,105,115,116, -101,110,101,114,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,115 -,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,47,102,97,118,105,99,111, -110,46,105,99,111,34,32,47,62,111,112,101,114,97,116,105,110,103,32,115,121,115, -116,101,109,34,32,115,116,121,108,101,61,34,119,105,100,116,104,58,49,116,97,114 -,103,101,116,61,34,95,98,108,97,110,107,34,62,83,116,97,116,101,32,85,110,105, -118,101,114,115,105,116,121,116,101,120,116,45,97,108,105,103,110,58,108,101,102 -,116,59,10,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,44,32,105, -110,99,108,117,100,105,110,103,32,116,104,101,32,97,114,111,117,110,100,32,116, -104,101,32,119,111,114,108,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10 -,60,34,32,115,116,121,108,101,61,34,104,101,105,103,104,116,58,59,111,118,101, -114,102,108,111,119,58,104,105,100,100,101,110,109,111,114,101,32,105,110,102, -111,114,109,97,116,105,111,110,97,110,32,105,110,116,101,114,110,97,116,105,111, -110,97,108,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,111,110,101 -,32,111,102,32,116,104,101,32,102,105,114,115,116,99,97,110,32,98,101,32,102,111 -,117,110,100,32,105,110,32,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10, -100,105,115,112,108,97,121,58,32,110,111,110,101,59,34,62,34,32,47,62,10,60,108, -105,110,107,32,114,101,108,61,34,10,32,32,40,102,117,110,99,116,105,111,110,40, -41,32,123,116,104,101,32,49,53,116,104,32,99,101,110,116,117,114,121,46,112,114, -101,118,101,110,116,68,101,102,97,117,108,116,40,108,97,114,103,101,32,110,117, -109,98,101,114,32,111,102,32,66,121,122,97,110,116,105,110,101,32,69,109,112,105 -,114,101,46,106,112,103,124,116,104,117,109,98,124,108,101,102,116,124,118,97, -115,116,32,109,97,106,111,114,105,116,121,32,111,102,109,97,106,111,114,105,116, -121,32,111,102,32,116,104,101,32,32,97,108,105,103,110,61,34,99,101,110,116,101, -114,34,62,85,110,105,118,101,114,115,105,116,121,32,80,114,101,115,115,100,111, -109,105,110,97,116,101,100,32,98,121,32,116,104,101,83,101,99,111,110,100,32,87, -111,114,108,100,32,87,97,114,100,105,115,116,114,105,98,117,116,105,111,110,32, -111,102,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,116,104, -101,32,114,101,115,116,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101, -114,105,122,101,100,32,98,121,32,114,101,108,61,34,110,111,102,111,108,108,111, -119,34,62,100,101,114,105,118,101,115,32,102,114,111,109,32,116,104,101,114,97, -116,104,101,114,32,116,104,97,110,32,116,104,101,32,97,32,99,111,109,98,105,110, -97,116,105,111,110,32,111,102,115,116,121,108,101,61,34,119,105,100,116,104,58, -49,48,48,69,110,103,108,105,115,104,45,115,112,101,97,107,105,110,103,99,111,109 -,112,117,116,101,114,32,115,99,105,101,110,99,101,98,111,114,100,101,114,61,34, -48,34,32,97,108,116,61,34,116,104,101,32,101,120,105,115,116,101,110,99,101,32, -111,102,68,101,109,111,99,114,97,116,105,99,32,80,97,114,116,121,34,32,115,116, -121,108,101,61,34,109,97,114,103,105,110,45,70,111,114,32,116,104,105,115,32,114 -,101,97,115,111,110,44,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,9,115 -,66,121,84,97,103,78,97,109,101,40,115,41,91,48,93,106,115,34,62,60,47,115,99, -114,105,112,116,62,13,10,60,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13, -10,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,39,32,97,108,116,61 -,39,39,32,99,108,97,115,115,61,39,102,111,114,109,97,116,105,111,110,32,111,102, -32,116,104,101,118,101,114,115,105,111,110,115,32,111,102,32,116,104,101,32,60, -47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,47,112,97,103,101,62,10,32,32 -,60,112,97,103,101,62,10,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110, -116,98,101,99,97,109,101,32,116,104,101,32,102,105,114,115,116,98,97,104,97,115, -97,32,73,110,100,111,110,101,115,105,97,101,110,103,108,105,115,104,32,40,115, -105,109,112,108,101,41,206,149,206,187,206,187,206,183,206,189,206,185,206,186, -206,172,209,133,209,128,208,178,208,176,209,130,209,129,208,186,208,184,208,186, -208,190,208,188,208,191,208,176,208,189,208,184,208,184,209,143,208,178,208,187, -209,143,208,181,209,130,209,129,209,143,208,148,208,190,208,177,208,176,208,178, -208,184,209,130,209,140,209,135,208,181,208,187,208,190,208,178,208,181,208,186, -208,176,209,128,208,176,208,183,208,178,208,184,209,130,208,184,209,143,208,152, -208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,158,209,130,208,178, -208,181,209,130,208,184,209,130,209,140,208,189,208,176,208,191,209,128,208,184, -208,188,208,181,209,128,208,184,208,189,209,130,208,181,209,128,208,189,208,181, -209,130,208,186,208,190,209,130,208,190,209,128,208,190,208,179,208,190,209,129, -209,130,209,128,208,176,208,189,208,184,209,134,209,139,208,186,208,176,209,135, -208,181,209,129,209,130,208,178,208,181,209,131,209,129,208,187,208,190,208,178, -208,184,209,143,209,133,208,191,209,128,208,190,208,177,208,187,208,181,208,188, -209,139,208,191,208,190,208,187,209,131,209,135,208,184,209,130,209,140,209,143, -208,178,208,187,209,143,209,142,209,130,209,129,209,143,208,189,208,176,208,184, -208,177,208,190,208,187,208,181,208,181,208,186,208,190,208,188,208,191,208,176, -208,189,208,184,209,143,208,178,208,189,208,184,208,188,208,176,208,189,208,184, -208,181,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,176,216,167, -217,132,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,177, -216,166,217,138,216,179,217,138,216,169,216,167,217,132,216,167,217,134,216,170, -217,130,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170, -217,131,216,167,217,132,216,179,217,138,216,167,216,177,216,167,216,170,216,167, -217,132,217,133,217,131,216,170,217,136,216,168,216,169,216,167,217,132,216,179, -216,185,217,136,216,175,217,138,216,169,216,167,216,173,216,181,216,167,216,166, -217,138,216,167,216,170,216,167,217,132,216,185,216,167,217,132,217,133,217,138, -216,169,216,167,217,132,216,181,217,136,216,170,217,138,216,167,216,170,216,167, -217,132,216,167,217,134,216,170,216,177,217,134,216,170,216,167,217,132,216,170, -216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,165,216,179,217,132, -216,167,217,133,217,138,216,167,217,132,217,133,216,180,216,167,216,177,217,131, -216,169,216,167,217,132,217,133,216,177,216,166,217,138,216,167,216,170,114,111, -98,111,116,115,34,32,99,111,110,116,101,110,116,61,34,60,100,105,118,32,105,100, -61,34,102,111,111,116,101,114,34,62,116,104,101,32,85,110,105,116,101,100,32,83, -116,97,116,101,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47, -46,106,112,103,124,114,105,103,104,116,124,116,104,117,109,98,124,46,106,115,34, -62,60,47,115,99,114,105,112,116,62,13,10,60,108,111,99,97,116,105,111,110,46,112 -,114,111,116,111,99,111,108,102,114,97,109,101,98,111,114,100,101,114,61,34,48, -34,32,115,34,32,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,60,47,97,62, -60,47,100,105,118,62,60,47,100,105,118,62,60,102,111,110,116,45,119,101,105,103, -104,116,58,98,111,108,100,59,38,113,117,111,116,59,32,97,110,100,32,38,113,117, -111,116,59,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109, -97,114,103,105,110,58,48,59,112,97,100,100,105,110,103,58,34,32,114,101,108,61, -34,110,111,102,111,108,108,111,119,34,32,80,114,101,115,105,100,101,110,116,32, -111,102,32,116,104,101,32,116,119,101,110,116,105,101,116,104,32,99,101,110,116, -117,114,121,101,118,105,115,105,111,110,62,10,32,32,60,47,112,97,103,101,73,110, -116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,97,46,97,115,121,110, -99,32,61,32,116,114,117,101,59,13,10,105,110,102,111,114,109,97,116,105,111,110, -32,97,98,111,117,116,60,100,105,118,32,105,100,61,34,104,101,97,100,101,114,34, -62,34,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,97,32,104,114, -101,102,61,34,104,116,116,112,115,58,47,47,60,100,105,118,32,105,100,61,34,99, -111,110,116,101,110,116,34,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10 -,60,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32,60,105,109, -103,32,115,114,99,61,39,104,116,116,112,58,47,47,97,99,99,111,114,100,105,110, -103,32,116,111,32,116,104,101,32,10,60,47,98,111,100,121,62,10,60,47,104,116,109 -,108,62,10,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,115, -99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,65,114,105,97,108,44, -32,72,101,108,118,101,116,105,99,97,44,60,47,97,62,60,115,112,97,110,32,99,108, -97,115,115,61,34,60,47,115,99,114,105,112,116,62,60,115,99,114,105,112,116,32, -112,111,108,105,116,105,99,97,108,32,112,97,114,116,105,101,115,116,100,62,60,47 -,116,114,62,60,47,116,97,98,108,101,62,60,104,114,101,102,61,34,104,116,116,112, -58,47,47,119,119,119,46,105,110,116,101,114,112,114,101,116,97,116,105,111,110, -32,111,102,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,100, -111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,99,104,97,114,115,101 -,116,61,34,117,116,102,45,56,34,62,10,98,101,103,105,110,110,105,110,103,32,111, -102,32,116,104,101,32,114,101,118,101,97,108,101,100,32,116,104,97,116,32,116, -104,101,116,101,108,101,118,105,115,105,111,110,32,115,101,114,105,101,115,34,32 -,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,32,116,97,114,103,101, -116,61,34,95,98,108,97,110,107,34,62,99,108,97,105,109,105,110,103,32,116,104,97 -,116,32,116,104,101,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46, -109,97,110,105,102,101,115,116,97,116,105,111,110,115,32,111,102,80,114,105,109, -101,32,77,105,110,105,115,116,101,114,32,111,102,105,110,102,108,117,101,110,99, -101,100,32,98,121,32,116,104,101,99,108,97,115,115,61,34,99,108,101,97,114,102, -105,120,34,62,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,116,104, -114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,67,104,117,114,99,104, -32,111,102,32,69,110,103,108,97,110,100,111,102,32,78,111,114,116,104,32,67,97, -114,111,108,105,110,97,115,113,117,97,114,101,32,107,105,108,111,109,101,116,114 -,101,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,100,105 -,115,116,105,110,99,116,32,102,114,111,109,32,116,104,101,99,111,109,109,111,110 -,108,121,32,107,110,111,119,110,32,97,115,80,104,111,110,101,116,105,99,32,65, -108,112,104,97,98,101,116,100,101,99,108,97,114,101,100,32,116,104,97,116,32,116 -,104,101,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,66,101, -110,106,97,109,105,110,32,70,114,97,110,107,108,105,110,114,111,108,101,45,112, -108,97,121,105,110,103,32,103,97,109,101,116,104,101,32,85,110,105,118,101,114, -115,105,116,121,32,111,102,105,110,32,87,101,115,116,101,114,110,32,69,117,114, -111,112,101,112,101,114,115,111,110,97,108,32,99,111,109,112,117,116,101,114,80, -114,111,106,101,99,116,32,71,117,116,101,110,98,101,114,103,114,101,103,97,114, -100,108,101,115,115,32,111,102,32,116,104,101,104,97,115,32,98,101,101,110,32, -112,114,111,112,111,115,101,100,116,111,103,101,116,104,101,114,32,119,105,116, -104,32,116,104,101,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,105 -,110,32,115,111,109,101,32,99,111,117,110,116,114,105,101,115,109,105,110,46,106 -,115,34,62,60,47,115,99,114,105,112,116,62,111,102,32,116,104,101,32,112,111,112 -,117,108,97,116,105,111,110,111,102,102,105,99,105,97,108,32,108,97,110,103,117, -97,103,101,60,105,109,103,32,115,114,99,61,34,105,109,97,103,101,115,47,105,100, -101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,110,97,116,117,114,97, -108,32,114,101,115,111,117,114,99,101,115,99,108,97,115,115,105,102,105,99,97, -116,105,111,110,32,111,102,99,97,110,32,98,101,32,99,111,110,115,105,100,101,114 -,101,100,113,117,97,110,116,117,109,32,109,101,99,104,97,110,105,99,115,78,101, -118,101,114,116,104,101,108,101,115,115,44,32,116,104,101,109,105,108,108,105, -111,110,32,121,101,97,114,115,32,97,103,111,60,47,98,111,100,121,62,13,10,60,47, -104,116,109,108,62,13,206,149,206,187,206,187,206,183,206,189,206,185,206,186, -206,172,10,116,97,107,101,32,97,100,118,97,110,116,97,103,101,32,111,102,97,110, -100,44,32,97,99,99,111,114,100,105,110,103,32,116,111,97,116,116,114,105,98,117, -116,101,100,32,116,111,32,116,104,101,77,105,99,114,111,115,111,102,116,32,87, -105,110,100,111,119,115,116,104,101,32,102,105,114,115,116,32,99,101,110,116,117 -,114,121,117,110,100,101,114,32,116,104,101,32,99,111,110,116,114,111,108,100, -105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,115,104,111,114,116, -108,121,32,97,102,116,101,114,32,116,104,101,110,111,116,97,98,108,101,32,101, -120,99,101,112,116,105,111,110,116,101,110,115,32,111,102,32,116,104,111,117,115 -,97,110,100,115,115,101,118,101,114,97,108,32,100,105,102,102,101,114,101,110, -116,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,46,114,101,97, -99,104,105,110,103,32,109,105,108,105,116,97,114,121,105,115,111,108,97,116,101, -100,32,102,114,111,109,32,116,104,101,111,112,112,111,115,105,116,105,111,110,32 -,116,111,32,116,104,101,116,104,101,32,79,108,100,32,84,101,115,116,97,109,101, -110,116,65,102,114,105,99,97,110,32,65,109,101,114,105,99,97,110,115,105,110,115 -,101,114,116,101,100,32,105,110,116,111,32,116,104,101,115,101,112,97,114,97,116 -,101,32,102,114,111,109,32,116,104,101,109,101,116,114,111,112,111,108,105,116, -97,110,32,97,114,101,97,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98, -108,101,97,99,107,110,111,119,108,101,100,103,101,100,32,116,104,97,116,97,114, -103,117,97,98,108,121,32,116,104,101,32,109,111,115,116,116,121,112,101,61,34, -116,101,120,116,47,99,115,115,34,62,10,116,104,101,32,73,110,116,101,114,110,97, -116,105,111,110,97,108,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104, -101,32,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,99,111,105,110 -,99,105,100,101,32,119,105,116,104,32,116,104,101,116,119,111,45,116,104,105,114 -,100,115,32,111,102,32,116,104,101,68,117,114,105,110,103,32,116,104,105,115,32, -116,105,109,101,44,100,117,114,105,110,103,32,116,104,101,32,112,101,114,105,111 -,100,97,110,110,111,117,110,99,101,100,32,116,104,97,116,32,104,101,116,104,101, -32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,110,100,32,109,111,114, -101,32,114,101,99,101,110,116,108,121,98,101,108,105,101,118,101,100,32,116,104, -97,116,32,116,104,101,99,111,110,115,99,105,111,117,115,110,101,115,115,32,97, -110,100,102,111,114,109,101,114,108,121,32,107,110,111,119,110,32,97,115,115,117 -,114,114,111,117,110,100,101,100,32,98,121,32,116,104,101,102,105,114,115,116,32 -,97,112,112,101,97,114,101,100,32,105,110,111,99,99,97,115,105,111,110,97,108, -108,121,32,117,115,101,100,112,111,115,105,116,105,111,110,58,97,98,115,111,108, -117,116,101,59,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,112 -,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,116,101,120, -116,45,97,108,105,103,110,58,99,101,110,116,101,114,59,106,97,120,47,108,105,98, -115,47,106,113,117,101,114,121,47,49,46,98,97,99,107,103,114,111,117,110,100,45, -99,111,108,111,114,58,35,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105, -111,110,47,97,110,103,117,97,103,101,34,32,99,111,110,116,101,110,116,61,34,60, -109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,80,114,105,118,97 -,99,121,32,80,111,108,105,99,121,60,47,97,62,101,40,34,37,51,67,115,99,114,105, -112,116,32,115,114,99,61,39,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110, -107,34,62,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,46, -106,112,103,124,116,104,117,109,98,124,114,105,103,104,116,124,50,60,47,100,105, -118,62,60,100,105,118,32,99,108,97,115,115,61,34,60,100,105,118,32,115,116,121, -108,101,61,34,102,108,111,97,116,58,110,105,110,101,116,101,101,110,116,104,32, -99,101,110,116,117,114,121,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108, -62,13,10,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,115,59,116, -101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,102,111,110,116,45, -119,101,105,103,104,116,58,32,98,111,108,100,59,32,65,99,99,111,114,100,105,110, -103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98, -101,116,119,101,101,110,34,32,102,114,97,109,101,98,111,114,100,101,114,61,34,48 -,34,32,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,108, -105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,104,116,109,108,52 -,47,108,111,111,115,101,46,100,116,100,34,62,10,100,117,114,105,110,103,32,116, -104,105,115,32,112,101,114,105,111,100,60,47,116,100,62,60,47,116,114,62,60,47, -116,97,98,108,101,62,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,32 -,116,111,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,59 -,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,105,110,112,117 -,116,32,116,121,112,101,61,34,116,101,120,116,34,32,60,115,112,97,110,32,115,116 -,121,108,101,61,34,102,111,110,116,45,111,110,114,101,97,100,121,115,116,97,116, -101,99,104,97,110,103,101,9,60,100,105,118,32,99,108,97,115,115,61,34,99,108,101 -,97,114,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,32,70 -,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,32,119,105,100, -101,32,118,97,114,105,101,116,121,32,111,102,32,60,33,68,79,67,84,89,80,69,32, -104,116,109,108,62,13,10,60,38,110,98,115,112,59,38,110,98,115,112,59,38,110,98, -115,112,59,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,116 -,121,108,101,61,34,102,108,111,97,116,58,108,101,102,116,59,99,111,110,99,101, -114,110,101,100,32,119,105,116,104,32,116,104,101,61,104,116,116,112,37,51,65,37 -,50,70,37,50,70,119,119,119,46,105,110,32,112,111,112,117,108,97,114,32,99,117, -108,116,117,114,101,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47 -,62,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,72,97,114 -,118,97,114,100,32,85,110,105,118,101,114,115,105,116,121,116,121,108,101,115, -104,101,101,116,34,32,104,114,101,102,61,34,47,116,104,101,32,109,97,105,110,32, -99,104,97,114,97,99,116,101,114,79,120,102,111,114,100,32,85,110,105,118,101,114 -,115,105,116,121,32,32,110,97,109,101,61,34,107,101,121,119,111,114,100,115,34, -32,99,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104 -,101,32,85,110,105,116,101,100,32,75,105,110,103,100,111,109,102,101,100,101,114 -,97,108,32,103,111,118,101,114,110,109,101,110,116,60,100,105,118,32,115,116,121 -,108,101,61,34,109,97,114,103,105,110,32,100,101,112,101,110,100,105,110,103,32, -111,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102, -32,116,104,101,60,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114, -46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,100,101,115,116, -114,117,99,116,105,111,110,32,111,102,32,116,104,101,115,108,105,103,104,116,108 -,121,32,100,105,102,102,101,114,101,110,116,105,110,32,97,99,99,111,114,100,97, -110,99,101,32,119,105,116,104,116,101,108,101,99,111,109,109,117,110,105,99,97, -116,105,111,110,115,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116, -104,101,115,104,111,114,116,108,121,32,116,104,101,114,101,97,102,116,101,114, -101,115,112,101,99,105,97,108,108,121,32,105,110,32,116,104,101,32,69,117,114, -111,112,101,97,110,32,99,111,117,110,116,114,105,101,115,72,111,119,101,118,101, -114,44,32,116,104,101,114,101,32,97,114,101,115,114,99,61,34,104,116,116,112,58, -47,47,115,116,97,116,105,99,115,117,103,103,101,115,116,101,100,32,116,104,97, -116,32,116,104,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119, -46,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,84,101,108, -101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,34,32,114,101,108,61,34 -,110,111,102,111,108,108,111,119,34,32,116,72,111,108,121,32,82,111,109,97,110, -32,69,109,112,101,114,111,114,97,108,109,111,115,116,32,101,120,99,108,117,115, -105,118,101,108,121,34,32,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34 -,83,101,99,114,101,116,97,114,121,32,111,102,32,83,116,97,116,101,99,117,108,109 -,105,110,97,116,105,110,103,32,105,110,32,116,104,101,67,73,65,32,87,111,114,108 -,100,32,70,97,99,116,98,111,111,107,116,104,101,32,109,111,115,116,32,105,109, -112,111,114,116,97,110,116,97,110,110,105,118,101,114,115,97,114,121,32,111,102, -32,116,104,101,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45 -,60,108,105,62,60,101,109,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,65 -,116,108,97,110,116,105,99,32,79,99,101,97,110,115,116,114,105,99,116,108,121,32 -,115,112,101,97,107,105,110,103,44,115,104,111,114,116,108,121,32,98,101,102,111 -,114,101,32,116,104,101,100,105,102,102,101,114,101,110,116,32,116,121,112,101, -115,32,111,102,116,104,101,32,79,116,116,111,109,97,110,32,69,109,112,105,114, -101,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,65,110,32,73, -110,116,114,111,100,117,99,116,105,111,110,32,116,111,99,111,110,115,101,113,117 -,101,110,99,101,32,111,102,32,116,104,101,100,101,112,97,114,116,117,114,101,32, -102,114,111,109,32,116,104,101,67,111,110,102,101,100,101,114,97,116,101,32,83, -116,97,116,101,115,105,110,100,105,103,101,110,111,117,115,32,112,101,111,112, -108,101,115,80,114,111,99,101,101,100,105,110,103,115,32,111,102,32,116,104,101, -105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,104,101,116,104,101 -,111,114,105,101,115,32,104,97,118,101,32,98,101,101,110,105,110,118,111,108,118 -,101,109,101,110,116,32,105,110,32,116,104,101,100,105,118,105,100,101,100,32, -105,110,116,111,32,116,104,114,101,101,97,100,106,97,99,101,110,116,32,99,111, -117,110,116,114,105,101,115,105,115,32,114,101,115,112,111,110,115,105,98,108, -101,32,102,111,114,100,105,115,115,111,108,117,116,105,111,110,32,111,102,32,116 -,104,101,99,111,108,108,97,98,111,114,97,116,105,111,110,32,119,105,116,104,119, -105,100,101,108,121,32,114,101,103,97,114,100,101,100,32,97,115,104,105,115,32, -99,111,110,116,101,109,112,111,114,97,114,105,101,115,102,111,117,110,100,105, -110,103,32,109,101,109,98,101,114,32,111,102,68,111,109,105,110,105,99,97,110,32 -,82,101,112,117,98,108,105,99,103,101,110,101,114,97,108,108,121,32,97,99,99,101 -,112,116,101,100,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32, -111,102,97,114,101,32,97,108,115,111,32,97,118,97,105,108,97,98,108,101,117,110, -100,101,114,32,99,111,110,115,116,114,117,99,116,105,111,110,114,101,115,116,111 -,114,97,116,105,111,110,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101 -,114,97,108,32,112,117,98,108,105,99,105,115,32,97,108,109,111,115,116,32,101, -110,116,105,114,101,108,121,112,97,115,115,101,115,32,116,104,114,111,117,103, -104,32,116,104,101,104,97,115,32,98,101,101,110,32,115,117,103,103,101,115,116, -101,100,99,111,109,112,117,116,101,114,32,97,110,100,32,118,105,100,101,111,71, -101,114,109,97,110,105,99,32,108,97,110,103,117,97,103,101,115,32,97,99,99,111, -114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110 -,116,32,102,114,111,109,32,116,104,101,115,104,111,114,116,108,121,32,97,102,116 -,101,114,119,97,114,100,115,104,114,101,102,61,34,104,116,116,112,115,58,47,47, -119,119,119,46,114,101,99,101,110,116,32,100,101,118,101,108,111,112,109,101,110 -,116,66,111,97,114,100,32,111,102,32,68,105,114,101,99,116,111,114,115,60,100, -105,118,32,99,108,97,115,115,61,34,115,101,97,114,99,104,124,32,60,97,32,104,114 -,101,102,61,34,104,116,116,112,58,47,47,73,110,32,112,97,114,116,105,99,117,108, -97,114,44,32,116,104,101,77,117,108,116,105,112,108,101,32,102,111,111,116,110, -111,116,101,115,111,114,32,111,116,104,101,114,32,115,117,98,115,116,97,110,99, -101,116,104,111,117,115,97,110,100,115,32,111,102,32,121,101,97,114,115,116,114, -97,110,115,108,97,116,105,111,110,32,111,102,32,116,104,101,60,47,100,105,118,62 -,13,10,60,47,100,105,118,62,13,10,13,10,60,97,32,104,114,101,102,61,34,105,110, -100,101,120,46,112,104,112,119,97,115,32,101,115,116,97,98,108,105,115,104,101, -100,32,105,110,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10, -112,97,114,116,105,99,105,112,97,116,101,32,105,110,32,116,104,101,97,32,115,116 -,114,111,110,103,32,105,110,102,108,117,101,110,99,101,115,116,121,108,101,61,34 -,109,97,114,103,105,110,45,116,111,112,58,114,101,112,114,101,115,101,110,116, -101,100,32,98,121,32,116,104,101,103,114,97,100,117,97,116,101,100,32,102,114, -111,109,32,116,104,101,84,114,97,100,105,116,105,111,110,97,108,108,121,44,32, -116,104,101,69,108,101,109,101,110,116,40,34,115,99,114,105,112,116,34,41,59,72, -111,119,101,118,101,114,44,32,115,105,110,99,101,32,116,104,101,47,100,105,118, -62,10,60,47,100,105,118,62,10,60,100,105,118,32,108,101,102,116,59,32,109,97,114 -,103,105,110,45,108,101,102,116,58,112,114,111,116,101,99,116,105,111,110,32,97, -103,97,105,110,115,116,48,59,32,118,101,114,116,105,99,97,108,45,97,108,105,103, -110,58,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32,116,104,101,116, -121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,47,100,105,118,62, -10,60,100,105,118,32,99,108,97,115,115,61,34,32,99,108,97,115,115,61,34,99,108, -101,97,114,102,105,120,34,62,60,100,105,118,32,99,108,97,115,115,61,34,102,111, -111,116,101,114,9,9,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,116,104, -101,32,109,111,116,105,111,110,32,112,105,99,116,117,114,101,208,145,209,138,208 -,187,208,179,208,176,209,128,209,129,208,186,208,184,208,177,209,138,208,187,208 -,179,208,176,209,128,209,129,208,186,208,184,208,164,208,181,208,180,208,181,209 -,128,208,176,209,134,208,184,208,184,208,189,208,181,209,129,208,186,208,190,208 -,187,209,140,208,186,208,190,209,129,208,190,208,190,208,177,209,137,208,181,208 -,189,208,184,208,181,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208 -,184,209,143,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,209 -,139,208,158,209,130,208,191,209,128,208,176,208,178,208,184,209,130,209,140,208 -,177,208,181,209,129,208,191,208,187,208,176,209,130,208,189,208,190,208,188,208 -,176,209,130,208,181,209,128,208,184,208,176,208,187,209,139,208,191,208,190,208 -,183,208,178,208,190,208,187,209,143,208,181,209,130,208,191,208,190,209,129,208 -,187,208,181,208,180,208,189,208,184,208,181,209,128,208,176,208,183,208,187,208 -,184,209,135,208,189,209,139,209,133,208,191,209,128,208,190,208,180,209,131,208 -,186,209,134,208,184,208,184,208,191,209,128,208,190,208,179,209,128,208,176,208 -,188,208,188,208,176,208,191,208,190,208,187,208,189,208,190,209,129,209,130,209 -,140,209,142,208,189,208,176,209,133,208,190,208,180,208,184,209,130,209,129,209 -,143,208,184,208,183,208,177,209,128,208,176,208,189,208,189,208,190,208,181,208 -,189,208,176,209,129,208,181,208,187,208,181,208,189,208,184,209,143,208,184,208 -,183,208,188,208,181,208,189,208,181,208,189,208,184,209,143,208,186,208,176,209 -,130,208,181,208,179,208,190,209,128,208,184,208,184,208,144,208,187,208,181,208 -,186,209,129,208,176,208,189,208,180,209,128,224,164,166,224,165,141,224,164,181 -,224,164,190,224,164,176,224,164,190,224,164,174,224,165,136,224,164,168,224,165 -,129,224,164,133,224,164,178,224,164,170,224,165,141,224,164,176,224,164,166,224 -,164,190,224,164,168,224,164,173,224,164,190,224,164,176,224,164,164,224,165,128 -,224,164,175,224,164,133,224,164,168,224,165,129,224,164,166,224,165,135,224,164 -,182,224,164,185,224,164,191,224,164,168,224,165,141,224,164,166,224,165,128,224 -,164,135,224,164,130,224,164,161,224,164,191,224,164,175,224,164,190,224,164,166 -,224,164,191,224,164,178,224,165,141,224,164,178,224,165,128,224,164,133,224,164 -,167,224,164,191,224,164,149,224,164,190,224,164,176,224,164,181,224,165,128,224 -,164,161,224,164,191,224,164,175,224,165,139,224,164,154,224,164,191,224,164,159 -,224,165,141,224,164,160,224,165,135,224,164,184,224,164,174,224,164,190,224,164 -,154,224,164,190,224,164,176,224,164,156,224,164,130,224,164,149,224,165,141,224 -,164,182,224,164,168,224,164,166,224,165,129,224,164,168,224,164,191,224,164,175 -,224,164,190,224,164,170,224,165,141,224,164,176,224,164,175,224,165,139,224,164 -,151,224,164,133,224,164,168,224,165,129,224,164,184,224,164,190,224,164,176,224 -,164,145,224,164,168,224,164,178,224,164,190,224,164,135,224,164,168,224,164,170 -,224,164,190,224,164,176,224,165,141,224,164,159,224,165,128,224,164,182,224,164 -,176,224,165,141,224,164,164,224,165,139,224,164,130,224,164,178,224,165,139,224 -,164,149,224,164,184,224,164,173,224,164,190,224,164,171,224,164,188,224,165,141 -,224,164,178,224,165,136,224,164,182,224,164,182,224,164,176,224,165,141,224,164 -,164,224,165,135,224,164,130,224,164,170,224,165,141,224,164,176,224,164,166,224 -,165,135,224,164,182,224,164,170,224,165,141,224,164,178,224,165,135,224,164,175 -,224,164,176,224,164,149,224,165,135,224,164,130,224,164,166,224,165,141,224,164 -,176,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,191,224 -,164,137,224,164,164,224,165,141,224,164,170,224,164,190,224,164,166,224,164,137 -,224,164,168,224,165,141,224,164,185,224,165,135,224,164,130,224,164,154,224,164 -,191,224,164,159,224,165,141,224,164,160,224,164,190,224,164,175,224,164,190,224 -,164,164,224,165,141,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175 -,224,164,190,224,164,166,224,164,190,224,164,170,224,165,129,224,164,176,224,164 -,190,224,164,168,224,165,135,224,164,156,224,165,139,224,164,161,224,164,188,224 -,165,135,224,164,130,224,164,133,224,164,168,224,165,129,224,164,181,224,164,190 -,224,164,166,224,164,182,224,165,141,224,164,176,224,165,135,224,164,163,224,165 -,128,224,164,182,224,164,191,224,164,149,224,165,141,224,164,183,224,164,190,224 -,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184 -,224,164,130,224,164,151,224,165,141,224,164,176,224,164,185,224,164,170,224,164 -,176,224,164,191,224,164,163,224,164,190,224,164,174,224,164,172,224,165,141,224 -,164,176,224,164,190,224,164,130,224,164,161,224,164,172,224,164,154,224,165,141 -,224,164,154,224,165,139,224,164,130,224,164,137,224,164,170,224,164,178,224,164 -,172,224,165,141,224,164,167,224,164,174,224,164,130,224,164,164,224,165,141,224 -,164,176,224,165,128,224,164,184,224,164,130,224,164,170,224,164,176,224,165,141 -,224,164,149,224,164,137,224,164,174,224,165,141,224,164,174,224,165,128,224,164 -,166,224,164,174,224,164,190,224,164,167,224,165,141,224,164,175,224,164,174,224 -,164,184,224,164,185,224,164,190,224,164,175,224,164,164,224,164,190,224,164,182 -,224,164,172,224,165,141,224,164,166,224,165,139,224,164,130,224,164,174,224,165 -,128,224,164,161,224,164,191,224,164,175,224,164,190,224,164,134,224,164,136,224 -,164,170,224,165,128,224,164,143,224,164,178,224,164,174,224,165,139,224,164,172 -,224,164,190,224,164,135,224,164,178,224,164,184,224,164,130,224,164,150,224,165 -,141,224,164,175,224,164,190,224,164,134,224,164,170,224,164,176,224,165,135,224 -,164,182,224,164,168,224,164,133,224,164,168,224,165,129,224,164,172,224,164,130 -,224,164,167,224,164,172,224,164,190,224,164,156,224,164,188,224,164,190,224,164 -,176,224,164,168,224,164,181,224,165,128,224,164,168,224,164,164,224,164,174,224 -,164,170,224,165,141,224,164,176,224,164,174,224,165,129,224,164,150,224,164,170 -,224,165,141,224,164,176,224,164,182,224,165,141,224,164,168,224,164,170,224,164 -,176,224,164,191,224,164,181,224,164,190,224,164,176,224,164,168,224,165,129,224 -,164,149,224,164,184,224,164,190,224,164,168,224,164,184,224,164,174,224,164,176 -,224,165,141,224,164,165,224,164,168,224,164,134,224,164,175,224,165,139,224,164 -,156,224,164,191,224,164,164,224,164,184,224,165,139,224,164,174,224,164,181,224 -,164,190,224,164,176,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216 -,167,216,170,216,167,217,132,217,133,217,134,216,170,216,175,217,138,216,167,216 -,170,216,167,217,132,217,131,217,133,216,168,217,138,217,136,216,170,216,177,216 -,167,217,132,217,133,216,180,216,167,217,135,216,175,216,167,216,170,216,185,216 -,175,216,175,216,167,217,132,216,178,217,136,216,167,216,177,216,185,216,175,216 -,175,216,167,217,132,216,177,216,175,217,136,216,175,216,167,217,132,216,165,216 -,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,217,129,217,136,216 -,170,217,136,216,180,217,136,216,168,216,167,217,132,217,133,216,179,216,167,216 -,168,217,130,216,167,216,170,216,167,217,132,217,133,216,185,217,132,217,136,217 -,133,216,167,216,170,216,167,217,132,217,133,216,179,217,132,216,179,217,132,216 -,167,216,170,216,167,217,132,216,172,216,177,216,167,217,129,217,138,217,131,216 -,179,216,167,217,132,216,167,216,179,217,132,216,167,217,133,217,138,216,169,216 -,167,217,132,216,167,216,170,216,181,216,167,217,132,216,167,216,170,107,101,121 -,119,111,114,100,115,34,32,99,111,110,116,101,110,116,61,34,119,51,46,111,114, -103,47,49,57,57,57,47,120,104,116,109,108,34,62,60,97,32,116,97,114,103,101,116, -61,34,95,98,108,97,110,107,34,32,116,101,120,116,47,104,116,109,108,59,32,99,104 -,97,114,115,101,116,61,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107, -34,62,60,116,97,98,108,101,32,99,101,108,108,112,97,100,100,105,110,103,61,34,97 -,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,116,101,120, -116,45,97,108,105,103,110,58,32,99,101,110,116,101,114,59,116,111,32,108,97,115, -116,32,118,101,114,115,105,111,110,32,98,121,32,98,97,99,107,103,114,111,117,110 -,100,45,99,111,108,111,114,58,32,35,34,32,104,114,101,102,61,34,104,116,116,112, -58,47,47,119,119,119,46,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32 -,105,100,61,60,97,32,104,114,101,102,61,34,35,34,32,99,108,97,115,115,61,34,34, -62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,99,114,105,112, -116,34,32,115,114,99,61,34,104,116,116,112,58,47,47,10,60,115,99,114,105,112,116 -,32,108,97,110,103,117,97,103,101,61,34,47,47,69,78,34,32,34,104,116,116,112,58, -47,47,119,119,119,46,119,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110, -101,110,116,40,34,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116, -58,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,101,110,116,100,111, -99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,115,99,112,111,115,105, -116,105,111,110,58,32,97,98,115,111,108,117,116,101,59,115,99,114,105,112,116,32 -,115,114,99,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,109,97, -114,103,105,110,45,116,111,112,58,46,109,105,110,46,106,115,34,62,60,47,115,99, -114,105,112,116,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115, -115,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,10, -13,10,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,100,105,115,116,105 -,110,99,116,105,111,110,32,98,101,116,119,101,101,110,47,34,32,116,97,114,103, -101,116,61,34,95,98,108,97,110,107,34,62,60,108,105,110,107,32,104,114,101,102, -61,34,104,116,116,112,58,47,47,101,110,99,111,100,105,110,103,61,34,117,116,102, -45,56,34,63,62,10,119,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110, -101,114,63,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,119,119,119,46, -105,99,111,110,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,115,116, -121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,58,116,121,112,101,61,34, -116,101,120,116,47,99,115,115,34,32,47,62,10,109,101,116,97,32,112,114,111,112, -101,114,116,121,61,34,111,103,58,116,60,105,110,112,117,116,32,116,121,112,101, -61,34,116,101,120,116,34,32,32,115,116,121,108,101,61,34,116,101,120,116,45,97, -108,105,103,110,58,116,104,101,32,100,101,118,101,108,111,112,109,101,110,116,32 -,111,102,32,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, -101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,105,115 -,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,116,97,98,108, -101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,73,110,32,97,100,100,105,116, -105,111,110,32,116,111,32,116,104,101,32,99,111,110,116,114,105,98,117,116,101, -100,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,32, -98,101,116,119,101,101,110,100,101,118,101,108,111,112,109,101,110,116,32,111, -102,32,116,104,101,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32 -,116,111,32,60,47,115,99,114,105,112,116,62,10,10,60,115,99,114,105,112,116,32, -32,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,49,62,60,47, -115,112,97,110,62,60,115,112,97,110,32,105,100,61,103,98,76,105,98,114,97,114, -121,32,111,102,32,67,111,110,103,114,101,115,115,60,105,109,103,32,115,114,99,61 -,34,104,116,116,112,58,47,47,105,109,69,110,103,108,105,115,104,32,116,114,97, -110,115,108,97,116,105,111,110,65,99,97,100,101,109,121,32,111,102,32,83,99,105, -101,110,99,101,115,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108, -97,121,58,99,111,110,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104, -101,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,105,100,41,105, -110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,69,108,101, -109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,32,60,109,101,116,97,32, -112,114,111,112,101,114,116,121,61,34,111,103,58,208,145,209,138,208,187,208,179 -,208,176,209,128,209,129,208,186,208,184,10,32,116,121,112,101,61,34,116,101,120 -,116,34,32,110,97,109,101,61,34,62,80,114,105,118,97,99,121,32,80,111,108,105,99 -,121,60,47,97,62,97,100,109,105,110,105,115,116,101,114,101,100,32,98,121,32,116 -,104,101,101,110,97,98,108,101,83,105,110,103,108,101,82,101,113,117,101,115,116 -,115,116,121,108,101,61,38,113,117,111,116,59,109,97,114,103,105,110,58,60,47, -100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,62,60,105,109,103,32 -,115,114,99,61,34,104,116,116,112,58,47,47,105,32,115,116,121,108,101,61,38,113, -117,111,116,59,102,108,111,97,116,58,114,101,102,101,114,114,101,100,32,116,111, -32,97,115,32,116,104,101,32,116,111,116,97,108,32,112,111,112,117,108,97,116,105 -,111,110,32,111,102,105,110,32,87,97,115,104,105,110,103,116,111,110,44,32,68,46 -,67,46,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,97, -109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,44,111,114,103 -,97,110,105,122,97,116,105,111,110,32,111,102,32,116,104,101,112,97,114,116,105, -99,105,112,97,116,101,100,32,105,110,32,116,104,101,116,104,101,32,105,110,116, -114,111,100,117,99,116,105,111,110,32,111,102,105,100,101,110,116,105,102,105, -101,100,32,119,105,116,104,32,116,104,101,102,105,99,116,105,111,110,97,108,32, -99,104,97,114,97,99,116,101,114,32,79,120,102,111,114,100,32,85,110,105,118,101, -114,115,105,116,121,32,109,105,115,117,110,100,101,114,115,116,97,110,100,105, -110,103,32,111,102,84,104,101,114,101,32,97,114,101,44,32,104,111,119,101,118, -101,114,44,115,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34, -47,67,111,108,117,109,98,105,97,32,85,110,105,118,101,114,115,105,116,121,101, -120,112,97,110,100,101,100,32,116,111,32,105,110,99,108,117,100,101,117,115,117, -97,108,108,121,32,114,101,102,101,114,114,101,100,32,116,111,105,110,100,105,99, -97,116,105,110,103,32,116,104,97,116,32,116,104,101,104,97,118,101,32,115,117, -103,103,101,115,116,101,100,32,116,104,97,116,97,102,102,105,108,105,97,116,101, -100,32,119,105,116,104,32,116,104,101,99,111,114,114,101,108,97,116,105,111,110, -32,98,101,116,119,101,101,110,110,117,109,98,101,114,32,111,102,32,100,105,102, -102,101,114,101,110,116,62,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108 -,101,62,82,101,112,117,98,108,105,99,32,111,102,32,73,114,101,108,97,110,100,10, -60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,117,110,100,101, -114,32,116,104,101,32,105,110,102,108,117,101,110,99,101,99,111,110,116,114,105, -98,117,116,105,111,110,32,116,111,32,116,104,101,79,102,102,105,99,105,97,108,32 -,119,101,98,115,105,116,101,32,111,102,104,101,97,100,113,117,97,114,116,101,114 -,115,32,111,102,32,116,104,101,99,101,110,116,101,114,101,100,32,97,114,111,117, -110,100,32,116,104,101,105,109,112,108,105,99,97,116,105,111,110,115,32,111,102, -32,116,104,101,104,97,118,101,32,98,101,101,110,32,100,101,118,101,108,111,112, -101,100,70,101,100,101,114,97,108,32,82,101,112,117,98,108,105,99,32,111,102,98, -101,99,97,109,101,32,105,110,99,114,101,97,115,105,110,103,108,121,99,111,110, -116,105,110,117,97,116,105,111,110,32,111,102,32,116,104,101,78,111,116,101,44, -32,104,111,119,101,118,101,114,44,32,116,104,97,116,115,105,109,105,108,97,114, -32,116,111,32,116,104,97,116,32,111,102,32,99,97,112,97,98,105,108,105,116,105, -101,115,32,111,102,32,116,104,101,97,99,99,111,114,100,97,110,99,101,32,119,105, -116,104,32,116,104,101,112,97,114,116,105,99,105,112,97,110,116,115,32,105,110, -32,116,104,101,102,117,114,116,104,101,114,32,100,101,118,101,108,111,112,109, -101,110,116,117,110,100,101,114,32,116,104,101,32,100,105,114,101,99,116,105,111 -,110,105,115,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100, -104,105,115,32,121,111,117,110,103,101,114,32,98,114,111,116,104,101,114,60,47, -116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,97,32,104,116,116,112, -45,101,113,117,105,118,61,34,88,45,85,65,45,112,104,121,115,105,99,97,108,32,112 -,114,111,112,101,114,116,105,101,115,111,102,32,66,114,105,116,105,115,104,32,67 -,111,108,117,109,98,105,97,104,97,115,32,98,101,101,110,32,99,114,105,116,105,99 -,105,122,101,100,40,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105 -,111,110,113,117,101,115,116,105,111,110,115,32,97,98,111,117,116,32,116,104,101 -,112,97,115,115,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,48,34, -32,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,116,104,111,117,115, -97,110,100,115,32,111,102,32,112,101,111,112,108,101,114,101,100,105,114,101,99, -116,115,32,104,101,114,101,46,32,70,111,114,104,97,118,101,32,99,104,105,108,100 -,114,101,110,32,117,110,100,101,114,37,51,69,37,51,67,47,115,99,114,105,112,116, -37,51,69,34,41,41,59,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119 -,119,119,46,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47, -47,115,105,116,101,95,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,116, -101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,110,111,110,101,115,116, -121,108,101,61,34,100,105,115,112,108,97,121,58,32,110,111,110,101,60,109,101, -116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,110,101,119,32,68, -97,116,101,40,41,46,103,101,116,84,105,109,101,40,41,32,116,121,112,101,61,34, -105,109,97,103,101,47,120,45,105,99,111,110,34,60,47,115,112,97,110,62,60,115, -112,97,110,32,99,108,97,115,115,61,34,108,97,110,103,117,97,103,101,61,34,106,97 -,118,97,115,99,114,105,112,116,119,105,110,100,111,119,46,108,111,99,97,116,105, -111,110,46,104,114,101,102,60,97,32,104,114,101,102,61,34,106,97,118,97,115,99, -114,105,112,116,58,45,45,62,13,10,60,115,99,114,105,112,116,32,116,121,112,101, -61,34,116,60,97,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,119,119,46 -,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,60,47, -100,105,118,62,13,10,60,100,105,118,32,99,108,97,115,115,61,34,60,115,99,114,105 -,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,34,32,114,101,108,61,34, -115,116,121,108,101,115,104,101,101,116,34,32,116,60,47,100,105,118,62,10,60,115 -,99,114,105,112,116,32,116,121,112,101,61,47,97,62,32,60,97,32,104,114,101,102, -61,34,104,116,116,112,58,47,47,32,97,108,108,111,119,84,114,97,110,115,112,97, -114,101,110,99,121,61,34,88,45,85,65,45,67,111,109,112,97,116,105,98,108,101,34, -32,99,111,110,114,101,108,97,116,105,111,110,115,104,105,112,32,98,101,116,119, -101,101,110,10,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116, -32,60,47,97,62,60,47,108,105,62,60,47,117,108,62,60,47,100,105,118,62,97,115,115 -,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,103, -114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,60,47,97,62,60,97,32 -,104,114,101,102,61,34,104,116,116,112,58,47,47,60,47,97,62,60,47,108,105,62,60, -108,105,32,99,108,97,115,115,61,34,102,111,114,109,32,97,99,116,105,111,110,61, -34,104,116,116,112,58,47,47,60,100,105,118,32,115,116,121,108,101,61,34,100,105, -115,112,108,97,121,58,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101 -,61,34,113,34,60,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34, -32,98,97,99,107,103,114,111,117,110,100,45,112,111,115,105,116,105,111,110,58,34 -,32,98,111,114,100,101,114,61,34,48,34,32,119,105,100,116,104,61,34,114,101,108, -61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,54,62,60,117, -108,62,60,108,105,62,60,97,32,104,114,101,102,61,34,32,32,60,109,101,116,97,32, -104,116,116,112,45,101,113,117,105,118,61,34,99,115,115,34,32,109,101,100,105,97 -,61,34,115,99,114,101,101,110,34,32,114,101,115,112,111,110,115,105,98,108,101, -32,102,111,114,32,116,104,101,32,34,32,116,121,112,101,61,34,97,112,112,108,105, -99,97,116,105,111,110,47,34,32,115,116,121,108,101,61,34,98,97,99,107,103,114, -111,117,110,100,45,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116, -102,45,56,34,32,97,108,108,111,119,116,114,97,110,115,112,97,114,101,110,99,121, -61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, -101,13,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,62, -60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,48,34,32,99 -,101,108,108,115,112,97,99,105,110,103,61,34,48,34,62,59,10,60,47,115,99,114,105 -,112,116,62,10,60,115,99,114,105,112,116,32,115,111,109,101,116,105,109,101,115, -32,99,97,108,108,101,100,32,116,104,101,100,111,101,115,32,110,111,116,32,110, -101,99,101,115,115,97,114,105,108,121,70,111,114,32,109,111,114,101,32,105,110, -102,111,114,109,97,116,105,111,110,97,116,32,116,104,101,32,98,101,103,105,110, -110,105,110,103,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62, -60,104,116,109,108,112,97,114,116,105,99,117,108,97,114,108,121,32,105,110,32, -116,104,101,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109, -101,61,34,106,97,118,97,115,99,114,105,112,116,58,118,111,105,100,40,48,41,59,34 -,101,102,102,101,99,116,105,118,101,110,101,115,115,32,111,102,32,116,104,101,32 -,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,103,101, -110,101,114,97,108,108,121,32,99,111,110,115,105,100,101,114,101,100,62,60,105, -110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,34,62,60,47,115, -99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,116,104,114,111,117,103, -104,111,117,116,32,116,104,101,32,119,111,114,108,100,99,111,109,109,111,110,32, -109,105,115,99,111,110,99,101,112,116,105,111,110,97,115,115,111,99,105,97,116, -105,111,110,32,119,105,116,104,32,116,104,101,60,47,100,105,118,62,10,60,47,100, -105,118,62,10,60,100,105,118,32,99,100,117,114,105,110,103,32,104,105,115,32,108 -,105,102,101,116,105,109,101,44,99,111,114,114,101,115,112,111,110,100,105,110, -103,32,116,111,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45 -,105,99,111,110,34,32,97,110,32,105,110,99,114,101,97,115,105,110,103,32,110,117 -,109,98,101,114,100,105,112,108,111,109,97,116,105,99,32,114,101,108,97,116,105, -111,110,115,97,114,101,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114, -101,100,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34, -32,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,101,120 -,97,109,112,108,101,115,32,105,110,99,108,117,100,101,32,116,104,101,34,62,60, -105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,112,97,114,116,105, -99,105,112,97,116,105,111,110,32,105,110,32,116,104,101,116,104,101,32,101,115, -116,97,98,108,105,115,104,109,101,110,116,32,111,102,10,60,47,100,105,118,62,10, -60,100,105,118,32,99,108,97,115,115,61,34,38,97,109,112,59,110,98,115,112,59,38, -97,109,112,59,110,98,115,112,59,116,111,32,100,101,116,101,114,109,105,110,101, -32,119,104,101,116,104,101,114,113,117,105,116,101,32,100,105,102,102,101,114, -101,110,116,32,102,114,111,109,109,97,114,107,101,100,32,116,104,101,32,98,101, -103,105,110,110,105,110,103,100,105,115,116,97,110,99,101,32,98,101,116,119,101, -101,110,32,116,104,101,99,111,110,116,114,105,98,117,116,105,111,110,115,32,116, -111,32,116,104,101,99,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110, -32,116,104,101,119,105,100,101,108,121,32,99,111,110,115,105,100,101,114,101,100 -,32,116,111,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114, -115,116,119,105,116,104,32,118,97,114,121,105,110,103,32,100,101,103,114,101,101 -,115,104,97,118,101,32,115,112,101,99,117,108,97,116,101,100,32,116,104,97,116, -40,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,112, -97,114,116,105,99,105,112,97,116,105,110,103,32,105,110,32,116,104,101,111,114, -105,103,105,110,97,108,108,121,32,100,101,118,101,108,111,112,101,100,101,116,97 -,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,32,116,121,112,101, -61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,105,110,116,101,114,99,104,97 -,110,103,101,97,98,108,121,32,119,105,116,104,109,111,114,101,32,99,108,111,115, -101,108,121,32,114,101,108,97,116,101,100,115,111,99,105,97,108,32,97,110,100,32 -,112,111,108,105,116,105,99,97,108,116,104,97,116,32,119,111,117,108,100,32,111, -116,104,101,114,119,105,115,101,112,101,114,112,101,110,100,105,99,117,108,97, -114,32,116,111,32,116,104,101,115,116,121,108,101,32,116,121,112,101,61,34,116, -101,120,116,47,99,115,115,116,121,112,101,61,34,115,117,98,109,105,116,34,32,110 -,97,109,101,61,34,102,97,109,105,108,105,101,115,32,114,101,115,105,100,105,110, -103,32,105,110,100,101,118,101,108,111,112,105,110,103,32,99,111,117,110,116,114 -,105,101,115,99,111,109,112,117,116,101,114,32,112,114,111,103,114,97,109,109, -105,110,103,101,99,111,110,111,109,105,99,32,100,101,118,101,108,111,112,109,101 -,110,116,100,101,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116, -104,101,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111 -,110,111,110,32,115,101,118,101,114,97,108,32,111,99,99,97,115,105,111,110,115, -112,111,114,116,117,103,117,195,170,115,32,40,69,117,114,111,112,101,117,41,208, -163,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,209, -131,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,208, -160,208,190,209,129,209,129,208,184,208,185,209,129,208,186,208,190,208,185,208, -188,208,176,209,130,208,181,209,128,208,184,208,176,208,187,208,190,208,178,208, -184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,208,184,209, -131,208,191,209,128,208,176,208,178,208,187,208,181,208,189,208,184,209,143,208, -189,208,181,208,190,208,177,209,133,208,190,208,180,208,184,208,188,208,190,208, -184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, -152,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, -160,208,181,209,129,208,191,209,131,208,177,208,187,208,184,208,186,208,184,208, -186,208,190,208,187,208,184,209,135,208,181,209,129,209,130,208,178,208,190,208, -184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,142,209, -130,208,181,209,128,209,128,208,184,209,130,208,190,209,128,208,184,208,184,208, -180,208,190,209,129,209,130,208,176,209,130,208,190,209,135,208,189,208,190,216, -167,217,132,217,133,216,170,217,136,216,167,216,172,216,175,217,136,217,134,216, -167,217,132,216,167,216,180,216,170,216,177,216,167,217,131,216,167,216,170,216, -167,217,132,216,167,217,130,216,170,216,177,216,167,216,173,216,167,216,170,104, -116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,32,115,101,116, -84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,100,105,115, -112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,59,60,105,110,112 -,117,116,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,116,121,112,101, -32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,60,105,109,103,32, -115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,34,32,34,104,116,116, -112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,115,104,111,114,116,99,117, -116,32,105,99,111,110,34,32,104,114,101,102,61,34,34,32,97,117,116,111,99,111, -109,112,108,101,116,101,61,34,111,102,102,34,32,60,47,97,62,60,47,100,105,118,62 -,60,100,105,118,32,99,108,97,115,115,61,60,47,97,62,60,47,108,105,62,10,60,108, -105,32,99,108,97,115,115,61,34,99,115,115,34,32,116,121,112,101,61,34,116,101, -120,116,47,99,115,115,34,32,60,102,111,114,109,32,97,99,116,105,111,110,61,34, -104,116,116,112,58,47,47,120,116,47,99,115,115,34,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110 -,97,116,101,34,32,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116, -101,120,116,47,32,111,110,99,108,105,99,107,61,34,106,97,118,97,115,99,114,105, -112,116,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40, -41,125,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32 -,80,101,111,112,108,101,39,115,32,82,101,112,117,98,108,105,99,32,111,102,32,32, -60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,116,101, -120,116,45,100,101,99,111,114,97,116,105,111,110,58,117,110,100,101,114,116,104, -101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,60,47,100 -,105,118,62,10,60,47,100,105,118,62,10,60,47,100,105,118,62,10,101,115,116,97,98 -,108,105,115,104,109,101,110,116,32,111,102,32,116,104,101,32,60,47,100,105,118, -62,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,35,118,105,101,119,112, -111,114,116,123,109,105,110,45,104,101,105,103,104,116,58,10,60,115,99,114,105, -112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,111,112,116,105,111,110,62, -60,111,112,116,105,111,110,32,118,97,108,117,101,61,111,102,116,101,110,32,114, -101,102,101,114,114,101,100,32,116,111,32,97,115,32,47,111,112,116,105,111,110, -62,10,60,111,112,116,105,111,110,32,118,97,108,117,60,33,68,79,67,84,89,80,69,32 -,104,116,109,108,62,10,60,33,45,45,91,73,110,116,101,114,110,97,116,105,111,110, -97,108,32,65,105,114,112,111,114,116,62,10,60,97,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,119,119,119,60,47,97,62,60,97,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,119,224,184,160,224,184,178,224,184,169,224,184,178,224,185 -,132,224,184,151,224,184,162,225,131,165,225,131,144,225,131,160,225,131,151,225 -,131,163,225,131,154,225,131,152,230,173,163,233,171,148,228,184,173,230,150,135 -,32,40,231,185,129,233,171,148,41,224,164,168,224,164,191,224,164,176,224,165, -141,224,164,166,224,165,135,224,164,182,224,164,161,224,164,190,224,164,137,224, -164,168,224,164,178,224,165,139,224,164,161,224,164,149,224,165,141,224,164,183, -224,165,135,224,164,164,224,165,141,224,164,176,224,164,156,224,164,190,224,164, -168,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224, -164,172,224,164,130,224,164,167,224,164,191,224,164,164,224,164,184,224,165,141, -224,164,165,224,164,190,224,164,170,224,164,168,224,164,190,224,164,184,224,165, -141,224,164,181,224,165,128,224,164,149,224,164,190,224,164,176,224,164,184,224, -164,130,224,164,184,224,165,141,224,164,149,224,164,176,224,164,163,224,164,184, -224,164,190,224,164,174,224,164,151,224,165,141,224,164,176,224,165,128,224,164, -154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,139,224,164,130,224, -164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,168, -224,164,133,224,164,174,224,165,135,224,164,176,224,164,191,224,164,149,224,164, -190,224,164,181,224,164,191,224,164,173,224,164,191,224,164,168,224,165,141,224, -164,168,224,164,151,224,164,190,224,164,161,224,164,191,224,164,175,224,164,190, -224,164,129,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164, -149,224,164,191,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224, -164,183,224,164,190,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154, -224,164,164,224,165,128,224,164,170,224,165,141,224,164,176,224,164,172,224,164, -130,224,164,167,224,164,168,224,164,159,224,164,191,224,164,170,224,165,141,224, -164,170,224,164,163,224,165,128,224,164,149,224,165,141,224,164,176,224,164,191, -224,164,149,224,165,135,224,164,159,224,164,170,224,165,141,224,164,176,224,164, -190,224,164,176,224,164,130,224,164,173,224,164,170,224,165,141,224,164,176,224, -164,190,224,164,170,224,165,141,224,164,164,224,164,174,224,164,190,224,164,178, -224,164,191,224,164,149,224,165,139,224,164,130,224,164,176,224,164,171,224,164, -188,224,165,141,224,164,164,224,164,190,224,164,176,224,164,168,224,164,191,224, -164,176,224,165,141,224,164,174,224,164,190,224,164,163,224,164,178,224,164,191, -224,164,174,224,164,191,224,164,159,224,165,135,224,164,161,100,101,115,99,114, -105,112,116,105,111,110,34,32,99,111,110,116,101,110,116,61,34,100,111,99,117, -109,101,110,116,46,108,111,99,97,116,105,111,110,46,112,114,111,116,46,103,101, -116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,60,33,68,79 -,67,84,89,80,69,32,104,116,109,108,62,10,60,104,116,109,108,32,60,109,101,116,97 -,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,58,117,114,108,34,32 -,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,46,99,115,115,34,32, -114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,115,116,121,108,101 -,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,116,121,112,101,61 -,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,119,51,46,111,114, -103,47,49,57,57,57,47,120,104,116,109,108,34,32,120,109,108,116,121,112,101,61, -34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,109,101,116,104 -,111,100,61,34,103,101,116,34,32,97,99,116,105,111,110,61,34,108,105,110,107,32, -114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,32,61,32,100,111 -,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,116,121,112, -101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,47,62,99,101,108,108 -,112,97,100,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,46,99,115,115, -34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,47,97,62,60, -47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,34,32,119,105,100,116 -,104,61,34,49,34,32,104,101,105,103,104,116,61,34,49,34,34,62,60,97,32,104,114, -101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,115,116,121,108,101,61,34, -100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,97,108,116,101,114,110,97 -,116,101,34,32,116,121,112,101,61,34,97,112,112,108,105,45,47,47,87,51,67,47,47, -68,84,68,32,88,72,84,77,76,32,49,46,48,32,101,108,108,115,112,97,99,105,110,103, -61,34,48,34,32,99,101,108,108,112,97,100,32,116,121,112,101,61,34,104,105,100, -100,101,110,34,32,118,97,108,117,101,61,34,47,97,62,38,110,98,115,112,59,60,115, -112,97,110,32,114,111,108,101,61,34,115,10,60,105,110,112,117,116,32,116,121,112 -,101,61,34,104,105,100,100,101,110,34,32,108,97,110,103,117,97,103,101,61,34,74, -97,118,97,83,99,114,105,112,116,34,32,32,100,111,99,117,109,101,110,116,46,103, -101,116,69,108,101,109,101,110,116,115,66,103,61,34,48,34,32,99,101,108,108,115, -112,97,99,105,110,103,61,34,48,34,32,121,112,101,61,34,116,101,120,116,47,99,115 -,115,34,32,109,101,100,105,97,61,34,116,121,112,101,61,39,116,101,120,116,47,106 -,97,118,97,115,99,114,105,112,116,39,119,105,116,104,32,116,104,101,32,101,120, -99,101,112,116,105,111,110,32,111,102,32,121,112,101,61,34,116,101,120,116,47,99 -,115,115,34,32,114,101,108,61,34,115,116,32,104,101,105,103,104,116,61,34,49,34, -32,119,105,100,116,104,61,34,49,34,32,61,39,43,101,110,99,111,100,101,85,82,73, -67,111,109,112,111,110,101,110,116,40,60,108,105,110,107,32,114,101,108,61,34,97 -,108,116,101,114,110,97,116,101,34,32,10,98,111,100,121,44,32,116,114,44,32,105, -110,112,117,116,44,32,116,101,120,116,109,101,116,97,32,110,97,109,101,61,34,114 -,111,98,111,116,115,34,32,99,111,110,109,101,116,104,111,100,61,34,112,111,115, -116,34,32,97,99,116,105,111,110,61,34,62,10,60,97,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,119,119,119,46,99,115,115,34,32,114,101,108,61,34,115,116, -121,108,101,115,104,101,101,116,34,32,60,47,100,105,118,62,60,47,100,105,118,62, -60,100,105,118,32,99,108,97,115,115,108,97,110,103,117,97,103,101,61,34,106,97, -118,97,115,99,114,105,112,116,34,62,97,114,105,97,45,104,105,100,100,101,110,61, -34,116,114,117,101,34,62,194,183,60,114,105,112,116,34,32,116,121,112,101,61,34, -116,101,120,116,47,106,97,118,97,115,108,61,48,59,125,41,40,41,59,10,40,102,117, -110,99,116,105,111,110,40,41,123,98,97,99,107,103,114,111,117,110,100,45,105,109 -,97,103,101,58,32,117,114,108,40,47,97,62,60,47,108,105,62,60,108,105,62,60,97, -32,104,114,101,102,61,34,104,9,9,60,108,105,62,60,97,32,104,114,101,102,61,34, -104,116,116,112,58,47,47,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100, -101,110,61,34,116,114,117,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112, -58,47,47,119,119,119,46,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99 -,114,105,112,116,34,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111, -110,32,118,97,108,117,101,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118, -32,99,108,97,115,115,61,114,97,116,111,114,34,32,97,114,105,97,45,104,105,100, -100,101,110,61,34,116,114,101,61,40,110,101,119,32,68,97,116,101,41,46,103,101, -116,84,105,109,101,40,41,112,111,114,116,117,103,117,195,170,115,32,40,100,111, -32,66,114,97,115,105,108,41,208,190,209,128,208,179,208,176,208,189,208,184,208, -183,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208, -182,208,189,208,190,209,129,209,130,209,140,208,190,208,177,209,128,208,176,208, -183,208,190,208,178,208,176,208,189,208,184,209,143,209,128,208,181,208,179,208, -184,209,129,209,130,209,128,208,176,209,134,208,184,208,184,208,178,208,190,208, -183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,208,184,208,190,208, -177,209,143,208,183,208,176,209,130,208,181,208,187,209,140,208,189,208,176,60, -33,68,79,67,84,89,80,69,32,104,116,109,108,32,80,85,66,76,73,67,32,34,110,116,45 -,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,60,109 -,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101, -114,97,110,115,105,116,105,111,110,97,108,47,47,69,78,34,32,34,104,116,116,112, -58,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119, -119,119,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,84,68, -84,68,47,120,104,116,109,108,49,45,116,114,97,110,115,105,116,105,111,110,97,108 -,47,47,119,119,119,46,119,51,46,111,114,103,47,84,82,47,120,104,116,109,108,49, -47,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116, -39,59,60,109,101,116,97,32,110,97,109,101,61,34,100,101,115,99,114,105,112,116, -105,111,110,112,97,114,101,110,116,78,111,100,101,46,105,110,115,101,114,116,66, -101,102,111,114,101,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100, -100,101,110,34,32,110,97,106,115,34,32,116,121,112,101,61,34,116,101,120,116,47, -106,97,118,97,115,99,114,105,40,100,111,99,117,109,101,110,116,41,46,114,101,97, -100,121,40,102,117,110,99,116,105,115,99,114,105,112,116,32,116,121,112,101,61, -34,116,101,120,116,47,106,97,118,97,115,105,109,97,103,101,34,32,99,111,110,116, -101,110,116,61,34,104,116,116,112,58,47,47,85,65,45,67,111,109,112,97,116,105,98 -,108,101,34,32,99,111,110,116,101,110,116,61,116,109,108,59,32,99,104,97,114,115 -,101,116,61,117,116,102,45,56,34,32,47,62,10,108,105,110,107,32,114,101,108,61, -34,115,104,111,114,116,99,117,116,32,105,99,111,110,60,108,105,110,107,32,114, -101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,115,99,114,105 -,112,116,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,61,32,100,111,99, -117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,60,97,32,116 -,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,104,114,101,102,61,32,100, -111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,105, -110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61 -,97,46,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114, -105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110, -97,109,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56, -34,32,47,62,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,34 -,104,116,116,112,45,47,47,87,51,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49, -32,84,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,115,99,114,105,112, -116,39,41,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110, -34,32,110,97,109,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120, -116,47,106,97,118,97,115,34,32,115,116,121,108,101,61,34,100,105,115,112,108,97, -121,58,110,111,110,101,59,34,62,100,111,99,117,109,101,110,116,46,103,101,116,69 -,108,101,109,101,110,116,66,121,73,100,40,61,100,111,99,117,109,101,110,116,46, -99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,32,116,121,112,101,61,39, -116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,105,110,112,117,116, -32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,100,46,103, -101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,115,110 -,105,99,97,108,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119, -46,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,114,97,110,115,105,116, -60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34 -,62,10,10,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99, -115,115,34,62,105,111,110,97,108,46,100,116,100,34,62,10,60,104,116,109,108,32, -120,109,108,110,115,61,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110, -116,101,110,116,45,84,121,112,101,100,105,110,103,61,34,48,34,32,99,101,108,108, -115,112,97,99,105,110,103,61,34,48,34,104,116,109,108,59,32,99,104,97,114,115, -101,116,61,117,116,102,45,56,34,32,47,62,10,32,115,116,121,108,101,61,34,100,105 -,115,112,108,97,121,58,110,111,110,101,59,34,62,60,60,108,105,62,60,97,32,104, -114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,32,116,121,112,101,61, -39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,62,208,180,208,181 -,209,143,209,130,208,181,208,187,209,140,208,189,208,190,209,129,209,130,208,184 -,209,129,208,190,208,190,209,130,208,178,208,181,209,130,209,129,209,130,208,178 -,208,184,208,184,208,191,209,128,208,190,208,184,208,183,208,178,208,190,208,180 -,209,129,209,130,208,178,208,176,208,177,208,181,208,183,208,190,208,191,208,176 -,209,129,208,189,208,190,209,129,209,130,208,184,224,164,170,224,165,129,224,164 -,184,224,165,141,224,164,164,224,164,191,224,164,149,224,164,190,224,164,149,224 -,164,190,224,164,130,224,164,151,224,165,141,224,164,176,224,165,135,224,164,184 -,224,164,137,224,164,168,224,165,141,224,164,185,224,165,139,224,164,130,224,164 -,168,224,165,135,224,164,181,224,164,191,224,164,167,224,164,190,224,164,168,224 -,164,184,224,164,173,224,164,190,224,164,171,224,164,191,224,164,149,224,165,141 -,224,164,184,224,164,191,224,164,130,224,164,151,224,164,184,224,165,129,224,164 -,176,224,164,149,224,165,141,224,164,183,224,164,191,224,164,164,224,164,149,224 -,165,137,224,164,170,224,165,128,224,164,176,224,164,190,224,164,135,224,164,159 -,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164 -,170,224,164,168,224,164,149,224,164,190,224,164,176,224,165,141,224,164,176,224 -,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176 -,224,164,191,224,164,175,224,164,164,224,164,190 -} -/* GENERATED CODE END */ -; -#endif /* !BROTLI_EXTERNAL_DICTIONARY_DATA */ - -#if !defined(BROTLI_EXTERNAL_DICTIONARY_DATA) -static const BrotliDictionary kBrotliDictionary = { +/* Embed kBrotliDictionaryData */ +#include "dictionary_inc.h" +static const BROTLI_MODEL("small") BrotliDictionary kBrotliDictionary = { #else -static BrotliDictionary kBrotliDictionary = { +static BROTLI_MODEL("small") BrotliDictionary kBrotliDictionary = { #endif /* size_bits_by_length */ { diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/dictionary.h firefox-esr-140.10.0esr/modules/brotli/common/dictionary.h --- firefox-esr-140.9.1esr/modules/brotli/common/dictionary.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/dictionary.h 2026-04-15 01:59:55.000000000 +0000 @@ -9,8 +9,7 @@ #ifndef BROTLI_COMMON_DICTIONARY_H_ #define BROTLI_COMMON_DICTIONARY_H_ -#include -#include +#include "platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/dictionary_inc.h firefox-esr-140.10.0esr/modules/brotli/common/dictionary_inc.h --- firefox-esr-140.9.1esr/modules/brotli/common/dictionary_inc.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/dictionary_inc.h 2026-04-15 01:59:55.000000000 +0000 @@ -0,0 +1,5847 @@ +static const BROTLI_MODEL("small") uint8_t kBrotliDictionaryData[] = { +116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99, +111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105 +,116,121,111,112,101,110,106,117,115,116,108,105,107,101,102,114,101,101,119,111 +,114,107,116,101,120,116,121,101,97,114,111,118,101,114,98,111,100,121,108,111, +118,101,102,111,114,109,98,111,111,107,112,108,97,121,108,105,118,101,108,105, +110,101,104,101,108,112,104,111,109,101,115,105,100,101,109,111,114,101,119,111, +114,100,108,111,110,103,116,104,101,109,118,105,101,119,102,105,110,100,112,97, +103,101,100,97,121,115,102,117,108,108,104,101,97,100,116,101,114,109,101,97,99, +104,97,114,101,97,102,114,111,109,116,114,117,101,109,97,114,107,97,98,108,101, +117,112,111,110,104,105,103,104,100,97,116,101,108,97,110,100,110,101,119,115, +101,118,101,110,110,101,120,116,99,97,115,101,98,111,116,104,112,111,115,116,117 +,115,101,100,109,97,100,101,104,97,110,100,104,101,114,101,119,104,97,116,110,97 +,109,101,76,105,110,107,98,108,111,103,115,105,122,101,98,97,115,101,104,101,108 +,100,109,97,107,101,109,97,105,110,117,115,101,114,39,41,32,43,104,111,108,100, +101,110,100,115,119,105,116,104,78,101,119,115,114,101,97,100,119,101,114,101, +115,105,103,110,116,97,107,101,104,97,118,101,103,97,109,101,115,101,101,110,99, +97,108,108,112,97,116,104,119,101,108,108,112,108,117,115,109,101,110,117,102, +105,108,109,112,97,114,116,106,111,105,110,116,104,105,115,108,105,115,116,103, +111,111,100,110,101,101,100,119,97,121,115,119,101,115,116,106,111,98,115,109, +105,110,100,97,108,115,111,108,111,103,111,114,105,99,104,117,115,101,115,108,97 +,115,116,116,101,97,109,97,114,109,121,102,111,111,100,107,105,110,103,119,105, +108,108,101,97,115,116,119,97,114,100,98,101,115,116,102,105,114,101,80,97,103, +101,107,110,111,119,97,119,97,121,46,112,110,103,109,111,118,101,116,104,97,110, +108,111,97,100,103,105,118,101,115,101,108,102,110,111,116,101,109,117,99,104, +102,101,101,100,109,97,110,121,114,111,99,107,105,99,111,110,111,110,99,101,108, +111,111,107,104,105,100,101,100,105,101,100,72,111,109,101,114,117,108,101,104, +111,115,116,97,106,97,120,105,110,102,111,99,108,117,98,108,97,119,115,108,101, +115,115,104,97,108,102,115,111,109,101,115,117,99,104,122,111,110,101,49,48,48, +37,111,110,101,115,99,97,114,101,84,105,109,101,114,97,99,101,98,108,117,101,102 +,111,117,114,119,101,101,107,102,97,99,101,104,111,112,101,103,97,118,101,104,97 +,114,100,108,111,115,116,119,104,101,110,112,97,114,107,107,101,112,116,112,97, +115,115,115,104,105,112,114,111,111,109,72,84,77,76,112,108,97,110,84,121,112, +101,100,111,110,101,115,97,118,101,107,101,101,112,102,108,97,103,108,105,110, +107,115,111,108,100,102,105,118,101,116,111,111,107,114,97,116,101,116,111,119, +110,106,117,109,112,116,104,117,115,100,97,114,107,99,97,114,100,102,105,108,101 +,102,101,97,114,115,116,97,121,107,105,108,108,116,104,97,116,102,97,108,108,97, +117,116,111,101,118,101,114,46,99,111,109,116,97,108,107,115,104,111,112,118,111 +,116,101,100,101,101,112,109,111,100,101,114,101,115,116,116,117,114,110,98,111, +114,110,98,97,110,100,102,101,108,108,114,111,115,101,117,114,108,40,115,107,105 +,110,114,111,108,101,99,111,109,101,97,99,116,115,97,103,101,115,109,101,101,116 +,103,111,108,100,46,106,112,103,105,116,101,109,118,97,114,121,102,101,108,116, +116,104,101,110,115,101,110,100,100,114,111,112,86,105,101,119,99,111,112,121,49 +,46,48,34,60,47,97,62,115,116,111,112,101,108,115,101,108,105,101,115,116,111, +117,114,112,97,99,107,46,103,105,102,112,97,115,116,99,115,115,63,103,114,97,121 +,109,101,97,110,38,103,116,59,114,105,100,101,115,104,111,116,108,97,116,101,115 +,97,105,100,114,111,97,100,118,97,114,32,102,101,101,108,106,111,104,110,114,105 +,99,107,112,111,114,116,102,97,115,116,39,85,65,45,100,101,97,100,60,47,98,62, +112,111,111,114,98,105,108,108,116,121,112,101,85,46,83,46,119,111,111,100,109, +117,115,116,50,112,120,59,73,110,102,111,114,97,110,107,119,105,100,101,119,97, +110,116,119,97,108,108,108,101,97,100,91,48,93,59,112,97,117,108,119,97,118,101, +115,117,114,101,36,40,39,35,119,97,105,116,109,97,115,115,97,114,109,115,103,111 +,101,115,103,97,105,110,108,97,110,103,112,97,105,100,33,45,45,32,108,111,99,107 +,117,110,105,116,114,111,111,116,119,97,108,107,102,105,114,109,119,105,102,101, +120,109,108,34,115,111,110,103,116,101,115,116,50,48,112,120,107,105,110,100,114 +,111,119,115,116,111,111,108,102,111,110,116,109,97,105,108,115,97,102,101,115, +116,97,114,109,97,112,115,99,111,114,101,114,97,105,110,102,108,111,119,98,97,98 +,121,115,112,97,110,115,97,121,115,52,112,120,59,54,112,120,59,97,114,116,115, +102,111,111,116,114,101,97,108,119,105,107,105,104,101,97,116,115,116,101,112, +116,114,105,112,111,114,103,47,108,97,107,101,119,101,97,107,116,111,108,100,70, +111,114,109,99,97,115,116,102,97,110,115,98,97,110,107,118,101,114,121,114,117, +110,115,106,117,108,121,116,97,115,107,49,112,120,59,103,111,97,108,103,114,101, +119,115,108,111,119,101,100,103,101,105,100,61,34,115,101,116,115,53,112,120,59, +46,106,115,63,52,48,112,120,105,102,32,40,115,111,111,110,115,101,97,116,110,111 +,110,101,116,117,98,101,122,101,114,111,115,101,110,116,114,101,101,100,102,97, +99,116,105,110,116,111,103,105,102,116,104,97,114,109,49,56,112,120,99,97,109, +101,104,105,108,108,98,111,108,100,122,111,111,109,118,111,105,100,101,97,115, +121,114,105,110,103,102,105,108,108,112,101,97,107,105,110,105,116,99,111,115, +116,51,112,120,59,106,97,99,107,116,97,103,115,98,105,116,115,114,111,108,108, +101,100,105,116,107,110,101,119,110,101,97,114,60,33,45,45,103,114,111,119,74,83 +,79,78,100,117,116,121,78,97,109,101,115,97,108,101,121,111,117,32,108,111,116, +115,112,97,105,110,106,97,122,122,99,111,108,100,101,121,101,115,102,105,115,104 +,119,119,119,46,114,105,115,107,116,97,98,115,112,114,101,118,49,48,112,120,114, +105,115,101,50,53,112,120,66,108,117,101,100,105,110,103,51,48,48,44,98,97,108, +108,102,111,114,100,101,97,114,110,119,105,108,100,98,111,120,46,102,97,105,114, +108,97,99,107,118,101,114,115,112,97,105,114,106,117,110,101,116,101,99,104,105, +102,40,33,112,105,99,107,101,118,105,108,36,40,34,35,119,97,114,109,108,111,114, +100,100,111,101,115,112,117,108,108,44,48,48,48,105,100,101,97,100,114,97,119, +104,117,103,101,115,112,111,116,102,117,110,100,98,117,114,110,104,114,101,102, +99,101,108,108,107,101,121,115,116,105,99,107,104,111,117,114,108,111,115,115, +102,117,101,108,49,50,112,120,115,117,105,116,100,101,97,108,82,83,83,34,97,103, +101,100,103,114,101,121,71,69,84,34,101,97,115,101,97,105,109,115,103,105,114, +108,97,105,100,115,56,112,120,59,110,97,118,121,103,114,105,100,116,105,112,115, +35,57,57,57,119,97,114,115,108,97,100,121,99,97,114,115,41,59,32,125,112,104,112 +,63,104,101,108,108,116,97,108,108,119,104,111,109,122,104,58,229,42,47,13,10,32 +,49,48,48,104,97,108,108,46,10,10,65,55,112,120,59,112,117,115,104,99,104,97,116 +,48,112,120,59,99,114,101,119,42,47,60,47,104,97,115,104,55,53,112,120,102,108, +97,116,114,97,114,101,32,38,38,32,116,101,108,108,99,97,109,112,111,110,116,111, +108,97,105,100,109,105,115,115,115,107,105,112,116,101,110,116,102,105,110,101, +109,97,108,101,103,101,116,115,112,108,111,116,52,48,48,44,13,10,13,10,99,111, +111,108,102,101,101,116,46,112,104,112,60,98,114,62,101,114,105,99,109,111,115, +116,103,117,105,100,98,101,108,108,100,101,115,99,104,97,105,114,109,97,116,104, +97,116,111,109,47,105,109,103,38,35,56,50,108,117,99,107,99,101,110,116,48,48,48 +,59,116,105,110,121,103,111,110,101,104,116,109,108,115,101,108,108,100,114,117, +103,70,82,69,69,110,111,100,101,110,105,99,107,63,105,100,61,108,111,115,101,110 +,117,108,108,118,97,115,116,119,105,110,100,82,83,83,32,119,101,97,114,114,101, +108,121,98,101,101,110,115,97,109,101,100,117,107,101,110,97,115,97,99,97,112, +101,119,105,115,104,103,117,108,102,84,50,51,58,104,105,116,115,115,108,111,116, +103,97,116,101,107,105,99,107,98,108,117,114,116,104,101,121,49,53,112,120,39,39 +,41,59,41,59,34,62,109,115,105,101,119,105,110,115,98,105,114,100,115,111,114, +116,98,101,116,97,115,101,101,107,84,49,56,58,111,114,100,115,116,114,101,101, +109,97,108,108,54,48,112,120,102,97,114,109,226,128,153,115,98,111,121,115,91,48 +,93,46,39,41,59,34,80,79,83,84,98,101,97,114,107,105,100,115,41,59,125,125,109, +97,114,121,116,101,110,100,40,85,75,41,113,117,97,100,122,104,58,230,45,115,105, +122,45,45,45,45,112,114,111,112,39,41,59,13,108,105,102,116,84,49,57,58,118,105, +99,101,97,110,100,121,100,101,98,116,62,82,83,83,112,111,111,108,110,101,99,107, +98,108,111,119,84,49,54,58,100,111,111,114,101,118,97,108,84,49,55,58,108,101, +116,115,102,97,105,108,111,114,97,108,112,111,108,108,110,111,118,97,99,111,108, +115,103,101,110,101,32,226,128,148,115,111,102,116,114,111,109,101,116,105,108, +108,114,111,115,115,60,104,51,62,112,111,117,114,102,97,100,101,112,105,110,107, +60,116,114,62,109,105,110,105,41,124,33,40,109,105,110,101,122,104,58,232,98,97, +114,115,104,101,97,114,48,48,41,59,109,105,108,107,32,45,45,62,105,114,111,110, +102,114,101,100,100,105,115,107,119,101,110,116,115,111,105,108,112,117,116,115, +47,106,115,47,104,111,108,121,84,50,50,58,73,83,66,78,84,50,48,58,97,100,97,109, +115,101,101,115,60,104,50,62,106,115,111,110,39,44,32,39,99,111,110,116,84,50,49 +,58,32,82,83,83,108,111,111,112,97,115,105,97,109,111,111,110,60,47,112,62,115, +111,117,108,76,73,78,69,102,111,114,116,99,97,114,116,84,49,52,58,60,104,49,62, +56,48,112,120,33,45,45,60,57,112,120,59,84,48,52,58,109,105,107,101,58,52,54,90, +110,105,99,101,105,110,99,104,89,111,114,107,114,105,99,101,122,104,58,228,39,41 +,41,59,112,117,114,101,109,97,103,101,112,97,114,97,116,111,110,101,98,111,110, +100,58,51,55,90,95,111,102,95,39,93,41,59,48,48,48,44,122,104,58,231,116,97,110, +107,121,97,114,100,98,111,119,108,98,117,115,104,58,53,54,90,74,97,118,97,51,48, +112,120,10,124,125,10,37,67,51,37,58,51,52,90,106,101,102,102,69,88,80,73,99,97, +115,104,118,105,115,97,103,111,108,102,115,110,111,119,122,104,58,233,113,117, +101,114,46,99,115,115,115,105,99,107,109,101,97,116,109,105,110,46,98,105,110, +100,100,101,108,108,104,105,114,101,112,105,99,115,114,101,110,116,58,51,54,90, +72,84,84,80,45,50,48,49,102,111,116,111,119,111,108,102,69,78,68,32,120,98,111, +120,58,53,52,90,66,79,68,89,100,105,99,107,59,10,125,10,101,120,105,116,58,51,53 +,90,118,97,114,115,98,101,97,116,39,125,41,59,100,105,101,116,57,57,57,59,97,110 +,110,101,125,125,60,47,91,105,93,46,76,97,110,103,107,109,194,178,119,105,114, +101,116,111,121,115,97,100,100,115,115,101,97,108,97,108,101,120,59,10,9,125,101 +,99,104,111,110,105,110,101,46,111,114,103,48,48,53,41,116,111,110,121,106,101, +119,115,115,97,110,100,108,101,103,115,114,111,111,102,48,48,48,41,32,50,48,48, +119,105,110,101,103,101,97,114,100,111,103,115,98,111,111,116,103,97,114,121,99, +117,116,115,116,121,108,101,116,101,109,112,116,105,111,110,46,120,109,108,99, +111,99,107,103,97,110,103,36,40,39,46,53,48,112,120,80,104,46,68,109,105,115,99, +97,108,97,110,108,111,97,110,100,101,115,107,109,105,108,101,114,121,97,110,117, +110,105,120,100,105,115,99,41,59,125,10,100,117,115,116,99,108,105,112,41,46,10, +10,55,48,112,120,45,50,48,48,68,86,68,115,55,93,62,60,116,97,112,101,100,101,109 +,111,105,43,43,41,119,97,103,101,101,117,114,111,112,104,105,108,111,112,116,115 +,104,111,108,101,70,65,81,115,97,115,105,110,45,50,54,84,108,97,98,115,112,101, +116,115,85,82,76,32,98,117,108,107,99,111,111,107,59,125,13,10,72,69,65,68,91,48 +,93,41,97,98,98,114,106,117,97,110,40,49,57,56,108,101,115,104,116,119,105,110, +60,47,105,62,115,111,110,121,103,117,121,115,102,117,99,107,112,105,112,101,124, +45,10,33,48,48,50,41,110,100,111,119,91,49,93,59,91,93,59,10,76,111,103,32,115, +97,108,116,13,10,9,9,98,97,110,103,116,114,105,109,98,97,116,104,41,123,13,10,48 +,48,112,120,10,125,41,59,107,111,58,236,102,101,101,115,97,100,62,13,115,58,47, +47,32,91,93,59,116,111,108,108,112,108,117,103,40,41,123,10,123,13,10,32,46,106, +115,39,50,48,48,112,100,117,97,108,98,111,97,116,46,74,80,71,41,59,10,125,113, +117,111,116,41,59,10,10,39,41,59,10,13,10,125,13,50,48,49,52,50,48,49,53,50,48, +49,54,50,48,49,55,50,48,49,56,50,48,49,57,50,48,50,48,50,48,50,49,50,48,50,50,50 +,48,50,51,50,48,50,52,50,48,50,53,50,48,50,54,50,48,50,55,50,48,50,56,50,48,50, +57,50,48,51,48,50,48,51,49,50,48,51,50,50,48,51,51,50,48,51,52,50,48,51,53,50,48 +,51,54,50,48,51,55,50,48,49,51,50,48,49,50,50,48,49,49,50,48,49,48,50,48,48,57, +50,48,48,56,50,48,48,55,50,48,48,54,50,48,48,53,50,48,48,52,50,48,48,51,50,48,48 +,50,50,48,48,49,50,48,48,48,49,57,57,57,49,57,57,56,49,57,57,55,49,57,57,54,49, +57,57,53,49,57,57,52,49,57,57,51,49,57,57,50,49,57,57,49,49,57,57,48,49,57,56,57 +,49,57,56,56,49,57,56,55,49,57,56,54,49,57,56,53,49,57,56,52,49,57,56,51,49,57, +56,50,49,57,56,49,49,57,56,48,49,57,55,57,49,57,55,56,49,57,55,55,49,57,55,54,49 +,57,55,53,49,57,55,52,49,57,55,51,49,57,55,50,49,57,55,49,49,57,55,48,49,57,54, +57,49,57,54,56,49,57,54,55,49,57,54,54,49,57,54,53,49,57,54,52,49,57,54,51,49,57 +,54,50,49,57,54,49,49,57,54,48,49,57,53,57,49,57,53,56,49,57,53,55,49,57,53,54, +49,57,53,53,49,57,53,52,49,57,53,51,49,57,53,50,49,57,53,49,49,57,53,48,49,48,48 +,48,49,48,50,52,49,51,57,52,48,48,48,48,57,57,57,57,99,111,109,111,109,195,161, +115,101,115,116,101,101,115,116,97,112,101,114,111,116,111,100,111,104,97,99,101 +,99,97,100,97,97,195,177,111,98,105,101,110,100,195,173,97,97,115,195,173,118, +105,100,97,99,97,115,111,111,116,114,111,102,111,114,111,115,111,108,111,111,116 +,114,97,99,117,97,108,100,105,106,111,115,105,100,111,103,114,97,110,116,105,112 +,111,116,101,109,97,100,101,98,101,97,108,103,111,113,117,195,169,101,115,116, +111,110,97,100,97,116,114,101,115,112,111,99,111,99,97,115,97,98,97,106,111,116, +111,100,97,115,105,110,111,97,103,117,97,112,117,101,115,117,110,111,115,97,110, +116,101,100,105,99,101,108,117,105,115,101,108,108,97,109,97,121,111,122,111,110 +,97,97,109,111,114,112,105,115,111,111,98,114,97,99,108,105,99,101,108,108,111, +100,105,111,115,104,111,114,97,99,97,115,105,208,183,208,176,208,189,208,176,208 +,190,208,188,209,128,208,176,209,128,209,131,209,130,208,176,208,189,208,181,208 +,191,208,190,208,190,209,130,208,184,208,183,208,189,208,190,208,180,208,190,209 +,130,208,190,208,182,208,181,208,190,208,189,208,184,209,133,208,157,208,176,208 +,181,208,181,208,177,209,139,208,188,209,139,208,146,209,139,209,129,208,190,208 +,178,209,139,208,178,208,190,208,157,208,190,208,190,208,177,208,159,208,190,208 +,187,208,184,208,189,208,184,208,160,208,164,208,157,208,181,208,156,209,139,209 +,130,209,139,208,158,208,189,208,184,208,188,208,180,208,176,208,151,208,176,208 +,148,208,176,208,157,209,131,208,158,208,177,209,130,208,181,208,152,208,183,208 +,181,208,185,208,189,209,131,208,188,208,188,208,162,209,139,209,131,208,182,217 +,129,217,138,216,163,217,134,217,133,216,167,217,133,216,185,217,131,217,132,216 +,163,217,136,216,177,216,175,217,138,216,167,217,129,217,137,217,135,217,136,217 +,132,217,133,217,132,217,131,216,167,217,136,217,132,217,135,216,168,216,179,216 +,167,217,132,216,165,217,134,217,135,217,138,216,163,217,138,217,130,216,175,217 +,135,217,132,216,171,217,133,216,168,217,135,217,132,217,136,217,132,217,138,216 +,168,217,132,216,167,217,138,216,168,217,131,216,180,217,138,216,167,217,133,216 +,163,217,133,217,134,216,170,216,168,217,138,217,132,217,134,216,173,216,168,217 +,135,217,133,217,133,216,180,217,136,216,180,102,105,114,115,116,118,105,100,101 +,111,108,105,103,104,116,119,111,114,108,100,109,101,100,105,97,119,104,105,116, +101,99,108,111,115,101,98,108,97,99,107,114,105,103,104,116,115,109,97,108,108, +98,111,111,107,115,112,108,97,99,101,109,117,115,105,99,102,105,101,108,100,111, +114,100,101,114,112,111,105,110,116,118,97,108,117,101,108,101,118,101,108,116, +97,98,108,101,98,111,97,114,100,104,111,117,115,101,103,114,111,117,112,119,111, +114,107,115,121,101,97,114,115,115,116,97,116,101,116,111,100,97,121,119,97,116, +101,114,115,116,97,114,116,115,116,121,108,101,100,101,97,116,104,112,111,119, +101,114,112,104,111,110,101,110,105,103,104,116,101,114,114,111,114,105,110,112, +117,116,97,98,111,117,116,116,101,114,109,115,116,105,116,108,101,116,111,111, +108,115,101,118,101,110,116,108,111,99,97,108,116,105,109,101,115,108,97,114,103 +,101,119,111,114,100,115,103,97,109,101,115,115,104,111,114,116,115,112,97,99, +101,102,111,99,117,115,99,108,101,97,114,109,111,100,101,108,98,108,111,99,107, +103,117,105,100,101,114,97,100,105,111,115,104,97,114,101,119,111,109,101,110,97 +,103,97,105,110,109,111,110,101,121,105,109,97,103,101,110,97,109,101,115,121, +111,117,110,103,108,105,110,101,115,108,97,116,101,114,99,111,108,111,114,103, +114,101,101,110,102,114,111,110,116,38,97,109,112,59,119,97,116,99,104,102,111, +114,99,101,112,114,105,99,101,114,117,108,101,115,98,101,103,105,110,97,102,116, +101,114,118,105,115,105,116,105,115,115,117,101,97,114,101,97,115,98,101,108,111 +,119,105,110,100,101,120,116,111,116,97,108,104,111,117,114,115,108,97,98,101, +108,112,114,105,110,116,112,114,101,115,115,98,117,105,108,116,108,105,110,107, +115,115,112,101,101,100,115,116,117,100,121,116,114,97,100,101,102,111,117,110, +100,115,101,110,115,101,117,110,100,101,114,115,104,111,119,110,102,111,114,109, +115,114,97,110,103,101,97,100,100,101,100,115,116,105,108,108,109,111,118,101, +100,116,97,107,101,110,97,98,111,118,101,102,108,97,115,104,102,105,120,101,100, +111,102,116,101,110,111,116,104,101,114,118,105,101,119,115,99,104,101,99,107, +108,101,103,97,108,114,105,118,101,114,105,116,101,109,115,113,117,105,99,107, +115,104,97,112,101,104,117,109,97,110,101,120,105,115,116,103,111,105,110,103, +109,111,118,105,101,116,104,105,114,100,98,97,115,105,99,112,101,97,99,101,115, +116,97,103,101,119,105,100,116,104,108,111,103,105,110,105,100,101,97,115,119, +114,111,116,101,112,97,103,101,115,117,115,101,114,115,100,114,105,118,101,115, +116,111,114,101,98,114,101,97,107,115,111,117,116,104,118,111,105,99,101,115,105 +,116,101,115,109,111,110,116,104,119,104,101,114,101,98,117,105,108,100,119,104, +105,99,104,101,97,114,116,104,102,111,114,117,109,116,104,114,101,101,115,112, +111,114,116,112,97,114,116,121,67,108,105,99,107,108,111,119,101,114,108,105,118 +,101,115,99,108,97,115,115,108,97,121,101,114,101,110,116,114,121,115,116,111, +114,121,117,115,97,103,101,115,111,117,110,100,99,111,117,114,116,121,111,117, +114,32,98,105,114,116,104,112,111,112,117,112,116,121,112,101,115,97,112,112,108 +,121,73,109,97,103,101,98,101,105,110,103,117,112,112,101,114,110,111,116,101, +115,101,118,101,114,121,115,104,111,119,115,109,101,97,110,115,101,120,116,114, +97,109,97,116,99,104,116,114,97,99,107,107,110,111,119,110,101,97,114,108,121,98 +,101,103,97,110,115,117,112,101,114,112,97,112,101,114,110,111,114,116,104,108, +101,97,114,110,103,105,118,101,110,110,97,109,101,100,101,110,100,101,100,84,101 +,114,109,115,112,97,114,116,115,71,114,111,117,112,98,114,97,110,100,117,115,105 +,110,103,119,111,109,97,110,102,97,108,115,101,114,101,97,100,121,97,117,100,105 +,111,116,97,107,101,115,119,104,105,108,101,46,99,111,109,47,108,105,118,101,100 +,99,97,115,101,115,100,97,105,108,121,99,104,105,108,100,103,114,101,97,116,106, +117,100,103,101,116,104,111,115,101,117,110,105,116,115,110,101,118,101,114,98, +114,111,97,100,99,111,97,115,116,99,111,118,101,114,97,112,112,108,101,102,105, +108,101,115,99,121,99,108,101,115,99,101,110,101,112,108,97,110,115,99,108,105, +99,107,119,114,105,116,101,113,117,101,101,110,112,105,101,99,101,101,109,97,105 +,108,102,114,97,109,101,111,108,100,101,114,112,104,111,116,111,108,105,109,105, +116,99,97,99,104,101,99,105,118,105,108,115,99,97,108,101,101,110,116,101,114, +116,104,101,109,101,116,104,101,114,101,116,111,117,99,104,98,111,117,110,100, +114,111,121,97,108,97,115,107,101,100,119,104,111,108,101,115,105,110,99,101,115 +,116,111,99,107,32,110,97,109,101,102,97,105,116,104,104,101,97,114,116,101,109, +112,116,121,111,102,102,101,114,115,99,111,112,101,111,119,110,101,100,109,105, +103,104,116,97,108,98,117,109,116,104,105,110,107,98,108,111,111,100,97,114,114, +97,121,109,97,106,111,114,116,114,117,115,116,99,97,110,111,110,117,110,105,111, +110,99,111,117,110,116,118,97,108,105,100,115,116,111,110,101,83,116,121,108,101 +,76,111,103,105,110,104,97,112,112,121,111,99,99,117,114,108,101,102,116,58,102, +114,101,115,104,113,117,105,116,101,102,105,108,109,115,103,114,97,100,101,110, +101,101,100,115,117,114,98,97,110,102,105,103,104,116,98,97,115,105,115,104,111, +118,101,114,97,117,116,111,59,114,111,117,116,101,46,104,116,109,108,109,105,120 +,101,100,102,105,110,97,108,89,111,117,114,32,115,108,105,100,101,116,111,112, +105,99,98,114,111,119,110,97,108,111,110,101,100,114,97,119,110,115,112,108,105, +116,114,101,97,99,104,82,105,103,104,116,100,97,116,101,115,109,97,114,99,104, +113,117,111,116,101,103,111,111,100,115,76,105,110,107,115,100,111,117,98,116,97 +,115,121,110,99,116,104,117,109,98,97,108,108,111,119,99,104,105,101,102,121,111 +,117,116,104,110,111,118,101,108,49,48,112,120,59,115,101,114,118,101,117,110, +116,105,108,104,97,110,100,115,67,104,101,99,107,83,112,97,99,101,113,117,101, +114,121,106,97,109,101,115,101,113,117,97,108,116,119,105,99,101,48,44,48,48,48, +83,116,97,114,116,112,97,110,101,108,115,111,110,103,115,114,111,117,110,100,101 +,105,103,104,116,115,104,105,102,116,119,111,114,116,104,112,111,115,116,115,108 +,101,97,100,115,119,101,101,107,115,97,118,111,105,100,116,104,101,115,101,109, +105,108,101,115,112,108,97,110,101,115,109,97,114,116,97,108,112,104,97,112,108, +97,110,116,109,97,114,107,115,114,97,116,101,115,112,108,97,121,115,99,108,97, +105,109,115,97,108,101,115,116,101,120,116,115,115,116,97,114,115,119,114,111, +110,103,60,47,104,51,62,116,104,105,110,103,46,111,114,103,47,109,117,108,116, +105,104,101,97,114,100,80,111,119,101,114,115,116,97,110,100,116,111,107,101,110 +,115,111,108,105,100,40,116,104,105,115,98,114,105,110,103,115,104,105,112,115, +115,116,97,102,102,116,114,105,101,100,99,97,108,108,115,102,117,108,108,121,102 +,97,99,116,115,97,103,101,110,116,84,104,105,115,32,47,47,45,45,62,97,100,109, +105,110,101,103,121,112,116,69,118,101,110,116,49,53,112,120,59,69,109,97,105, +108,116,114,117,101,34,99,114,111,115,115,115,112,101,110,116,98,108,111,103,115 +,98,111,120,34,62,110,111,116,101,100,108,101,97,118,101,99,104,105,110,97,115, +105,122,101,115,103,117,101,115,116,60,47,104,52,62,114,111,98,111,116,104,101, +97,118,121,116,114,117,101,44,115,101,118,101,110,103,114,97,110,100,99,114,105, +109,101,115,105,103,110,115,97,119,97,114,101,100,97,110,99,101,112,104,97,115, +101,62,60,33,45,45,101,110,95,85,83,38,35,51,57,59,50,48,48,112,120,95,110,97, +109,101,108,97,116,105,110,101,110,106,111,121,97,106,97,120,46,97,116,105,111, +110,115,109,105,116,104,85,46,83,46,32,104,111,108,100,115,112,101,116,101,114, +105,110,100,105,97,110,97,118,34,62,99,104,97,105,110,115,99,111,114,101,99,111, +109,101,115,100,111,105,110,103,112,114,105,111,114,83,104,97,114,101,49,57,57, +48,115,114,111,109,97,110,108,105,115,116,115,106,97,112,97,110,102,97,108,108, +115,116,114,105,97,108,111,119,110,101,114,97,103,114,101,101,60,47,104,50,62,97 +,98,117,115,101,97,108,101,114,116,111,112,101,114,97,34,45,47,47,87,99,97,114, +100,115,104,105,108,108,115,116,101,97,109,115,80,104,111,116,111,116,114,117, +116,104,99,108,101,97,110,46,112,104,112,63,115,97,105,110,116,109,101,116,97, +108,108,111,117,105,115,109,101,97,110,116,112,114,111,111,102,98,114,105,101, +102,114,111,119,34,62,103,101,110,114,101,116,114,117,99,107,108,111,111,107,115 +,86,97,108,117,101,70,114,97,109,101,46,110,101,116,47,45,45,62,10,60,116,114, +121,32,123,10,118,97,114,32,109,97,107,101,115,99,111,115,116,115,112,108,97,105 +,110,97,100,117,108,116,113,117,101,115,116,116,114,97,105,110,108,97,98,111,114 +,104,101,108,112,115,99,97,117,115,101,109,97,103,105,99,109,111,116,111,114,116 +,104,101,105,114,50,53,48,112,120,108,101,97,115,116,115,116,101,112,115,67,111, +117,110,116,99,111,117,108,100,103,108,97,115,115,115,105,100,101,115,102,117, +110,100,115,104,111,116,101,108,97,119,97,114,100,109,111,117,116,104,109,111, +118,101,115,112,97,114,105,115,103,105,118,101,115,100,117,116,99,104,116,101, +120,97,115,102,114,117,105,116,110,117,108,108,44,124,124,91,93,59,116,111,112, +34,62,10,60,33,45,45,80,79,83,84,34,111,99,101,97,110,60,98,114,47,62,102,108, +111,111,114,115,112,101,97,107,100,101,112,116,104,32,115,105,122,101,98,97,110, +107,115,99,97,116,99,104,99,104,97,114,116,50,48,112,120,59,97,108,105,103,110, +100,101,97,108,115,119,111,117,108,100,53,48,112,120,59,117,114,108,61,34,112,97 +,114,107,115,109,111,117,115,101,77,111,115,116,32,46,46,46,60,47,97,109,111,110 +,103,98,114,97,105,110,98,111,100,121,32,110,111,110,101,59,98,97,115,101,100,99 +,97,114,114,121,100,114,97,102,116,114,101,102,101,114,112,97,103,101,95,104,111 +,109,101,46,109,101,116,101,114,100,101,108,97,121,100,114,101,97,109,112,114, +111,118,101,106,111,105,110,116,60,47,116,114,62,100,114,117,103,115,60,33,45,45 +,32,97,112,114,105,108,105,100,101,97,108,97,108,108,101,110,101,120,97,99,116, +102,111,114,116,104,99,111,100,101,115,108,111,103,105,99,86,105,101,119,32,115, +101,101,109,115,98,108,97,110,107,112,111,114,116,115,32,40,50,48,48,115,97,118, +101,100,95,108,105,110,107,103,111,97,108,115,103,114,97,110,116,103,114,101,101 +,107,104,111,109,101,115,114,105,110,103,115,114,97,116,101,100,51,48,112,120,59 +,119,104,111,115,101,112,97,114,115,101,40,41,59,34,32,66,108,111,99,107,108,105 +,110,117,120,106,111,110,101,115,112,105,120,101,108,39,41,59,34,62,41,59,105, +102,40,45,108,101,102,116,100,97,118,105,100,104,111,114,115,101,70,111,99,117, +115,114,97,105,115,101,98,111,120,101,115,84,114,97,99,107,101,109,101,110,116, +60,47,101,109,62,98,97,114,34,62,46,115,114,99,61,116,111,119,101,114,97,108,116 +,61,34,99,97,98,108,101,104,101,110,114,121,50,52,112,120,59,115,101,116,117,112 +,105,116,97,108,121,115,104,97,114,112,109,105,110,111,114,116,97,115,116,101, +119,97,110,116,115,116,104,105,115,46,114,101,115,101,116,119,104,101,101,108, +103,105,114,108,115,47,99,115,115,47,49,48,48,37,59,99,108,117,98,115,115,116, +117,102,102,98,105,98,108,101,118,111,116,101,115,32,49,48,48,48,107,111,114,101 +,97,125,41,59,13,10,98,97,110,100,115,113,117,101,117,101,61,32,123,125,59,56,48 +,112,120,59,99,107,105,110,103,123,13,10,9,9,97,104,101,97,100,99,108,111,99,107 +,105,114,105,115,104,108,105,107,101,32,114,97,116,105,111,115,116,97,116,115,70 +,111,114,109,34,121,97,104,111,111,41,91,48,93,59,65,98,111,117,116,102,105,110, +100,115,60,47,104,49,62,100,101,98,117,103,116,97,115,107,115,85,82,76,32,61,99, +101,108,108,115,125,41,40,41,59,49,50,112,120,59,112,114,105,109,101,116,101,108 +,108,115,116,117,114,110,115,48,120,54,48,48,46,106,112,103,34,115,112,97,105, +110,98,101,97,99,104,116,97,120,101,115,109,105,99,114,111,97,110,103,101,108,45 +,45,62,60,47,103,105,102,116,115,115,116,101,118,101,45,108,105,110,107,98,111, +100,121,46,125,41,59,10,9,109,111,117,110,116,32,40,49,57,57,70,65,81,60,47,114, +111,103,101,114,102,114,97,110,107,67,108,97,115,115,50,56,112,120,59,102,101, +101,100,115,60,104,49,62,60,115,99,111,116,116,116,101,115,116,115,50,50,112,120 +,59,100,114,105,110,107,41,32,124,124,32,108,101,119,105,115,115,104,97,108,108, +35,48,51,57,59,32,102,111,114,32,108,111,118,101,100,119,97,115,116,101,48,48, +112,120,59,106,97,58,227,130,115,105,109,111,110,60,102,111,110,116,114,101,112, +108,121,109,101,101,116,115,117,110,116,101,114,99,104,101,97,112,116,105,103, +104,116,66,114,97,110,100,41,32,33,61,32,100,114,101,115,115,99,108,105,112,115, +114,111,111,109,115,111,110,107,101,121,109,111,98,105,108,109,97,105,110,46,78, +97,109,101,32,112,108,97,116,101,102,117,110,110,121,116,114,101,101,115,99,111, +109,47,34,49,46,106,112,103,119,109,111,100,101,112,97,114,97,109,83,84,65,82,84 +,108,101,102,116,32,105,100,100,101,110,44,32,50,48,49,41,59,10,125,10,102,111, +114,109,46,118,105,114,117,115,99,104,97,105,114,116,114,97,110,115,119,111,114, +115,116,80,97,103,101,115,105,116,105,111,110,112,97,116,99,104,60,33,45,45,10, +111,45,99,97,99,102,105,114,109,115,116,111,117,114,115,44,48,48,48,32,97,115, +105,97,110,105,43,43,41,123,97,100,111,98,101,39,41,91,48,93,105,100,61,49,48,98 +,111,116,104,59,109,101,110,117,32,46,50,46,109,105,46,112,110,103,34,107,101, +118,105,110,99,111,97,99,104,67,104,105,108,100,98,114,117,99,101,50,46,106,112, +103,85,82,76,41,43,46,106,112,103,124,115,117,105,116,101,115,108,105,99,101,104 +,97,114,114,121,49,50,48,34,32,115,119,101,101,116,116,114,62,13,10,110,97,109, +101,61,100,105,101,103,111,112,97,103,101,32,115,119,105,115,115,45,45,62,10,10, +35,102,102,102,59,34,62,76,111,103,46,99,111,109,34,116,114,101,97,116,115,104, +101,101,116,41,32,38,38,32,49,52,112,120,59,115,108,101,101,112,110,116,101,110, +116,102,105,108,101,100,106,97,58,227,131,105,100,61,34,99,78,97,109,101,34,119, +111,114,115,101,115,104,111,116,115,45,98,111,120,45,100,101,108,116,97,10,38, +108,116,59,98,101,97,114,115,58,52,56,90,60,100,97,116,97,45,114,117,114,97,108, +60,47,97,62,32,115,112,101,110,100,98,97,107,101,114,115,104,111,112,115,61,32, +34,34,59,112,104,112,34,62,99,116,105,111,110,49,51,112,120,59,98,114,105,97,110 +,104,101,108,108,111,115,105,122,101,61,111,61,37,50,70,32,106,111,105,110,109, +97,121,98,101,60,105,109,103,32,105,109,103,34,62,44,32,102,106,115,105,109,103, +34,32,34,41,91,48,93,77,84,111,112,66,84,121,112,101,34,110,101,119,108,121,68, +97,110,115,107,99,122,101,99,104,116,114,97,105,108,107,110,111,119,115,60,47, +104,53,62,102,97,113,34,62,122,104,45,99,110,49,48,41,59,10,45,49,34,41,59,116, +121,112,101,61,98,108,117,101,115,116,114,117,108,121,100,97,118,105,115,46,106, +115,39,59,62,13,10,60,33,115,116,101,101,108,32,121,111,117,32,104,50,62,13,10, +102,111,114,109,32,106,101,115,117,115,49,48,48,37,32,109,101,110,117,46,13,10,9 +,13,10,119,97,108,101,115,114,105,115,107,115,117,109,101,110,116,100,100,105, +110,103,98,45,108,105,107,116,101,97,99,104,103,105,102,34,32,118,101,103,97,115 +,100,97,110,115,107,101,101,115,116,105,115,104,113,105,112,115,117,111,109,105, +115,111,98,114,101,100,101,115,100,101,101,110,116,114,101,116,111,100,111,115, +112,117,101,100,101,97,195,177,111,115,101,115,116,195,161,116,105,101,110,101, +104,97,115,116,97,111,116,114,111,115,112,97,114,116,101,100,111,110,100,101,110 +,117,101,118,111,104,97,99,101,114,102,111,114,109,97,109,105,115,109,111,109, +101,106,111,114,109,117,110,100,111,97,113,117,195,173,100,195,173,97,115,115, +195,179,108,111,97,121,117,100,97,102,101,99,104,97,116,111,100,97,115,116,97, +110,116,111,109,101,110,111,115,100,97,116,111,115,111,116,114,97,115,115,105, +116,105,111,109,117,99,104,111,97,104,111,114,97,108,117,103,97,114,109,97,121, +111,114,101,115,116,111,115,104,111,114,97,115,116,101,110,101,114,97,110,116, +101,115,102,111,116,111,115,101,115,116,97,115,112,97,195,173,115,110,117,101, +118,97,115,97,108,117,100,102,111,114,111,115,109,101,100,105,111,113,117,105, +101,110,109,101,115,101,115,112,111,100,101,114,99,104,105,108,101,115,101,114, +195,161,118,101,99,101,115,100,101,99,105,114,106,111,115,195,169,101,115,116,97 +,114,118,101,110,116,97,103,114,117,112,111,104,101,99,104,111,101,108,108,111, +115,116,101,110,103,111,97,109,105,103,111,99,111,115,97,115,110,105,118,101,108 +,103,101,110,116,101,109,105,115,109,97,97,105,114,101,115,106,117,108,105,111, +116,101,109,97,115,104,97,99,105,97,102,97,118,111,114,106,117,110,105,111,108, +105,98,114,101,112,117,110,116,111,98,117,101,110,111,97,117,116,111,114,97,98, +114,105,108,98,117,101,110,97,116,101,120,116,111,109,97,114,122,111,115,97,98, +101,114,108,105,115,116,97,108,117,101,103,111,99,195,179,109,111,101,110,101, +114,111,106,117,101,103,111,112,101,114,195,186,104,97,98,101,114,101,115,116, +111,121,110,117,110,99,97,109,117,106,101,114,118,97,108,111,114,102,117,101,114 +,97,108,105,98,114,111,103,117,115,116,97,105,103,117,97,108,118,111,116,111,115 +,99,97,115,111,115,103,117,195,173,97,112,117,101,100,111,115,111,109,111,115,97 +,118,105,115,111,117,115,116,101,100,100,101,98,101,110,110,111,99,104,101,98, +117,115,99,97,102,97,108,116,97,101,117,114,111,115,115,101,114,105,101,100,105, +99,104,111,99,117,114,115,111,99,108,97,118,101,99,97,115,97,115,108,101,195,179 +,110,112,108,97,122,111,108,97,114,103,111,111,98,114,97,115,118,105,115,116,97, +97,112,111,121,111,106,117,110,116,111,116,114,97,116,97,118,105,115,116,111,99, +114,101,97,114,99,97,109,112,111,104,101,109,111,115,99,105,110,99,111,99,97,114 +,103,111,112,105,115,111,115,111,114,100,101,110,104,97,99,101,110,195,161,114, +101,97,100,105,115,99,111,112,101,100,114,111,99,101,114,99,97,112,117,101,100, +97,112,97,112,101,108,109,101,110,111,114,195,186,116,105,108,99,108,97,114,111, +106,111,114,103,101,99,97,108,108,101,112,111,110,101,114,116,97,114,100,101,110 +,97,100,105,101,109,97,114,99,97,115,105,103,117,101,101,108,108,97,115,115,105, +103,108,111,99,111,99,104,101,109,111,116,111,115,109,97,100,114,101,99,108,97, +115,101,114,101,115,116,111,110,105,195,177,111,113,117,101,100,97,112,97,115,97 +,114,98,97,110,99,111,104,105,106,111,115,118,105,97,106,101,112,97,98,108,111, +195,169,115,116,101,118,105,101,110,101,114,101,105,110,111,100,101,106,97,114, +102,111,110,100,111,99,97,110,97,108,110,111,114,116,101,108,101,116,114,97,99, +97,117,115,97,116,111,109,97,114,109,97,110,111,115,108,117,110,101,115,97,117, +116,111,115,118,105,108,108,97,118,101,110,100,111,112,101,115,97,114,116,105, +112,111,115,116,101,110,103,97,109,97,114,99,111,108,108,101,118,97,112,97,100, +114,101,117,110,105,100,111,118,97,109,111,115,122,111,110,97,115,97,109,98,111, +115,98,97,110,100,97,109,97,114,105,97,97,98,117,115,111,109,117,99,104,97,115, +117,98,105,114,114,105,111,106,97,118,105,118,105,114,103,114,97,100,111,99,104, +105,99,97,97,108,108,195,173,106,111,118,101,110,100,105,99,104,97,101,115,116, +97,110,116,97,108,101,115,115,97,108,105,114,115,117,101,108,111,112,101,115,111 +,115,102,105,110,101,115,108,108,97,109,97,98,117,115,99,111,195,169,115,116,97, +108,108,101,103,97,110,101,103,114,111,112,108,97,122,97,104,117,109,111,114,112 +,97,103,97,114,106,117,110,116,97,100,111,98,108,101,105,115,108,97,115,98,111, +108,115,97,98,97,195,177,111,104,97,98,108,97,108,117,99,104,97,195,129,114,101, +97,100,105,99,101,110,106,117,103,97,114,110,111,116,97,115,118,97,108,108,101, +97,108,108,195,161,99,97,114,103,97,100,111,108,111,114,97,98,97,106,111,101,115 +,116,195,169,103,117,115,116,111,109,101,110,116,101,109,97,114,105,111,102,105, +114,109,97,99,111,115,116,111,102,105,99,104,97,112,108,97,116,97,104,111,103,97 +,114,97,114,116,101,115,108,101,121,101,115,97,113,117,101,108,109,117,115,101, +111,98,97,115,101,115,112,111,99,111,115,109,105,116,97,100,99,105,101,108,111, +99,104,105,99,111,109,105,101,100,111,103,97,110,97,114,115,97,110,116,111,101, +116,97,112,97,100,101,98,101,115,112,108,97,121,97,114,101,100,101,115,115,105, +101,116,101,99,111,114,116,101,99,111,114,101,97,100,117,100,97,115,100,101,115, +101,111,118,105,101,106,111,100,101,115,101,97,97,103,117,97,115,38,113,117,111, +116,59,100,111,109,97,105,110,99,111,109,109,111,110,115,116,97,116,117,115,101, +118,101,110,116,115,109,97,115,116,101,114,115,121,115,116,101,109,97,99,116,105 +,111,110,98,97,110,110,101,114,114,101,109,111,118,101,115,99,114,111,108,108, +117,112,100,97,116,101,103,108,111,98,97,108,109,101,100,105,117,109,102,105,108 +,116,101,114,110,117,109,98,101,114,99,104,97,110,103,101,114,101,115,117,108, +116,112,117,98,108,105,99,115,99,114,101,101,110,99,104,111,111,115,101,110,111, +114,109,97,108,116,114,97,118,101,108,105,115,115,117,101,115,115,111,117,114,99 +,101,116,97,114,103,101,116,115,112,114,105,110,103,109,111,100,117,108,101,109, +111,98,105,108,101,115,119,105,116,99,104,112,104,111,116,111,115,98,111,114,100 +,101,114,114,101,103,105,111,110,105,116,115,101,108,102,115,111,99,105,97,108, +97,99,116,105,118,101,99,111,108,117,109,110,114,101,99,111,114,100,102,111,108, +108,111,119,116,105,116,108,101,62,101,105,116,104,101,114,108,101,110,103,116, +104,102,97,109,105,108,121,102,114,105,101,110,100,108,97,121,111,117,116,97,117 +,116,104,111,114,99,114,101,97,116,101,114,101,118,105,101,119,115,117,109,109, +101,114,115,101,114,118,101,114,112,108,97,121,101,100,112,108,97,121,101,114, +101,120,112,97,110,100,112,111,108,105,99,121,102,111,114,109,97,116,100,111,117 +,98,108,101,112,111,105,110,116,115,115,101,114,105,101,115,112,101,114,115,111, +110,108,105,118,105,110,103,100,101,115,105,103,110,109,111,110,116,104,115,102, +111,114,99,101,115,117,110,105,113,117,101,119,101,105,103,104,116,112,101,111, +112,108,101,101,110,101,114,103,121,110,97,116,117,114,101,115,101,97,114,99,104 +,102,105,103,117,114,101,104,97,118,105,110,103,99,117,115,116,111,109,111,102, +102,115,101,116,108,101,116,116,101,114,119,105,110,100,111,119,115,117,98,109, +105,116,114,101,110,100,101,114,103,114,111,117,112,115,117,112,108,111,97,100, +104,101,97,108,116,104,109,101,116,104,111,100,118,105,100,101,111,115,115,99, +104,111,111,108,102,117,116,117,114,101,115,104,97,100,111,119,100,101,98,97,116 +,101,118,97,108,117,101,115,79,98,106,101,99,116,111,116,104,101,114,115,114,105 +,103,104,116,115,108,101,97,103,117,101,99,104,114,111,109,101,115,105,109,112, +108,101,110,111,116,105,99,101,115,104,97,114,101,100,101,110,100,105,110,103, +115,101,97,115,111,110,114,101,112,111,114,116,111,110,108,105,110,101,115,113, +117,97,114,101,98,117,116,116,111,110,105,109,97,103,101,115,101,110,97,98,108, +101,109,111,118,105,110,103,108,97,116,101,115,116,119,105,110,116,101,114,70, +114,97,110,99,101,112,101,114,105,111,100,115,116,114,111,110,103,114,101,112, +101,97,116,76,111,110,100,111,110,100,101,116,97,105,108,102,111,114,109,101,100 +,100,101,109,97,110,100,115,101,99,117,114,101,112,97,115,115,101,100,116,111, +103,103,108,101,112,108,97,99,101,115,100,101,118,105,99,101,115,116,97,116,105, +99,99,105,116,105,101,115,115,116,114,101,97,109,121,101,108,108,111,119,97,116, +116,97,99,107,115,116,114,101,101,116,102,108,105,103,104,116,104,105,100,100, +101,110,105,110,102,111,34,62,111,112,101,110,101,100,117,115,101,102,117,108, +118,97,108,108,101,121,99,97,117,115,101,115,108,101,97,100,101,114,115,101,99, +114,101,116,115,101,99,111,110,100,100,97,109,97,103,101,115,112,111,114,116,115 +,101,120,99,101,112,116,114,97,116,105,110,103,115,105,103,110,101,100,116,104, +105,110,103,115,101,102,102,101,99,116,102,105,101,108,100,115,115,116,97,116, +101,115,111,102,102,105,99,101,118,105,115,117,97,108,101,100,105,116,111,114, +118,111,108,117,109,101,82,101,112,111,114,116,109,117,115,101,117,109,109,111, +118,105,101,115,112,97,114,101,110,116,97,99,99,101,115,115,109,111,115,116,108, +121,109,111,116,104,101,114,34,32,105,100,61,34,109,97,114,107,101,116,103,114, +111,117,110,100,99,104,97,110,99,101,115,117,114,118,101,121,98,101,102,111,114, +101,115,121,109,98,111,108,109,111,109,101,110,116,115,112,101,101,99,104,109, +111,116,105,111,110,105,110,115,105,100,101,109,97,116,116,101,114,67,101,110, +116,101,114,111,98,106,101,99,116,101,120,105,115,116,115,109,105,100,100,108, +101,69,117,114,111,112,101,103,114,111,119,116,104,108,101,103,97,99,121,109,97, +110,110,101,114,101,110,111,117,103,104,99,97,114,101,101,114,97,110,115,119,101 +,114,111,114,105,103,105,110,112,111,114,116,97,108,99,108,105,101,110,116,115, +101,108,101,99,116,114,97,110,100,111,109,99,108,111,115,101,100,116,111,112,105 +,99,115,99,111,109,105,110,103,102,97,116,104,101,114,111,112,116,105,111,110, +115,105,109,112,108,121,114,97,105,115,101,100,101,115,99,97,112,101,99,104,111, +115,101,110,99,104,117,114,99,104,100,101,102,105,110,101,114,101,97,115,111,110 +,99,111,114,110,101,114,111,117,116,112,117,116,109,101,109,111,114,121,105,102, +114,97,109,101,112,111,108,105,99,101,109,111,100,101,108,115,78,117,109,98,101, +114,100,117,114,105,110,103,111,102,102,101,114,115,115,116,121,108,101,115,107, +105,108,108,101,100,108,105,115,116,101,100,99,97,108,108,101,100,115,105,108, +118,101,114,109,97,114,103,105,110,100,101,108,101,116,101,98,101,116,116,101, +114,98,114,111,119,115,101,108,105,109,105,116,115,71,108,111,98,97,108,115,105, +110,103,108,101,119,105,100,103,101,116,99,101,110,116,101,114,98,117,100,103, +101,116,110,111,119,114,97,112,99,114,101,100,105,116,99,108,97,105,109,115,101, +110,103,105,110,101,115,97,102,101,116,121,99,104,111,105,99,101,115,112,105,114 +,105,116,45,115,116,121,108,101,115,112,114,101,97,100,109,97,107,105,110,103, +110,101,101,100,101,100,114,117,115,115,105,97,112,108,101,97,115,101,101,120, +116,101,110,116,83,99,114,105,112,116,98,114,111,107,101,110,97,108,108,111,119, +115,99,104,97,114,103,101,100,105,118,105,100,101,102,97,99,116,111,114,109,101, +109,98,101,114,45,98,97,115,101,100,116,104,101,111,114,121,99,111,110,102,105, +103,97,114,111,117,110,100,119,111,114,107,101,100,104,101,108,112,101,100,67, +104,117,114,99,104,105,109,112,97,99,116,115,104,111,117,108,100,97,108,119,97, +121,115,108,111,103,111,34,32,98,111,116,116,111,109,108,105,115,116,34,62,41, +123,118,97,114,32,112,114,101,102,105,120,111,114,97,110,103,101,72,101,97,100, +101,114,46,112,117,115,104,40,99,111,117,112,108,101,103,97,114,100,101,110,98, +114,105,100,103,101,108,97,117,110,99,104,82,101,118,105,101,119,116,97,107,105, +110,103,118,105,115,105,111,110,108,105,116,116,108,101,100,97,116,105,110,103, +66,117,116,116,111,110,98,101,97,117,116,121,116,104,101,109,101,115,102,111,114 +,103,111,116,83,101,97,114,99,104,97,110,99,104,111,114,97,108,109,111,115,116, +108,111,97,100,101,100,67,104,97,110,103,101,114,101,116,117,114,110,115,116,114 +,105,110,103,114,101,108,111,97,100,77,111,98,105,108,101,105,110,99,111,109,101 +,115,117,112,112,108,121,83,111,117,114,99,101,111,114,100,101,114,115,118,105, +101,119,101,100,38,110,98,115,112,59,99,111,117,114,115,101,65,98,111,117,116,32 +,105,115,108,97,110,100,60,104,116,109,108,32,99,111,111,107,105,101,110,97,109, +101,61,34,97,109,97,122,111,110,109,111,100,101,114,110,97,100,118,105,99,101, +105,110,60,47,97,62,58,32,84,104,101,32,100,105,97,108,111,103,104,111,117,115, +101,115,66,69,71,73,78,32,77,101,120,105,99,111,115,116,97,114,116,115,99,101, +110,116,114,101,104,101,105,103,104,116,97,100,100,105,110,103,73,115,108,97,110 +,100,97,115,115,101,116,115,69,109,112,105,114,101,83,99,104,111,111,108,101,102 +,102,111,114,116,100,105,114,101,99,116,110,101,97,114,108,121,109,97,110,117,97 +,108,83,101,108,101,99,116,46,10,10,79,110,101,106,111,105,110,101,100,109,101, +110,117,34,62,80,104,105,108,105,112,97,119,97,114,100,115,104,97,110,100,108, +101,105,109,112,111,114,116,79,102,102,105,99,101,114,101,103,97,114,100,115,107 +,105,108,108,115,110,97,116,105,111,110,83,112,111,114,116,115,100,101,103,114, +101,101,119,101,101,107,108,121,32,40,101,46,103,46,98,101,104,105,110,100,100, +111,99,116,111,114,108,111,103,103,101,100,117,110,105,116,101,100,60,47,98,62, +60,47,98,101,103,105,110,115,112,108,97,110,116,115,97,115,115,105,115,116,97, +114,116,105,115,116,105,115,115,117,101,100,51,48,48,112,120,124,99,97,110,97, +100,97,97,103,101,110,99,121,115,99,104,101,109,101,114,101,109,97,105,110,66, +114,97,122,105,108,115,97,109,112,108,101,108,111,103,111,34,62,98,101,121,111, +110,100,45,115,99,97,108,101,97,99,99,101,112,116,115,101,114,118,101,100,109,97 +,114,105,110,101,70,111,111,116,101,114,99,97,109,101,114,97,60,47,104,49,62,10, +95,102,111,114,109,34,108,101,97,118,101,115,115,116,114,101,115,115,34,32,47,62 +,13,10,46,103,105,102,34,32,111,110,108,111,97,100,108,111,97,100,101,114,79,120 +,102,111,114,100,115,105,115,116,101,114,115,117,114,118,105,118,108,105,115,116 +,101,110,102,101,109,97,108,101,68,101,115,105,103,110,115,105,122,101,61,34,97, +112,112,101,97,108,116,101,120,116,34,62,108,101,118,101,108,115,116,104,97,110, +107,115,104,105,103,104,101,114,102,111,114,99,101,100,97,110,105,109,97,108,97, +110,121,111,110,101,65,102,114,105,99,97,97,103,114,101,101,100,114,101,99,101, +110,116,80,101,111,112,108,101,60,98,114,32,47,62,119,111,110,100,101,114,112, +114,105,99,101,115,116,117,114,110,101,100,124,124,32,123,125,59,109,97,105,110, +34,62,105,110,108,105,110,101,115,117,110,100,97,121,119,114,97,112,34,62,102,97 +,105,108,101,100,99,101,110,115,117,115,109,105,110,117,116,101,98,101,97,99,111 +,110,113,117,111,116,101,115,49,53,48,112,120,124,101,115,116,97,116,101,114,101 +,109,111,116,101,101,109,97,105,108,34,108,105,110,107,101,100,114,105,103,104, +116,59,115,105,103,110,97,108,102,111,114,109,97,108,49,46,104,116,109,108,115, +105,103,110,117,112,112,114,105,110,99,101,102,108,111,97,116,58,46,112,110,103, +34,32,102,111,114,117,109,46,65,99,99,101,115,115,112,97,112,101,114,115,115,111 +,117,110,100,115,101,120,116,101,110,100,72,101,105,103,104,116,115,108,105,100, +101,114,85,84,70,45,56,34,38,97,109,112,59,32,66,101,102,111,114,101,46,32,87, +105,116,104,115,116,117,100,105,111,111,119,110,101,114,115,109,97,110,97,103, +101,112,114,111,102,105,116,106,81,117,101,114,121,97,110,110,117,97,108,112,97, +114,97,109,115,98,111,117,103,104,116,102,97,109,111,117,115,103,111,111,103,108 +,101,108,111,110,103,101,114,105,43,43,41,32,123,105,115,114,97,101,108,115,97, +121,105,110,103,100,101,99,105,100,101,104,111,109,101,34,62,104,101,97,100,101, +114,101,110,115,117,114,101,98,114,97,110,99,104,112,105,101,99,101,115,98,108, +111,99,107,59,115,116,97,116,101,100,116,111,112,34,62,60,114,97,99,105,110,103, +114,101,115,105,122,101,45,45,38,103,116,59,112,97,99,105,116,121,115,101,120, +117,97,108,98,117,114,101,97,117,46,106,112,103,34,32,49,48,44,48,48,48,111,98, +116,97,105,110,116,105,116,108,101,115,97,109,111,117,110,116,44,32,73,110,99,46 +,99,111,109,101,100,121,109,101,110,117,34,32,108,121,114,105,99,115,116,111,100 +,97,121,46,105,110,100,101,101,100,99,111,117,110,116,121,95,108,111,103,111,46, +70,97,109,105,108,121,108,111,111,107,101,100,77,97,114,107,101,116,108,115,101, +32,105,102,80,108,97,121,101,114,116,117,114,107,101,121,41,59,118,97,114,32,102 +,111,114,101,115,116,103,105,118,105,110,103,101,114,114,111,114,115,68,111,109, +97,105,110,125,101,108,115,101,123,105,110,115,101,114,116,66,108,111,103,60,47, +102,111,111,116,101,114,108,111,103,105,110,46,102,97,115,116,101,114,97,103,101 +,110,116,115,60,98,111,100,121,32,49,48,112,120,32,48,112,114,97,103,109,97,102, +114,105,100,97,121,106,117,110,105,111,114,100,111,108,108,97,114,112,108,97,99, +101,100,99,111,118,101,114,115,112,108,117,103,105,110,53,44,48,48,48,32,112,97, +103,101,34,62,98,111,115,116,111,110,46,116,101,115,116,40,97,118,97,116,97,114, +116,101,115,116,101,100,95,99,111,117,110,116,102,111,114,117,109,115,115,99,104 +,101,109,97,105,110,100,101,120,44,102,105,108,108,101,100,115,104,97,114,101, +115,114,101,97,100,101,114,97,108,101,114,116,40,97,112,112,101,97,114,83,117,98 +,109,105,116,108,105,110,101,34,62,98,111,100,121,34,62,10,42,32,84,104,101,84, +104,111,117,103,104,115,101,101,105,110,103,106,101,114,115,101,121,78,101,119, +115,60,47,118,101,114,105,102,121,101,120,112,101,114,116,105,110,106,117,114, +121,119,105,100,116,104,61,67,111,111,107,105,101,83,84,65,82,84,32,97,99,114, +111,115,115,95,105,109,97,103,101,116,104,114,101,97,100,110,97,116,105,118,101, +112,111,99,107,101,116,98,111,120,34,62,10,83,121,115,116,101,109,32,68,97,118, +105,100,99,97,110,99,101,114,116,97,98,108,101,115,112,114,111,118,101,100,65, +112,114,105,108,32,114,101,97,108,108,121,100,114,105,118,101,114,105,116,101, +109,34,62,109,111,114,101,34,62,98,111,97,114,100,115,99,111,108,111,114,115,99, +97,109,112,117,115,102,105,114,115,116,32,124,124,32,91,93,59,109,101,100,105,97 +,46,103,117,105,116,97,114,102,105,110,105,115,104,119,105,100,116,104,58,115, +104,111,119,101,100,79,116,104,101,114,32,46,112,104,112,34,32,97,115,115,117, +109,101,108,97,121,101,114,115,119,105,108,115,111,110,115,116,111,114,101,115, +114,101,108,105,101,102,115,119,101,100,101,110,67,117,115,116,111,109,101,97, +115,105,108,121,32,121,111,117,114,32,83,116,114,105,110,103,10,10,87,104,105, +108,116,97,121,108,111,114,99,108,101,97,114,58,114,101,115,111,114,116,102,114, +101,110,99,104,116,104,111,117,103,104,34,41,32,43,32,34,60,98,111,100,121,62,98 +,117,121,105,110,103,98,114,97,110,100,115,77,101,109,98,101,114,110,97,109,101, +34,62,111,112,112,105,110,103,115,101,99,116,111,114,53,112,120,59,34,62,118,115 +,112,97,99,101,112,111,115,116,101,114,109,97,106,111,114,32,99,111,102,102,101, +101,109,97,114,116,105,110,109,97,116,117,114,101,104,97,112,112,101,110,60,47, +110,97,118,62,107,97,110,115,97,115,108,105,110,107,34,62,73,109,97,103,101,115, +61,102,97,108,115,101,119,104,105,108,101,32,104,115,112,97,99,101,48,38,97,109, +112,59,32,10,10,73,110,32,32,112,111,119,101,114,80,111,108,115,107,105,45,99, +111,108,111,114,106,111,114,100,97,110,66,111,116,116,111,109,83,116,97,114,116, +32,45,99,111,117,110,116,50,46,104,116,109,108,110,101,119,115,34,62,48,49,46, +106,112,103,79,110,108,105,110,101,45,114,105,103,104,116,109,105,108,108,101, +114,115,101,110,105,111,114,73,83,66,78,32,48,48,44,48,48,48,32,103,117,105,100, +101,115,118,97,108,117,101,41,101,99,116,105,111,110,114,101,112,97,105,114,46, +120,109,108,34,32,32,114,105,103,104,116,115,46,104,116,109,108,45,98,108,111,99 +,107,114,101,103,69,120,112,58,104,111,118,101,114,119,105,116,104,105,110,118, +105,114,103,105,110,112,104,111,110,101,115,60,47,116,114,62,13,117,115,105,110, +103,32,10,9,118,97,114,32,62,39,41,59,10,9,60,47,116,100,62,10,60,47,116,114,62, +10,98,97,104,97,115,97,98,114,97,115,105,108,103,97,108,101,103,111,109,97,103, +121,97,114,112,111,108,115,107,105,115,114,112,115,107,105,216,177,216,175,217, +136,228,184,173,230,150,135,231,174,128,228,189,147,231,185,129,233,171,148,228, +191,161,230,129,175,228,184,173,229,155,189,230,136,145,228,187,172,228,184,128, +228,184,170,229,133,172,229,143,184,231,174,161,231,144,134,232,174,186,229,157, +155,229,143,175,228,187,165,230,156,141,229,138,161,230,151,182,233,151,180,228, +184,170,228,186,186,228,186,167,229,147,129,232,135,170,229,183,177,228,188,129, +228,184,154,230,159,165,231,156,139,229,183,165,228,189,156,232,129,148,231,179, +187,230,178,161,230,156,137,231,189,145,231,171,153,230,137,128,230,156,137,232, +175,132,232,174,186,228,184,173,229,191,131,230,150,135,231,171,160,231,148,168, +230,136,183,233,166,150,233,161,181,228,189,156,232,128,133,230,138,128,230,156, +175,233,151,174,233,162,152,231,155,184,229,133,179,228,184,139,232,189,189,230, +144,156,231,180,162,228,189,191,231,148,168,232,189,175,228,187,182,229,156,168, +231,186,191,228,184,187,233,162,152,232,181,132,230,150,153,232,167,134,233,162, +145,229,155,158,229,164,141,230,179,168,229,134,140,231,189,145,231,187,156,230, +148,182,232,151,143,229,134,133,229,174,185,230,142,168,232,141,144,229,184,130, +229,156,186,230,182,136,230,129,175,231,169,186,233,151,180,229,143,145,229,184, +131,228,187,128,228,185,136,229,165,189,229,143,139,231,148,159,230,180,187,229, +155,190,231,137,135,229,143,145,229,177,149,229,166,130,230,158,156,230,137,139, +230,156,186,230,150,176,233,151,187,230,156,128,230,150,176,230,150,185,229,188, +143,229,140,151,228,186,172,230,143,144,228,190,155,229,133,179,228,186,142,230, +155,180,229,164,154,232,191,153,228,184,170,231,179,187,231,187,159,231,159,165, +233,129,147,230,184,184,230,136,143,229,185,191,229,145,138,229,133,182,228,187, +150,229,143,145,232,161,168,229,174,137,229,133,168,231,172,172,228,184,128,228, +188,154,229,145,152,232,191,155,232,161,140,231,130,185,229,135,187,231,137,136, +230,157,131,231,148,181,229,173,144,228,184,150,231,149,140,232,174,190,232,174, +161,229,133,141,232,180,185,230,149,153,232,130,178,229,138,160,229,133,165,230, +180,187,229,138,168,228,187,150,228,187,172,229,149,134,229,147,129,229,141,154, +229,174,162,231,142,176,229,156,168,228,184,138,230,181,183,229,166,130,228,189, +149,229,183,178,231,187,143,231,149,153,232,168,128,232,175,166,231,187,134,231, +164,190,229,140,186,231,153,187,229,189,149,230,156,172,231,171,153,233,156,128, +232,166,129,228,187,183,230,160,188,230,148,175,230,140,129,229,155,189,233,153, +133,233,147,190,230,142,165,229,155,189,229,174,182,229,187,186,232,174,190,230, +156,139,229,143,139,233,152,133,232,175,187,230,179,149,229,190,139,228,189,141, +231,189,174,231,187,143,230,181,142,233,128,137,230,139,169,232,191,153,230,160, +183,229,189,147,229,137,141,229,136,134,231,177,187,230,142,146,232,161,140,229, +155,160,228,184,186,228,186,164,230,152,147,230,156,128,229,144,142,233,159,179, +228,185,144,228,184,141,232,131,189,233,128,154,232,191,135,232,161,140,228,184, +154,231,167,145,230,138,128,229,143,175,232,131,189,232,174,190,229,164,135,229, +144,136,228,189,156,229,164,167,229,174,182,231,164,190,228,188,154,231,160,148, +231,169,182,228,184,147,228,184,154,229,133,168,233,131,168,233,161,185,231,155, +174,232,191,153,233,135,140,232,191,152,230,152,175,229,188,128,229,167,139,230, +131,133,229,134,181,231,148,181,232,132,145,230,150,135,228,187,182,229,147,129, +231,137,140,229,184,174,229,138,169,230,150,135,229,140,150,232,181,132,230,186, +144,229,164,167,229,173,166,229,173,166,228,185,160,229,156,176,229,157,128,230, +181,143,232,167,136,230,138,149,232,181,132,229,183,165,231,168,139,232,166,129, +230,177,130,230,128,142,228,185,136,230,151,182,229,128,153,229,138,159,232,131, +189,228,184,187,232,166,129,231,155,174,229,137,141,232,181,132,232,174,175,229, +159,142,229,184,130,230,150,185,230,179,149,231,148,181,229,189,177,230,139,155, +232,129,152,229,163,176,230,152,142,228,187,187,228,189,149,229,129,165,229,186, +183,230,149,176,230,141,174,231,190,142,229,155,189,230,177,189,232,189,166,228, +187,139,231,187,141,228,189,134,230,152,175,228,186,164,230,181,129,231,148,159, +228,186,167,230,137,128,228,187,165,231,148,181,232,175,157,230,152,190,231,164, +186,228,184,128,228,186,155,229,141,149,228,189,141,228,186,186,229,145,152,229, +136,134,230,158,144,229,156,176,229,155,190,230,151,133,230,184,184,229,183,165, +229,133,183,229,173,166,231,148,159,231,179,187,229,136,151,231,189,145,229,143, +139,229,184,150,229,173,144,229,175,134,231,160,129,233,162,145,233,129,147,230, +142,167,229,136,182,229,156,176,229,140,186,229,159,186,230,156,172,229,133,168, +229,155,189,231,189,145,228,184,138,233,135,141,232,166,129,231,172,172,228,186, +140,229,150,156,230,172,162,232,191,155,229,133,165,229,143,139,230,131,133,232, +191,153,228,186,155,232,128,131,232,175,149,229,143,145,231,142,176,229,159,185, +232,174,173,228,187,165,228,184,138,230,148,191,229,186,156,230,136,144,228,184, +186,231,142,175,229,162,131,233,166,153,230,184,175,229,144,140,230,151,182,229, +168,177,228,185,144,229,143,145,233,128,129,228,184,128,229,174,154,229,188,128, +229,143,145,228,189,156,229,147,129,230,160,135,229,135,134,230,172,162,232,191, +142,232,167,163,229,134,179,229,156,176,230,150,185,228,184,128,228,184,139,228, +187,165,229,143,138,232,180,163,228,187,187,230,136,150,232,128,133,229,174,162, +230,136,183,228,187,163,232,161,168,231,167,175,229,136,134,229,165,179,228,186, +186,230,149,176,231,160,129,233,148,128,229,148,174,229,135,186,231,142,176,231, +166,187,231,186,191,229,186,148,231,148,168,229,136,151,232,161,168,228,184,141, +229,144,140,231,188,150,232,190,145,231,187,159,232,174,161,230,159,165,232,175, +162,228,184,141,232,166,129,230,156,137,229,133,179,230,156,186,230,158,132,229, +190,136,229,164,154,230,146,173,230,148,190,231,187,132,231,187,135,230,148,191, +231,173,150,231,155,180,230,142,165,232,131,189,229,138,155,230,157,165,230,186, +144,230,153,130,233,150,147,231,156,139,229,136,176,231,131,173,233,151,168,229, +133,179,233,148,174,228,184,147,229,140,186,233,157,158,229,184,184,232,139,177, +232,175,173,231,153,190,229,186,166,229,184,140,230,156,155,231,190,142,229,165, +179,230,175,148,232,190,131,231,159,165,232,175,134,232,167,132,229,174,154,229, +187,186,232,174,174,233,131,168,233,151,168,230,132,143,232,167,129,231,178,190, +229,189,169,230,151,165,230,156,172,230,143,144,233,171,152,229,143,145,232,168, +128,230,150,185,233,157,162,229,159,186,233,135,145,229,164,132,231,144,134,230, +157,131,233,153,144,229,189,177,231,137,135,233,147,182,232,161,140,232,191,152, +230,156,137,229,136,134,228,186,171,231,137,169,229,147,129,231,187,143,232,144, +165,230,183,187,229,138,160,228,184,147,229,174,182,232,191,153,231,167,141,232, +175,157,233,162,152,232,181,183,230,157,165,228,184,154,229,138,161,229,133,172, +229,145,138,232,174,176,229,189,149,231,174,128,228,187,139,232,180,168,233,135, +143,231,148,183,228,186,186,229,189,177,229,147,141,229,188,149,231,148,168,230, +138,165,229,145,138,233,131,168,229,136,134,229,191,171,233,128,159,229,146,168, +232,175,162,230,151,182,229,176,154,230,179,168,230,132,143,231,148,179,232,175, +183,229,173,166,230,160,161,229,186,148,232,175,165,229,142,134,229,143,178,229, +143,170,230,152,175,232,191,148,229,155,158,232,180,173,228,185,176,229,144,141, +231,167,176,228,184,186,228,186,134,230,136,144,229,138,159,232,175,180,230,152, +142,228,190,155,229,186,148,229,173,169,229,173,144,228,184,147,233,162,152,231, +168,139,229,186,143,228,184,128,232,136,172,230,156,131,229,147,161,229,143,170, +230,156,137,229,133,182,229,174,131,228,191,157,230,138,164,232,128,140,228,184, +148,228,187,138,229,164,169,231,170,151,229,143,163,229,138,168,230,128,129,231, +138,182,230,128,129,231,137,185,229,136,171,232,174,164,228,184,186,229,191,133, +233,161,187,230,155,180,230,150,176,229,176,143,232,175,180,230,136,145,229,128, +145,228,189,156,228,184,186,229,170,146,228,189,147,229,140,133,230,139,172,233, +130,163,228,185,136,228,184,128,230,160,183,229,155,189,229,134,133,230,152,175, +229,144,166,230,160,185,230,141,174,231,148,181,232,167,134,229,173,166,233,153, +162,229,133,183,230,156,137,232,191,135,231,168,139,231,148,177,228,186,142,228, +186,186,230,137,141,229,135,186,230,157,165,228,184,141,232,191,135,230,173,163, +229,156,168,230,152,142,230,152,159,230,149,133,228,186,139,229,133,179,231,179, +187,230,160,135,233,162,152,229,149,134,229,138,161,232,190,147,229,133,165,228, +184,128,231,155,180,229,159,186,231,161,128,230,149,153,229,173,166,228,186,134, +232,167,163,229,187,186,231,173,145,231,187,147,230,158,156,229,133,168,231,144, +131,233,128,154,231,159,165,232,174,161,229,136,146,229,175,185,228,186,142,232, +137,186,230,156,175,231,155,184,229,134,140,229,143,145,231,148,159,231,156,159, +231,154,132,229,187,186,231,171,139,231,173,137,231,186,167,231,177,187,229,158, +139,231,187,143,233,170,140,229,174,158,231,142,176,229,136,182,228,189,156,230, +157,165,232,135,170,230,160,135,231,173,190,228,187,165,228,184,139,229,142,159, +229,136,155,230,151,160,230,179,149,229,133,182,228,184,173,229,128,139,228,186, +186,228,184,128,229,136,135,230,140,135,229,141,151,229,133,179,233,151,173,233, +155,134,229,155,162,231,172,172,228,184,137,229,133,179,230,179,168,229,155,160, +230,173,164,231,133,167,231,137,135,230,183,177,229,156,179,229,149,134,228,184, +154,229,185,191,229,183,158,230,151,165,230,156,159,233,171,152,231,186,167,230, +156,128,232,191,145,231,187,188,229,144,136,232,161,168,231,164,186,228,184,147, +232,190,145,232,161,140,228,184,186,228,186,164,233,128,154,232,175,132,228,187, +183,232,167,137,229,190,151,231,178,190,229,141,142,229,174,182,229,186,173,229, +174,140,230,136,144,230,132,159,232,167,137,229,174,137,232,163,133,229,190,151, +229,136,176,233,130,174,228,187,182,229,136,182,229,186,166,233,163,159,229,147, +129,232,153,189,231,132,182,232,189,172,232,189,189,230,138,165,228,187,183,232, +174,176,232,128,133,230,150,185,230,161,136,232,161,140,230,148,191,228,186,186, +230,176,145,231,148,168,229,147,129,228,184,156,232,165,191,230,143,144,229,135, +186,233,133,146,229,186,151,231,132,182,229,144,142,228,187,152,230,172,190,231, +131,173,231,130,185,228,187,165,229,137,141,229,174,140,229,133,168,229,143,145, +229,184,150,232,174,190,231,189,174,233,162,134,229,175,188,229,183,165,228,184, +154,229,140,187,233,153,162,231,156,139,231,156,139,231,187,143,229,133,184,229, +142,159,229,155,160,229,185,179,229,143,176,229,144,132,231,167,141,229,162,158, +229,138,160,230,157,144,230,150,153,230,150,176,229,162,158,228,185,139,229,144, +142,232,129,140,228,184,154,230,149,136,230,158,156,228,187,138,229,185,180,232, +174,186,230,150,135,230,136,145,229,155,189,229,145,138,232,175,137,231,137,136, +228,184,187,228,191,174,230,148,185,229,143,130,228,184,142,230,137,147,229,141, +176,229,191,171,228,185,144,230,156,186,230,162,176,232,167,130,231,130,185,229, +173,152,229,156,168,231,178,190,231,165,158,232,142,183,229,190,151,229,136,169, +231,148,168,231,187,167,231,187,173,228,189,160,228,187,172,232,191,153,228,185, +136,230,168,161,229,188,143,232,175,173,232,168,128,232,131,189,229,164,159,233, +155,133,232,153,142,230,147,141,228,189,156,233,163,142,230,160,188,228,184,128, +232,181,183,231,167,145,229,173,166,228,189,147,232,130,178,231,159,173,228,191, +161,230,157,161,228,187,182,230,178,187,231,150,151,232,191,144,229,138,168,228, +186,167,228,184,154,228,188,154,232,174,174,229,175,188,232,136,170,229,133,136, +231,148,159,232,129,148,231,155,159,229,143,175,230,152,175,229,149,143,233,161, +140,231,187,147,230,158,132,228,189,156,231,148,168,232,176,131,230,159,165,232, +179,135,230,150,153,232,135,170,229,138,168,232,180,159,232,180,163,229,134,156, +228,184,154,232,174,191,233,151,174,229,174,158,230,150,189,230,142,165,229,143, +151,232,174,168,232,174,186,233,130,163,228,184,170,229,143,141,233,166,136,229, +138,160,229,188,186,229,165,179,230,128,167,232,140,131,229,155,180,230,156,141, +229,139,153,228,188,145,233,151,178,228,187,138,230,151,165,229,174,162,230,156, +141,232,167,128,231,156,139,229,143,130,229,138,160,231,154,132,232,175,157,228, +184,128,231,130,185,228,191,157,232,175,129,229,155,190,228,185,166,230,156,137, +230,149,136,230,181,139,232,175,149,231,167,187,229,138,168,230,137,141,232,131, +189,229,134,179,229,174,154,232,130,161,231,165,168,228,184,141,230,150,173,233, +156,128,230,177,130,228,184,141,229,190,151,229,138,158,230,179,149,228,185,139, +233,151,180,233,135,135,231,148,168,232,144,165,233,148,128,230,138,149,232,175, +137,231,155,174,230,160,135,231,136,177,230,131,133,230,145,132,229,189,177,230, +156,137,228,186,155,232,164,135,232,163,189,230,150,135,229,173,166,230,156,186, +228,188,154,230,149,176,229,173,151,232,163,133,228,191,174,232,180,173,231,137, +169,229,134,156,230,157,145,229,133,168,233,157,162,231,178,190,229,147,129,229, +133,182,229,174,158,228,186,139,230,131,133,230,176,180,229,185,179,230,143,144, +231,164,186,228,184,138,229,184,130,232,176,162,232,176,162,230,153,174,233,128, +154,230,149,153,229,184,136,228,184,138,228,188,160,231,177,187,229,136,171,230, +173,140,230,155,178,230,139,165,230,156,137,229,136,155,230,150,176,233,133,141, +228,187,182,229,143,170,232,166,129,230,151,182,228,187,163,232,179,135,232,168, +138,232,190,190,229,136,176,228,186,186,231,148,159,232,174,162,233,152,133,232, +128,129,229,184,136,229,177,149,231,164,186,229,191,131,231,144,134,232,180,180, +229,173,144,231,182,178,231,171,153,228,184,187,233,161,140,232,135,170,231,132, +182,231,186,167,229,136,171,231,174,128,229,141,149,230,148,185,233,157,169,233, +130,163,228,186,155,230,157,165,232,175,180,230,137,147,229,188,128,228,187,163, +231,160,129,229,136,160,233,153,164,232,175,129,229,136,184,232,138,130,231,155, +174,233,135,141,231,130,185,230,172,161,230,149,184,229,164,154,229,176,145,232, +167,132,229,136,146,232,181,132,233,135,145,230,137,190,229,136,176,228,187,165, +229,144,142,229,164,167,229,133,168,228,184,187,233,161,181,230,156,128,228,189, +179,229,155,158,231,173,148,229,164,169,228,184,139,228,191,157,233,154,156,231, +142,176,228,187,163,230,163,128,230,159,165,230,138,149,231,165,168,229,176,143, +230,151,182,230,178,146,230,156,137,230,173,163,229,184,184,231,148,154,232,135, +179,228,187,163,231,144,134,231,155,174,229,189,149,229,133,172,229,188,128,229, +164,141,229,136,182,233,135,145,232,158,141,229,185,184,231,166,143,231,137,136, +230,156,172,229,189,162,230,136,144,229,135,134,229,164,135,232,161,140,230,131, +133,229,155,158,229,136,176,230,128,157,230,131,179,230,128,142,230,160,183,229, +141,143,232,174,174,232,174,164,232,175,129,230,156,128,229,165,189,228,186,167, +231,148,159,230,140,137,231,133,167,230,156,141,232,163,133,229,185,191,228,184, +156,229,138,168,230,188,171,233,135,135,232,180,173,230,150,176,230,137,139,231, +187,132,229,155,190,233,157,162,230,157,191,229,143,130,232,128,131,230,148,191, +230,178,187,229,174,185,230,152,147,229,164,169,229,156,176,229,138,170,229,138, +155,228,186,186,228,187,172,229,141,135,231,186,167,233,128,159,229,186,166,228, +186,186,231,137,169,232,176,131,230,149,180,230,181,129,232,161,140,233,128,160, +230,136,144,230,150,135,229,173,151,233,159,169,229,155,189,232,180,184,230,152, +147,229,188,128,229,177,149,231,155,184,233,151,156,232,161,168,231,142,176,229, +189,177,232,167,134,229,166,130,230,173,164,231,190,142,229,174,185,229,164,167, +229,176,143,230,138,165,233,129,147,230,157,161,230,172,190,229,191,131,230,131, +133,232,174,184,229,164,154,230,179,149,232,167,132,229,174,182,229,177,133,228, +185,166,229,186,151,232,191,158,230,142,165,231,171,139,229,141,179,228,184,190, +230,138,165,230,138,128,229,183,167,229,165,165,232,191,144,231,153,187,229,133, +165,228,187,165,230,157,165,231,144,134,232,174,186,228,186,139,228,187,182,232, +135,170,231,148,177,228,184,173,229,141,142,229,138,158,229,133,172,229,166,136, +229,166,136,231,156,159,230,173,163,228,184,141,233,148,153,229,133,168,230,150, +135,229,144,136,229,144,140,228,187,183,229,128,188,229,136,171,228,186,186,231, +155,145,231,157,163,229,133,183,228,189,147,228,184,150,231,186,170,229,155,162, +233,152,159,229,136,155,228,184,154,230,137,191,230,139,133,229,162,158,233,149, +191,230,156,137,228,186,186,228,191,157,230,140,129,229,149,134,229,174,182,231, +187,180,228,191,174,229,143,176,230,185,190,229,183,166,229,143,179,232,130,161, +228,187,189,231,173,148,230,161,136,229,174,158,233,153,133,231,148,181,228,191, +161,231,187,143,231,144,134,231,148,159,229,145,189,229,174,163,228,188,160,228, +187,187,229,138,161,230,173,163,229,188,143,231,137,185,232,137,178,228,184,139, +230,157,165,229,141,143,228,188,154,229,143,170,232,131,189,229,189,147,231,132, +182,233,135,141,230,150,176,229,133,167,229,174,185,230,140,135,229,175,188,232, +191,144,232,161,140,230,151,165,229,191,151,232,179,163,229,174,182,232,182,133, +232,191,135,229,156,159,229,156,176,230,181,153,230,177,159,230,148,175,228,187, +152,230,142,168,229,135,186,231,171,153,233,149,191,230,157,173,229,183,158,230, +137,167,232,161,140,229,136,182,233,128,160,228,185,139,228,184,128,230,142,168, +229,185,191,231,142,176,229,156,186,230,143,143,232,191,176,229,143,152,229,140, +150,228,188,160,231,187,159,230,173,140,230,137,139,228,191,157,233,153,169,232, +175,190,231,168,139,229,140,187,231,150,151,231,187,143,232,191,135,232,191,135, +229,142,187,228,185,139,229,137,141,230,148,182,229,133,165,229,185,180,229,186, +166,230,157,130,229,191,151,231,190,142,228,184,189,230,156,128,233,171,152,231, +153,187,233,153,134,230,156,170,230,157,165,229,138,160,229,183,165,229,133,141, +232,180,163,230,149,153,231,168,139,231,137,136,229,157,151,232,186,171,228,189, +147,233,135,141,229,186,134,229,135,186,229,148,174,230,136,144,230,156,172,229, +189,162,229,188,143,229,156,159,232,177,134,229,135,186,229,131,185,228,184,156, +230,150,185,233,130,174,231,174,177,229,141,151,228,186,172,230,177,130,232,129, +140,229,143,150,229,190,151,232,129,140,228,189,141,231,155,184,228,191,161,233, +161,181,233,157,162,229,136,134,233,146,159,231,189,145,233,161,181,231,161,174, +229,174,154,229,155,190,228,190,139,231,189,145,229,157,128,231,167,175,230,158, +129,233,148,153,232,175,175,231,155,174,231,154,132,229,174,157,232,180,157,230, +156,186,229,133,179,233,163,142,233,153,169,230,142,136,230,157,131,231,151,133, +230,175,146,229,174,160,231,137,169,233,153,164,228,186,134,232,169,149,232,171, +150,231,150,190,231,151,133,229,143,138,230,151,182,230,177,130,232,180,173,231, +171,153,231,130,185,229,132,191,231,171,165,230,175,143,229,164,169,228,184,173, +229,164,174,232,174,164,232,175,134,230,175,143,228,184,170,229,164,169,230,180, +165,229,173,151,228,189,147,229,143,176,231,129,163,231,187,180,230,138,164,230, +156,172,233,161,181,228,184,170,230,128,167,229,174,152,230,150,185,229,184,184, +232,167,129,231,155,184,230,156,186,230,136,152,231,149,165,229,186,148,229,189, +147,229,190,139,229,184,136,230,150,185,228,190,191,230,160,161,229,155,173,232, +130,161,229,184,130,230,136,191,229,177,139,230,160,143,231,155,174,229,145,152, +229,183,165,229,175,188,232,135,180,231,170,129,231,132,182,233,129,147,229,133, +183,230,156,172,231,189,145,231,187,147,229,144,136,230,161,163,230,161,136,229, +138,179,229,138,168,229,143,166,229,164,150,231,190,142,229,133,131,229,188,149, +232,181,183,230,148,185,229,143,152,231,172,172,229,155,155,228,188,154,232,174, +161,232,170,170,230,152,142,233,154,144,231,167,129,229,174,157,229,174,157,232, +167,132,232,140,131,230,182,136,232,180,185,229,133,177,229,144,140,229,191,152, +232,174,176,228,189,147,231,179,187,229,184,166,230,157,165,229,144,141,229,173, +151,231,153,188,232,161,168,229,188,128,230,148,190,229,138,160,231,155,159,229, +143,151,229,136,176,228,186,140,230,137,139,229,164,167,233,135,143,230,136,144, +228,186,186,230,149,176,233,135,143,229,133,177,228,186,171,229,140,186,229,159, +159,229,165,179,229,173,169,229,142,159,229,136,153,230,137,128,229,156,168,231, +187,147,230,157,159,233,128,154,228,191,161,232,182,133,231,186,167,233,133,141, +231,189,174,229,189,147,230,151,182,228,188,152,231,167,128,230,128,167,230,132, +159,230,136,191,228,186,167,233,129,138,230,136,178,229,135,186,229,143,163,230, +143,144,228,186,164,229,176,177,228,184,154,228,191,157,229,129,165,231,168,139, +229,186,166,229,143,130,230,149,176,228,186,139,228,184,154,230,149,180,228,184, +170,229,177,177,228,184,156,230,131,133,230,132,159,231,137,185,230,174,138,229, +136,134,233,161,158,230,144,156,229,176,139,229,177,158,228,186,142,233,151,168, +230,136,183,232,180,162,229,138,161,229,163,176,233,159,179,229,143,138,229,133, +182,232,180,162,231,187,143,229,157,154,230,140,129,229,185,178,233,131,168,230, +136,144,231,171,139,229,136,169,231,155,138,232,128,131,232,153,145,230,136,144, +233,131,189,229,140,133,232,163,133,231,148,168,230,136,182,230,175,148,232,181, +155,230,150,135,230,152,142,230,139,155,229,149,134,229,174,140,230,149,180,231, +156,159,230,152,175,231,156,188,231,157,155,228,188,153,228,188,180,229,168,129, +230,156,155,233,162,134,229,159,159,229,141,171,231,148,159,228,188,152,230,131, +160,232,171,150,229,163,135,229,133,172,229,133,177,232,137,175,229,165,189,229, +133,133,229,136,134,231,172,166,229,144,136,233,153,132,228,187,182,231,137,185, +231,130,185,228,184,141,229,143,175,232,139,177,230,150,135,232,181,132,228,186, +167,230,160,185,230,156,172,230,152,142,230,152,190,229,175,134,231,162,188,229, +133,172,228,188,151,230,176,145,230,151,143,230,155,180,229,138,160,228,186,171, +229,143,151,229,144,140,229,173,166,229,144,175,229,138,168,233,128,130,229,144, +136,229,142,159,230,157,165,233,151,174,231,173,148,230,156,172,230,150,135,231, +190,142,233,163,159,231,187,191,232,137,178,231,168,179,229,174,154,231,187,136, +228,186,142,231,148,159,231,137,169,228,190,155,230,177,130,230,144,156,231,139, +144,229,138,155,233,135,143,228,184,165,233,135,141,230,176,184,232,191,156,229, +134,153,231,156,159,230,156,137,233,153,144,231,171,158,228,186,137,229,175,185, +232,177,161,232,180,185,231,148,168,228,184,141,229,165,189,231,187,157,229,175, +185,229,141,129,229,136,134,228,191,131,232,191,155,231,130,185,232,175,132,229, +189,177,233,159,179,228,188,152,229,138,191,228,184,141,229,176,145,230,172,163, +232,181,143,229,185,182,228,184,148,230,156,137,231,130,185,230,150,185,229,144, +145,229,133,168,230,150,176,228,191,161,231,148,168,232,174,190,230,150,189,229, +189,162,232,177,161,232,181,132,230,160,188,231,170,129,231,160,180,233,154,143, +231,157,128,233,135,141,229,164,167,228,186,142,230,152,175,230,175,149,228,184, +154,230,153,186,232,131,189,229,140,150,229,183,165,229,174,140,231,190,142,229, +149,134,229,159,142,231,187,159,228,184,128,229,135,186,231,137,136,230,137,147, +233,128,160,231,148,162,229,147,129,230,166,130,229,134,181,231,148,168,228,186, +142,228,191,157,231,149,153,229,155,160,231,180,160,228,184,173,229,156,139,229, +173,152,229,130,168,232,180,180,229,155,190,230,156,128,230,132,155,233,149,191, +230,156,159,229,143,163,228,187,183,231,144,134,232,180,162,229,159,186,229,156, +176,229,174,137,230,142,146,230,173,166,230,177,137,233,135,140,233,157,162,229, +136,155,229,187,186,229,164,169,231,169,186,233,166,150,229,133,136,229,174,140, +229,150,132,233,169,177,229,138,168,228,184,139,233,157,162,228,184,141,229,134, +141,232,175,154,228,191,161,230,132,143,228,185,137,233,152,179,229,133,137,232, +139,177,229,155,189,230,188,130,228,186,174,229,134,155,228,186,139,231,142,169, +229,174,182,231,190,164,228,188,151,229,134,156,230,176,145,229,141,179,229,143, +175,229,144,141,231,168,177,229,174,182,229,133,183,229,138,168,231,148,187,230, +131,179,229,136,176,230,179,168,230,152,142,229,176,143,229,173,166,230,128,167, +232,131,189,232,128,131,231,160,148,231,161,172,228,187,182,232,167,130,231,156, +139,230,184,133,230,165,154,230,144,158,231,172,145,233,166,150,233,160,129,233, +187,132,233,135,145,233,128,130,231,148,168,230,177,159,232,139,143,231,156,159, +229,174,158,228,184,187,231,174,161,233,152,182,230,174,181,232,168,187,229,134, +138,231,191,187,232,175,145,230,157,131,229,136,169,229,129,154,229,165,189,228, +188,188,228,185,142,233,128,154,232,174,175,230,150,189,229,183,165,231,139,128, +230,133,139,228,185,159,232,174,184,231,142,175,228,191,157,229,159,185,229,133, +187,230,166,130,229,191,181,229,164,167,229,158,139,230,156,186,231,165,168,231, +144,134,232,167,163,229,140,191,229,144,141,99,117,97,110,100,111,101,110,118, +105,97,114,109,97,100,114,105,100,98,117,115,99,97,114,105,110,105,99,105,111, +116,105,101,109,112,111,112,111,114,113,117,101,99,117,101,110,116,97,101,115, +116,97,100,111,112,117,101,100,101,110,106,117,101,103,111,115,99,111,110,116, +114,97,101,115,116,195,161,110,110,111,109,98,114,101,116,105,101,110,101,110, +112,101,114,102,105,108,109,97,110,101,114,97,97,109,105,103,111,115,99,105,117, +100,97,100,99,101,110,116,114,111,97,117,110,113,117,101,112,117,101,100,101,115 +,100,101,110,116,114,111,112,114,105,109,101,114,112,114,101,99,105,111,115,101, +103,195,186,110,98,117,101,110,111,115,118,111,108,118,101,114,112,117,110,116, +111,115,115,101,109,97,110,97,104,97,98,195,173,97,97,103,111,115,116,111,110, +117,101,118,111,115,117,110,105,100,111,115,99,97,114,108,111,115,101,113,117, +105,112,111,110,105,195,177,111,115,109,117,99,104,111,115,97,108,103,117,110,97 +,99,111,114,114,101,111,105,109,97,103,101,110,112,97,114,116,105,114,97,114,114 +,105,98,97,109,97,114,195,173,97,104,111,109,98,114,101,101,109,112,108,101,111, +118,101,114,100,97,100,99,97,109,98,105,111,109,117,99,104,97,115,102,117,101, +114,111,110,112,97,115,97,100,111,108,195,173,110,101,97,112,97,114,101,99,101, +110,117,101,118,97,115,99,117,114,115,111,115,101,115,116,97,98,97,113,117,105, +101,114,111,108,105,98,114,111,115,99,117,97,110,116,111,97,99,99,101,115,111, +109,105,103,117,101,108,118,97,114,105,111,115,99,117,97,116,114,111,116,105,101 +,110,101,115,103,114,117,112,111,115,115,101,114,195,161,110,101,117,114,111,112 +,97,109,101,100,105,111,115,102,114,101,110,116,101,97,99,101,114,99,97,100,101, +109,195,161,115,111,102,101,114,116,97,99,111,99,104,101,115,109,111,100,101,108 +,111,105,116,97,108,105,97,108,101,116,114,97,115,97,108,103,195,186,110,99,111, +109,112,114,97,99,117,97,108,101,115,101,120,105,115,116,101,99,117,101,114,112, +111,115,105,101,110,100,111,112,114,101,110,115,97,108,108,101,103,97,114,118, +105,97,106,101,115,100,105,110,101,114,111,109,117,114,99,105,97,112,111,100,114 +,195,161,112,117,101,115,116,111,100,105,97,114,105,111,112,117,101,98,108,111, +113,117,105,101,114,101,109,97,110,117,101,108,112,114,111,112,105,111,99,114, +105,115,105,115,99,105,101,114,116,111,115,101,103,117,114,111,109,117,101,114, +116,101,102,117,101,110,116,101,99,101,114,114,97,114,103,114,97,110,100,101,101 +,102,101,99,116,111,112,97,114,116,101,115,109,101,100,105,100,97,112,114,111, +112,105,97,111,102,114,101,99,101,116,105,101,114,114,97,101,45,109,97,105,108, +118,97,114,105,97,115,102,111,114,109,97,115,102,117,116,117,114,111,111,98,106, +101,116,111,115,101,103,117,105,114,114,105,101,115,103,111,110,111,114,109,97, +115,109,105,115,109,111,115,195,186,110,105,99,111,99,97,109,105,110,111,115,105 +,116,105,111,115,114,97,122,195,179,110,100,101,98,105,100,111,112,114,117,101, +98,97,116,111,108,101,100,111,116,101,110,195,173,97,106,101,115,195,186,115,101 +,115,112,101,114,111,99,111,99,105,110,97,111,114,105,103,101,110,116,105,101, +110,100,97,99,105,101,110,116,111,99,195,161,100,105,122,104,97,98,108,97,114, +115,101,114,195,173,97,108,97,116,105,110,97,102,117,101,114,122,97,101,115,116, +105,108,111,103,117,101,114,114,97,101,110,116,114,97,114,195,169,120,105,116, +111,108,195,179,112,101,122,97,103,101,110,100,97,118,195,173,100,101,111,101, +118,105,116,97,114,112,97,103,105,110,97,109,101,116,114,111,115,106,97,118,105, +101,114,112,97,100,114,101,115,102,195,161,99,105,108,99,97,98,101,122,97,195, +161,114,101,97,115,115,97,108,105,100,97,101,110,118,195,173,111,106,97,112,195, +179,110,97,98,117,115,111,115,98,105,101,110,101,115,116,101,120,116,111,115,108 +,108,101,118,97,114,112,117,101,100,97,110,102,117,101,114,116,101,99,111,109, +195,186,110,99,108,97,115,101,115,104,117,109,97,110,111,116,101,110,105,100,111 +,98,105,108,98,97,111,117,110,105,100,97,100,101,115,116,195,161,115,101,100,105 +,116,97,114,99,114,101,97,100,111,208,180,208,187,209,143,209,135,209,130,208, +190,208,186,208,176,208,186,208,184,208,187,208,184,209,141,209,130,208,190,208, +178,209,129,208,181,208,181,208,179,208,190,208,191,209,128,208,184,209,130,208, +176,208,186,208,181,209,137,208,181,209,131,208,182,208,181,208,154,208,176,208, +186,208,177,208,181,208,183,208,177,209,139,208,187,208,190,208,189,208,184,208, +146,209,129,208,181,208,191,208,190,208,180,208,173,209,130,208,190,209,130,208, +190,208,188,209,135,208,181,208,188,208,189,208,181,209,130,208,187,208,181,209, +130,209,128,208,176,208,183,208,190,208,189,208,176,208,179,208,180,208,181,208, +188,208,189,208,181,208,148,208,187,209,143,208,159,209,128,208,184,208,189,208, +176,209,129,208,189,208,184,209,133,209,130,208,181,208,188,208,186,209,130,208, +190,208,179,208,190,208,180,208,178,208,190,209,130,209,130,208,176,208,188,208, +161,208,168,208,144,208,188,208,176,209,143,208,167,209,130,208,190,208,178,208, +176,209,129,208,178,208,176,208,188,208,181,208,188,209,131,208,162,208,176,208, +186,208,180,208,178,208,176,208,189,208,176,208,188,209,141,209,130,208,184,209, +141,209,130,209,131,208,146,208,176,208,188,209,130,208,181,209,133,208,191,209, +128,208,190,209,130,209,131,209,130,208,189,208,176,208,180,208,180,208,189,209, +143,208,146,208,190,209,130,209,130,209,128,208,184,208,189,208,181,208,185,208, +146,208,176,209,129,208,189,208,184,208,188,209,129,208,176,208,188,209,130,208, +190,209,130,209,128,209,131,208,177,208,158,208,189,208,184,208,188,208,184,209, +128,208,189,208,181,208,181,208,158,208,158,208,158,208,187,208,184,209,134,209, +141,209,130,208,176,208,158,208,189,208,176,208,189,208,181,208,188,208,180,208, +190,208,188,208,188,208,190,208,185,208,180,208,178,208,181,208,190,208,189,208, +190,209,129,209,131,208,180,224,164,149,224,165,135,224,164,185,224,165,136,224, +164,149,224,165,128,224,164,184,224,165,135,224,164,149,224,164,190,224,164,149, +224,165,139,224,164,148,224,164,176,224,164,170,224,164,176,224,164,168,224,165, +135,224,164,143,224,164,149,224,164,149,224,164,191,224,164,173,224,165,128,224, +164,135,224,164,184,224,164,149,224,164,176,224,164,164,224,165,139,224,164,185, +224,165,139,224,164,134,224,164,170,224,164,185,224,165,128,224,164,175,224,164, +185,224,164,175,224,164,190,224,164,164,224,164,149,224,164,165,224,164,190,106, +97,103,114,97,110,224,164,134,224,164,156,224,164,156,224,165,139,224,164,133, +224,164,172,224,164,166,224,165,139,224,164,151,224,164,136,224,164,156,224,164, +190,224,164,151,224,164,143,224,164,185,224,164,174,224,164,135,224,164,168,224, +164,181,224,164,185,224,164,175,224,165,135,224,164,165,224,165,135,224,164,165, +224,165,128,224,164,152,224,164,176,224,164,156,224,164,172,224,164,166,224,165, +128,224,164,149,224,164,136,224,164,156,224,165,128,224,164,181,224,165,135,224, +164,168,224,164,136,224,164,168,224,164,143,224,164,185,224,164,176,224,164,137, +224,164,184,224,164,174,224,165,135,224,164,149,224,164,174,224,164,181,224,165, +139,224,164,178,224,165,135,224,164,184,224,164,172,224,164,174,224,164,136,224, +164,166,224,165,135,224,164,147,224,164,176,224,164,134,224,164,174,224,164,172, +224,164,184,224,164,173,224,164,176,224,164,172,224,164,168,224,164,154,224,164, +178,224,164,174,224,164,168,224,164,134,224,164,151,224,164,184,224,165,128,224, +164,178,224,165,128,216,185,217,132,217,137,216,165,217,132,217,137,217,135,216, +176,216,167,216,162,216,174,216,177,216,185,216,175,216,175,216,167,217,132,217, +137,217,135,216,176,217,135,216,181,217,136,216,177,216,186,217,138,216,177,217, +131,216,167,217,134,217,136,217,132,216,167,216,168,217,138,217,134,216,185,216, +177,216,182,216,176,217,132,217,131,217,135,217,134,216,167,217,138,217,136,217, +133,217,130,216,167,217,132,216,185,217,132,217,138,216,167,217,134,216,167,217, +132,217,131,217,134,216,173,216,170,217,137,217,130,216,168,217,132,217,136,216, +173,216,169,216,167,216,174,216,177,217,129,217,130,216,183,216,185,216,168,216, +175,216,177,217,131,217,134,216,165,216,176,216,167,217,131,217,133,216,167,216, +167,216,173,216,175,216,165,217,132,216,167,217,129,217,138,217,135,216,168,216, +185,216,182,217,131,217,138,217,129,216,168,216,173,216,171,217,136,217,133,217, +134,217,136,217,135,217,136,216,163,217,134,216,167,216,172,216,175,216,167,217, +132,217,135,216,167,216,179,217,132,217,133,216,185,217,134,216,175,217,132,217, +138,216,179,216,185,216,168,216,177,216,181,217,132,217,137,217,133,217,134,216, +176,216,168,217,135,216,167,216,163,217,134,217,135,217,133,216,171,217,132,217, +131,217,134,216,170,216,167,217,132,216,167,216,173,217,138,216,171,217,133,216, +181,216,177,216,180,216,177,216,173,216,173,217,136,217,132,217,136,217,129,217, +138,216,167,216,176,216,167,217,132,217,131,217,132,217,133,216,177,216,169,216, +167,217,134,216,170,216,167,217,132,217,129,216,163,216,168,217,136,216,174,216, +167,216,181,216,163,217,134,216,170,216,167,217,134,217,135,216,167,217,132,217, +138,216,185,216,182,217,136,217,136,217,130,216,175,216,167,216,168,217,134,216, +174,217,138,216,177,216,168,217,134,216,170,217,132,217,131,217,133,216,180,216, +167,216,161,217,136,217,135,217,138,216,167,216,168,217,136,217,130,216,181,216, +181,217,136,217,133,216,167,216,177,217,130,217,133,216,163,216,173,216,175,217, +134,216,173,217,134,216,185,216,175,217,133,216,177,216,163,217,138,216,167,216, +173,216,169,217,131,216,170,216,168,216,175,217,136,217,134,217,138,216,172,216, +168,217,133,217,134,217,135,216,170,216,173,216,170,216,172,217,135,216,169,216, +179,217,134,216,169,217,138,216,170,217,133,217,131,216,177,216,169,216,186,216, +178,216,169,217,134,217,129,216,179,216,168,217,138,216,170,217,132,217,132,217, +135,217,132,217,134,216,167,216,170,217,132,217,131,217,130,217,132,216,168,217, +132,217,133,216,167,216,185,217,134,217,135,216,163,217,136,217,132,216,180,217, +138,216,161,217,134,217,136,216,177,216,163,217,133,216,167,217,129,217,138,217, +131,216,168,217,131,217,132,216,176,216,167,216,170,216,177,216,170,216,168,216, +168,216,163,217,134,217,135,217,133,216,179,216,167,217,134,217,131,216,168,217, +138,216,185,217,129,217,130,216,175,216,173,216,179,217,134,217,132,217,135,217, +133,216,180,216,185,216,177,216,163,217,135,217,132,216,180,217,135,216,177,217, +130,216,183,216,177,216,183,217,132,216,168,112,114,111,102,105,108,101,115,101, +114,118,105,99,101,100,101,102,97,117,108,116,104,105,109,115,101,108,102,100, +101,116,97,105,108,115,99,111,110,116,101,110,116,115,117,112,112,111,114,116, +115,116,97,114,116,101,100,109,101,115,115,97,103,101,115,117,99,99,101,115,115, +102,97,115,104,105,111,110,60,116,105,116,108,101,62,99,111,117,110,116,114,121, +97,99,99,111,117,110,116,99,114,101,97,116,101,100,115,116,111,114,105,101,115, +114,101,115,117,108,116,115,114,117,110,110,105,110,103,112,114,111,99,101,115, +115,119,114,105,116,105,110,103,111,98,106,101,99,116,115,118,105,115,105,98,108 +,101,119,101,108,99,111,109,101,97,114,116,105,99,108,101,117,110,107,110,111, +119,110,110,101,116,119,111,114,107,99,111,109,112,97,110,121,100,121,110,97,109 +,105,99,98,114,111,119,115,101,114,112,114,105,118,97,99,121,112,114,111,98,108, +101,109,83,101,114,118,105,99,101,114,101,115,112,101,99,116,100,105,115,112,108 +,97,121,114,101,113,117,101,115,116,114,101,115,101,114,118,101,119,101,98,115, +105,116,101,104,105,115,116,111,114,121,102,114,105,101,110,100,115,111,112,116, +105,111,110,115,119,111,114,107,105,110,103,118,101,114,115,105,111,110,109,105, +108,108,105,111,110,99,104,97,110,110,101,108,119,105,110,100,111,119,46,97,100, +100,114,101,115,115,118,105,115,105,116,101,100,119,101,97,116,104,101,114,99, +111,114,114,101,99,116,112,114,111,100,117,99,116,101,100,105,114,101,99,116,102 +,111,114,119,97,114,100,121,111,117,32,99,97,110,114,101,109,111,118,101,100,115 +,117,98,106,101,99,116,99,111,110,116,114,111,108,97,114,99,104,105,118,101,99, +117,114,114,101,110,116,114,101,97,100,105,110,103,108,105,98,114,97,114,121,108 +,105,109,105,116,101,100,109,97,110,97,103,101,114,102,117,114,116,104,101,114, +115,117,109,109,97,114,121,109,97,99,104,105,110,101,109,105,110,117,116,101,115 +,112,114,105,118,97,116,101,99,111,110,116,101,120,116,112,114,111,103,114,97, +109,115,111,99,105,101,116,121,110,117,109,98,101,114,115,119,114,105,116,116, +101,110,101,110,97,98,108,101,100,116,114,105,103,103,101,114,115,111,117,114,99 +,101,115,108,111,97,100,105,110,103,101,108,101,109,101,110,116,112,97,114,116, +110,101,114,102,105,110,97,108,108,121,112,101,114,102,101,99,116,109,101,97,110 +,105,110,103,115,121,115,116,101,109,115,107,101,101,112,105,110,103,99,117,108, +116,117,114,101,38,113,117,111,116,59,44,106,111,117,114,110,97,108,112,114,111, +106,101,99,116,115,117,114,102,97,99,101,115,38,113,117,111,116,59,101,120,112, +105,114,101,115,114,101,118,105,101,119,115,98,97,108,97,110,99,101,69,110,103, +108,105,115,104,67,111,110,116,101,110,116,116,104,114,111,117,103,104,80,108, +101,97,115,101,32,111,112,105,110,105,111,110,99,111,110,116,97,99,116,97,118, +101,114,97,103,101,112,114,105,109,97,114,121,118,105,108,108,97,103,101,83,112, +97,110,105,115,104,103,97,108,108,101,114,121,100,101,99,108,105,110,101,109,101 +,101,116,105,110,103,109,105,115,115,105,111,110,112,111,112,117,108,97,114,113, +117,97,108,105,116,121,109,101,97,115,117,114,101,103,101,110,101,114,97,108,115 +,112,101,99,105,101,115,115,101,115,115,105,111,110,115,101,99,116,105,111,110, +119,114,105,116,101,114,115,99,111,117,110,116,101,114,105,110,105,116,105,97, +108,114,101,112,111,114,116,115,102,105,103,117,114,101,115,109,101,109,98,101, +114,115,104,111,108,100,105,110,103,100,105,115,112,117,116,101,101,97,114,108, +105,101,114,101,120,112,114,101,115,115,100,105,103,105,116,97,108,112,105,99, +116,117,114,101,65,110,111,116,104,101,114,109,97,114,114,105,101,100,116,114,97 +,102,102,105,99,108,101,97,100,105,110,103,99,104,97,110,103,101,100,99,101,110, +116,114,97,108,118,105,99,116,111,114,121,105,109,97,103,101,115,47,114,101,97, +115,111,110,115,115,116,117,100,105,101,115,102,101,97,116,117,114,101,108,105, +115,116,105,110,103,109,117,115,116,32,98,101,115,99,104,111,111,108,115,86,101, +114,115,105,111,110,117,115,117,97,108,108,121,101,112,105,115,111,100,101,112, +108,97,121,105,110,103,103,114,111,119,105,110,103,111,98,118,105,111,117,115, +111,118,101,114,108,97,121,112,114,101,115,101,110,116,97,99,116,105,111,110,115 +,60,47,117,108,62,13,10,119,114,97,112,112,101,114,97,108,114,101,97,100,121,99, +101,114,116,97,105,110,114,101,97,108,105,116,121,115,116,111,114,97,103,101,97, +110,111,116,104,101,114,100,101,115,107,116,111,112,111,102,102,101,114,101,100, +112,97,116,116,101,114,110,117,110,117,115,117,97,108,68,105,103,105,116,97,108, +99,97,112,105,116,97,108,87,101,98,115,105,116,101,102,97,105,108,117,114,101,99 +,111,110,110,101,99,116,114,101,100,117,99,101,100,65,110,100,114,111,105,100, +100,101,99,97,100,101,115,114,101,103,117,108,97,114,32,38,97,109,112,59,32,97, +110,105,109,97,108,115,114,101,108,101,97,115,101,65,117,116,111,109,97,116,103, +101,116,116,105,110,103,109,101,116,104,111,100,115,110,111,116,104,105,110,103, +80,111,112,117,108,97,114,99,97,112,116,105,111,110,108,101,116,116,101,114,115, +99,97,112,116,117,114,101,115,99,105,101,110,99,101,108,105,99,101,110,115,101, +99,104,97,110,103,101,115,69,110,103,108,97,110,100,61,49,38,97,109,112,59,72, +105,115,116,111,114,121,32,61,32,110,101,119,32,67,101,110,116,114,97,108,117, +112,100,97,116,101,100,83,112,101,99,105,97,108,78,101,116,119,111,114,107,114, +101,113,117,105,114,101,99,111,109,109,101,110,116,119,97,114,110,105,110,103,67 +,111,108,108,101,103,101,116,111,111,108,98,97,114,114,101,109,97,105,110,115,98 +,101,99,97,117,115,101,101,108,101,99,116,101,100,68,101,117,116,115,99,104,102, +105,110,97,110,99,101,119,111,114,107,101,114,115,113,117,105,99,107,108,121,98, +101,116,119,101,101,110,101,120,97,99,116,108,121,115,101,116,116,105,110,103, +100,105,115,101,97,115,101,83,111,99,105,101,116,121,119,101,97,112,111,110,115, +101,120,104,105,98,105,116,38,108,116,59,33,45,45,67,111,110,116,114,111,108,99, +108,97,115,115,101,115,99,111,118,101,114,101,100,111,117,116,108,105,110,101,97 +,116,116,97,99,107,115,100,101,118,105,99,101,115,40,119,105,110,100,111,119,112 +,117,114,112,111,115,101,116,105,116,108,101,61,34,77,111,98,105,108,101,32,107, +105,108,108,105,110,103,115,104,111,119,105,110,103,73,116,97,108,105,97,110,100 +,114,111,112,112,101,100,104,101,97,118,105,108,121,101,102,102,101,99,116,115, +45,49,39,93,41,59,10,99,111,110,102,105,114,109,67,117,114,114,101,110,116,97, +100,118,97,110,99,101,115,104,97,114,105,110,103,111,112,101,110,105,110,103,100 +,114,97,119,105,110,103,98,105,108,108,105,111,110,111,114,100,101,114,101,100, +71,101,114,109,97,110,121,114,101,108,97,116,101,100,60,47,102,111,114,109,62, +105,110,99,108,117,100,101,119,104,101,116,104,101,114,100,101,102,105,110,101, +100,83,99,105,101,110,99,101,99,97,116,97,108,111,103,65,114,116,105,99,108,101, +98,117,116,116,111,110,115,108,97,114,103,101,115,116,117,110,105,102,111,114, +109,106,111,117,114,110,101,121,115,105,100,101,98,97,114,67,104,105,99,97,103, +111,104,111,108,105,100,97,121,71,101,110,101,114,97,108,112,97,115,115,97,103, +101,44,38,113,117,111,116,59,97,110,105,109,97,116,101,102,101,101,108,105,110, +103,97,114,114,105,118,101,100,112,97,115,115,105,110,103,110,97,116,117,114,97, +108,114,111,117,103,104,108,121,46,10,10,84,104,101,32,98,117,116,32,110,111,116 +,100,101,110,115,105,116,121,66,114,105,116,97,105,110,67,104,105,110,101,115, +101,108,97,99,107,32,111,102,116,114,105,98,117,116,101,73,114,101,108,97,110, +100,34,32,100,97,116,97,45,102,97,99,116,111,114,115,114,101,99,101,105,118,101, +116,104,97,116,32,105,115,76,105,98,114,97,114,121,104,117,115,98,97,110,100,105 +,110,32,102,97,99,116,97,102,102,97,105,114,115,67,104,97,114,108,101,115,114,97 +,100,105,99,97,108,98,114,111,117,103,104,116,102,105,110,100,105,110,103,108,97 +,110,100,105,110,103,58,108,97,110,103,61,34,114,101,116,117,114,110,32,108,101, +97,100,101,114,115,112,108,97,110,110,101,100,112,114,101,109,105,117,109,112,97 +,99,107,97,103,101,65,109,101,114,105,99,97,69,100,105,116,105,111,110,93,38,113 +,117,111,116,59,77,101,115,115,97,103,101,110,101,101,100,32,116,111,118,97,108, +117,101,61,34,99,111,109,112,108,101,120,108,111,111,107,105,110,103,115,116,97, +116,105,111,110,98,101,108,105,101,118,101,115,109,97,108,108,101,114,45,109,111 +,98,105,108,101,114,101,99,111,114,100,115,119,97,110,116,32,116,111,107,105,110 +,100,32,111,102,70,105,114,101,102,111,120,121,111,117,32,97,114,101,115,105,109 +,105,108,97,114,115,116,117,100,105,101,100,109,97,120,105,109,117,109,104,101, +97,100,105,110,103,114,97,112,105,100,108,121,99,108,105,109,97,116,101,107,105, +110,103,100,111,109,101,109,101,114,103,101,100,97,109,111,117,110,116,115,102, +111,117,110,100,101,100,112,105,111,110,101,101,114,102,111,114,109,117,108,97, +100,121,110,97,115,116,121,104,111,119,32,116,111,32,83,117,112,112,111,114,116, +114,101,118,101,110,117,101,101,99,111,110,111,109,121,82,101,115,117,108,116, +115,98,114,111,116,104,101,114,115,111,108,100,105,101,114,108,97,114,103,101, +108,121,99,97,108,108,105,110,103,46,38,113,117,111,116,59,65,99,99,111,117,110, +116,69,100,119,97,114,100,32,115,101,103,109,101,110,116,82,111,98,101,114,116, +32,101,102,102,111,114,116,115,80,97,99,105,102,105,99,108,101,97,114,110,101, +100,117,112,32,119,105,116,104,104,101,105,103,104,116,58,119,101,32,104,97,118, +101,65,110,103,101,108,101,115,110,97,116,105,111,110,115,95,115,101,97,114,99, +104,97,112,112,108,105,101,100,97,99,113,117,105,114,101,109,97,115,115,105,118, +101,103,114,97,110,116,101,100,58,32,102,97,108,115,101,116,114,101,97,116,101, +100,98,105,103,103,101,115,116,98,101,110,101,102,105,116,100,114,105,118,105, +110,103,83,116,117,100,105,101,115,109,105,110,105,109,117,109,112,101,114,104, +97,112,115,109,111,114,110,105,110,103,115,101,108,108,105,110,103,105,115,32, +117,115,101,100,114,101,118,101,114,115,101,118,97,114,105,97,110,116,32,114,111 +,108,101,61,34,109,105,115,115,105,110,103,97,99,104,105,101,118,101,112,114,111 +,109,111,116,101,115,116,117,100,101,110,116,115,111,109,101,111,110,101,101,120 +,116,114,101,109,101,114,101,115,116,111,114,101,98,111,116,116,111,109,58,101, +118,111,108,118,101,100,97,108,108,32,116,104,101,115,105,116,101,109,97,112,101 +,110,103,108,105,115,104,119,97,121,32,116,111,32,32,65,117,103,117,115,116,115, +121,109,98,111,108,115,67,111,109,112,97,110,121,109,97,116,116,101,114,115,109, +117,115,105,99,97,108,97,103,97,105,110,115,116,115,101,114,118,105,110,103,125, +41,40,41,59,13,10,112,97,121,109,101,110,116,116,114,111,117,98,108,101,99,111, +110,99,101,112,116,99,111,109,112,97,114,101,112,97,114,101,110,116,115,112,108, +97,121,101,114,115,114,101,103,105,111,110,115,109,111,110,105,116,111,114,32,39 +,39,84,104,101,32,119,105,110,110,105,110,103,101,120,112,108,111,114,101,97,100 +,97,112,116,101,100,71,97,108,108,101,114,121,112,114,111,100,117,99,101,97,98, +105,108,105,116,121,101,110,104,97,110,99,101,99,97,114,101,101,114,115,41,46,32 +,84,104,101,32,99,111,108,108,101,99,116,83,101,97,114,99,104,32,97,110,99,105, +101,110,116,101,120,105,115,116,101,100,102,111,111,116,101,114,32,104,97,110, +100,108,101,114,112,114,105,110,116,101,100,99,111,110,115,111,108,101,69,97,115 +,116,101,114,110,101,120,112,111,114,116,115,119,105,110,100,111,119,115,67,104, +97,110,110,101,108,105,108,108,101,103,97,108,110,101,117,116,114,97,108,115,117 +,103,103,101,115,116,95,104,101,97,100,101,114,115,105,103,110,105,110,103,46, +104,116,109,108,34,62,115,101,116,116,108,101,100,119,101,115,116,101,114,110,99 +,97,117,115,105,110,103,45,119,101,98,107,105,116,99,108,97,105,109,101,100,74, +117,115,116,105,99,101,99,104,97,112,116,101,114,118,105,99,116,105,109,115,84, +104,111,109,97,115,32,109,111,122,105,108,108,97,112,114,111,109,105,115,101,112 +,97,114,116,105,101,115,101,100,105,116,105,111,110,111,117,116,115,105,100,101, +58,102,97,108,115,101,44,104,117,110,100,114,101,100,79,108,121,109,112,105,99, +95,98,117,116,116,111,110,97,117,116,104,111,114,115,114,101,97,99,104,101,100, +99,104,114,111,110,105,99,100,101,109,97,110,100,115,115,101,99,111,110,100,115, +112,114,111,116,101,99,116,97,100,111,112,116,101,100,112,114,101,112,97,114,101 +,110,101,105,116,104,101,114,103,114,101,97,116,108,121,103,114,101,97,116,101, +114,111,118,101,114,97,108,108,105,109,112,114,111,118,101,99,111,109,109,97,110 +,100,115,112,101,99,105,97,108,115,101,97,114,99,104,46,119,111,114,115,104,105, +112,102,117,110,100,105,110,103,116,104,111,117,103,104,116,104,105,103,104,101, +115,116,105,110,115,116,101,97,100,117,116,105,108,105,116,121,113,117,97,114, +116,101,114,67,117,108,116,117,114,101,116,101,115,116,105,110,103,99,108,101,97 +,114,108,121,101,120,112,111,115,101,100,66,114,111,119,115,101,114,108,105,98, +101,114,97,108,125,32,99,97,116,99,104,80,114,111,106,101,99,116,101,120,97,109, +112,108,101,104,105,100,101,40,41,59,70,108,111,114,105,100,97,97,110,115,119, +101,114,115,97,108,108,111,119,101,100,69,109,112,101,114,111,114,100,101,102, +101,110,115,101,115,101,114,105,111,117,115,102,114,101,101,100,111,109,83,101, +118,101,114,97,108,45,98,117,116,116,111,110,70,117,114,116,104,101,114,111,117, +116,32,111,102,32,33,61,32,110,117,108,108,116,114,97,105,110,101,100,68,101,110 +,109,97,114,107,118,111,105,100,40,48,41,47,97,108,108,46,106,115,112,114,101, +118,101,110,116,82,101,113,117,101,115,116,83,116,101,112,104,101,110,10,10,87, +104,101,110,32,111,98,115,101,114,118,101,60,47,104,50,62,13,10,77,111,100,101, +114,110,32,112,114,111,118,105,100,101,34,32,97,108,116,61,34,98,111,114,100,101 +,114,115,46,10,10,70,111,114,32,10,10,77,97,110,121,32,97,114,116,105,115,116, +115,112,111,119,101,114,101,100,112,101,114,102,111,114,109,102,105,99,116,105, +111,110,116,121,112,101,32,111,102,109,101,100,105,99,97,108,116,105,99,107,101, +116,115,111,112,112,111,115,101,100,67,111,117,110,99,105,108,119,105,116,110, +101,115,115,106,117,115,116,105,99,101,71,101,111,114,103,101,32,66,101,108,103, +105,117,109,46,46,46,60,47,97,62,116,119,105,116,116,101,114,110,111,116,97,98, +108,121,119,97,105,116,105,110,103,119,97,114,102,97,114,101,32,79,116,104,101, +114,32,114,97,110,107,105,110,103,112,104,114,97,115,101,115,109,101,110,116,105 +,111,110,115,117,114,118,105,118,101,115,99,104,111,108,97,114,60,47,112,62,13, +10,32,67,111,117,110,116,114,121,105,103,110,111,114,101,100,108,111,115,115,32, +111,102,106,117,115,116,32,97,115,71,101,111,114,103,105,97,115,116,114,97,110, +103,101,60,104,101,97,100,62,60,115,116,111,112,112,101,100,49,39,93,41,59,13,10 +,105,115,108,97,110,100,115,110,111,116,97,98,108,101,98,111,114,100,101,114,58, +108,105,115,116,32,111,102,99,97,114,114,105,101,100,49,48,48,44,48,48,48,60,47, +104,51,62,10,32,115,101,118,101,114,97,108,98,101,99,111,109,101,115,115,101,108 +,101,99,116,32,119,101,100,100,105,110,103,48,48,46,104,116,109,108,109,111,110, +97,114,99,104,111,102,102,32,116,104,101,116,101,97,99,104,101,114,104,105,103, +104,108,121,32,98,105,111,108,111,103,121,108,105,102,101,32,111,102,111,114,32, +101,118,101,110,114,105,115,101,32,111,102,38,114,97,113,117,111,59,112,108,117, +115,111,110,101,104,117,110,116,105,110,103,40,116,104,111,117,103,104,68,111, +117,103,108,97,115,106,111,105,110,105,110,103,99,105,114,99,108,101,115,70,111, +114,32,116,104,101,65,110,99,105,101,110,116,86,105,101,116,110,97,109,118,101, +104,105,99,108,101,115,117,99,104,32,97,115,99,114,121,115,116,97,108,118,97,108 +,117,101,32,61,87,105,110,100,111,119,115,101,110,106,111,121,101,100,97,32,115, +109,97,108,108,97,115,115,117,109,101,100,60,97,32,105,100,61,34,102,111,114,101 +,105,103,110,32,65,108,108,32,114,105,104,111,119,32,116,104,101,68,105,115,112, +108,97,121,114,101,116,105,114,101,100,104,111,119,101,118,101,114,104,105,100, +100,101,110,59,98,97,116,116,108,101,115,115,101,101,107,105,110,103,99,97,98, +105,110,101,116,119,97,115,32,110,111,116,108,111,111,107,32,97,116,99,111,110, +100,117,99,116,103,101,116,32,116,104,101,74,97,110,117,97,114,121,104,97,112, +112,101,110,115,116,117,114,110,105,110,103,97,58,104,111,118,101,114,79,110,108 +,105,110,101,32,70,114,101,110,99,104,32,108,97,99,107,105,110,103,116,121,112, +105,99,97,108,101,120,116,114,97,99,116,101,110,101,109,105,101,115,101,118,101, +110,32,105,102,103,101,110,101,114,97,116,100,101,99,105,100,101,100,97,114,101, +32,110,111,116,47,115,101,97,114,99,104,98,101,108,105,101,102,115,45,105,109,97 +,103,101,58,108,111,99,97,116,101,100,115,116,97,116,105,99,46,108,111,103,105, +110,34,62,99,111,110,118,101,114,116,118,105,111,108,101,110,116,101,110,116,101 +,114,101,100,102,105,114,115,116,34,62,99,105,114,99,117,105,116,70,105,110,108, +97,110,100,99,104,101,109,105,115,116,115,104,101,32,119,97,115,49,48,112,120,59 +,34,62,97,115,32,115,117,99,104,100,105,118,105,100,101,100,60,47,115,112,97,110 +,62,119,105,108,108,32,98,101,108,105,110,101,32,111,102,97,32,103,114,101,97, +116,109,121,115,116,101,114,121,47,105,110,100,101,120,46,102,97,108,108,105,110 +,103,100,117,101,32,116,111,32,114,97,105,108,119,97,121,99,111,108,108,101,103, +101,109,111,110,115,116,101,114,100,101,115,99,101,110,116,105,116,32,119,105, +116,104,110,117,99,108,101,97,114,74,101,119,105,115,104,32,112,114,111,116,101, +115,116,66,114,105,116,105,115,104,102,108,111,119,101,114,115,112,114,101,100, +105,99,116,114,101,102,111,114,109,115,98,117,116,116,111,110,32,119,104,111,32, +119,97,115,108,101,99,116,117,114,101,105,110,115,116,97,110,116,115,117,105,99, +105,100,101,103,101,110,101,114,105,99,112,101,114,105,111,100,115,109,97,114, +107,101,116,115,83,111,99,105,97,108,32,102,105,115,104,105,110,103,99,111,109, +98,105,110,101,103,114,97,112,104,105,99,119,105,110,110,101,114,115,60,98,114, +32,47,62,60,98,121,32,116,104,101,32,78,97,116,117,114,97,108,80,114,105,118,97, +99,121,99,111,111,107,105,101,115,111,117,116,99,111,109,101,114,101,115,111,108 +,118,101,83,119,101,100,105,115,104,98,114,105,101,102,108,121,80,101,114,115, +105,97,110,115,111,32,109,117,99,104,67,101,110,116,117,114,121,100,101,112,105, +99,116,115,99,111,108,117,109,110,115,104,111,117,115,105,110,103,115,99,114,105 +,112,116,115,110,101,120,116,32,116,111,98,101,97,114,105,110,103,109,97,112,112 +,105,110,103,114,101,118,105,115,101,100,106,81,117,101,114,121,40,45,119,105, +100,116,104,58,116,105,116,108,101,34,62,116,111,111,108,116,105,112,83,101,99, +116,105,111,110,100,101,115,105,103,110,115,84,117,114,107,105,115,104,121,111, +117,110,103,101,114,46,109,97,116,99,104,40,125,41,40,41,59,10,10,98,117,114,110 +,105,110,103,111,112,101,114,97,116,101,100,101,103,114,101,101,115,115,111,117, +114,99,101,61,82,105,99,104,97,114,100,99,108,111,115,101,108,121,112,108,97,115 +,116,105,99,101,110,116,114,105,101,115,60,47,116,114,62,13,10,99,111,108,111, +114,58,35,117,108,32,105,100,61,34,112,111,115,115,101,115,115,114,111,108,108, +105,110,103,112,104,121,115,105,99,115,102,97,105,108,105,110,103,101,120,101,99 +,117,116,101,99,111,110,116,101,115,116,108,105,110,107,32,116,111,68,101,102,97 +,117,108,116,60,98,114,32,47,62,10,58,32,116,114,117,101,44,99,104,97,114,116, +101,114,116,111,117,114,105,115,109,99,108,97,115,115,105,99,112,114,111,99,101, +101,100,101,120,112,108,97,105,110,60,47,104,49,62,13,10,111,110,108,105,110,101 +,46,63,120,109,108,32,118,101,104,101,108,112,105,110,103,100,105,97,109,111,110 +,100,117,115,101,32,116,104,101,97,105,114,108,105,110,101,101,110,100,32,45,45, +62,41,46,97,116,116,114,40,114,101,97,100,101,114,115,104,111,115,116,105,110, +103,35,102,102,102,102,102,102,114,101,97,108,105,122,101,86,105,110,99,101,110, +116,115,105,103,110,97,108,115,32,115,114,99,61,34,47,80,114,111,100,117,99,116, +100,101,115,112,105,116,101,100,105,118,101,114,115,101,116,101,108,108,105,110, +103,80,117,98,108,105,99,32,104,101,108,100,32,105,110,74,111,115,101,112,104,32 +,116,104,101,97,116,114,101,97,102,102,101,99,116,115,60,115,116,121,108,101,62, +97,32,108,97,114,103,101,100,111,101,115,110,39,116,108,97,116,101,114,44,32,69, +108,101,109,101,110,116,102,97,118,105,99,111,110,99,114,101,97,116,111,114,72, +117,110,103,97,114,121,65,105,114,112,111,114,116,115,101,101,32,116,104,101,115 +,111,32,116,104,97,116,77,105,99,104,97,101,108,83,121,115,116,101,109,115,80, +114,111,103,114,97,109,115,44,32,97,110,100,32,32,119,105,100,116,104,61,101,38, +113,117,111,116,59,116,114,97,100,105,110,103,108,101,102,116,34,62,10,112,101, +114,115,111,110,115,71,111,108,100,101,110,32,65,102,102,97,105,114,115,103,114, +97,109,109,97,114,102,111,114,109,105,110,103,100,101,115,116,114,111,121,105, +100,101,97,32,111,102,99,97,115,101,32,111,102,111,108,100,101,115,116,32,116, +104,105,115,32,105,115,46,115,114,99,32,61,32,99,97,114,116,111,111,110,114,101, +103,105,115,116,114,67,111,109,109,111,110,115,77,117,115,108,105,109,115,87,104 +,97,116,32,105,115,105,110,32,109,97,110,121,109,97,114,107,105,110,103,114,101, +118,101,97,108,115,73,110,100,101,101,100,44,101,113,117,97,108,108,121,47,115, +104,111,119,95,97,111,117,116,100,111,111,114,101,115,99,97,112,101,40,65,117, +115,116,114,105,97,103,101,110,101,116,105,99,115,121,115,116,101,109,44,73,110, +32,116,104,101,32,115,105,116,116,105,110,103,72,101,32,97,108,115,111,73,115, +108,97,110,100,115,65,99,97,100,101,109,121,10,9,9,60,33,45,45,68,97,110,105,101 +,108,32,98,105,110,100,105,110,103,98,108,111,99,107,34,62,105,109,112,111,115, +101,100,117,116,105,108,105,122,101,65,98,114,97,104,97,109,40,101,120,99,101, +112,116,123,119,105,100,116,104,58,112,117,116,116,105,110,103,41,46,104,116,109 +,108,40,124,124,32,91,93,59,10,68,65,84,65,91,32,42,107,105,116,99,104,101,110, +109,111,117,110,116,101,100,97,99,116,117,97,108,32,100,105,97,108,101,99,116, +109,97,105,110,108,121,32,95,98,108,97,110,107,39,105,110,115,116,97,108,108,101 +,120,112,101,114,116,115,105,102,40,116,121,112,101,73,116,32,97,108,115,111,38, +99,111,112,121,59,32,34,62,84,101,114,109,115,98,111,114,110,32,105,110,79,112, +116,105,111,110,115,101,97,115,116,101,114,110,116,97,108,107,105,110,103,99,111 +,110,99,101,114,110,103,97,105,110,101,100,32,111,110,103,111,105,110,103,106, +117,115,116,105,102,121,99,114,105,116,105,99,115,102,97,99,116,111,114,121,105, +116,115,32,111,119,110,97,115,115,97,117,108,116,105,110,118,105,116,101,100,108 +,97,115,116,105,110,103,104,105,115,32,111,119,110,104,114,101,102,61,34,47,34, +32,114,101,108,61,34,100,101,118,101,108,111,112,99,111,110,99,101,114,116,100, +105,97,103,114,97,109,100,111,108,108,97,114,115,99,108,117,115,116,101,114,112, +104,112,63,105,100,61,97,108,99,111,104,111,108,41,59,125,41,40,41,59,117,115, +105,110,103,32,97,62,60,115,112,97,110,62,118,101,115,115,101,108,115,114,101, +118,105,118,97,108,65,100,100,114,101,115,115,97,109,97,116,101,117,114,97,110, +100,114,111,105,100,97,108,108,101,103,101,100,105,108,108,110,101,115,115,119, +97,108,107,105,110,103,99,101,110,116,101,114,115,113,117,97,108,105,102,121,109 +,97,116,99,104,101,115,117,110,105,102,105,101,100,101,120,116,105,110,99,116,68 +,101,102,101,110,115,101,100,105,101,100,32,105,110,10,9,60,33,45,45,32,99,117, +115,116,111,109,115,108,105,110,107,105,110,103,76,105,116,116,108,101,32,66,111 +,111,107,32,111,102,101,118,101,110,105,110,103,109,105,110,46,106,115,63,97,114 +,101,32,116,104,101,107,111,110,116,97,107,116,116,111,100,97,121,39,115,46,104, +116,109,108,34,32,116,97,114,103,101,116,61,119,101,97,114,105,110,103,65,108, +108,32,82,105,103,59,10,125,41,40,41,59,114,97,105,115,105,110,103,32,65,108,115 +,111,44,32,99,114,117,99,105,97,108,97,98,111,117,116,34,62,100,101,99,108,97, +114,101,45,45,62,10,60,115,99,102,105,114,101,102,111,120,97,115,32,109,117,99, +104,97,112,112,108,105,101,115,105,110,100,101,120,44,32,115,44,32,98,117,116,32 +,116,121,112,101,32,61,32,10,13,10,60,33,45,45,116,111,119,97,114,100,115,82,101 +,99,111,114,100,115,80,114,105,118,97,116,101,70,111,114,101,105,103,110,80,114, +101,109,105,101,114,99,104,111,105,99,101,115,86,105,114,116,117,97,108,114,101, +116,117,114,110,115,67,111,109,109,101,110,116,80,111,119,101,114,101,100,105, +110,108,105,110,101,59,112,111,118,101,114,116,121,99,104,97,109,98,101,114,76, +105,118,105,110,103,32,118,111,108,117,109,101,115,65,110,116,104,111,110,121, +108,111,103,105,110,34,32,82,101,108,97,116,101,100,69,99,111,110,111,109,121, +114,101,97,99,104,101,115,99,117,116,116,105,110,103,103,114,97,118,105,116,121, +108,105,102,101,32,105,110,67,104,97,112,116,101,114,45,115,104,97,100,111,119, +78,111,116,97,98,108,101,60,47,116,100,62,13,10,32,114,101,116,117,114,110,115, +116,97,100,105,117,109,119,105,100,103,101,116,115,118,97,114,121,105,110,103, +116,114,97,118,101,108,115,104,101,108,100,32,98,121,119,104,111,32,97,114,101, +119,111,114,107,32,105,110,102,97,99,117,108,116,121,97,110,103,117,108,97,114, +119,104,111,32,104,97,100,97,105,114,112,111,114,116,116,111,119,110,32,111,102, +10,10,83,111,109,101,32,39,99,108,105,99,107,39,99,104,97,114,103,101,115,107, +101,121,119,111,114,100,105,116,32,119,105,108,108,99,105,116,121,32,111,102,40, +116,104,105,115,41,59,65,110,100,114,101,119,32,117,110,105,113,117,101,32,99, +104,101,99,107,101,100,111,114,32,109,111,114,101,51,48,48,112,120,59,32,114,101 +,116,117,114,110,59,114,115,105,111,110,61,34,112,108,117,103,105,110,115,119, +105,116,104,105,110,32,104,101,114,115,101,108,102,83,116,97,116,105,111,110,70, +101,100,101,114,97,108,118,101,110,116,117,114,101,112,117,98,108,105,115,104, +115,101,110,116,32,116,111,116,101,110,115,105,111,110,97,99,116,114,101,115,115 +,99,111,109,101,32,116,111,102,105,110,103,101,114,115,68,117,107,101,32,111,102 +,112,101,111,112,108,101,44,101,120,112,108,111,105,116,119,104,97,116,32,105, +115,104,97,114,109,111,110,121,97,32,109,97,106,111,114,34,58,34,104,116,116,112 +,105,110,32,104,105,115,32,109,101,110,117,34,62,10,109,111,110,116,104,108,121, +111,102,102,105,99,101,114,99,111,117,110,99,105,108,103,97,105,110,105,110,103, +101,118,101,110,32,105,110,83,117,109,109,97,114,121,100,97,116,101,32,111,102, +108,111,121,97,108,116,121,102,105,116,110,101,115,115,97,110,100,32,119,97,115, +101,109,112,101,114,111,114,115,117,112,114,101,109,101,83,101,99,111,110,100,32 +,104,101,97,114,105,110,103,82,117,115,115,105,97,110,108,111,110,103,101,115, +116,65,108,98,101,114,116,97,108,97,116,101,114,97,108,115,101,116,32,111,102,32 +,115,109,97,108,108,34,62,46,97,112,112,101,110,100,100,111,32,119,105,116,104, +102,101,100,101,114,97,108,98,97,110,107,32,111,102,98,101,110,101,97,116,104,68 +,101,115,112,105,116,101,67,97,112,105,116,97,108,103,114,111,117,110,100,115,41 +,44,32,97,110,100,32,112,101,114,99,101,110,116,105,116,32,102,114,111,109,99, +108,111,115,105,110,103,99,111,110,116,97,105,110,73,110,115,116,101,97,100,102, +105,102,116,101,101,110,97,115,32,119,101,108,108,46,121,97,104,111,111,46,114, +101,115,112,111,110,100,102,105,103,104,116,101,114,111,98,115,99,117,114,101, +114,101,102,108,101,99,116,111,114,103,97,110,105,99,61,32,77,97,116,104,46,101, +100,105,116,105,110,103,111,110,108,105,110,101,32,112,97,100,100,105,110,103,97 +,32,119,104,111,108,101,111,110,101,114,114,111,114,121,101,97,114,32,111,102, +101,110,100,32,111,102,32,98,97,114,114,105,101,114,119,104,101,110,32,105,116, +104,101,97,100,101,114,32,104,111,109,101,32,111,102,114,101,115,117,109,101,100 +,114,101,110,97,109,101,100,115,116,114,111,110,103,62,104,101,97,116,105,110, +103,114,101,116,97,105,110,115,99,108,111,117,100,102,114,119,97,121,32,111,102, +32,77,97,114,99,104,32,49,107,110,111,119,105,110,103,105,110,32,112,97,114,116, +66,101,116,119,101,101,110,108,101,115,115,111,110,115,99,108,111,115,101,115, +116,118,105,114,116,117,97,108,108,105,110,107,115,34,62,99,114,111,115,115,101, +100,69,78,68,32,45,45,62,102,97,109,111,117,115,32,97,119,97,114,100,101,100,76, +105,99,101,110,115,101,72,101,97,108,116,104,32,102,97,105,114,108,121,32,119, +101,97,108,116,104,121,109,105,110,105,109,97,108,65,102,114,105,99,97,110,99, +111,109,112,101,116,101,108,97,98,101,108,34,62,115,105,110,103,105,110,103,102, +97,114,109,101,114,115,66,114,97,115,105,108,41,100,105,115,99,117,115,115,114, +101,112,108,97,99,101,71,114,101,103,111,114,121,102,111,110,116,32,99,111,112, +117,114,115,117,101,100,97,112,112,101,97,114,115,109,97,107,101,32,117,112,114, +111,117,110,100,101,100,98,111,116,104,32,111,102,98,108,111,99,107,101,100,115, +97,119,32,116,104,101,111,102,102,105,99,101,115,99,111,108,111,117,114,115,105, +102,40,100,111,99,117,119,104,101,110,32,104,101,101,110,102,111,114,99,101,112, +117,115,104,40,102,117,65,117,103,117,115,116,32,85,84,70,45,56,34,62,70,97,110, +116,97,115,121,105,110,32,109,111,115,116,105,110,106,117,114,101,100,85,115,117 +,97,108,108,121,102,97,114,109,105,110,103,99,108,111,115,117,114,101,111,98,106 +,101,99,116,32,100,101,102,101,110,99,101,117,115,101,32,111,102,32,77,101,100, +105,99,97,108,60,98,111,100,121,62,10,101,118,105,100,101,110,116,98,101,32,117, +115,101,100,107,101,121,67,111,100,101,115,105,120,116,101,101,110,73,115,108,97 +,109,105,99,35,48,48,48,48,48,48,101,110,116,105,114,101,32,119,105,100,101,108, +121,32,97,99,116,105,118,101,32,40,116,121,112,101,111,102,111,110,101,32,99,97, +110,99,111,108,111,114,32,61,115,112,101,97,107,101,114,101,120,116,101,110,100, +115,80,104,121,115,105,99,115,116,101,114,114,97,105,110,60,116,98,111,100,121, +62,102,117,110,101,114,97,108,118,105,101,119,105,110,103,109,105,100,100,108, +101,32,99,114,105,99,107,101,116,112,114,111,112,104,101,116,115,104,105,102,116 +,101,100,100,111,99,116,111,114,115,82,117,115,115,101,108,108,32,116,97,114,103 +,101,116,99,111,109,112,97,99,116,97,108,103,101,98,114,97,115,111,99,105,97,108 +,45,98,117,108,107,32,111,102,109,97,110,32,97,110,100,60,47,116,100,62,10,32, +104,101,32,108,101,102,116,41,46,118,97,108,40,41,102,97,108,115,101,41,59,108, +111,103,105,99,97,108,98,97,110,107,105,110,103,104,111,109,101,32,116,111,110, +97,109,105,110,103,32,65,114,105,122,111,110,97,99,114,101,100,105,116,115,41,59 +,10,125,41,59,10,102,111,117,110,100,101,114,105,110,32,116,117,114,110,67,111, +108,108,105,110,115,98,101,102,111,114,101,32,66,117,116,32,116,104,101,99,104, +97,114,103,101,100,84,105,116,108,101,34,62,67,97,112,116,97,105,110,115,112,101 +,108,108,101,100,103,111,100,100,101,115,115,84,97,103,32,45,45,62,65,100,100, +105,110,103,58,98,117,116,32,119,97,115,82,101,99,101,110,116,32,112,97,116,105, +101,110,116,98,97,99,107,32,105,110,61,102,97,108,115,101,38,76,105,110,99,111, +108,110,119,101,32,107,110,111,119,67,111,117,110,116,101,114,74,117,100,97,105, +115,109,115,99,114,105,112,116,32,97,108,116,101,114,101,100,39,93,41,59,10,32, +32,104,97,115,32,116,104,101,117,110,99,108,101,97,114,69,118,101,110,116,39,44, +98,111,116,104,32,105,110,110,111,116,32,97,108,108,10,10,60,33,45,45,32,112,108 +,97,99,105,110,103,104,97,114,100,32,116,111,32,99,101,110,116,101,114,115,111, +114,116,32,111,102,99,108,105,101,110,116,115,115,116,114,101,101,116,115,66,101 +,114,110,97,114,100,97,115,115,101,114,116,115,116,101,110,100,32,116,111,102,97 +,110,116,97,115,121,100,111,119,110,32,105,110,104,97,114,98,111,117,114,70,114, +101,101,100,111,109,106,101,119,101,108,114,121,47,97,98,111,117,116,46,46,115, +101,97,114,99,104,108,101,103,101,110,100,115,105,115,32,109,97,100,101,109,111, +100,101,114,110,32,111,110,108,121,32,111,110,111,110,108,121,32,116,111,105,109 +,97,103,101,34,32,108,105,110,101,97,114,32,112,97,105,110,116,101,114,97,110, +100,32,110,111,116,114,97,114,101,108,121,32,97,99,114,111,110,121,109,100,101, +108,105,118,101,114,115,104,111,114,116,101,114,48,48,38,97,109,112,59,97,115,32 +,109,97,110,121,119,105,100,116,104,61,34,47,42,32,60,33,91,67,116,105,116,108, +101,32,61,111,102,32,116,104,101,32,108,111,119,101,115,116,32,112,105,99,107, +101,100,32,101,115,99,97,112,101,100,117,115,101,115,32,111,102,112,101,111,112, +108,101,115,32,80,117,98,108,105,99,77,97,116,116,104,101,119,116,97,99,116,105, +99,115,100,97,109,97,103,101,100,119,97,121,32,102,111,114,108,97,119,115,32,111 +,102,101,97,115,121,32,116,111,32,119,105,110,100,111,119,115,116,114,111,110, +103,32,32,115,105,109,112,108,101,125,99,97,116,99,104,40,115,101,118,101,110, +116,104,105,110,102,111,98,111,120,119,101,110,116,32,116,111,112,97,105,110,116 +,101,100,99,105,116,105,122,101,110,73,32,100,111,110,39,116,114,101,116,114,101 +,97,116,46,32,83,111,109,101,32,119,119,46,34,41,59,10,98,111,109,98,105,110,103 +,109,97,105,108,116,111,58,109,97,100,101,32,105,110,46,32,77,97,110,121,32,99, +97,114,114,105,101,115,124,124,123,125,59,119,105,119,111,114,107,32,111,102,115 +,121,110,111,110,121,109,100,101,102,101,97,116,115,102,97,118,111,114,101,100, +111,112,116,105,99,97,108,112,97,103,101,84,114,97,117,110,108,101,115,115,32, +115,101,110,100,105,110,103,108,101,102,116,34,62,60,99,111,109,83,99,111,114,65 +,108,108,32,116,104,101,106,81,117,101,114,121,46,116,111,117,114,105,115,116,67 +,108,97,115,115,105,99,102,97,108,115,101,34,32,87,105,108,104,101,108,109,115, +117,98,117,114,98,115,103,101,110,117,105,110,101,98,105,115,104,111,112,115,46, +115,112,108,105,116,40,103,108,111,98,97,108,32,102,111,108,108,111,119,115,98, +111,100,121,32,111,102,110,111,109,105,110,97,108,67,111,110,116,97,99,116,115, +101,99,117,108,97,114,108,101,102,116,32,116,111,99,104,105,101,102,108,121,45, +104,105,100,100,101,110,45,98,97,110,110,101,114,60,47,108,105,62,10,10,46,32,87 +,104,101,110,32,105,110,32,98,111,116,104,100,105,115,109,105,115,115,69,120,112 +,108,111,114,101,97,108,119,97,121,115,32,118,105,97,32,116,104,101,115,112,97, +195,177,111,108,119,101,108,102,97,114,101,114,117,108,105,110,103,32,97,114,114 +,97,110,103,101,99,97,112,116,97,105,110,104,105,115,32,115,111,110,114,117,108, +101,32,111,102,104,101,32,116,111,111,107,105,116,115,101,108,102,44,61,48,38,97 +,109,112,59,40,99,97,108,108,101,100,115,97,109,112,108,101,115,116,111,32,109, +97,107,101,99,111,109,47,112,97,103,77,97,114,116,105,110,32,75,101,110,110,101, +100,121,97,99,99,101,112,116,115,102,117,108,108,32,111,102,104,97,110,100,108, +101,100,66,101,115,105,100,101,115,47,47,45,45,62,60,47,97,98,108,101,32,116,111 +,116,97,114,103,101,116,115,101,115,115,101,110,99,101,104,105,109,32,116,111,32 +,105,116,115,32,98,121,32,99,111,109,109,111,110,46,109,105,110,101,114,97,108, +116,111,32,116,97,107,101,119,97,121,115,32,116,111,115,46,111,114,103,47,108,97 +,100,118,105,115,101,100,112,101,110,97,108,116,121,115,105,109,112,108,101,58, +105,102,32,116,104,101,121,76,101,116,116,101,114,115,97,32,115,104,111,114,116, +72,101,114,98,101,114,116,115,116,114,105,107,101,115,32,103,114,111,117,112,115 +,46,108,101,110,103,116,104,102,108,105,103,104,116,115,111,118,101,114,108,97, +112,115,108,111,119,108,121,32,108,101,115,115,101,114,32,115,111,99,105,97,108, +32,60,47,112,62,10,9,9,105,116,32,105,110,116,111,114,97,110,107,101,100,32,114, +97,116,101,32,111,102,117,108,62,13,10,32,32,97,116,116,101,109,112,116,112,97, +105,114,32,111,102,109,97,107,101,32,105,116,75,111,110,116,97,107,116,65,110, +116,111,110,105,111,104,97,118,105,110,103,32,114,97,116,105,110,103,115,32,97, +99,116,105,118,101,115,116,114,101,97,109,115,116,114,97,112,112,101,100,34,41, +46,99,115,115,40,104,111,115,116,105,108,101,108,101,97,100,32,116,111,108,105, +116,116,108,101,32,103,114,111,117,112,115,44,80,105,99,116,117,114,101,45,45,62 +,13,10,13,10,32,114,111,119,115,61,34,32,111,98,106,101,99,116,105,110,118,101, +114,115,101,60,102,111,111,116,101,114,67,117,115,116,111,109,86,62,60,92,47,115 +,99,114,115,111,108,118,105,110,103,67,104,97,109,98,101,114,115,108,97,118,101, +114,121,119,111,117,110,100,101,100,119,104,101,114,101,97,115,33,61,32,39,117, +110,100,102,111,114,32,97,108,108,112,97,114,116,108,121,32,45,114,105,103,104, +116,58,65,114,97,98,105,97,110,98,97,99,107,101,100,32,99,101,110,116,117,114, +121,117,110,105,116,32,111,102,109,111,98,105,108,101,45,69,117,114,111,112,101, +44,105,115,32,104,111,109,101,114,105,115,107,32,111,102,100,101,115,105,114,101 +,100,67,108,105,110,116,111,110,99,111,115,116,32,111,102,97,103,101,32,111,102, +32,98,101,99,111,109,101,32,110,111,110,101,32,111,102,112,38,113,117,111,116,59 +,77,105,100,100,108,101,32,101,97,100,39,41,91,48,67,114,105,116,105,99,115,115, +116,117,100,105,111,115,62,38,99,111,112,121,59,103,114,111,117,112,34,62,97,115 +,115,101,109,98,108,109,97,107,105,110,103,32,112,114,101,115,115,101,100,119, +105,100,103,101,116,46,112,115,58,34,32,63,32,114,101,98,117,105,108,116,98,121, +32,115,111,109,101,70,111,114,109,101,114,32,101,100,105,116,111,114,115,100,101 +,108,97,121,101,100,67,97,110,111,110,105,99,104,97,100,32,116,104,101,112,117, +115,104,105,110,103,99,108,97,115,115,61,34,98,117,116,32,97,114,101,112,97,114, +116,105,97,108,66,97,98,121,108,111,110,98,111,116,116,111,109,32,99,97,114,114, +105,101,114,67,111,109,109,97,110,100,105,116,115,32,117,115,101,65,115,32,119, +105,116,104,99,111,117,114,115,101,115,97,32,116,104,105,114,100,100,101,110,111 +,116,101,115,97,108,115,111,32,105,110,72,111,117,115,116,111,110,50,48,112,120, +59,34,62,97,99,99,117,115,101,100,100,111,117,98,108,101,32,103,111,97,108,32, +111,102,70,97,109,111,117,115,32,41,46,98,105,110,100,40,112,114,105,101,115,116 +,115,32,79,110,108,105,110,101,105,110,32,74,117,108,121,115,116,32,43,32,34,103 +,99,111,110,115,117,108,116,100,101,99,105,109,97,108,104,101,108,112,102,117, +108,114,101,118,105,118,101,100,105,115,32,118,101,114,121,114,39,43,39,105,112, +116,108,111,115,105,110,103,32,102,101,109,97,108,101,115,105,115,32,97,108,115, +111,115,116,114,105,110,103,115,100,97,121,115,32,111,102,97,114,114,105,118,97, +108,102,117,116,117,114,101,32,60,111,98,106,101,99,116,102,111,114,99,105,110, +103,83,116,114,105,110,103,40,34,32,47,62,10,9,9,104,101,114,101,32,105,115,101, +110,99,111,100,101,100,46,32,32,84,104,101,32,98,97,108,108,111,111,110,100,111, +110,101,32,98,121,47,99,111,109,109,111,110,98,103,99,111,108,111,114,108,97,119 +,32,111,102,32,73,110,100,105,97,110,97,97,118,111,105,100,101,100,98,117,116,32 +,116,104,101,50,112,120,32,51,112,120,106,113,117,101,114,121,46,97,102,116,101, +114,32,97,112,111,108,105,99,121,46,109,101,110,32,97,110,100,102,111,111,116, +101,114,45,61,32,116,114,117,101,59,102,111,114,32,117,115,101,115,99,114,101, +101,110,46,73,110,100,105,97,110,32,105,109,97,103,101,32,61,102,97,109,105,108, +121,44,104,116,116,112,58,47,47,32,38,110,98,115,112,59,100,114,105,118,101,114, +115,101,116,101,114,110,97,108,115,97,109,101,32,97,115,110,111,116,105,99,101, +100,118,105,101,119,101,114,115,125,41,40,41,59,10,32,105,115,32,109,111,114,101 +,115,101,97,115,111,110,115,102,111,114,109,101,114,32,116,104,101,32,110,101, +119,105,115,32,106,117,115,116,99,111,110,115,101,110,116,32,83,101,97,114,99, +104,119,97,115,32,116,104,101,119,104,121,32,116,104,101,115,104,105,112,112,101 +,100,98,114,62,60,98,114,62,119,105,100,116,104,58,32,104,101,105,103,104,116,61 +,109,97,100,101,32,111,102,99,117,105,115,105,110,101,105,115,32,116,104,97,116, +97,32,118,101,114,121,32,65,100,109,105,114,97,108,32,102,105,120,101,100,59,110 +,111,114,109,97,108,32,77,105,115,115,105,111,110,80,114,101,115,115,44,32,111, +110,116,97,114,105,111,99,104,97,114,115,101,116,116,114,121,32,116,111,32,105, +110,118,97,100,101,100,61,34,116,114,117,101,34,115,112,97,99,105,110,103,105, +115,32,109,111,115,116,97,32,109,111,114,101,32,116,111,116,97,108,108,121,102, +97,108,108,32,111,102,125,41,59,13,10,32,32,105,109,109,101,110,115,101,116,105, +109,101,32,105,110,115,101,116,32,111,117,116,115,97,116,105,115,102,121,116,111 +,32,102,105,110,100,100,111,119,110,32,116,111,108,111,116,32,111,102,32,80,108, +97,121,101,114,115,105,110,32,74,117,110,101,113,117,97,110,116,117,109,110,111, +116,32,116,104,101,116,105,109,101,32,116,111,100,105,115,116,97,110,116,70,105, +110,110,105,115,104,115,114,99,32,61,32,40,115,105,110,103,108,101,32,104,101, +108,112,32,111,102,71,101,114,109,97,110,32,108,97,119,32,97,110,100,108,97,98, +101,108,101,100,102,111,114,101,115,116,115,99,111,111,107,105,110,103,115,112, +97,99,101,34,62,104,101,97,100,101,114,45,119,101,108,108,32,97,115,83,116,97, +110,108,101,121,98,114,105,100,103,101,115,47,103,108,111,98,97,108,67,114,111, +97,116,105,97,32,65,98,111,117,116,32,91,48,93,59,10,32,32,105,116,44,32,97,110, +100,103,114,111,117,112,101,100,98,101,105,110,103,32,97,41,123,116,104,114,111, +119,104,101,32,109,97,100,101,108,105,103,104,116,101,114,101,116,104,105,99,97, +108,70,70,70,70,70,70,34,98,111,116,116,111,109,34,108,105,107,101,32,97,32,101, +109,112,108,111,121,115,108,105,118,101,32,105,110,97,115,32,115,101,101,110,112 +,114,105,110,116,101,114,109,111,115,116,32,111,102,117,98,45,108,105,110,107, +114,101,106,101,99,116,115,97,110,100,32,117,115,101,105,109,97,103,101,34,62, +115,117,99,99,101,101,100,102,101,101,100,105,110,103,78,117,99,108,101,97,114, +105,110,102,111,114,109,97,116,111,32,104,101,108,112,87,111,109,101,110,39,115, +78,101,105,116,104,101,114,77,101,120,105,99,97,110,112,114,111,116,101,105,110, +60,116,97,98,108,101,32,98,121,32,109,97,110,121,104,101,97,108,116,104,121,108, +97,119,115,117,105,116,100,101,118,105,115,101,100,46,112,117,115,104,40,123,115 +,101,108,108,101,114,115,115,105,109,112,108,121,32,84,104,114,111,117,103,104, +46,99,111,111,107,105,101,32,73,109,97,103,101,40,111,108,100,101,114,34,62,117, +115,46,106,115,34,62,32,83,105,110,99,101,32,117,110,105,118,101,114,115,108,97, +114,103,101,114,32,111,112,101,110,32,116,111,33,45,45,32,101,110,100,108,105, +101,115,32,105,110,39,93,41,59,13,10,32,32,109,97,114,107,101,116,119,104,111,32 +,105,115,32,40,34,68,79,77,67,111,109,97,110,97,103,101,100,111,110,101,32,102, +111,114,116,121,112,101,111,102,32,75,105,110,103,100,111,109,112,114,111,102, +105,116,115,112,114,111,112,111,115,101,116,111,32,115,104,111,119,99,101,110, +116,101,114,59,109,97,100,101,32,105,116,100,114,101,115,115,101,100,119,101,114 +,101,32,105,110,109,105,120,116,117,114,101,112,114,101,99,105,115,101,97,114, +105,115,105,110,103,115,114,99,32,61,32,39,109,97,107,101,32,97,32,115,101,99, +117,114,101,100,66,97,112,116,105,115,116,118,111,116,105,110,103,32,10,9,9,118, +97,114,32,77,97,114,99,104,32,50,103,114,101,119,32,117,112,67,108,105,109,97, +116,101,46,114,101,109,111,118,101,115,107,105,108,108,101,100,119,97,121,32,116 +,104,101,60,47,104,101,97,100,62,102,97,99,101,32,111,102,97,99,116,105,110,103, +32,114,105,103,104,116,34,62,116,111,32,119,111,114,107,114,101,100,117,99,101, +115,104,97,115,32,104,97,100,101,114,101,99,116,101,100,115,104,111,119,40,41,59 +,97,99,116,105,111,110,61,98,111,111,107,32,111,102,97,110,32,97,114,101,97,61, +61,32,34,104,116,116,60,104,101,97,100,101,114,10,60,104,116,109,108,62,99,111, +110,102,111,114,109,102,97,99,105,110,103,32,99,111,111,107,105,101,46,114,101, +108,121,32,111,110,104,111,115,116,101,100,32,46,99,117,115,116,111,109,104,101, +32,119,101,110,116,98,117,116,32,102,111,114,115,112,114,101,97,100,32,70,97,109 +,105,108,121,32,97,32,109,101,97,110,115,111,117,116,32,116,104,101,102,111,114, +117,109,115,46,102,111,111,116,97,103,101,34,62,77,111,98,105,108,67,108,101,109 +,101,110,116,115,34,32,105,100,61,34,97,115,32,104,105,103,104,105,110,116,101, +110,115,101,45,45,62,60,33,45,45,102,101,109,97,108,101,32,105,115,32,115,101, +101,110,105,109,112,108,105,101,100,115,101,116,32,116,104,101,97,32,115,116,97, +116,101,97,110,100,32,104,105,115,102,97,115,116,101,115,116,98,101,115,105,100, +101,115,98,117,116,116,111,110,95,98,111,117,110,100,101,100,34,62,60,105,109, +103,32,73,110,102,111,98,111,120,101,118,101,110,116,115,44,97,32,121,111,117, +110,103,97,110,100,32,97,114,101,78,97,116,105,118,101,32,99,104,101,97,112,101, +114,84,105,109,101,111,117,116,97,110,100,32,104,97,115,101,110,103,105,110,101, +115,119,111,110,32,116,104,101,40,109,111,115,116,108,121,114,105,103,104,116,58 +,32,102,105,110,100,32,97,32,45,98,111,116,116,111,109,80,114,105,110,99,101,32, +97,114,101,97,32,111,102,109,111,114,101,32,111,102,115,101,97,114,99,104,95,110 +,97,116,117,114,101,44,108,101,103,97,108,108,121,112,101,114,105,111,100,44,108 +,97,110,100,32,111,102,111,114,32,119,105,116,104,105,110,100,117,99,101,100,112 +,114,111,118,105,110,103,109,105,115,115,105,108,101,108,111,99,97,108,108,121, +65,103,97,105,110,115,116,116,104,101,32,119,97,121,107,38,113,117,111,116,59, +112,120,59,34,62,13,10,112,117,115,104,101,100,32,97,98,97,110,100,111,110,110, +117,109,101,114,97,108,67,101,114,116,97,105,110,73,110,32,116,104,105,115,109, +111,114,101,32,105,110,111,114,32,115,111,109,101,110,97,109,101,32,105,115,97, +110,100,44,32,105,110,99,114,111,119,110,101,100,73,83,66,78,32,48,45,99,114,101 +,97,116,101,115,79,99,116,111,98,101,114,109,97,121,32,110,111,116,99,101,110, +116,101,114,32,108,97,116,101,32,105,110,68,101,102,101,110,99,101,101,110,97,99 +,116,101,100,119,105,115,104,32,116,111,98,114,111,97,100,108,121,99,111,111,108 +,105,110,103,111,110,108,111,97,100,61,105,116,46,32,84,104,101,114,101,99,111, +118,101,114,77,101,109,98,101,114,115,104,101,105,103,104,116,32,97,115,115,117, +109,101,115,60,104,116,109,108,62,10,112,101,111,112,108,101,46,105,110,32,111, +110,101,32,61,119,105,110,100,111,119,102,111,111,116,101,114,95,97,32,103,111, +111,100,32,114,101,107,108,97,109,97,111,116,104,101,114,115,44,116,111,32,116, +104,105,115,95,99,111,111,107,105,101,112,97,110,101,108,34,62,76,111,110,100, +111,110,44,100,101,102,105,110,101,115,99,114,117,115,104,101,100,98,97,112,116, +105,115,109,99,111,97,115,116,97,108,115,116,97,116,117,115,32,116,105,116,108, +101,34,32,109,111,118,101,32,116,111,108,111,115,116,32,105,110,98,101,116,116, +101,114,32,105,109,112,108,105,101,115,114,105,118,97,108,114,121,115,101,114, +118,101,114,115,32,83,121,115,116,101,109,80,101,114,104,97,112,115,101,115,32, +97,110,100,32,99,111,110,116,101,110,100,102,108,111,119,105,110,103,108,97,115, +116,101,100,32,114,105,115,101,32,105,110,71,101,110,101,115,105,115,118,105,101 +,119,32,111,102,114,105,115,105,110,103,32,115,101,101,109,32,116,111,98,117,116 +,32,105,110,32,98,97,99,107,105,110,103,104,101,32,119,105,108,108,103,105,118, +101,110,32,97,103,105,118,105,110,103,32,99,105,116,105,101,115,46,102,108,111, +119,32,111,102,32,76,97,116,101,114,32,97,108,108,32,98,117,116,72,105,103,104, +119,97,121,111,110,108,121,32,98,121,115,105,103,110,32,111,102,104,101,32,100, +111,101,115,100,105,102,102,101,114,115,98,97,116,116,101,114,121,38,97,109,112, +59,108,97,115,105,110,103,108,101,115,116,104,114,101,97,116,115,105,110,116,101 +,103,101,114,116,97,107,101,32,111,110,114,101,102,117,115,101,100,99,97,108,108 +,101,100,32,61,85,83,38,97,109,112,83,101,101,32,116,104,101,110,97,116,105,118, +101,115,98,121,32,116,104,105,115,115,121,115,116,101,109,46,104,101,97,100,32, +111,102,58,104,111,118,101,114,44,108,101,115,98,105,97,110,115,117,114,110,97, +109,101,97,110,100,32,97,108,108,99,111,109,109,111,110,47,104,101,97,100,101, +114,95,95,112,97,114,97,109,115,72,97,114,118,97,114,100,47,112,105,120,101,108, +46,114,101,109,111,118,97,108,115,111,32,108,111,110,103,114,111,108,101,32,111, +102,106,111,105,110,116,108,121,115,107,121,115,99,114,97,85,110,105,99,111,100, +101,98,114,32,47,62,13,10,65,116,108,97,110,116,97,110,117,99,108,101,117,115,67 +,111,117,110,116,121,44,112,117,114,101,108,121,32,99,111,117,110,116,34,62,101, +97,115,105,108,121,32,98,117,105,108,100,32,97,111,110,99,108,105,99,107,97,32, +103,105,118,101,110,112,111,105,110,116,101,114,104,38,113,117,111,116,59,101, +118,101,110,116,115,32,101,108,115,101,32,123,10,100,105,116,105,111,110,115,110 +,111,119,32,116,104,101,44,32,119,105,116,104,32,109,97,110,32,119,104,111,111, +114,103,47,87,101,98,111,110,101,32,97,110,100,99,97,118,97,108,114,121,72,101, +32,100,105,101,100,115,101,97,116,116,108,101,48,48,44,48,48,48,32,123,119,105, +110,100,111,119,104,97,118,101,32,116,111,105,102,40,119,105,110,100,97,110,100, +32,105,116,115,115,111,108,101,108,121,32,109,38,113,117,111,116,59,114,101,110, +101,119,101,100,68,101,116,114,111,105,116,97,109,111,110,103,115,116,101,105, +116,104,101,114,32,116,104,101,109,32,105,110,83,101,110,97,116,111,114,85,115, +60,47,97,62,60,75,105,110,103,32,111,102,70,114,97,110,99,105,115,45,112,114,111 +,100,117,99,104,101,32,117,115,101,100,97,114,116,32,97,110,100,104,105,109,32, +97,110,100,117,115,101,100,32,98,121,115,99,111,114,105,110,103,97,116,32,104, +111,109,101,116,111,32,104,97,118,101,114,101,108,97,116,101,115,105,98,105,108, +105,116,121,102,97,99,116,105,111,110,66,117,102,102,97,108,111,108,105,110,107, +34,62,60,119,104,97,116,32,104,101,102,114,101,101,32,116,111,67,105,116,121,32, +111,102,99,111,109,101,32,105,110,115,101,99,116,111,114,115,99,111,117,110,116, +101,100,111,110,101,32,100,97,121,110,101,114,118,111,117,115,115,113,117,97,114 +,101,32,125,59,105,102,40,103,111,105,110,32,119,104,97,116,105,109,103,34,32,97 +,108,105,115,32,111,110,108,121,115,101,97,114,99,104,47,116,117,101,115,100,97, +121,108,111,111,115,101,108,121,83,111,108,111,109,111,110,115,101,120,117,97, +108,32,45,32,60,97,32,104,114,109,101,100,105,117,109,34,68,79,32,78,79,84,32,70 +,114,97,110,99,101,44,119,105,116,104,32,97,32,119,97,114,32,97,110,100,115,101, +99,111,110,100,32,116,97,107,101,32,97,32,62,13,10,13,10,13,10,109,97,114,107, +101,116,46,104,105,103,104,119,97,121,100,111,110,101,32,105,110,99,116,105,118, +105,116,121,34,108,97,115,116,34,62,111,98,108,105,103,101,100,114,105,115,101, +32,116,111,34,117,110,100,101,102,105,109,97,100,101,32,116,111,32,69,97,114,108 +,121,32,112,114,97,105,115,101,100,105,110,32,105,116,115,32,102,111,114,32,104, +105,115,97,116,104,108,101,116,101,74,117,112,105,116,101,114,89,97,104,111,111, +33,32,116,101,114,109,101,100,32,115,111,32,109,97,110,121,114,101,97,108,108, +121,32,115,46,32,84,104,101,32,97,32,119,111,109,97,110,63,118,97,108,117,101,61 +,100,105,114,101,99,116,32,114,105,103,104,116,34,32,98,105,99,121,99,108,101,97 +,99,105,110,103,61,34,100,97,121,32,97,110,100,115,116,97,116,105,110,103,82,97, +116,104,101,114,44,104,105,103,104,101,114,32,79,102,102,105,99,101,32,97,114, +101,32,110,111,119,116,105,109,101,115,44,32,119,104,101,110,32,97,32,112,97,121 +,32,102,111,114,111,110,32,116,104,105,115,45,108,105,110,107,34,62,59,98,111, +114,100,101,114,97,114,111,117,110,100,32,97,110,110,117,97,108,32,116,104,101, +32,78,101,119,112,117,116,32,116,104,101,46,99,111,109,34,32,116,97,107,105,110, +32,116,111,97,32,98,114,105,101,102,40,105,110,32,116,104,101,103,114,111,117, +112,115,46,59,32,119,105,100,116,104,101,110,122,121,109,101,115,115,105,109,112 +,108,101,32,105,110,32,108,97,116,101,123,114,101,116,117,114,110,116,104,101, +114,97,112,121,97,32,112,111,105,110,116,98,97,110,110,105,110,103,105,110,107, +115,34,62,10,40,41,59,34,32,114,101,97,32,112,108,97,99,101,92,117,48,48,51,67, +97,97,98,111,117,116,32,97,116,114,62,13,10,9,9,99,99,111,117,110,116,32,103,105 +,118,101,115,32,97,60,83,67,82,73,80,84,82,97,105,108,119,97,121,116,104,101,109 +,101,115,47,116,111,111,108,98,111,120,66,121,73,100,40,34,120,104,117,109,97, +110,115,44,119,97,116,99,104,101,115,105,110,32,115,111,109,101,32,105,102,32,40 +,119,105,99,111,109,105,110,103,32,102,111,114,109,97,116,115,32,85,110,100,101, +114,32,98,117,116,32,104,97,115,104,97,110,100,101,100,32,109,97,100,101,32,98, +121,116,104,97,110,32,105,110,102,101,97,114,32,111,102,100,101,110,111,116,101, +100,47,105,102,114,97,109,101,108,101,102,116,32,105,110,118,111,108,116,97,103, +101,105,110,32,101,97,99,104,97,38,113,117,111,116,59,98,97,115,101,32,111,102, +73,110,32,109,97,110,121,117,110,100,101,114,103,111,114,101,103,105,109,101,115 +,97,99,116,105,111,110,32,60,47,112,62,13,10,60,117,115,116,111,109,86,97,59,38, +103,116,59,60,47,105,109,112,111,114,116,115,111,114,32,116,104,97,116,109,111, +115,116,108,121,32,38,97,109,112,59,114,101,32,115,105,122,101,61,34,60,47,97,62 +,60,47,104,97,32,99,108,97,115,115,112,97,115,115,105,118,101,72,111,115,116,32, +61,32,87,104,101,116,104,101,114,102,101,114,116,105,108,101,86,97,114,105,111, +117,115,61,91,93,59,40,102,117,99,97,109,101,114,97,115,47,62,60,47,116,100,62, +97,99,116,115,32,97,115,73,110,32,115,111,109,101,62,13,10,13,10,60,33,111,114, +103,97,110,105,115,32,60,98,114,32,47,62,66,101,105,106,105,110,103,99,97,116,97 +,108,195,160,100,101,117,116,115,99,104,101,117,114,111,112,101,117,101,117,115, +107,97,114,97,103,97,101,105,108,103,101,115,118,101,110,115,107,97,101,115,112, +97,195,177,97,109,101,110,115,97,106,101,117,115,117,97,114,105,111,116,114,97, +98,97,106,111,109,195,169,120,105,99,111,112,195,161,103,105,110,97,115,105,101, +109,112,114,101,115,105,115,116,101,109,97,111,99,116,117,98,114,101,100,117,114 +,97,110,116,101,97,195,177,97,100,105,114,101,109,112,114,101,115,97,109,111,109 +,101,110,116,111,110,117,101,115,116,114,111,112,114,105,109,101,114,97,116,114, +97,118,195,169,115,103,114,97,99,105,97,115,110,117,101,115,116,114,97,112,114, +111,99,101,115,111,101,115,116,97,100,111,115,99,97,108,105,100,97,100,112,101, +114,115,111,110,97,110,195,186,109,101,114,111,97,99,117,101,114,100,111,109,195 +,186,115,105,99,97,109,105,101,109,98,114,111,111,102,101,114,116,97,115,97,108, +103,117,110,111,115,112,97,195,173,115,101,115,101,106,101,109,112,108,111,100, +101,114,101,99,104,111,97,100,101,109,195,161,115,112,114,105,118,97,100,111,97, +103,114,101,103,97,114,101,110,108,97,99,101,115,112,111,115,105,98,108,101,104, +111,116,101,108,101,115,115,101,118,105,108,108,97,112,114,105,109,101,114,111, +195,186,108,116,105,109,111,101,118,101,110,116,111,115,97,114,99,104,105,118, +111,99,117,108,116,117,114,97,109,117,106,101,114,101,115,101,110,116,114,97,100 +,97,97,110,117,110,99,105,111,101,109,98,97,114,103,111,109,101,114,99,97,100, +111,103,114,97,110,100,101,115,101,115,116,117,100,105,111,109,101,106,111,114, +101,115,102,101,98,114,101,114,111,100,105,115,101,195,177,111,116,117,114,105, +115,109,111,99,195,179,100,105,103,111,112,111,114,116,97,100,97,101,115,112,97, +99,105,111,102,97,109,105,108,105,97,97,110,116,111,110,105,111,112,101,114,109, +105,116,101,103,117,97,114,100,97,114,97,108,103,117,110,97,115,112,114,101,99, +105,111,115,97,108,103,117,105,101,110,115,101,110,116,105,100,111,118,105,115, +105,116,97,115,116,195,173,116,117,108,111,99,111,110,111,99,101,114,115,101,103 +,117,110,100,111,99,111,110,115,101,106,111,102,114,97,110,99,105,97,109,105,110 +,117,116,111,115,115,101,103,117,110,100,97,116,101,110,101,109,111,115,101,102, +101,99,116,111,115,109,195,161,108,97,103,97,115,101,115,105,195,179,110,114,101 +,118,105,115,116,97,103,114,97,110,97,100,97,99,111,109,112,114,97,114,105,110, +103,114,101,115,111,103,97,114,99,195,173,97,97,99,99,105,195,179,110,101,99,117 +,97,100,111,114,113,117,105,101,110,101,115,105,110,99,108,117,115,111,100,101, +98,101,114,195,161,109,97,116,101,114,105,97,104,111,109,98,114,101,115,109,117, +101,115,116,114,97,112,111,100,114,195,173,97,109,97,195,177,97,110,97,195,186, +108,116,105,109,97,101,115,116,97,109,111,115,111,102,105,99,105,97,108,116,97, +109,98,105,101,110,110,105,110,103,195,186,110,115,97,108,117,100,111,115,112, +111,100,101,109,111,115,109,101,106,111,114,97,114,112,111,115,105,116,105,111, +110,98,117,115,105,110,101,115,115,104,111,109,101,112,97,103,101,115,101,99,117 +,114,105,116,121,108,97,110,103,117,97,103,101,115,116,97,110,100,97,114,100,99, +97,109,112,97,105,103,110,102,101,97,116,117,114,101,115,99,97,116,101,103,111, +114,121,101,120,116,101,114,110,97,108,99,104,105,108,100,114,101,110,114,101, +115,101,114,118,101,100,114,101,115,101,97,114,99,104,101,120,99,104,97,110,103, +101,102,97,118,111,114,105,116,101,116,101,109,112,108,97,116,101,109,105,108, +105,116,97,114,121,105,110,100,117,115,116,114,121,115,101,114,118,105,99,101, +115,109,97,116,101,114,105,97,108,112,114,111,100,117,99,116,115,122,45,105,110, +100,101,120,58,99,111,109,109,101,110,116,115,115,111,102,116,119,97,114,101,99, +111,109,112,108,101,116,101,99,97,108,101,110,100,97,114,112,108,97,116,102,111, +114,109,97,114,116,105,99,108,101,115,114,101,113,117,105,114,101,100,109,111, +118,101,109,101,110,116,113,117,101,115,116,105,111,110,98,117,105,108,100,105, +110,103,112,111,108,105,116,105,99,115,112,111,115,115,105,98,108,101,114,101, +108,105,103,105,111,110,112,104,121,115,105,99,97,108,102,101,101,100,98,97,99, +107,114,101,103,105,115,116,101,114,112,105,99,116,117,114,101,115,100,105,115, +97,98,108,101,100,112,114,111,116,111,99,111,108,97,117,100,105,101,110,99,101, +115,101,116,116,105,110,103,115,97,99,116,105,118,105,116,121,101,108,101,109, +101,110,116,115,108,101,97,114,110,105,110,103,97,110,121,116,104,105,110,103,97 +,98,115,116,114,97,99,116,112,114,111,103,114,101,115,115,111,118,101,114,118, +105,101,119,109,97,103,97,122,105,110,101,101,99,111,110,111,109,105,99,116,114, +97,105,110,105,110,103,112,114,101,115,115,117,114,101,118,97,114,105,111,117, +115,32,60,115,116,114,111,110,103,62,112,114,111,112,101,114,116,121,115,104,111 +,112,112,105,110,103,116,111,103,101,116,104,101,114,97,100,118,97,110,99,101, +100,98,101,104,97,118,105,111,114,100,111,119,110,108,111,97,100,102,101,97,116, +117,114,101,100,102,111,111,116,98,97,108,108,115,101,108,101,99,116,101,100,76, +97,110,103,117,97,103,101,100,105,115,116,97,110,99,101,114,101,109,101,109,98, +101,114,116,114,97,99,107,105,110,103,112,97,115,115,119,111,114,100,109,111,100 +,105,102,105,101,100,115,116,117,100,101,110,116,115,100,105,114,101,99,116,108, +121,102,105,103,104,116,105,110,103,110,111,114,116,104,101,114,110,100,97,116, +97,98,97,115,101,102,101,115,116,105,118,97,108,98,114,101,97,107,105,110,103, +108,111,99,97,116,105,111,110,105,110,116,101,114,110,101,116,100,114,111,112, +100,111,119,110,112,114,97,99,116,105,99,101,101,118,105,100,101,110,99,101,102, +117,110,99,116,105,111,110,109,97,114,114,105,97,103,101,114,101,115,112,111,110 +,115,101,112,114,111,98,108,101,109,115,110,101,103,97,116,105,118,101,112,114, +111,103,114,97,109,115,97,110,97,108,121,115,105,115,114,101,108,101,97,115,101, +100,98,97,110,110,101,114,34,62,112,117,114,99,104,97,115,101,112,111,108,105,99 +,105,101,115,114,101,103,105,111,110,97,108,99,114,101,97,116,105,118,101,97,114 +,103,117,109,101,110,116,98,111,111,107,109,97,114,107,114,101,102,101,114,114, +101,114,99,104,101,109,105,99,97,108,100,105,118,105,115,105,111,110,99,97,108, +108,98,97,99,107,115,101,112,97,114,97,116,101,112,114,111,106,101,99,116,115,99 +,111,110,102,108,105,99,116,104,97,114,100,119,97,114,101,105,110,116,101,114, +101,115,116,100,101,108,105,118,101,114,121,109,111,117,110,116,97,105,110,111, +98,116,97,105,110,101,100,61,32,102,97,108,115,101,59,102,111,114,40,118,97,114, +32,97,99,99,101,112,116,101,100,99,97,112,97,99,105,116,121,99,111,109,112,117, +116,101,114,105,100,101,110,116,105,116,121,97,105,114,99,114,97,102,116,101,109 +,112,108,111,121,101,100,112,114,111,112,111,115,101,100,100,111,109,101,115,116 +,105,99,105,110,99,108,117,100,101,115,112,114,111,118,105,100,101,100,104,111, +115,112,105,116,97,108,118,101,114,116,105,99,97,108,99,111,108,108,97,112,115, +101,97,112,112,114,111,97,99,104,112,97,114,116,110,101,114,115,108,111,103,111, +34,62,60,97,100,97,117,103,104,116,101,114,97,117,116,104,111,114,34,32,99,117, +108,116,117,114,97,108,102,97,109,105,108,105,101,115,47,105,109,97,103,101,115, +47,97,115,115,101,109,98,108,121,112,111,119,101,114,102,117,108,116,101,97,99, +104,105,110,103,102,105,110,105,115,104,101,100,100,105,115,116,114,105,99,116, +99,114,105,116,105,99,97,108,99,103,105,45,98,105,110,47,112,117,114,112,111,115 +,101,115,114,101,113,117,105,114,101,115,101,108,101,99,116,105,111,110,98,101, +99,111,109,105,110,103,112,114,111,118,105,100,101,115,97,99,97,100,101,109,105, +99,101,120,101,114,99,105,115,101,97,99,116,117,97,108,108,121,109,101,100,105, +99,105,110,101,99,111,110,115,116,97,110,116,97,99,99,105,100,101,110,116,77,97, +103,97,122,105,110,101,100,111,99,117,109,101,110,116,115,116,97,114,116,105,110 +,103,98,111,116,116,111,109,34,62,111,98,115,101,114,118,101,100,58,32,38,113, +117,111,116,59,101,120,116,101,110,100,101,100,112,114,101,118,105,111,117,115, +83,111,102,116,119,97,114,101,99,117,115,116,111,109,101,114,100,101,99,105,115, +105,111,110,115,116,114,101,110,103,116,104,100,101,116,97,105,108,101,100,115, +108,105,103,104,116,108,121,112,108,97,110,110,105,110,103,116,101,120,116,97, +114,101,97,99,117,114,114,101,110,99,121,101,118,101,114,121,111,110,101,115,116 +,114,97,105,103,104,116,116,114,97,110,115,102,101,114,112,111,115,105,116,105, +118,101,112,114,111,100,117,99,101,100,104,101,114,105,116,97,103,101,115,104, +105,112,112,105,110,103,97,98,115,111,108,117,116,101,114,101,99,101,105,118,101 +,100,114,101,108,101,118,97,110,116,98,117,116,116,111,110,34,32,118,105,111,108 +,101,110,99,101,97,110,121,119,104,101,114,101,98,101,110,101,102,105,116,115, +108,97,117,110,99,104,101,100,114,101,99,101,110,116,108,121,97,108,108,105,97, +110,99,101,102,111,108,108,111,119,101,100,109,117,108,116,105,112,108,101,98, +117,108,108,101,116,105,110,105,110,99,108,117,100,101,100,111,99,99,117,114,114 +,101,100,105,110,116,101,114,110,97,108,36,40,116,104,105,115,41,46,114,101,112, +117,98,108,105,99,62,60,116,114,62,60,116,100,99,111,110,103,114,101,115,115,114 +,101,99,111,114,100,101,100,117,108,116,105,109,97,116,101,115,111,108,117,116, +105,111,110,60,117,108,32,105,100,61,34,100,105,115,99,111,118,101,114,72,111, +109,101,60,47,97,62,119,101,98,115,105,116,101,115,110,101,116,119,111,114,107, +115,97,108,116,104,111,117,103,104,101,110,116,105,114,101,108,121,109,101,109, +111,114,105,97,108,109,101,115,115,97,103,101,115,99,111,110,116,105,110,117,101 +,97,99,116,105,118,101,34,62,115,111,109,101,119,104,97,116,118,105,99,116,111, +114,105,97,87,101,115,116,101,114,110,32,32,116,105,116,108,101,61,34,76,111,99, +97,116,105,111,110,99,111,110,116,114,97,99,116,118,105,115,105,116,111,114,115, +68,111,119,110,108,111,97,100,119,105,116,104,111,117,116,32,114,105,103,104,116 +,34,62,10,109,101,97,115,117,114,101,115,119,105,100,116,104,32,61,32,118,97,114 +,105,97,98,108,101,105,110,118,111,108,118,101,100,118,105,114,103,105,110,105, +97,110,111,114,109,97,108,108,121,104,97,112,112,101,110,101,100,97,99,99,111, +117,110,116,115,115,116,97,110,100,105,110,103,110,97,116,105,111,110,97,108,82, +101,103,105,115,116,101,114,112,114,101,112,97,114,101,100,99,111,110,116,114, +111,108,115,97,99,99,117,114,97,116,101,98,105,114,116,104,100,97,121,115,116, +114,97,116,101,103,121,111,102,102,105,99,105,97,108,103,114,97,112,104,105,99, +115,99,114,105,109,105,110,97,108,112,111,115,115,105,98,108,121,99,111,110,115, +117,109,101,114,80,101,114,115,111,110,97,108,115,112,101,97,107,105,110,103,118 +,97,108,105,100,97,116,101,97,99,104,105,101,118,101,100,46,106,112,103,34,32,47 +,62,109,97,99,104,105,110,101,115,60,47,104,50,62,10,32,32,107,101,121,119,111, +114,100,115,102,114,105,101,110,100,108,121,98,114,111,116,104,101,114,115,99, +111,109,98,105,110,101,100,111,114,105,103,105,110,97,108,99,111,109,112,111,115 +,101,100,101,120,112,101,99,116,101,100,97,100,101,113,117,97,116,101,112,97,107 +,105,115,116,97,110,102,111,108,108,111,119,34,32,118,97,108,117,97,98,108,101, +60,47,108,97,98,101,108,62,114,101,108,97,116,105,118,101,98,114,105,110,103,105 +,110,103,105,110,99,114,101,97,115,101,103,111,118,101,114,110,111,114,112,108, +117,103,105,110,115,47,76,105,115,116,32,111,102,32,72,101,97,100,101,114,34,62, +34,32,110,97,109,101,61,34,32,40,38,113,117,111,116,59,103,114,97,100,117,97,116 +,101,60,47,104,101,97,100,62,10,99,111,109,109,101,114,99,101,109,97,108,97,121, +115,105,97,100,105,114,101,99,116,111,114,109,97,105,110,116,97,105,110,59,104, +101,105,103,104,116,58,115,99,104,101,100,117,108,101,99,104,97,110,103,105,110, +103,98,97,99,107,32,116,111,32,99,97,116,104,111,108,105,99,112,97,116,116,101, +114,110,115,99,111,108,111,114,58,32,35,103,114,101,97,116,101,115,116,115,117, +112,112,108,105,101,115,114,101,108,105,97,98,108,101,60,47,117,108,62,10,9,9,60 +,115,101,108,101,99,116,32,99,105,116,105,122,101,110,115,99,108,111,116,104,105 +,110,103,119,97,116,99,104,105,110,103,60,108,105,32,105,100,61,34,115,112,101, +99,105,102,105,99,99,97,114,114,121,105,110,103,115,101,110,116,101,110,99,101, +60,99,101,110,116,101,114,62,99,111,110,116,114,97,115,116,116,104,105,110,107, +105,110,103,99,97,116,99,104,40,101,41,115,111,117,116,104,101,114,110,77,105,99 +,104,97,101,108,32,109,101,114,99,104,97,110,116,99,97,114,111,117,115,101,108, +112,97,100,100,105,110,103,58,105,110,116,101,114,105,111,114,46,115,112,108,105 +,116,40,34,108,105,122,97,116,105,111,110,79,99,116,111,98,101,114,32,41,123,114 +,101,116,117,114,110,105,109,112,114,111,118,101,100,45,45,38,103,116,59,10,10, +99,111,118,101,114,97,103,101,99,104,97,105,114,109,97,110,46,112,110,103,34,32, +47,62,115,117,98,106,101,99,116,115,82,105,99,104,97,114,100,32,119,104,97,116, +101,118,101,114,112,114,111,98,97,98,108,121,114,101,99,111,118,101,114,121,98, +97,115,101,98,97,108,108,106,117,100,103,109,101,110,116,99,111,110,110,101,99, +116,46,46,99,115,115,34,32,47,62,32,119,101,98,115,105,116,101,114,101,112,111, +114,116,101,100,100,101,102,97,117,108,116,34,47,62,60,47,97,62,13,10,101,108, +101,99,116,114,105,99,115,99,111,116,108,97,110,100,99,114,101,97,116,105,111, +110,113,117,97,110,116,105,116,121,46,32,73,83,66,78,32,48,100,105,100,32,110, +111,116,32,105,110,115,116,97,110,99,101,45,115,101,97,114,99,104,45,34,32,108, +97,110,103,61,34,115,112,101,97,107,101,114,115,67,111,109,112,117,116,101,114, +99,111,110,116,97,105,110,115,97,114,99,104,105,118,101,115,109,105,110,105,115, +116,101,114,114,101,97,99,116,105,111,110,100,105,115,99,111,117,110,116,73,116, +97,108,105,97,110,111,99,114,105,116,101,114,105,97,115,116,114,111,110,103,108, +121,58,32,39,104,116,116,112,58,39,115,99,114,105,112,116,39,99,111,118,101,114, +105,110,103,111,102,102,101,114,105,110,103,97,112,112,101,97,114,101,100,66,114 +,105,116,105,115,104,32,105,100,101,110,116,105,102,121,70,97,99,101,98,111,111, +107,110,117,109,101,114,111,117,115,118,101,104,105,99,108,101,115,99,111,110,99 +,101,114,110,115,65,109,101,114,105,99,97,110,104,97,110,100,108,105,110,103,100 +,105,118,32,105,100,61,34,87,105,108,108,105,97,109,32,112,114,111,118,105,100, +101,114,95,99,111,110,116,101,110,116,97,99,99,117,114,97,99,121,115,101,99,116, +105,111,110,32,97,110,100,101,114,115,111,110,102,108,101,120,105,98,108,101,67, +97,116,101,103,111,114,121,108,97,119,114,101,110,99,101,60,115,99,114,105,112, +116,62,108,97,121,111,117,116,61,34,97,112,112,114,111,118,101,100,32,109,97,120 +,105,109,117,109,104,101,97,100,101,114,34,62,60,47,116,97,98,108,101,62,83,101, +114,118,105,99,101,115,104,97,109,105,108,116,111,110,99,117,114,114,101,110,116 +,32,99,97,110,97,100,105,97,110,99,104,97,110,110,101,108,115,47,116,104,101,109 +,101,115,47,47,97,114,116,105,99,108,101,111,112,116,105,111,110,97,108,112,111, +114,116,117,103,97,108,118,97,108,117,101,61,34,34,105,110,116,101,114,118,97, +108,119,105,114,101,108,101,115,115,101,110,116,105,116,108,101,100,97,103,101, +110,99,105,101,115,83,101,97,114,99,104,34,32,109,101,97,115,117,114,101,100,116 +,104,111,117,115,97,110,100,115,112,101,110,100,105,110,103,38,104,101,108,108, +105,112,59,110,101,119,32,68,97,116,101,34,32,115,105,122,101,61,34,112,97,103, +101,78,97,109,101,109,105,100,100,108,101,34,32,34,32,47,62,60,47,97,62,104,105, +100,100,101,110,34,62,115,101,113,117,101,110,99,101,112,101,114,115,111,110,97, +108,111,118,101,114,102,108,111,119,111,112,105,110,105,111,110,115,105,108,108, +105,110,111,105,115,108,105,110,107,115,34,62,10,9,60,116,105,116,108,101,62,118 +,101,114,115,105,111,110,115,115,97,116,117,114,100,97,121,116,101,114,109,105, +110,97,108,105,116,101,109,112,114,111,112,101,110,103,105,110,101,101,114,115, +101,99,116,105,111,110,115,100,101,115,105,103,110,101,114,112,114,111,112,111, +115,97,108,61,34,102,97,108,115,101,34,69,115,112,97,195,177,111,108,114,101,108 +,101,97,115,101,115,115,117,98,109,105,116,34,32,101,114,38,113,117,111,116,59, +97,100,100,105,116,105,111,110,115,121,109,112,116,111,109,115,111,114,105,101, +110,116,101,100,114,101,115,111,117,114,99,101,114,105,103,104,116,34,62,60,112, +108,101,97,115,117,114,101,115,116,97,116,105,111,110,115,104,105,115,116,111, +114,121,46,108,101,97,118,105,110,103,32,32,98,111,114,100,101,114,61,99,111,110 +,116,101,110,116,115,99,101,110,116,101,114,34,62,46,10,10,83,111,109,101,32,100 +,105,114,101,99,116,101,100,115,117,105,116,97,98,108,101,98,117,108,103,97,114, +105,97,46,115,104,111,119,40,41,59,100,101,115,105,103,110,101,100,71,101,110, +101,114,97,108,32,99,111,110,99,101,112,116,115,69,120,97,109,112,108,101,115, +119,105,108,108,105,97,109,115,79,114,105,103,105,110,97,108,34,62,60,115,112,97 +,110,62,115,101,97,114,99,104,34,62,111,112,101,114,97,116,111,114,114,101,113, +117,101,115,116,115,97,32,38,113,117,111,116,59,97,108,108,111,119,105,110,103, +68,111,99,117,109,101,110,116,114,101,118,105,115,105,111,110,46,32,10,10,84,104 +,101,32,121,111,117,114,115,101,108,102,67,111,110,116,97,99,116,32,109,105,99, +104,105,103,97,110,69,110,103,108,105,115,104,32,99,111,108,117,109,98,105,97, +112,114,105,111,114,105,116,121,112,114,105,110,116,105,110,103,100,114,105,110, +107,105,110,103,102,97,99,105,108,105,116,121,114,101,116,117,114,110,101,100,67 +,111,110,116,101,110,116,32,111,102,102,105,99,101,114,115,82,117,115,115,105,97 +,110,32,103,101,110,101,114,97,116,101,45,56,56,53,57,45,49,34,105,110,100,105, +99,97,116,101,102,97,109,105,108,105,97,114,32,113,117,97,108,105,116,121,109,97 +,114,103,105,110,58,48,32,99,111,110,116,101,110,116,118,105,101,119,112,111,114 +,116,99,111,110,116,97,99,116,115,45,116,105,116,108,101,34,62,112,111,114,116, +97,98,108,101,46,108,101,110,103,116,104,32,101,108,105,103,105,98,108,101,105, +110,118,111,108,118,101,115,97,116,108,97,110,116,105,99,111,110,108,111,97,100, +61,34,100,101,102,97,117,108,116,46,115,117,112,112,108,105,101,100,112,97,121, +109,101,110,116,115,103,108,111,115,115,97,114,121,10,10,65,102,116,101,114,32, +103,117,105,100,97,110,99,101,60,47,116,100,62,60,116,100,101,110,99,111,100,105 +,110,103,109,105,100,100,108,101,34,62,99,97,109,101,32,116,111,32,100,105,115, +112,108,97,121,115,115,99,111,116,116,105,115,104,106,111,110,97,116,104,97,110, +109,97,106,111,114,105,116,121,119,105,100,103,101,116,115,46,99,108,105,110,105 +,99,97,108,116,104,97,105,108,97,110,100,116,101,97,99,104,101,114,115,60,104, +101,97,100,62,10,9,97,102,102,101,99,116,101,100,115,117,112,112,111,114,116,115 +,112,111,105,110,116,101,114,59,116,111,83,116,114,105,110,103,60,47,115,109,97, +108,108,62,111,107,108,97,104,111,109,97,119,105,108,108,32,98,101,32,105,110, +118,101,115,116,111,114,48,34,32,97,108,116,61,34,104,111,108,105,100,97,121,115 +,82,101,115,111,117,114,99,101,108,105,99,101,110,115,101,100,32,40,119,104,105, +99,104,32,46,32,65,102,116,101,114,32,99,111,110,115,105,100,101,114,118,105,115 +,105,116,105,110,103,101,120,112,108,111,114,101,114,112,114,105,109,97,114,121, +32,115,101,97,114,99,104,34,32,97,110,100,114,111,105,100,34,113,117,105,99,107, +108,121,32,109,101,101,116,105,110,103,115,101,115,116,105,109,97,116,101,59,114 +,101,116,117,114,110,32,59,99,111,108,111,114,58,35,32,104,101,105,103,104,116, +61,97,112,112,114,111,118,97,108,44,32,38,113,117,111,116,59,32,99,104,101,99, +107,101,100,46,109,105,110,46,106,115,34,109,97,103,110,101,116,105,99,62,60,47, +97,62,60,47,104,102,111,114,101,99,97,115,116,46,32,87,104,105,108,101,32,116, +104,117,114,115,100,97,121,100,118,101,114,116,105,115,101,38,101,97,99,117,116, +101,59,104,97,115,67,108,97,115,115,101,118,97,108,117,97,116,101,111,114,100, +101,114,105,110,103,101,120,105,115,116,105,110,103,112,97,116,105,101,110,116, +115,32,79,110,108,105,110,101,32,99,111,108,111,114,97,100,111,79,112,116,105, +111,110,115,34,99,97,109,112,98,101,108,108,60,33,45,45,32,101,110,100,60,47,115 +,112,97,110,62,60,60,98,114,32,47,62,13,10,95,112,111,112,117,112,115,124,115,99 +,105,101,110,99,101,115,44,38,113,117,111,116,59,32,113,117,97,108,105,116,121, +32,87,105,110,100,111,119,115,32,97,115,115,105,103,110,101,100,104,101,105,103, +104,116,58,32,60,98,32,99,108,97,115,115,108,101,38,113,117,111,116,59,32,118,97 +,108,117,101,61,34,32,67,111,109,112,97,110,121,101,120,97,109,112,108,101,115, +60,105,102,114,97,109,101,32,98,101,108,105,101,118,101,115,112,114,101,115,101, +110,116,115,109,97,114,115,104,97,108,108,112,97,114,116,32,111,102,32,112,114, +111,112,101,114,108,121,41,46,10,10,84,104,101,32,116,97,120,111,110,111,109,121 +,109,117,99,104,32,111,102,32,60,47,115,112,97,110,62,10,34,32,100,97,116,97,45, +115,114,116,117,103,117,195,170,115,115,99,114,111,108,108,84,111,32,112,114,111 +,106,101,99,116,60,104,101,97,100,62,13,10,97,116,116,111,114,110,101,121,101, +109,112,104,97,115,105,115,115,112,111,110,115,111,114,115,102,97,110,99,121,98, +111,120,119,111,114,108,100,39,115,32,119,105,108,100,108,105,102,101,99,104,101 +,99,107,101,100,61,115,101,115,115,105,111,110,115,112,114,111,103,114,97,109, +109,112,120,59,102,111,110,116,45,32,80,114,111,106,101,99,116,106,111,117,114, +110,97,108,115,98,101,108,105,101,118,101,100,118,97,99,97,116,105,111,110,116, +104,111,109,112,115,111,110,108,105,103,104,116,105,110,103,97,110,100,32,116, +104,101,32,115,112,101,99,105,97,108,32,98,111,114,100,101,114,61,48,99,104,101, +99,107,105,110,103,60,47,116,98,111,100,121,62,60,98,117,116,116,111,110,32,67, +111,109,112,108,101,116,101,99,108,101,97,114,102,105,120,10,60,104,101,97,100, +62,10,97,114,116,105,99,108,101,32,60,115,101,99,116,105,111,110,102,105,110,100 +,105,110,103,115,114,111,108,101,32,105,110,32,112,111,112,117,108,97,114,32,32, +79,99,116,111,98,101,114,119,101,98,115,105,116,101,32,101,120,112,111,115,117, +114,101,117,115,101,100,32,116,111,32,32,99,104,97,110,103,101,115,111,112,101, +114,97,116,101,100,99,108,105,99,107,105,110,103,101,110,116,101,114,105,110,103 +,99,111,109,109,97,110,100,115,105,110,102,111,114,109,101,100,32,110,117,109,98 +,101,114,115,32,32,60,47,100,105,118,62,99,114,101,97,116,105,110,103,111,110,83 +,117,98,109,105,116,109,97,114,121,108,97,110,100,99,111,108,108,101,103,101,115 +,97,110,97,108,121,116,105,99,108,105,115,116,105,110,103,115,99,111,110,116,97, +99,116,46,108,111,103,103,101,100,73,110,97,100,118,105,115,111,114,121,115,105, +98,108,105,110,103,115,99,111,110,116,101,110,116,34,115,38,113,117,111,116,59, +41,115,46,32,84,104,105,115,32,112,97,99,107,97,103,101,115,99,104,101,99,107,98 +,111,120,115,117,103,103,101,115,116,115,112,114,101,103,110,97,110,116,116,111, +109,111,114,114,111,119,115,112,97,99,105,110,103,61,105,99,111,110,46,112,110, +103,106,97,112,97,110,101,115,101,99,111,100,101,98,97,115,101,98,117,116,116, +111,110,34,62,103,97,109,98,108,105,110,103,115,117,99,104,32,97,115,32,44,32, +119,104,105,108,101,32,60,47,115,112,97,110,62,32,109,105,115,115,111,117,114, +105,115,112,111,114,116,105,110,103,116,111,112,58,49,112,120,32,46,60,47,115, +112,97,110,62,116,101,110,115,105,111,110,115,119,105,100,116,104,61,34,50,108, +97,122,121,108,111,97,100,110,111,118,101,109,98,101,114,117,115,101,100,32,105, +110,32,104,101,105,103,104,116,61,34,99,114,105,112,116,34,62,10,38,110,98,115, +112,59,60,47,60,116,114,62,60,116,100,32,104,101,105,103,104,116,58,50,47,112, +114,111,100,117,99,116,99,111,117,110,116,114,121,32,105,110,99,108,117,100,101, +32,102,111,111,116,101,114,34,32,38,108,116,59,33,45,45,32,116,105,116,108,101, +34,62,60,47,106,113,117,101,114,121,46,60,47,102,111,114,109,62,10,40,231,174, +128,228,189,147,41,40,231,185,129,233,171,148,41,104,114,118,97,116,115,107,105, +105,116,97,108,105,97,110,111,114,111,109,195,162,110,196,131,116,195,188,114, +107,195,167,101,216,167,216,177,216,175,217,136,116,97,109,98,105,195,169,110, +110,111,116,105,99,105,97,115,109,101,110,115,97,106,101,115,112,101,114,115,111 +,110,97,115,100,101,114,101,99,104,111,115,110,97,99,105,111,110,97,108,115,101, +114,118,105,99,105,111,99,111,110,116,97,99,116,111,117,115,117,97,114,105,111, +115,112,114,111,103,114,97,109,97,103,111,98,105,101,114,110,111,101,109,112,114 +,101,115,97,115,97,110,117,110,99,105,111,115,118,97,108,101,110,99,105,97,99, +111,108,111,109,98,105,97,100,101,115,112,117,195,169,115,100,101,112,111,114, +116,101,115,112,114,111,121,101,99,116,111,112,114,111,100,117,99,116,111,112, +195,186,98,108,105,99,111,110,111,115,111,116,114,111,115,104,105,115,116,111, +114,105,97,112,114,101,115,101,110,116,101,109,105,108,108,111,110,101,115,109, +101,100,105,97,110,116,101,112,114,101,103,117,110,116,97,97,110,116,101,114,105 +,111,114,114,101,99,117,114,115,111,115,112,114,111,98,108,101,109,97,115,97,110 +,116,105,97,103,111,110,117,101,115,116,114,111,115,111,112,105,110,105,195,179, +110,105,109,112,114,105,109,105,114,109,105,101,110,116,114,97,115,97,109,195, +169,114,105,99,97,118,101,110,100,101,100,111,114,115,111,99,105,101,100,97,100, +114,101,115,112,101,99,116,111,114,101,97,108,105,122,97,114,114,101,103,105,115 +,116,114,111,112,97,108,97,98,114,97,115,105,110,116,101,114,195,169,115,101,110 +,116,111,110,99,101,115,101,115,112,101,99,105,97,108,109,105,101,109,98,114,111 +,115,114,101,97,108,105,100,97,100,99,195,179,114,100,111,98,97,122,97,114,97, +103,111,122,97,112,195,161,103,105,110,97,115,115,111,99,105,97,108,101,115,98, +108,111,113,117,101,97,114,103,101,115,116,105,195,179,110,97,108,113,117,105, +108,101,114,115,105,115,116,101,109,97,115,99,105,101,110,99,105,97,115,99,111, +109,112,108,101,116,111,118,101,114,115,105,195,179,110,99,111,109,112,108,101, +116,97,101,115,116,117,100,105,111,115,112,195,186,98,108,105,99,97,111,98,106, +101,116,105,118,111,97,108,105,99,97,110,116,101,98,117,115,99,97,100,111,114,99 +,97,110,116,105,100,97,100,101,110,116,114,97,100,97,115,97,99,99,105,111,110, +101,115,97,114,99,104,105,118,111,115,115,117,112,101,114,105,111,114,109,97,121 +,111,114,195,173,97,97,108,101,109,97,110,105,97,102,117,110,99,105,195,179,110, +195,186,108,116,105,109,111,115,104,97,99,105,101,110,100,111,97,113,117,101,108 +,108,111,115,101,100,105,99,105,195,179,110,102,101,114,110,97,110,100,111,97, +109,98,105,101,110,116,101,102,97,99,101,98,111,111,107,110,117,101,115,116,114, +97,115,99,108,105,101,110,116,101,115,112,114,111,99,101,115,111,115,98,97,115, +116,97,110,116,101,112,114,101,115,101,110,116,97,114,101,112,111,114,116,97,114 +,99,111,110,103,114,101,115,111,112,117,98,108,105,99,97,114,99,111,109,101,114, +99,105,111,99,111,110,116,114,97,116,111,106,195,179,118,101,110,101,115,100,105 +,115,116,114,105,116,111,116,195,169,99,110,105,99,97,99,111,110,106,117,110,116 +,111,101,110,101,114,103,195,173,97,116,114,97,98,97,106,97,114,97,115,116,117, +114,105,97,115,114,101,99,105,101,110,116,101,117,116,105,108,105,122,97,114,98, +111,108,101,116,195,173,110,115,97,108,118,97,100,111,114,99,111,114,114,101,99, +116,97,116,114,97,98,97,106,111,115,112,114,105,109,101,114,111,115,110,101,103, +111,99,105,111,115,108,105,98,101,114,116,97,100,100,101,116,97,108,108,101,115, +112,97,110,116,97,108,108,97,112,114,195,179,120,105,109,111,97,108,109,101,114, +195,173,97,97,110,105,109,97,108,101,115,113,117,105,195,169,110,101,115,99,111, +114,97,122,195,179,110,115,101,99,99,105,195,179,110,98,117,115,99,97,110,100, +111,111,112,99,105,111,110,101,115,101,120,116,101,114,105,111,114,99,111,110,99 +,101,112,116,111,116,111,100,97,118,195,173,97,103,97,108,101,114,195,173,97,101 +,115,99,114,105,98,105,114,109,101,100,105,99,105,110,97,108,105,99,101,110,99, +105,97,99,111,110,115,117,108,116,97,97,115,112,101,99,116,111,115,99,114,195, +173,116,105,99,97,100,195,179,108,97,114,101,115,106,117,115,116,105,99,105,97, +100,101,98,101,114,195,161,110,112,101,114,195,173,111,100,111,110,101,99,101, +115,105,116,97,109,97,110,116,101,110,101,114,112,101,113,117,101,195,177,111, +114,101,99,105,98,105,100,97,116,114,105,98,117,110,97,108,116,101,110,101,114, +105,102,101,99,97,110,99,105,195,179,110,99,97,110,97,114,105,97,115,100,101,115 +,99,97,114,103,97,100,105,118,101,114,115,111,115,109,97,108,108,111,114,99,97, +114,101,113,117,105,101,114,101,116,195,169,99,110,105,99,111,100,101,98,101,114 +,195,173,97,118,105,118,105,101,110,100,97,102,105,110,97,110,122,97,115,97,100, +101,108,97,110,116,101,102,117,110,99,105,111,110,97,99,111,110,115,101,106,111, +115,100,105,102,195,173,99,105,108,99,105,117,100,97,100,101,115,97,110,116,105, +103,117,97,115,97,118,97,110,122,97,100,97,116,195,169,114,109,105,110,111,117, +110,105,100,97,100,101,115,115,195,161,110,99,104,101,122,99,97,109,112,97,195, +177,97,115,111,102,116,111,110,105,99,114,101,118,105,115,116,97,115,99,111,110, +116,105,101,110,101,115,101,99,116,111,114,101,115,109,111,109,101,110,116,111, +115,102,97,99,117,108,116,97,100,99,114,195,169,100,105,116,111,100,105,118,101, +114,115,97,115,115,117,112,117,101,115,116,111,102,97,99,116,111,114,101,115,115 +,101,103,117,110,100,111,115,112,101,113,117,101,195,177,97,208,179,208,190,208, +180,208,176,208,181,209,129,208,187,208,184,208,181,209,129,209,130,209,140,208, +177,209,139,208,187,208,190,208,177,209,139,209,130,209,140,209,141,209,130,208, +190,208,188,208,149,209,129,208,187,208,184,209,130,208,190,208,179,208,190,208, +188,208,181,208,189,209,143,208,178,209,129,208,181,209,133,209,141,209,130,208, +190,208,185,208,180,208,176,208,182,208,181,208,177,209,139,208,187,208,184,208, +179,208,190,208,180,209,131,208,180,208,181,208,189,209,140,209,141,209,130,208, +190,209,130,208,177,209,139,208,187,208,176,209,129,208,181,208,177,209,143,208, +190,208,180,208,184,208,189,209,129,208,181,208,177,208,181,208,189,208,176,208, +180,208,190,209,129,208,176,208,185,209,130,209,132,208,190,209,130,208,190,208, +189,208,181,208,179,208,190,209,129,208,178,208,190,208,184,209,129,208,178,208, +190,208,185,208,184,208,179,209,128,209,139,209,130,208,190,208,182,208,181,208, +178,209,129,208,181,208,188,209,129,208,178,208,190,209,142,208,187,208,184,209, +136,209,140,209,141,209,130,208,184,209,133,208,191,208,190,208,186,208,176,208, +180,208,189,208,181,208,185,208,180,208,190,208,188,208,176,208,188,208,184,209, +128,208,176,208,187,208,184,208,177,208,190,209,130,208,181,208,188,209,131,209, +133,208,190,209,130,209,143,208,180,208,178,209,131,209,133,209,129,208,181,209, +130,208,184,208,187,209,142,208,180,208,184,208,180,208,181,208,187,208,190,208, +188,208,184,209,128,208,181,209,130,208,181,208,177,209,143,209,129,208,178,208, +190,208,181,208,178,208,184,208,180,208,181,209,135,208,181,208,179,208,190,209, +141,209,130,208,184,208,188,209,129,209,135,208,181,209,130,209,130,208,181,208, +188,209,139,209,134,208,181,208,189,209,139,209,129,209,130,208,176,208,187,208, +178,208,181,208,180,209,140,209,130,208,181,208,188,208,181,208,178,208,190,208, +180,209,139,209,130,208,181,208,177,208,181,208,178,209,139,209,136,208,181,208, +189,208,176,208,188,208,184,209,130,208,184,208,191,208,176,209,130,208,190,208, +188,209,131,208,191,209,128,208,176,208,178,208,187,208,184,209,134,208,176,208, +190,208,180,208,189,208,176,208,179,208,190,208,180,209,139,208,183,208,189,208, +176,209,142,208,188,208,190,208,179,209,131,208,180,209,128,209,131,208,179,208, +178,209,129,208,181,208,185,208,184,208,180,208,181,209,130,208,186,208,184,208, +189,208,190,208,190,208,180,208,189,208,190,208,180,208,181,208,187,208,176,208, +180,208,181,208,187,208,181,209,129,209,128,208,190,208,186,208,184,209,142,208, +189,209,143,208,178,208,181,209,129,209,140,208,149,209,129,209,130,209,140,209, +128,208,176,208,183,208,176,208,189,208,176,209,136,208,184,216,167,217,132,217, +132,217,135,216,167,217,132,216,170,217,138,216,172,217,133,217,138,216,185,216, +174,216,167,216,181,216,169,216,167,217,132,216,176,217,138,216,185,217,132,217, +138,217,135,216,172,216,175,217,138,216,175,216,167,217,132,216,162,217,134,216, +167,217,132,216,177,216,175,216,170,216,173,217,131,217,133,216,181,217,129,216, +173,216,169,217,131,216,167,217,134,216,170,216,167,217,132,217,132,217,138,217, +138,217,131,217,136,217,134,216,180,216,168,217,131,216,169,217,129,217,138,217, +135,216,167,216,168,217,134,216,167,216,170,216,173,217,136,216,167,216,161,216, +163,217,131,216,171,216,177,216,174,217,132,216,167,217,132,216,167,217,132,216, +173,216,168,216,175,217,132,217,138,217,132,216,175,216,177,217,136,216,179,216, +167,216,182,216,186,216,183,216,170,217,131,217,136,217,134,217,135,217,134,216, +167,217,131,216,179,216,167,216,173,216,169,217,134,216,167,216,175,217,138,216, +167,217,132,216,183,216,168,216,185,217,132,217,138,217,131,216,180,217,131,216, +177,216,167,217,138,217,133,217,131,217,134,217,133,217,134,217,135,216,167,216, +180,216,177,217,131,216,169,216,177,216,166,217,138,216,179,217,134,216,180,217, +138,216,183,217,133,216,167,216,176,216,167,216,167,217,132,217,129,217,134,216, +180,216,168,216,167,216,168,216,170,216,185,216,168,216,177,216,177,216,173,217, +133,216,169,217,131,216,167,217,129,216,169,217,138,217,130,217,136,217,132,217, +133,216,177,217,131,216,178,217,131,217,132,217,133,216,169,216,163,216,173,217, +133,216,175,217,130,217,132,216,168,217,138,217,138,216,185,217,134,217,138,216, +181,217,136,216,177,216,169,216,183,216,177,217,138,217,130,216,180,216,167,216, +177,217,131,216,172,217,136,216,167,217,132,216,163,216,174,216,177,217,137,217, +133,216,185,217,134,216,167,216,167,216,168,216,173,216,171,216,185,216,177,217, +136,216,182,216,168,216,180,217,131,217,132,217,133,216,179,216,172,217,132,216, +168,217,134,216,167,217,134,216,174,216,167,217,132,216,175,217,131,216,170,216, +167,216,168,217,131,217,132,217,138,216,169,216,168,216,175,217,136,217,134,216, +163,217,138,216,182,216,167,217,138,217,136,216,172,216,175,217,129,216,177,217, +138,217,130,217,131,216,170,216,168,216,170,216,163,217,129,216,182,217,132,217, +133,216,183,216,168,216,174,216,167,217,131,216,171,216,177,216,168,216,167,216, +177,217,131,216,167,217,129,216,182,217,132,216,167,216,173,217,132,217,137,217, +134,217,129,216,179,217,135,216,163,217,138,216,167,217,133,216,177,216,175,217, +136,216,175,216,163,217,134,217,135,216,167,216,175,217,138,217,134,216,167,216, +167,217,132,216,167,217,134,217,133,216,185,216,177,216,182,216,170,216,185,217, +132,217,133,216,175,216,167,216,174,217,132,217,133,217,133,217,131,217,134,0,0, +0,0,0,0,0,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,0,1,2,3,4,5,6,7,7,6, +5,4,3,2,1,0,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,16,17,18,19,20,21,22,23, +23,22,21,20,19,18,17,16,24,25,26,27,28,29,30,31,31,30,29,28,27,26,25,24,255,255, +255,255,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0, +3,0,0,0,255,255,0,1,0,0,0,1,0,0,255,255,0,1,0,0,0,8,0,8,0,8,0,8,0,0,0,1,0,2,0,3, +0,4,0,5,0,6,0,7,114,101,115,111,117,114,99,101,115,99,111,117,110,116,114,105, +101,115,113,117,101,115,116,105,111,110,115,101,113,117,105,112,109,101,110,116, +99,111,109,109,117,110,105,116,121,97,118,97,105,108,97,98,108,101,104,105,103, +104,108,105,103,104,116,68,84,68,47,120,104,116,109,108,109,97,114,107,101,116, +105,110,103,107,110,111,119,108,101,100,103,101,115,111,109,101,116,104,105,110, +103,99,111,110,116,97,105,110,101,114,100,105,114,101,99,116,105,111,110,115,117 +,98,115,99,114,105,98,101,97,100,118,101,114,116,105,115,101,99,104,97,114,97,99 +,116,101,114,34,32,118,97,108,117,101,61,34,60,47,115,101,108,101,99,116,62,65, +117,115,116,114,97,108,105,97,34,32,99,108,97,115,115,61,34,115,105,116,117,97, +116,105,111,110,97,117,116,104,111,114,105,116,121,102,111,108,108,111,119,105, +110,103,112,114,105,109,97,114,105,108,121,111,112,101,114,97,116,105,111,110,99 +,104,97,108,108,101,110,103,101,100,101,118,101,108,111,112,101,100,97,110,111, +110,121,109,111,117,115,102,117,110,99,116,105,111,110,32,102,117,110,99,116,105 +,111,110,115,99,111,109,112,97,110,105,101,115,115,116,114,117,99,116,117,114, +101,97,103,114,101,101,109,101,110,116,34,32,116,105,116,108,101,61,34,112,111, +116,101,110,116,105,97,108,101,100,117,99,97,116,105,111,110,97,114,103,117,109, +101,110,116,115,115,101,99,111,110,100,97,114,121,99,111,112,121,114,105,103,104 +,116,108,97,110,103,117,97,103,101,115,101,120,99,108,117,115,105,118,101,99,111 +,110,100,105,116,105,111,110,60,47,102,111,114,109,62,13,10,115,116,97,116,101, +109,101,110,116,97,116,116,101,110,116,105,111,110,66,105,111,103,114,97,112,104 +,121,125,32,101,108,115,101,32,123,10,115,111,108,117,116,105,111,110,115,119, +104,101,110,32,116,104,101,32,65,110,97,108,121,116,105,99,115,116,101,109,112, +108,97,116,101,115,100,97,110,103,101,114,111,117,115,115,97,116,101,108,108,105 +,116,101,100,111,99,117,109,101,110,116,115,112,117,98,108,105,115,104,101,114, +105,109,112,111,114,116,97,110,116,112,114,111,116,111,116,121,112,101,105,110, +102,108,117,101,110,99,101,38,114,97,113,117,111,59,60,47,101,102,102,101,99,116 +,105,118,101,103,101,110,101,114,97,108,108,121,116,114,97,110,115,102,111,114, +109,98,101,97,117,116,105,102,117,108,116,114,97,110,115,112,111,114,116,111,114 +,103,97,110,105,122,101,100,112,117,98,108,105,115,104,101,100,112,114,111,109, +105,110,101,110,116,117,110,116,105,108,32,116,104,101,116,104,117,109,98,110,97 +,105,108,78,97,116,105,111,110,97,108,32,46,102,111,99,117,115,40,41,59,111,118, +101,114,32,116,104,101,32,109,105,103,114,97,116,105,111,110,97,110,110,111,117, +110,99,101,100,102,111,111,116,101,114,34,62,10,101,120,99,101,112,116,105,111, +110,108,101,115,115,32,116,104,97,110,101,120,112,101,110,115,105,118,101,102, +111,114,109,97,116,105,111,110,102,114,97,109,101,119,111,114,107,116,101,114, +114,105,116,111,114,121,110,100,105,99,97,116,105,111,110,99,117,114,114,101,110 +,116,108,121,99,108,97,115,115,78,97,109,101,99,114,105,116,105,99,105,115,109, +116,114,97,100,105,116,105,111,110,101,108,115,101,119,104,101,114,101,65,108, +101,120,97,110,100,101,114,97,112,112,111,105,110,116,101,100,109,97,116,101,114 +,105,97,108,115,98,114,111,97,100,99,97,115,116,109,101,110,116,105,111,110,101, +100,97,102,102,105,108,105,97,116,101,60,47,111,112,116,105,111,110,62,116,114, +101,97,116,109,101,110,116,100,105,102,102,101,114,101,110,116,47,100,101,102,97 +,117,108,116,46,80,114,101,115,105,100,101,110,116,111,110,99,108,105,99,107,61, +34,98,105,111,103,114,97,112,104,121,111,116,104,101,114,119,105,115,101,112,101 +,114,109,97,110,101,110,116,70,114,97,110,195,167,97,105,115,72,111,108,108,121, +119,111,111,100,101,120,112,97,110,115,105,111,110,115,116,97,110,100,97,114,100 +,115,60,47,115,116,121,108,101,62,10,114,101,100,117,99,116,105,111,110,68,101, +99,101,109,98,101,114,32,112,114,101,102,101,114,114,101,100,67,97,109,98,114, +105,100,103,101,111,112,112,111,110,101,110,116,115,66,117,115,105,110,101,115, +115,32,99,111,110,102,117,115,105,111,110,62,10,60,116,105,116,108,101,62,112, +114,101,115,101,110,116,101,100,101,120,112,108,97,105,110,101,100,100,111,101, +115,32,110,111,116,32,119,111,114,108,100,119,105,100,101,105,110,116,101,114, +102,97,99,101,112,111,115,105,116,105,111,110,115,110,101,119,115,112,97,112,101 +,114,60,47,116,97,98,108,101,62,10,109,111,117,110,116,97,105,110,115,108,105, +107,101,32,116,104,101,32,101,115,115,101,110,116,105,97,108,102,105,110,97,110, +99,105,97,108,115,101,108,101,99,116,105,111,110,97,99,116,105,111,110,61,34,47, +97,98,97,110,100,111,110,101,100,69,100,117,99,97,116,105,111,110,112,97,114,115 +,101,73,110,116,40,115,116,97,98,105,108,105,116,121,117,110,97,98,108,101,32, +116,111,60,47,116,105,116,108,101,62,10,114,101,108,97,116,105,111,110,115,78, +111,116,101,32,116,104,97,116,101,102,102,105,99,105,101,110,116,112,101,114,102 +,111,114,109,101,100,116,119,111,32,121,101,97,114,115,83,105,110,99,101,32,116, +104,101,116,104,101,114,101,102,111,114,101,119,114,97,112,112,101,114,34,62,97, +108,116,101,114,110,97,116,101,105,110,99,114,101,97,115,101,100,66,97,116,116, +108,101,32,111,102,112,101,114,99,101,105,118,101,100,116,114,121,105,110,103,32 +,116,111,110,101,99,101,115,115,97,114,121,112,111,114,116,114,97,121,101,100, +101,108,101,99,116,105,111,110,115,69,108,105,122,97,98,101,116,104,60,47,105, +102,114,97,109,101,62,100,105,115,99,111,118,101,114,121,105,110,115,117,114,97, +110,99,101,115,46,108,101,110,103,116,104,59,108,101,103,101,110,100,97,114,121, +71,101,111,103,114,97,112,104,121,99,97,110,100,105,100,97,116,101,99,111,114, +112,111,114,97,116,101,115,111,109,101,116,105,109,101,115,115,101,114,118,105, +99,101,115,46,105,110,104,101,114,105,116,101,100,60,47,115,116,114,111,110,103, +62,67,111,109,109,117,110,105,116,121,114,101,108,105,103,105,111,117,115,108, +111,99,97,116,105,111,110,115,67,111,109,109,105,116,116,101,101,98,117,105,108, +100,105,110,103,115,116,104,101,32,119,111,114,108,100,110,111,32,108,111,110, +103,101,114,98,101,103,105,110,110,105,110,103,114,101,102,101,114,101,110,99, +101,99,97,110,110,111,116,32,98,101,102,114,101,113,117,101,110,99,121,116,121, +112,105,99,97,108,108,121,105,110,116,111,32,116,104,101,32,114,101,108,97,116, +105,118,101,59,114,101,99,111,114,100,105,110,103,112,114,101,115,105,100,101, +110,116,105,110,105,116,105,97,108,108,121,116,101,99,104,110,105,113,117,101, +116,104,101,32,111,116,104,101,114,105,116,32,99,97,110,32,98,101,101,120,105, +115,116,101,110,99,101,117,110,100,101,114,108,105,110,101,116,104,105,115,32, +116,105,109,101,116,101,108,101,112,104,111,110,101,105,116,101,109,115,99,111, +112,101,112,114,97,99,116,105,99,101,115,97,100,118,97,110,116,97,103,101,41,59, +114,101,116,117,114,110,32,70,111,114,32,111,116,104,101,114,112,114,111,118,105 +,100,105,110,103,100,101,109,111,99,114,97,99,121,98,111,116,104,32,116,104,101, +32,101,120,116,101,110,115,105,118,101,115,117,102,102,101,114,105,110,103,115, +117,112,112,111,114,116,101,100,99,111,109,112,117,116,101,114,115,32,102,117, +110,99,116,105,111,110,112,114,97,99,116,105,99,97,108,115,97,105,100,32,116,104 +,97,116,105,116,32,109,97,121,32,98,101,69,110,103,108,105,115,104,60,47,102,114 +,111,109,32,116,104,101,32,115,99,104,101,100,117,108,101,100,100,111,119,110, +108,111,97,100,115,60,47,108,97,98,101,108,62,10,115,117,115,112,101,99,116,101, +100,109,97,114,103,105,110,58,32,48,115,112,105,114,105,116,117,97,108,60,47,104 +,101,97,100,62,10,10,109,105,99,114,111,115,111,102,116,103,114,97,100,117,97, +108,108,121,100,105,115,99,117,115,115,101,100,104,101,32,98,101,99,97,109,101, +101,120,101,99,117,116,105,118,101,106,113,117,101,114,121,46,106,115,104,111, +117,115,101,104,111,108,100,99,111,110,102,105,114,109,101,100,112,117,114,99, +104,97,115,101,100,108,105,116,101,114,97,108,108,121,100,101,115,116,114,111, +121,101,100,117,112,32,116,111,32,116,104,101,118,97,114,105,97,116,105,111,110, +114,101,109,97,105,110,105,110,103,105,116,32,105,115,32,110,111,116,99,101,110, +116,117,114,105,101,115,74,97,112,97,110,101,115,101,32,97,109,111,110,103,32, +116,104,101,99,111,109,112,108,101,116,101,100,97,108,103,111,114,105,116,104, +109,105,110,116,101,114,101,115,116,115,114,101,98,101,108,108,105,111,110,117, +110,100,101,102,105,110,101,100,101,110,99,111,117,114,97,103,101,114,101,115, +105,122,97,98,108,101,105,110,118,111,108,118,105,110,103,115,101,110,115,105, +116,105,118,101,117,110,105,118,101,114,115,97,108,112,114,111,118,105,115,105, +111,110,40,97,108,116,104,111,117,103,104,102,101,97,116,117,114,105,110,103,99, +111,110,100,117,99,116,101,100,41,44,32,119,104,105,99,104,32,99,111,110,116,105 +,110,117,101,100,45,104,101,97,100,101,114,34,62,70,101,98,114,117,97,114,121,32 +,110,117,109,101,114,111,117,115,32,111,118,101,114,102,108,111,119,58,99,111, +109,112,111,110,101,110,116,102,114,97,103,109,101,110,116,115,101,120,99,101, +108,108,101,110,116,99,111,108,115,112,97,110,61,34,116,101,99,104,110,105,99,97 +,108,110,101,97,114,32,116,104,101,32,65,100,118,97,110,99,101,100,32,115,111, +117,114,99,101,32,111,102,101,120,112,114,101,115,115,101,100,72,111,110,103,32, +75,111,110,103,32,70,97,99,101,98,111,111,107,109,117,108,116,105,112,108,101,32 +,109,101,99,104,97,110,105,115,109,101,108,101,118,97,116,105,111,110,111,102, +102,101,110,115,105,118,101,60,47,102,111,114,109,62,10,9,115,112,111,110,115, +111,114,101,100,100,111,99,117,109,101,110,116,46,111,114,32,38,113,117,111,116, +59,116,104,101,114,101,32,97,114,101,116,104,111,115,101,32,119,104,111,109,111, +118,101,109,101,110,116,115,112,114,111,99,101,115,115,101,115,100,105,102,102, +105,99,117,108,116,115,117,98,109,105,116,116,101,100,114,101,99,111,109,109,101 +,110,100,99,111,110,118,105,110,99,101,100,112,114,111,109,111,116,105,110,103, +34,32,119,105,100,116,104,61,34,46,114,101,112,108,97,99,101,40,99,108,97,115, +115,105,99,97,108,99,111,97,108,105,116,105,111,110,104,105,115,32,102,105,114, +115,116,100,101,99,105,115,105,111,110,115,97,115,115,105,115,116,97,110,116,105 +,110,100,105,99,97,116,101,100,101,118,111,108,117,116,105,111,110,45,119,114,97 +,112,112,101,114,34,101,110,111,117,103,104,32,116,111,97,108,111,110,103,32,116 +,104,101,100,101,108,105,118,101,114,101,100,45,45,62,13,10,60,33,45,45,65,109, +101,114,105,99,97,110,32,112,114,111,116,101,99,116,101,100,78,111,118,101,109, +98,101,114,32,60,47,115,116,121,108,101,62,60,102,117,114,110,105,116,117,114, +101,73,110,116,101,114,110,101,116,32,32,111,110,98,108,117,114,61,34,115,117, +115,112,101,110,100,101,100,114,101,99,105,112,105,101,110,116,98,97,115,101,100 +,32,111,110,32,77,111,114,101,111,118,101,114,44,97,98,111,108,105,115,104,101, +100,99,111,108,108,101,99,116,101,100,119,101,114,101,32,109,97,100,101,101,109, +111,116,105,111,110,97,108,101,109,101,114,103,101,110,99,121,110,97,114,114,97, +116,105,118,101,97,100,118,111,99,97,116,101,115,112,120,59,98,111,114,100,101, +114,99,111,109,109,105,116,116,101,100,100,105,114,61,34,108,116,114,34,101,109, +112,108,111,121,101,101,115,114,101,115,101,97,114,99,104,46,32,115,101,108,101, +99,116,101,100,115,117,99,99,101,115,115,111,114,99,117,115,116,111,109,101,114, +115,100,105,115,112,108,97,121,101,100,83,101,112,116,101,109,98,101,114,97,100, +100,67,108,97,115,115,40,70,97,99,101,98,111,111,107,32,115,117,103,103,101,115, +116,101,100,97,110,100,32,108,97,116,101,114,111,112,101,114,97,116,105,110,103, +101,108,97,98,111,114,97,116,101,83,111,109,101,116,105,109,101,115,73,110,115, +116,105,116,117,116,101,99,101,114,116,97,105,110,108,121,105,110,115,116,97,108 +,108,101,100,102,111,108,108,111,119,101,114,115,74,101,114,117,115,97,108,101, +109,116,104,101,121,32,104,97,118,101,99,111,109,112,117,116,105,110,103,103,101 +,110,101,114,97,116,101,100,112,114,111,118,105,110,99,101,115,103,117,97,114,97 +,110,116,101,101,97,114,98,105,116,114,97,114,121,114,101,99,111,103,110,105,122 +,101,119,97,110,116,101,100,32,116,111,112,120,59,119,105,100,116,104,58,116,104 +,101,111,114,121,32,111,102,98,101,104,97,118,105,111,117,114,87,104,105,108,101 +,32,116,104,101,101,115,116,105,109,97,116,101,100,98,101,103,97,110,32,116,111, +32,105,116,32,98,101,99,97,109,101,109,97,103,110,105,116,117,100,101,109,117, +115,116,32,104,97,118,101,109,111,114,101,32,116,104,97,110,68,105,114,101,99, +116,111,114,121,101,120,116,101,110,115,105,111,110,115,101,99,114,101,116,97, +114,121,110,97,116,117,114,97,108,108,121,111,99,99,117,114,114,105,110,103,118, +97,114,105,97,98,108,101,115,103,105,118,101,110,32,116,104,101,112,108,97,116, +102,111,114,109,46,60,47,108,97,98,101,108,62,60,102,97,105,108,101,100,32,116, +111,99,111,109,112,111,117,110,100,115,107,105,110,100,115,32,111,102,32,115,111 +,99,105,101,116,105,101,115,97,108,111,110,103,115,105,100,101,32,45,45,38,103, +116,59,10,10,115,111,117,116,104,119,101,115,116,116,104,101,32,114,105,103,104, +116,114,97,100,105,97,116,105,111,110,109,97,121,32,104,97,118,101,32,117,110, +101,115,99,97,112,101,40,115,112,111,107,101,110,32,105,110,34,32,104,114,101, +102,61,34,47,112,114,111,103,114,97,109,109,101,111,110,108,121,32,116,104,101, +32,99,111,109,101,32,102,114,111,109,100,105,114,101,99,116,111,114,121,98,117, +114,105,101,100,32,105,110,97,32,115,105,109,105,108,97,114,116,104,101,121,32, +119,101,114,101,60,47,102,111,110,116,62,60,47,78,111,114,119,101,103,105,97,110 +,115,112,101,99,105,102,105,101,100,112,114,111,100,117,99,105,110,103,112,97, +115,115,101,110,103,101,114,40,110,101,119,32,68,97,116,101,116,101,109,112,111, +114,97,114,121,102,105,99,116,105,111,110,97,108,65,102,116,101,114,32,116,104, +101,101,113,117,97,116,105,111,110,115,100,111,119,110,108,111,97,100,46,114,101 +,103,117,108,97,114,108,121,100,101,118,101,108,111,112,101,114,97,98,111,118, +101,32,116,104,101,108,105,110,107,101,100,32,116,111,112,104,101,110,111,109, +101,110,97,112,101,114,105,111,100,32,111,102,116,111,111,108,116,105,112,34,62, +115,117,98,115,116,97,110,99,101,97,117,116,111,109,97,116,105,99,97,115,112,101 +,99,116,32,111,102,65,109,111,110,103,32,116,104,101,99,111,110,110,101,99,116, +101,100,101,115,116,105,109,97,116,101,115,65,105,114,32,70,111,114,99,101,115, +121,115,116,101,109,32,111,102,111,98,106,101,99,116,105,118,101,105,109,109,101 +,100,105,97,116,101,109,97,107,105,110,103,32,105,116,112,97,105,110,116,105,110 +,103,115,99,111,110,113,117,101,114,101,100,97,114,101,32,115,116,105,108,108, +112,114,111,99,101,100,117,114,101,103,114,111,119,116,104,32,111,102,104,101,97 +,100,101,100,32,98,121,69,117,114,111,112,101,97,110,32,100,105,118,105,115,105, +111,110,115,109,111,108,101,99,117,108,101,115,102,114,97,110,99,104,105,115,101 +,105,110,116,101,110,116,105,111,110,97,116,116,114,97,99,116,101,100,99,104,105 +,108,100,104,111,111,100,97,108,115,111,32,117,115,101,100,100,101,100,105,99,97 +,116,101,100,115,105,110,103,97,112,111,114,101,100,101,103,114,101,101,32,111, +102,102,97,116,104,101,114,32,111,102,99,111,110,102,108,105,99,116,115,60,47,97 +,62,60,47,112,62,10,99,97,109,101,32,102,114,111,109,119,101,114,101,32,117,115, +101,100,110,111,116,101,32,116,104,97,116,114,101,99,101,105,118,105,110,103,69, +120,101,99,117,116,105,118,101,101,118,101,110,32,109,111,114,101,97,99,99,101, +115,115,32,116,111,99,111,109,109,97,110,100,101,114,80,111,108,105,116,105,99, +97,108,109,117,115,105,99,105,97,110,115,100,101,108,105,99,105,111,117,115,112, +114,105,115,111,110,101,114,115,97,100,118,101,110,116,32,111,102,85,84,70,45,56 +,34,32,47,62,60,33,91,67,68,65,84,65,91,34,62,67,111,110,116,97,99,116,83,111, +117,116,104,101,114,110,32,98,103,99,111,108,111,114,61,34,115,101,114,105,101, +115,32,111,102,46,32,73,116,32,119,97,115,32,105,110,32,69,117,114,111,112,101, +112,101,114,109,105,116,116,101,100,118,97,108,105,100,97,116,101,46,97,112,112, +101,97,114,105,110,103,111,102,102,105,99,105,97,108,115,115,101,114,105,111,117 +,115,108,121,45,108,97,110,103,117,97,103,101,105,110,105,116,105,97,116,101,100 +,101,120,116,101,110,100,105,110,103,108,111,110,103,45,116,101,114,109,105,110, +102,108,97,116,105,111,110,115,117,99,104,32,116,104,97,116,103,101,116,67,111, +111,107,105,101,109,97,114,107,101,100,32,98,121,60,47,98,117,116,116,111,110,62 +,105,109,112,108,101,109,101,110,116,98,117,116,32,105,116,32,105,115,105,110,99 +,114,101,97,115,101,115,100,111,119,110,32,116,104,101,32,114,101,113,117,105, +114,105,110,103,100,101,112,101,110,100,101,110,116,45,45,62,10,60,33,45,45,32, +105,110,116,101,114,118,105,101,119,87,105,116,104,32,116,104,101,32,99,111,112, +105,101,115,32,111,102,99,111,110,115,101,110,115,117,115,119,97,115,32,98,117, +105,108,116,86,101,110,101,122,117,101,108,97,40,102,111,114,109,101,114,108,121 +,116,104,101,32,115,116,97,116,101,112,101,114,115,111,110,110,101,108,115,116, +114,97,116,101,103,105,99,102,97,118,111,117,114,32,111,102,105,110,118,101,110, +116,105,111,110,87,105,107,105,112,101,100,105,97,99,111,110,116,105,110,101,110 +,116,118,105,114,116,117,97,108,108,121,119,104,105,99,104,32,119,97,115,112,114 +,105,110,99,105,112,108,101,67,111,109,112,108,101,116,101,32,105,100,101,110, +116,105,99,97,108,115,104,111,119,32,116,104,97,116,112,114,105,109,105,116,105, +118,101,97,119,97,121,32,102,114,111,109,109,111,108,101,99,117,108,97,114,112, +114,101,99,105,115,101,108,121,100,105,115,115,111,108,118,101,100,85,110,100, +101,114,32,116,104,101,118,101,114,115,105,111,110,61,34,62,38,110,98,115,112,59 +,60,47,73,116,32,105,115,32,116,104,101,32,84,104,105,115,32,105,115,32,119,105, +108,108,32,104,97,118,101,111,114,103,97,110,105,115,109,115,115,111,109,101,32, +116,105,109,101,70,114,105,101,100,114,105,99,104,119,97,115,32,102,105,114,115, +116,116,104,101,32,111,110,108,121,32,102,97,99,116,32,116,104,97,116,102,111, +114,109,32,105,100,61,34,112,114,101,99,101,100,105,110,103,84,101,99,104,110, +105,99,97,108,112,104,121,115,105,99,105,115,116,111,99,99,117,114,115,32,105, +110,110,97,118,105,103,97,116,111,114,115,101,99,116,105,111,110,34,62,115,112, +97,110,32,105,100,61,34,115,111,117,103,104,116,32,116,111,98,101,108,111,119,32 +,116,104,101,115,117,114,118,105,118,105,110,103,125,60,47,115,116,121,108,101, +62,104,105,115,32,100,101,97,116,104,97,115,32,105,110,32,116,104,101,99,97,117, +115,101,100,32,98,121,112,97,114,116,105,97,108,108,121,101,120,105,115,116,105, +110,103,32,117,115,105,110,103,32,116,104,101,119,97,115,32,103,105,118,101,110, +97,32,108,105,115,116,32,111,102,108,101,118,101,108,115,32,111,102,110,111,116, +105,111,110,32,111,102,79,102,102,105,99,105,97,108,32,100,105,115,109,105,115, +115,101,100,115,99,105,101,110,116,105,115,116,114,101,115,101,109,98,108,101, +115,100,117,112,108,105,99,97,116,101,101,120,112,108,111,115,105,118,101,114, +101,99,111,118,101,114,101,100,97,108,108,32,111,116,104,101,114,103,97,108,108, +101,114,105,101,115,123,112,97,100,100,105,110,103,58,112,101,111,112,108,101,32 +,111,102,114,101,103,105,111,110,32,111,102,97,100,100,114,101,115,115,101,115, +97,115,115,111,99,105,97,116,101,105,109,103,32,97,108,116,61,34,105,110,32,109, +111,100,101,114,110,115,104,111,117,108,100,32,98,101,109,101,116,104,111,100,32 +,111,102,114,101,112,111,114,116,105,110,103,116,105,109,101,115,116,97,109,112, +110,101,101,100,101,100,32,116,111,116,104,101,32,71,114,101,97,116,114,101,103, +97,114,100,105,110,103,115,101,101,109,101,100,32,116,111,118,105,101,119,101, +100,32,97,115,105,109,112,97,99,116,32,111,110,105,100,101,97,32,116,104,97,116, +116,104,101,32,87,111,114,108,100,104,101,105,103,104,116,32,111,102,101,120,112 +,97,110,100,105,110,103,84,104,101,115,101,32,97,114,101,99,117,114,114,101,110, +116,34,62,99,97,114,101,102,117,108,108,121,109,97,105,110,116,97,105,110,115,99 +,104,97,114,103,101,32,111,102,67,108,97,115,115,105,99,97,108,97,100,100,114, +101,115,115,101,100,112,114,101,100,105,99,116,101,100,111,119,110,101,114,115, +104,105,112,60,100,105,118,32,105,100,61,34,114,105,103,104,116,34,62,13,10,114, +101,115,105,100,101,110,99,101,108,101,97,118,101,32,116,104,101,99,111,110,116, +101,110,116,34,62,97,114,101,32,111,102,116,101,110,32,32,125,41,40,41,59,13,10, +112,114,111,98,97,98,108,121,32,80,114,111,102,101,115,115,111,114,45,98,117,116 +,116,111,110,34,32,114,101,115,112,111,110,100,101,100,115,97,121,115,32,116,104 +,97,116,104,97,100,32,116,111,32,98,101,112,108,97,99,101,100,32,105,110,72,117, +110,103,97,114,105,97,110,115,116,97,116,117,115,32,111,102,115,101,114,118,101, +115,32,97,115,85,110,105,118,101,114,115,97,108,101,120,101,99,117,116,105,111, +110,97,103,103,114,101,103,97,116,101,102,111,114,32,119,104,105,99,104,105,110, +102,101,99,116,105,111,110,97,103,114,101,101,100,32,116,111,104,111,119,101,118 +,101,114,44,32,112,111,112,117,108,97,114,34,62,112,108,97,99,101,100,32,111,110 +,99,111,110,115,116,114,117,99,116,101,108,101,99,116,111,114,97,108,115,121,109 +,98,111,108,32,111,102,105,110,99,108,117,100,105,110,103,114,101,116,117,114, +110,32,116,111,97,114,99,104,105,116,101,99,116,67,104,114,105,115,116,105,97, +110,112,114,101,118,105,111,117,115,32,108,105,118,105,110,103,32,105,110,101,97 +,115,105,101,114,32,116,111,112,114,111,102,101,115,115,111,114,10,38,108,116,59 +,33,45,45,32,101,102,102,101,99,116,32,111,102,97,110,97,108,121,116,105,99,115, +119,97,115,32,116,97,107,101,110,119,104,101,114,101,32,116,104,101,116,111,111, +107,32,111,118,101,114,98,101,108,105,101,102,32,105,110,65,102,114,105,107,97, +97,110,115,97,115,32,102,97,114,32,97,115,112,114,101,118,101,110,116,101,100, +119,111,114,107,32,119,105,116,104,97,32,115,112,101,99,105,97,108,60,102,105, +101,108,100,115,101,116,67,104,114,105,115,116,109,97,115,82,101,116,114,105,101 +,118,101,100,10,10,73,110,32,116,104,101,32,98,97,99,107,32,105,110,116,111,110, +111,114,116,104,101,97,115,116,109,97,103,97,122,105,110,101,115,62,60,115,116, +114,111,110,103,62,99,111,109,109,105,116,116,101,101,103,111,118,101,114,110, +105,110,103,103,114,111,117,112,115,32,111,102,115,116,111,114,101,100,32,105, +110,101,115,116,97,98,108,105,115,104,97,32,103,101,110,101,114,97,108,105,116, +115,32,102,105,114,115,116,116,104,101,105,114,32,111,119,110,112,111,112,117, +108,97,116,101,100,97,110,32,111,98,106,101,99,116,67,97,114,105,98,98,101,97, +110,97,108,108,111,119,32,116,104,101,100,105,115,116,114,105,99,116,115,119,105 +,115,99,111,110,115,105,110,108,111,99,97,116,105,111,110,46,59,32,119,105,100, +116,104,58,32,105,110,104,97,98,105,116,101,100,83,111,99,105,97,108,105,115,116 +,74,97,110,117,97,114,121,32,49,60,47,102,111,111,116,101,114,62,115,105,109,105 +,108,97,114,108,121,99,104,111,105,99,101,32,111,102,116,104,101,32,115,97,109, +101,32,115,112,101,99,105,102,105,99,32,98,117,115,105,110,101,115,115,32,84,104 +,101,32,102,105,114,115,116,46,108,101,110,103,116,104,59,32,100,101,115,105,114 +,101,32,116,111,100,101,97,108,32,119,105,116,104,115,105,110,99,101,32,116,104, +101,117,115,101,114,65,103,101,110,116,99,111,110,99,101,105,118,101,100,105,110 +,100,101,120,46,112,104,112,97,115,32,38,113,117,111,116,59,101,110,103,97,103, +101,32,105,110,114,101,99,101,110,116,108,121,44,102,101,119,32,121,101,97,114, +115,119,101,114,101,32,97,108,115,111,10,60,104,101,97,100,62,10,60,101,100,105, +116,101,100,32,98,121,97,114,101,32,107,110,111,119,110,99,105,116,105,101,115, +32,105,110,97,99,99,101,115,115,107,101,121,99,111,110,100,101,109,110,101,100, +97,108,115,111,32,104,97,118,101,115,101,114,118,105,99,101,115,44,102,97,109, +105,108,121,32,111,102,83,99,104,111,111,108,32,111,102,99,111,110,118,101,114, +116,101,100,110,97,116,117,114,101,32,111,102,32,108,97,110,103,117,97,103,101, +109,105,110,105,115,116,101,114,115,60,47,111,98,106,101,99,116,62,116,104,101, +114,101,32,105,115,32,97,32,112,111,112,117,108,97,114,115,101,113,117,101,110, +99,101,115,97,100,118,111,99,97,116,101,100,84,104,101,121,32,119,101,114,101,97 +,110,121,32,111,116,104,101,114,108,111,99,97,116,105,111,110,61,101,110,116,101 +,114,32,116,104,101,109,117,99,104,32,109,111,114,101,114,101,102,108,101,99,116 +,101,100,119,97,115,32,110,97,109,101,100,111,114,105,103,105,110,97,108,32,97, +32,116,121,112,105,99,97,108,119,104,101,110,32,116,104,101,121,101,110,103,105, +110,101,101,114,115,99,111,117,108,100,32,110,111,116,114,101,115,105,100,101, +110,116,115,119,101,100,110,101,115,100,97,121,116,104,101,32,116,104,105,114, +100,32,112,114,111,100,117,99,116,115,74,97,110,117,97,114,121,32,50,119,104,97, +116,32,116,104,101,121,97,32,99,101,114,116,97,105,110,114,101,97,99,116,105,111 +,110,115,112,114,111,99,101,115,115,111,114,97,102,116,101,114,32,104,105,115, +116,104,101,32,108,97,115,116,32,99,111,110,116,97,105,110,101,100,34,62,60,47, +100,105,118,62,10,60,47,97,62,60,47,116,100,62,100,101,112,101,110,100,32,111, +110,115,101,97,114,99,104,34,62,10,112,105,101,99,101,115,32,111,102,99,111,109, +112,101,116,105,110,103,82,101,102,101,114,101,110,99,101,116,101,110,110,101, +115,115,101,101,119,104,105,99,104,32,104,97,115,32,118,101,114,115,105,111,110, +61,60,47,115,112,97,110,62,32,60,60,47,104,101,97,100,101,114,62,103,105,118,101 +,115,32,116,104,101,104,105,115,116,111,114,105,97,110,118,97,108,117,101,61,34, +34,62,112,97,100,100,105,110,103,58,48,118,105,101,119,32,116,104,97,116,116,111 +,103,101,116,104,101,114,44,116,104,101,32,109,111,115,116,32,119,97,115,32,102, +111,117,110,100,115,117,98,115,101,116,32,111,102,97,116,116,97,99,107,32,111, +110,99,104,105,108,100,114,101,110,44,112,111,105,110,116,115,32,111,102,112,101 +,114,115,111,110,97,108,32,112,111,115,105,116,105,111,110,58,97,108,108,101,103 +,101,100,108,121,67,108,101,118,101,108,97,110,100,119,97,115,32,108,97,116,101, +114,97,110,100,32,97,102,116,101,114,97,114,101,32,103,105,118,101,110,119,97, +115,32,115,116,105,108,108,115,99,114,111,108,108,105,110,103,100,101,115,105, +103,110,32,111,102,109,97,107,101,115,32,116,104,101,109,117,99,104,32,108,101, +115,115,65,109,101,114,105,99,97,110,115,46,10,10,65,102,116,101,114,32,44,32,98 +,117,116,32,116,104,101,77,117,115,101,117,109,32,111,102,108,111,117,105,115, +105,97,110,97,40,102,114,111,109,32,116,104,101,109,105,110,110,101,115,111,116, +97,112,97,114,116,105,99,108,101,115,97,32,112,114,111,99,101,115,115,68,111,109 +,105,110,105,99,97,110,118,111,108,117,109,101,32,111,102,114,101,116,117,114, +110,105,110,103,100,101,102,101,110,115,105,118,101,48,48,112,120,124,114,105, +103,104,109,97,100,101,32,102,114,111,109,109,111,117,115,101,111,118,101,114,34 +,32,115,116,121,108,101,61,34,115,116,97,116,101,115,32,111,102,40,119,104,105, +99,104,32,105,115,99,111,110,116,105,110,117,101,115,70,114,97,110,99,105,115,99 +,111,98,117,105,108,100,105,110,103,32,119,105,116,104,111,117,116,32,97,119,105 +,116,104,32,115,111,109,101,119,104,111,32,119,111,117,108,100,97,32,102,111,114 +,109,32,111,102,97,32,112,97,114,116,32,111,102,98,101,102,111,114,101,32,105, +116,107,110,111,119,110,32,97,115,32,32,83,101,114,118,105,99,101,115,108,111,99 +,97,116,105,111,110,32,97,110,100,32,111,102,116,101,110,109,101,97,115,117,114, +105,110,103,97,110,100,32,105,116,32,105,115,112,97,112,101,114,98,97,99,107,118 +,97,108,117,101,115,32,111,102,13,10,60,116,105,116,108,101,62,61,32,119,105,110 +,100,111,119,46,100,101,116,101,114,109,105,110,101,101,114,38,113,117,111,116, +59,32,112,108,97,121,101,100,32,98,121,97,110,100,32,101,97,114,108,121,60,47,99 +,101,110,116,101,114,62,102,114,111,109,32,116,104,105,115,116,104,101,32,116, +104,114,101,101,112,111,119,101,114,32,97,110,100,111,102,32,38,113,117,111,116, +59,105,110,110,101,114,72,84,77,76,60,97,32,104,114,101,102,61,34,121,58,105,110 +,108,105,110,101,59,67,104,117,114,99,104,32,111,102,116,104,101,32,101,118,101, +110,116,118,101,114,121,32,104,105,103,104,111,102,102,105,99,105,97,108,32,45, +104,101,105,103,104,116,58,32,99,111,110,116,101,110,116,61,34,47,99,103,105,45, +98,105,110,47,116,111,32,99,114,101,97,116,101,97,102,114,105,107,97,97,110,115, +101,115,112,101,114,97,110,116,111,102,114,97,110,195,167,97,105,115,108,97,116, +118,105,101,197,161,117,108,105,101,116,117,118,105,197,179,196,140,101,197,161, +116,105,110,97,196,141,101,197,161,116,105,110,97,224,185,132,224,184,151,224, +184,162,230,151,165,230,156,172,232,170,158,231,174,128,228,189,147,229,173,151, +231,185,129,233,171,148,229,173,151,237,149,156,234,181,173,236,150,180,228,184, +186,228,187,128,228,185,136,232,174,161,231,174,151,230,156,186,231,172,148,232, +174,176,230,156,172,232,168,142,232,171,150,229,141,128,230,156,141,229,138,161, +229,153,168,228,186,146,232,129,148,231,189,145,230,136,191,229,156,176,228,186, +167,228,191,177,228,185,144,233,131,168,229,135,186,231,137,136,231,164,190,230, +142,146,232,161,140,230,166,156,233,131,168,232,144,189,230,160,188,232,191,155, +228,184,128,230,173,165,230,148,175,228,187,152,229,174,157,233,170,140,232,175, +129,231,160,129,229,167,148,229,145,152,228,188,154,230,149,176,230,141,174,229, +186,147,230,182,136,232,180,185,232,128,133,229,138,158,229,133,172,229,174,164, +232,174,168,232,174,186,229,140,186,230,183,177,229,156,179,229,184,130,230,146, +173,230,148,190,229,153,168,229,140,151,228,186,172,229,184,130,229,164,167,229, +173,166,231,148,159,232,182,138,230,157,165,232,182,138,231,174,161,231,144,134, +229,145,152,228,191,161,230,129,175,231,189,145,115,101,114,118,105,99,105,111, +115,97,114,116,195,173,99,117,108,111,97,114,103,101,110,116,105,110,97,98,97, +114,99,101,108,111,110,97,99,117,97,108,113,117,105,101,114,112,117,98,108,105, +99,97,100,111,112,114,111,100,117,99,116,111,115,112,111,108,195,173,116,105,99, +97,114,101,115,112,117,101,115,116,97,119,105,107,105,112,101,100,105,97,115,105 +,103,117,105,101,110,116,101,98,195,186,115,113,117,101,100,97,99,111,109,117, +110,105,100,97,100,115,101,103,117,114,105,100,97,100,112,114,105,110,99,105,112 +,97,108,112,114,101,103,117,110,116,97,115,99,111,110,116,101,110,105,100,111, +114,101,115,112,111,110,100,101,114,118,101,110,101,122,117,101,108,97,112,114, +111,98,108,101,109,97,115,100,105,99,105,101,109,98,114,101,114,101,108,97,99, +105,195,179,110,110,111,118,105,101,109,98,114,101,115,105,109,105,108,97,114, +101,115,112,114,111,121,101,99,116,111,115,112,114,111,103,114,97,109,97,115,105 +,110,115,116,105,116,117,116,111,97,99,116,105,118,105,100,97,100,101,110,99,117 +,101,110,116,114,97,101,99,111,110,111,109,195,173,97,105,109,195,161,103,101, +110,101,115,99,111,110,116,97,99,116,97,114,100,101,115,99,97,114,103,97,114,110 +,101,99,101,115,97,114,105,111,97,116,101,110,99,105,195,179,110,116,101,108,195 +,169,102,111,110,111,99,111,109,105,115,105,195,179,110,99,97,110,99,105,111,110 +,101,115,99,97,112,97,99,105,100,97,100,101,110,99,111,110,116,114,97,114,97,110 +,195,161,108,105,115,105,115,102,97,118,111,114,105,116,111,115,116,195,169,114, +109,105,110,111,115,112,114,111,118,105,110,99,105,97,101,116,105,113,117,101, +116,97,115,101,108,101,109,101,110,116,111,115,102,117,110,99,105,111,110,101, +115,114,101,115,117,108,116,97,100,111,99,97,114,195,161,99,116,101,114,112,114, +111,112,105,101,100,97,100,112,114,105,110,99,105,112,105,111,110,101,99,101,115 +,105,100,97,100,109,117,110,105,99,105,112,97,108,99,114,101,97,99,105,195,179, +110,100,101,115,99,97,114,103,97,115,112,114,101,115,101,110,99,105,97,99,111, +109,101,114,99,105,97,108,111,112,105,110,105,111,110,101,115,101,106,101,114,99 +,105,99,105,111,101,100,105,116,111,114,105,97,108,115,97,108,97,109,97,110,99, +97,103,111,110,122,195,161,108,101,122,100,111,99,117,109,101,110,116,111,112, +101,108,195,173,99,117,108,97,114,101,99,105,101,110,116,101,115,103,101,110,101 +,114,97,108,101,115,116,97,114,114,97,103,111,110,97,112,114,195,161,99,116,105, +99,97,110,111,118,101,100,97,100,101,115,112,114,111,112,117,101,115,116,97,112, +97,99,105,101,110,116,101,115,116,195,169,99,110,105,99,97,115,111,98,106,101, +116,105,118,111,115,99,111,110,116,97,99,116,111,115,224,164,174,224,165,135,224 +,164,130,224,164,178,224,164,191,224,164,143,224,164,185,224,165,136,224,164,130 +,224,164,151,224,164,175,224,164,190,224,164,184,224,164,190,224,164,165,224,164 +,143,224,164,181,224,164,130,224,164,176,224,164,185,224,165,135,224,164,149,224 +,165,139,224,164,136,224,164,149,224,165,129,224,164,155,224,164,176,224,164,185 +,224,164,190,224,164,172,224,164,190,224,164,166,224,164,149,224,164,185,224,164 +,190,224,164,184,224,164,173,224,165,128,224,164,185,224,165,129,224,164,143,224 +,164,176,224,164,185,224,165,128,224,164,174,224,165,136,224,164,130,224,164,166 +,224,164,191,224,164,168,224,164,172,224,164,190,224,164,164,100,105,112,108,111 +,100,111,99,115,224,164,184,224,164,174,224,164,175,224,164,176,224,165,130,224, +164,170,224,164,168,224,164,190,224,164,174,224,164,170,224,164,164,224,164,190, +224,164,171,224,164,191,224,164,176,224,164,148,224,164,184,224,164,164,224,164, +164,224,164,176,224,164,185,224,164,178,224,165,139,224,164,151,224,164,185,224, +165,129,224,164,134,224,164,172,224,164,190,224,164,176,224,164,166,224,165,135, +224,164,182,224,164,185,224,165,129,224,164,136,224,164,150,224,165,135,224,164, +178,224,164,175,224,164,166,224,164,191,224,164,149,224,164,190,224,164,174,224, +164,181,224,165,135,224,164,172,224,164,164,224,165,128,224,164,168,224,164,172, +224,165,128,224,164,154,224,164,174,224,165,140,224,164,164,224,164,184,224,164, +190,224,164,178,224,164,178,224,165,135,224,164,150,224,164,156,224,165,137,224, +164,172,224,164,174,224,164,166,224,164,166,224,164,164,224,164,165,224,164,190, +224,164,168,224,164,185,224,165,128,224,164,182,224,164,185,224,164,176,224,164, +133,224,164,178,224,164,151,224,164,149,224,164,173,224,165,128,224,164,168,224, +164,151,224,164,176,224,164,170,224,164,190,224,164,184,224,164,176,224,164,190, +224,164,164,224,164,149,224,164,191,224,164,143,224,164,137,224,164,184,224,165, +135,224,164,151,224,164,175,224,165,128,224,164,185,224,165,130,224,164,129,224, +164,134,224,164,151,224,165,135,224,164,159,224,165,128,224,164,174,224,164,150, +224,165,139,224,164,156,224,164,149,224,164,190,224,164,176,224,164,133,224,164, +173,224,165,128,224,164,151,224,164,175,224,165,135,224,164,164,224,165,129,224, +164,174,224,164,181,224,165,139,224,164,159,224,164,166,224,165,135,224,164,130, +224,164,133,224,164,151,224,164,176,224,164,144,224,164,184,224,165,135,224,164, +174,224,165,135,224,164,178,224,164,178,224,164,151,224,164,190,224,164,185,224, +164,190,224,164,178,224,164,138,224,164,170,224,164,176,224,164,154,224,164,190, +224,164,176,224,164,144,224,164,184,224,164,190,224,164,166,224,165,135,224,164, +176,224,164,156,224,164,191,224,164,184,224,164,166,224,164,191,224,164,178,224, +164,172,224,164,130,224,164,166,224,164,172,224,164,168,224,164,190,224,164,185, +224,165,130,224,164,130,224,164,178,224,164,190,224,164,150,224,164,156,224,165, +128,224,164,164,224,164,172,224,164,159,224,164,168,224,164,174,224,164,191,224, +164,178,224,164,135,224,164,184,224,165,135,224,164,134,224,164,168,224,165,135, +224,164,168,224,164,175,224,164,190,224,164,149,224,165,129,224,164,178,224,164, +178,224,165,137,224,164,151,224,164,173,224,164,190,224,164,151,224,164,176,224, +165,135,224,164,178,224,164,156,224,164,151,224,164,185,224,164,176,224,164,190, +224,164,174,224,164,178,224,164,151,224,165,135,224,164,170,224,165,135,224,164, +156,224,164,185,224,164,190,224,164,165,224,164,135,224,164,184,224,165,128,224, +164,184,224,164,185,224,165,128,224,164,149,224,164,178,224,164,190,224,164,160, +224,165,128,224,164,149,224,164,185,224,164,190,224,164,129,224,164,166,224,165, +130,224,164,176,224,164,164,224,164,185,224,164,164,224,164,184,224,164,190,224, +164,164,224,164,175,224,164,190,224,164,166,224,164,134,224,164,175,224,164,190, +224,164,170,224,164,190,224,164,149,224,164,149,224,165,140,224,164,168,224,164, +182,224,164,190,224,164,174,224,164,166,224,165,135,224,164,150,224,164,175,224, +164,185,224,165,128,224,164,176,224,164,190,224,164,175,224,164,150,224,165,129, +224,164,166,224,164,178,224,164,151,224,165,128,99,97,116,101,103,111,114,105, +101,115,101,120,112,101,114,105,101,110,99,101,60,47,116,105,116,108,101,62,13, +10,67,111,112,121,114,105,103,104,116,32,106,97,118,97,115,99,114,105,112,116,99 +,111,110,100,105,116,105,111,110,115,101,118,101,114,121,116,104,105,110,103,60, +112,32,99,108,97,115,115,61,34,116,101,99,104,110,111,108,111,103,121,98,97,99, +107,103,114,111,117,110,100,60,97,32,99,108,97,115,115,61,34,109,97,110,97,103, +101,109,101,110,116,38,99,111,112,121,59,32,50,48,49,106,97,118,97,83,99,114,105 +,112,116,99,104,97,114,97,99,116,101,114,115,98,114,101,97,100,99,114,117,109,98 +,116,104,101,109,115,101,108,118,101,115,104,111,114,105,122,111,110,116,97,108, +103,111,118,101,114,110,109,101,110,116,67,97,108,105,102,111,114,110,105,97,97, +99,116,105,118,105,116,105,101,115,100,105,115,99,111,118,101,114,101,100,78,97, +118,105,103,97,116,105,111,110,116,114,97,110,115,105,116,105,111,110,99,111,110 +,110,101,99,116,105,111,110,110,97,118,105,103,97,116,105,111,110,97,112,112,101 +,97,114,97,110,99,101,60,47,116,105,116,108,101,62,60,109,99,104,101,99,107,98, +111,120,34,32,116,101,99,104,110,105,113,117,101,115,112,114,111,116,101,99,116, +105,111,110,97,112,112,97,114,101,110,116,108,121,97,115,32,119,101,108,108,32, +97,115,117,110,116,39,44,32,39,85,65,45,114,101,115,111,108,117,116,105,111,110, +111,112,101,114,97,116,105,111,110,115,116,101,108,101,118,105,115,105,111,110, +116,114,97,110,115,108,97,116,101,100,87,97,115,104,105,110,103,116,111,110,110, +97,118,105,103,97,116,111,114,46,32,61,32,119,105,110,100,111,119,46,105,109,112 +,114,101,115,115,105,111,110,38,108,116,59,98,114,38,103,116,59,108,105,116,101, +114,97,116,117,114,101,112,111,112,117,108,97,116,105,111,110,98,103,99,111,108, +111,114,61,34,35,101,115,112,101,99,105,97,108,108,121,32,99,111,110,116,101,110 +,116,61,34,112,114,111,100,117,99,116,105,111,110,110,101,119,115,108,101,116, +116,101,114,112,114,111,112,101,114,116,105,101,115,100,101,102,105,110,105,116, +105,111,110,108,101,97,100,101,114,115,104,105,112,84,101,99,104,110,111,108,111 +,103,121,80,97,114,108,105,97,109,101,110,116,99,111,109,112,97,114,105,115,111, +110,117,108,32,99,108,97,115,115,61,34,46,105,110,100,101,120,79,102,40,34,99, +111,110,99,108,117,115,105,111,110,100,105,115,99,117,115,115,105,111,110,99,111 +,109,112,111,110,101,110,116,115,98,105,111,108,111,103,105,99,97,108,82,101,118 +,111,108,117,116,105,111,110,95,99,111,110,116,97,105,110,101,114,117,110,100, +101,114,115,116,111,111,100,110,111,115,99,114,105,112,116,62,60,112,101,114,109 +,105,115,115,105,111,110,101,97,99,104,32,111,116,104,101,114,97,116,109,111,115 +,112,104,101,114,101,32,111,110,102,111,99,117,115,61,34,60,102,111,114,109,32, +105,100,61,34,112,114,111,99,101,115,115,105,110,103,116,104,105,115,46,118,97, +108,117,101,103,101,110,101,114,97,116,105,111,110,67,111,110,102,101,114,101, +110,99,101,115,117,98,115,101,113,117,101,110,116,119,101,108,108,45,107,110,111 +,119,110,118,97,114,105,97,116,105,111,110,115,114,101,112,117,116,97,116,105, +111,110,112,104,101,110,111,109,101,110,111,110,100,105,115,99,105,112,108,105, +110,101,108,111,103,111,46,112,110,103,34,32,40,100,111,99,117,109,101,110,116, +44,98,111,117,110,100,97,114,105,101,115,101,120,112,114,101,115,115,105,111,110 +,115,101,116,116,108,101,109,101,110,116,66,97,99,107,103,114,111,117,110,100, +111,117,116,32,111,102,32,116,104,101,101,110,116,101,114,112,114,105,115,101,40 +,34,104,116,116,112,115,58,34,32,117,110,101,115,99,97,112,101,40,34,112,97,115, +115,119,111,114,100,34,32,100,101,109,111,99,114,97,116,105,99,60,97,32,104,114, +101,102,61,34,47,119,114,97,112,112,101,114,34,62,10,109,101,109,98,101,114,115, +104,105,112,108,105,110,103,117,105,115,116,105,99,112,120,59,112,97,100,100,105 +,110,103,112,104,105,108,111,115,111,112,104,121,97,115,115,105,115,116,97,110, +99,101,117,110,105,118,101,114,115,105,116,121,102,97,99,105,108,105,116,105,101 +,115,114,101,99,111,103,110,105,122,101,100,112,114,101,102,101,114,101,110,99, +101,105,102,32,40,116,121,112,101,111,102,109,97,105,110,116,97,105,110,101,100, +118,111,99,97,98,117,108,97,114,121,104,121,112,111,116,104,101,115,105,115,46, +115,117,98,109,105,116,40,41,59,38,97,109,112,59,110,98,115,112,59,97,110,110, +111,116,97,116,105,111,110,98,101,104,105,110,100,32,116,104,101,70,111,117,110, +100,97,116,105,111,110,112,117,98,108,105,115,104,101,114,34,97,115,115,117,109, +112,116,105,111,110,105,110,116,114,111,100,117,99,101,100,99,111,114,114,117, +112,116,105,111,110,115,99,105,101,110,116,105,115,116,115,101,120,112,108,105, +99,105,116,108,121,105,110,115,116,101,97,100,32,111,102,100,105,109,101,110,115 +,105,111,110,115,32,111,110,67,108,105,99,107,61,34,99,111,110,115,105,100,101, +114,101,100,100,101,112,97,114,116,109,101,110,116,111,99,99,117,112,97,116,105, +111,110,115,111,111,110,32,97,102,116,101,114,105,110,118,101,115,116,109,101, +110,116,112,114,111,110,111,117,110,99,101,100,105,100,101,110,116,105,102,105, +101,100,101,120,112,101,114,105,109,101,110,116,77,97,110,97,103,101,109,101,110 +,116,103,101,111,103,114,97,112,104,105,99,34,32,104,101,105,103,104,116,61,34, +108,105,110,107,32,114,101,108,61,34,46,114,101,112,108,97,99,101,40,47,100,101, +112,114,101,115,115,105,111,110,99,111,110,102,101,114,101,110,99,101,112,117, +110,105,115,104,109,101,110,116,101,108,105,109,105,110,97,116,101,100,114,101, +115,105,115,116,97,110,99,101,97,100,97,112,116,97,116,105,111,110,111,112,112, +111,115,105,116,105,111,110,119,101,108,108,32,107,110,111,119,110,115,117,112, +112,108,101,109,101,110,116,100,101,116,101,114,109,105,110,101,100,104,49,32,99 +,108,97,115,115,61,34,48,112,120,59,109,97,114,103,105,110,109,101,99,104,97,110 +,105,99,97,108,115,116,97,116,105,115,116,105,99,115,99,101,108,101,98,114,97, +116,101,100,71,111,118,101,114,110,109,101,110,116,10,10,68,117,114,105,110,103, +32,116,100,101,118,101,108,111,112,101,114,115,97,114,116,105,102,105,99,105,97, +108,101,113,117,105,118,97,108,101,110,116,111,114,105,103,105,110,97,116,101, +100,67,111,109,109,105,115,115,105,111,110,97,116,116,97,99,104,109,101,110,116, +60,115,112,97,110,32,105,100,61,34,116,104,101,114,101,32,119,101,114,101,78,101 +,100,101,114,108,97,110,100,115,98,101,121,111,110,100,32,116,104,101,114,101, +103,105,115,116,101,114,101,100,106,111,117,114,110,97,108,105,115,116,102,114, +101,113,117,101,110,116,108,121,97,108,108,32,111,102,32,116,104,101,108,97,110, +103,61,34,101,110,34,32,60,47,115,116,121,108,101,62,13,10,97,98,115,111,108,117 +,116,101,59,32,115,117,112,112,111,114,116,105,110,103,101,120,116,114,101,109, +101,108,121,32,109,97,105,110,115,116,114,101,97,109,60,47,115,116,114,111,110, +103,62,32,112,111,112,117,108,97,114,105,116,121,101,109,112,108,111,121,109,101 +,110,116,60,47,116,97,98,108,101,62,13,10,32,99,111,108,115,112,97,110,61,34,60, +47,102,111,114,109,62,10,32,32,99,111,110,118,101,114,115,105,111,110,97,98,111, +117,116,32,116,104,101,32,60,47,112,62,60,47,100,105,118,62,105,110,116,101,103, +114,97,116,101,100,34,32,108,97,110,103,61,34,101,110,80,111,114,116,117,103,117 +,101,115,101,115,117,98,115,116,105,116,117,116,101,105,110,100,105,118,105,100, +117,97,108,105,109,112,111,115,115,105,98,108,101,109,117,108,116,105,109,101, +100,105,97,97,108,109,111,115,116,32,97,108,108,112,120,32,115,111,108,105,100, +32,35,97,112,97,114,116,32,102,114,111,109,115,117,98,106,101,99,116,32,116,111, +105,110,32,69,110,103,108,105,115,104,99,114,105,116,105,99,105,122,101,100,101, +120,99,101,112,116,32,102,111,114,103,117,105,100,101,108,105,110,101,115,111, +114,105,103,105,110,97,108,108,121,114,101,109,97,114,107,97,98,108,101,116,104, +101,32,115,101,99,111,110,100,104,50,32,99,108,97,115,115,61,34,60,97,32,116,105 +,116,108,101,61,34,40,105,110,99,108,117,100,105,110,103,112,97,114,97,109,101, +116,101,114,115,112,114,111,104,105,98,105,116,101,100,61,32,34,104,116,116,112, +58,47,47,100,105,99,116,105,111,110,97,114,121,112,101,114,99,101,112,116,105, +111,110,114,101,118,111,108,117,116,105,111,110,102,111,117,110,100,97,116,105, +111,110,112,120,59,104,101,105,103,104,116,58,115,117,99,99,101,115,115,102,117, +108,115,117,112,112,111,114,116,101,114,115,109,105,108,108,101,110,110,105,117, +109,104,105,115,32,102,97,116,104,101,114,116,104,101,32,38,113,117,111,116,59, +110,111,45,114,101,112,101,97,116,59,99,111,109,109,101,114,99,105,97,108,105, +110,100,117,115,116,114,105,97,108,101,110,99,111,117,114,97,103,101,100,97,109, +111,117,110,116,32,111,102,32,117,110,111,102,102,105,99,105,97,108,101,102,102, +105,99,105,101,110,99,121,82,101,102,101,114,101,110,99,101,115,99,111,111,114, +100,105,110,97,116,101,100,105,115,99,108,97,105,109,101,114,101,120,112,101,100 +,105,116,105,111,110,100,101,118,101,108,111,112,105,110,103,99,97,108,99,117, +108,97,116,101,100,115,105,109,112,108,105,102,105,101,100,108,101,103,105,116, +105,109,97,116,101,115,117,98,115,116,114,105,110,103,40,48,34,32,99,108,97,115, +115,61,34,99,111,109,112,108,101,116,101,108,121,105,108,108,117,115,116,114,97, +116,101,102,105,118,101,32,121,101,97,114,115,105,110,115,116,114,117,109,101, +110,116,80,117,98,108,105,115,104,105,110,103,49,34,32,99,108,97,115,115,61,34, +112,115,121,99,104,111,108,111,103,121,99,111,110,102,105,100,101,110,99,101,110 +,117,109,98,101,114,32,111,102,32,97,98,115,101,110,99,101,32,111,102,102,111,99 +,117,115,101,100,32,111,110,106,111,105,110,101,100,32,116,104,101,115,116,114, +117,99,116,117,114,101,115,112,114,101,118,105,111,117,115,108,121,62,60,47,105, +102,114,97,109,101,62,111,110,99,101,32,97,103,97,105,110,98,117,116,32,114,97, +116,104,101,114,105,109,109,105,103,114,97,110,116,115,111,102,32,99,111,117,114 +,115,101,44,97,32,103,114,111,117,112,32,111,102,76,105,116,101,114,97,116,117, +114,101,85,110,108,105,107,101,32,116,104,101,60,47,97,62,38,110,98,115,112,59, +10,102,117,110,99,116,105,111,110,32,105,116,32,119,97,115,32,116,104,101,67,111 +,110,118,101,110,116,105,111,110,97,117,116,111,109,111,98,105,108,101,80,114, +111,116,101,115,116,97,110,116,97,103,103,114,101,115,115,105,118,101,97,102,116 +,101,114,32,116,104,101,32,83,105,109,105,108,97,114,108,121,44,34,32,47,62,60, +47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,13,10,102,117,110,99,116 +,105,111,110,118,105,115,105,98,105,108,105,116,121,116,104,101,32,117,115,101, +32,111,102,118,111,108,117,110,116,101,101,114,115,97,116,116,114,97,99,116,105, +111,110,117,110,100,101,114,32,116,104,101,32,116,104,114,101,97,116,101,110,101 +,100,42,60,33,91,67,68,65,84,65,91,105,109,112,111,114,116,97,110,99,101,105,110 +,32,103,101,110,101,114,97,108,116,104,101,32,108,97,116,116,101,114,60,47,102, +111,114,109,62,10,60,47,46,105,110,100,101,120,79,102,40,39,105,32,61,32,48,59, +32,105,32,60,100,105,102,102,101,114,101,110,99,101,100,101,118,111,116,101,100, +32,116,111,116,114,97,100,105,116,105,111,110,115,115,101,97,114,99,104,32,102, +111,114,117,108,116,105,109,97,116,101,108,121,116,111,117,114,110,97,109,101, +110,116,97,116,116,114,105,98,117,116,101,115,115,111,45,99,97,108,108,101,100, +32,125,10,60,47,115,116,121,108,101,62,101,118,97,108,117,97,116,105,111,110,101 +,109,112,104,97,115,105,122,101,100,97,99,99,101,115,115,105,98,108,101,60,47, +115,101,99,116,105,111,110,62,115,117,99,99,101,115,115,105,111,110,97,108,111, +110,103,32,119,105,116,104,77,101,97,110,119,104,105,108,101,44,105,110,100,117, +115,116,114,105,101,115,60,47,97,62,60,98,114,32,47,62,104,97,115,32,98,101,99, +111,109,101,97,115,112,101,99,116,115,32,111,102,84,101,108,101,118,105,115,105, +111,110,115,117,102,102,105,99,105,101,110,116,98,97,115,107,101,116,98,97,108, +108,98,111,116,104,32,115,105,100,101,115,99,111,110,116,105,110,117,105,110,103 +,97,110,32,97,114,116,105,99,108,101,60,105,109,103,32,97,108,116,61,34,97,100, +118,101,110,116,117,114,101,115,104,105,115,32,109,111,116,104,101,114,109,97, +110,99,104,101,115,116,101,114,112,114,105,110,99,105,112,108,101,115,112,97,114 +,116,105,99,117,108,97,114,99,111,109,109,101,110,116,97,114,121,101,102,102,101 +,99,116,115,32,111,102,100,101,99,105,100,101,100,32,116,111,34,62,60,115,116, +114,111,110,103,62,112,117,98,108,105,115,104,101,114,115,74,111,117,114,110,97, +108,32,111,102,100,105,102,102,105,99,117,108,116,121,102,97,99,105,108,105,116, +97,116,101,97,99,99,101,112,116,97,98,108,101,115,116,121,108,101,46,99,115,115, +34,9,102,117,110,99,116,105,111,110,32,105,110,110,111,118,97,116,105,111,110,62 +,67,111,112,121,114,105,103,104,116,115,105,116,117,97,116,105,111,110,115,119, +111,117,108,100,32,104,97,118,101,98,117,115,105,110,101,115,115,101,115,68,105, +99,116,105,111,110,97,114,121,115,116,97,116,101,109,101,110,116,115,111,102,116 +,101,110,32,117,115,101,100,112,101,114,115,105,115,116,101,110,116,105,110,32, +74,97,110,117,97,114,121,99,111,109,112,114,105,115,105,110,103,60,47,116,105, +116,108,101,62,10,9,100,105,112,108,111,109,97,116,105,99,99,111,110,116,97,105, +110,105,110,103,112,101,114,102,111,114,109,105,110,103,101,120,116,101,110,115, +105,111,110,115,109,97,121,32,110,111,116,32,98,101,99,111,110,99,101,112,116,32 +,111,102,32,111,110,99,108,105,99,107,61,34,73,116,32,105,115,32,97,108,115,111, +102,105,110,97,110,99,105,97,108,32,109,97,107,105,110,103,32,116,104,101,76,117 +,120,101,109,98,111,117,114,103,97,100,100,105,116,105,111,110,97,108,97,114,101 +,32,99,97,108,108,101,100,101,110,103,97,103,101,100,32,105,110,34,115,99,114, +105,112,116,34,41,59,98,117,116,32,105,116,32,119,97,115,101,108,101,99,116,114, +111,110,105,99,111,110,115,117,98,109,105,116,61,34,10,60,33,45,45,32,69,110,100 +,32,101,108,101,99,116,114,105,99,97,108,111,102,102,105,99,105,97,108,108,121, +115,117,103,103,101,115,116,105,111,110,116,111,112,32,111,102,32,116,104,101, +117,110,108,105,107,101,32,116,104,101,65,117,115,116,114,97,108,105,97,110,79, +114,105,103,105,110,97,108,108,121,114,101,102,101,114,101,110,99,101,115,10,60, +47,104,101,97,100,62,13,10,114,101,99,111,103,110,105,115,101,100,105,110,105, +116,105,97,108,105,122,101,108,105,109,105,116,101,100,32,116,111,65,108,101,120 +,97,110,100,114,105,97,114,101,116,105,114,101,109,101,110,116,65,100,118,101, +110,116,117,114,101,115,102,111,117,114,32,121,101,97,114,115,10,10,38,108,116, +59,33,45,45,32,105,110,99,114,101,97,115,105,110,103,100,101,99,111,114,97,116, +105,111,110,104,51,32,99,108,97,115,115,61,34,111,114,105,103,105,110,115,32,111 +,102,111,98,108,105,103,97,116,105,111,110,114,101,103,117,108,97,116,105,111, +110,99,108,97,115,115,105,102,105,101,100,40,102,117,110,99,116,105,111,110,40, +97,100,118,97,110,116,97,103,101,115,98,101,105,110,103,32,116,104,101,32,104, +105,115,116,111,114,105,97,110,115,60,98,97,115,101,32,104,114,101,102,114,101, +112,101,97,116,101,100,108,121,119,105,108,108,105,110,103,32,116,111,99,111,109 +,112,97,114,97,98,108,101,100,101,115,105,103,110,97,116,101,100,110,111,109,105 +,110,97,116,105,111,110,102,117,110,99,116,105,111,110,97,108,105,110,115,105, +100,101,32,116,104,101,114,101,118,101,108,97,116,105,111,110,101,110,100,32,111 +,102,32,116,104,101,115,32,102,111,114,32,116,104,101,32,97,117,116,104,111,114, +105,122,101,100,114,101,102,117,115,101,100,32,116,111,116,97,107,101,32,112,108 +,97,99,101,97,117,116,111,110,111,109,111,117,115,99,111,109,112,114,111,109,105 +,115,101,112,111,108,105,116,105,99,97,108,32,114,101,115,116,97,117,114,97,110, +116,116,119,111,32,111,102,32,116,104,101,70,101,98,114,117,97,114,121,32,50,113 +,117,97,108,105,116,121,32,111,102,115,119,102,111,98,106,101,99,116,46,117,110, +100,101,114,115,116,97,110,100,110,101,97,114,108,121,32,97,108,108,119,114,105, +116,116,101,110,32,98,121,105,110,116,101,114,118,105,101,119,115,34,32,119,105, +100,116,104,61,34,49,119,105,116,104,100,114,97,119,97,108,102,108,111,97,116,58 +,108,101,102,116,105,115,32,117,115,117,97,108,108,121,99,97,110,100,105,100,97, +116,101,115,110,101,119,115,112,97,112,101,114,115,109,121,115,116,101,114,105, +111,117,115,68,101,112,97,114,116,109,101,110,116,98,101,115,116,32,107,110,111, +119,110,112,97,114,108,105,97,109,101,110,116,115,117,112,112,114,101,115,115, +101,100,99,111,110,118,101,110,105,101,110,116,114,101,109,101,109,98,101,114, +101,100,100,105,102,102,101,114,101,110,116,32,115,121,115,116,101,109,97,116, +105,99,104,97,115,32,108,101,100,32,116,111,112,114,111,112,97,103,97,110,100,97 +,99,111,110,116,114,111,108,108,101,100,105,110,102,108,117,101,110,99,101,115, +99,101,114,101,109,111,110,105,97,108,112,114,111,99,108,97,105,109,101,100,80, +114,111,116,101,99,116,105,111,110,108,105,32,99,108,97,115,115,61,34,83,99,105, +101,110,116,105,102,105,99,99,108,97,115,115,61,34,110,111,45,116,114,97,100,101 +,109,97,114,107,115,109,111,114,101,32,116,104,97,110,32,119,105,100,101,115,112 +,114,101,97,100,76,105,98,101,114,97,116,105,111,110,116,111,111,107,32,112,108, +97,99,101,100,97,121,32,111,102,32,116,104,101,97,115,32,108,111,110,103,32,97, +115,105,109,112,114,105,115,111,110,101,100,65,100,100,105,116,105,111,110,97, +108,10,60,104,101,97,100,62,10,60,109,76,97,98,111,114,97,116,111,114,121,78,111 +,118,101,109,98,101,114,32,50,101,120,99,101,112,116,105,111,110,115,73,110,100, +117,115,116,114,105,97,108,118,97,114,105,101,116,121,32,111,102,102,108,111,97, +116,58,32,108,101,102,68,117,114,105,110,103,32,116,104,101,97,115,115,101,115, +115,109,101,110,116,104,97,118,101,32,98,101,101,110,32,100,101,97,108,115,32, +119,105,116,104,83,116,97,116,105,115,116,105,99,115,111,99,99,117,114,114,101, +110,99,101,47,117,108,62,60,47,100,105,118,62,99,108,101,97,114,102,105,120,34, +62,116,104,101,32,112,117,98,108,105,99,109,97,110,121,32,121,101,97,114,115,119 +,104,105,99,104,32,119,101,114,101,111,118,101,114,32,116,105,109,101,44,115,121 +,110,111,110,121,109,111,117,115,99,111,110,116,101,110,116,34,62,10,112,114,101 +,115,117,109,97,98,108,121,104,105,115,32,102,97,109,105,108,121,117,115,101,114 +,65,103,101,110,116,46,117,110,101,120,112,101,99,116,101,100,105,110,99,108,117 +,100,105,110,103,32,99,104,97,108,108,101,110,103,101,100,97,32,109,105,110,111, +114,105,116,121,117,110,100,101,102,105,110,101,100,34,98,101,108,111,110,103, +115,32,116,111,116,97,107,101,110,32,102,114,111,109,105,110,32,79,99,116,111,98 +,101,114,112,111,115,105,116,105,111,110,58,32,115,97,105,100,32,116,111,32,98, +101,114,101,108,105,103,105,111,117,115,32,70,101,100,101,114,97,116,105,111,110 +,32,114,111,119,115,112,97,110,61,34,111,110,108,121,32,97,32,102,101,119,109, +101,97,110,116,32,116,104,97,116,108,101,100,32,116,111,32,116,104,101,45,45,62, +13,10,60,100,105,118,32,60,102,105,101,108,100,115,101,116,62,65,114,99,104,98, +105,115,104,111,112,32,99,108,97,115,115,61,34,110,111,98,101,105,110,103,32,117 +,115,101,100,97,112,112,114,111,97,99,104,101,115,112,114,105,118,105,108,101, +103,101,115,110,111,115,99,114,105,112,116,62,10,114,101,115,117,108,116,115,32, +105,110,109,97,121,32,98,101,32,116,104,101,69,97,115,116,101,114,32,101,103,103 +,109,101,99,104,97,110,105,115,109,115,114,101,97,115,111,110,97,98,108,101,80, +111,112,117,108,97,116,105,111,110,67,111,108,108,101,99,116,105,111,110,115,101 +,108,101,99,116,101,100,34,62,110,111,115,99,114,105,112,116,62,13,47,105,110, +100,101,120,46,112,104,112,97,114,114,105,118,97,108,32,111,102,45,106,115,115, +100,107,39,41,41,59,109,97,110,97,103,101,100,32,116,111,105,110,99,111,109,112, +108,101,116,101,99,97,115,117,97,108,116,105,101,115,99,111,109,112,108,101,116, +105,111,110,67,104,114,105,115,116,105,97,110,115,83,101,112,116,101,109,98,101, +114,32,97,114,105,116,104,109,101,116,105,99,112,114,111,99,101,100,117,114,101, +115,109,105,103,104,116,32,104,97,118,101,80,114,111,100,117,99,116,105,111,110, +105,116,32,97,112,112,101,97,114,115,80,104,105,108,111,115,111,112,104,121,102, +114,105,101,110,100,115,104,105,112,108,101,97,100,105,110,103,32,116,111,103, +105,118,105,110,103,32,116,104,101,116,111,119,97,114,100,32,116,104,101,103,117 +,97,114,97,110,116,101,101,100,100,111,99,117,109,101,110,116,101,100,99,111,108 +,111,114,58,35,48,48,48,118,105,100,101,111,32,103,97,109,101,99,111,109,109,105 +,115,115,105,111,110,114,101,102,108,101,99,116,105,110,103,99,104,97,110,103, +101,32,116,104,101,97,115,115,111,99,105,97,116,101,100,115,97,110,115,45,115, +101,114,105,102,111,110,107,101,121,112,114,101,115,115,59,32,112,97,100,100,105 +,110,103,58,72,101,32,119,97,115,32,116,104,101,117,110,100,101,114,108,121,105, +110,103,116,121,112,105,99,97,108,108,121,32,44,32,97,110,100,32,116,104,101,32, +115,114,99,69,108,101,109,101,110,116,115,117,99,99,101,115,115,105,118,101,115, +105,110,99,101,32,116,104,101,32,115,104,111,117,108,100,32,98,101,32,110,101, +116,119,111,114,107,105,110,103,97,99,99,111,117,110,116,105,110,103,117,115,101 +,32,111,102,32,116,104,101,108,111,119,101,114,32,116,104,97,110,115,104,111,119 +,115,32,116,104,97,116,60,47,115,112,97,110,62,10,9,9,99,111,109,112,108,97,105, +110,116,115,99,111,110,116,105,110,117,111,117,115,113,117,97,110,116,105,116, +105,101,115,97,115,116,114,111,110,111,109,101,114,104,101,32,100,105,100,32,110 +,111,116,100,117,101,32,116,111,32,105,116,115,97,112,112,108,105,101,100,32,116 +,111,97,110,32,97,118,101,114,97,103,101,101,102,102,111,114,116,115,32,116,111, +116,104,101,32,102,117,116,117,114,101,97,116,116,101,109,112,116,32,116,111,84, +104,101,114,101,102,111,114,101,44,99,97,112,97,98,105,108,105,116,121,82,101, +112,117,98,108,105,99,97,110,119,97,115,32,102,111,114,109,101,100,69,108,101,99 +,116,114,111,110,105,99,107,105,108,111,109,101,116,101,114,115,99,104,97,108, +108,101,110,103,101,115,112,117,98,108,105,115,104,105,110,103,116,104,101,32, +102,111,114,109,101,114,105,110,100,105,103,101,110,111,117,115,100,105,114,101, +99,116,105,111,110,115,115,117,98,115,105,100,105,97,114,121,99,111,110,115,112, +105,114,97,99,121,100,101,116,97,105,108,115,32,111,102,97,110,100,32,105,110,32 +,116,104,101,97,102,102,111,114,100,97,98,108,101,115,117,98,115,116,97,110,99, +101,115,114,101,97,115,111,110,32,102,111,114,99,111,110,118,101,110,116,105,111 +,110,105,116,101,109,116,121,112,101,61,34,97,98,115,111,108,117,116,101,108,121 +,115,117,112,112,111,115,101,100,108,121,114,101,109,97,105,110,101,100,32,97,97 +,116,116,114,97,99,116,105,118,101,116,114,97,118,101,108,108,105,110,103,115, +101,112,97,114,97,116,101,108,121,102,111,99,117,115,101,115,32,111,110,101,108, +101,109,101,110,116,97,114,121,97,112,112,108,105,99,97,98,108,101,102,111,117, +110,100,32,116,104,97,116,115,116,121,108,101,115,104,101,101,116,109,97,110,117 +,115,99,114,105,112,116,115,116,97,110,100,115,32,102,111,114,32,110,111,45,114, +101,112,101,97,116,40,115,111,109,101,116,105,109,101,115,67,111,109,109,101,114 +,99,105,97,108,105,110,32,65,109,101,114,105,99,97,117,110,100,101,114,116,97, +107,101,110,113,117,97,114,116,101,114,32,111,102,97,110,32,101,120,97,109,112, +108,101,112,101,114,115,111,110,97,108,108,121,105,110,100,101,120,46,112,104, +112,63,60,47,98,117,116,116,111,110,62,10,112,101,114,99,101,110,116,97,103,101, +98,101,115,116,45,107,110,111,119,110,99,114,101,97,116,105,110,103,32,97,34,32, +100,105,114,61,34,108,116,114,76,105,101,117,116,101,110,97,110,116,10,60,100, +105,118,32,105,100,61,34,116,104,101,121,32,119,111,117,108,100,97,98,105,108, +105,116,121,32,111,102,109,97,100,101,32,117,112,32,111,102,110,111,116,101,100, +32,116,104,97,116,99,108,101,97,114,32,116,104,97,116,97,114,103,117,101,32,116, +104,97,116,116,111,32,97,110,111,116,104,101,114,99,104,105,108,100,114,101,110, +39,115,112,117,114,112,111,115,101,32,111,102,102,111,114,109,117,108,97,116,101 +,100,98,97,115,101,100,32,117,112,111,110,116,104,101,32,114,101,103,105,111,110 +,115,117,98,106,101,99,116,32,111,102,112,97,115,115,101,110,103,101,114,115,112 +,111,115,115,101,115,115,105,111,110,46,10,10,73,110,32,116,104,101,32,66,101, +102,111,114,101,32,116,104,101,97,102,116,101,114,119,97,114,100,115,99,117,114, +114,101,110,116,108,121,32,97,99,114,111,115,115,32,116,104,101,115,99,105,101, +110,116,105,102,105,99,99,111,109,109,117,110,105,116,121,46,99,97,112,105,116, +97,108,105,115,109,105,110,32,71,101,114,109,97,110,121,114,105,103,104,116,45, +119,105,110,103,116,104,101,32,115,121,115,116,101,109,83,111,99,105,101,116,121 +,32,111,102,112,111,108,105,116,105,99,105,97,110,100,105,114,101,99,116,105,111 +,110,58,119,101,110,116,32,111,110,32,116,111,114,101,109,111,118,97,108,32,111, +102,32,78,101,119,32,89,111,114,107,32,97,112,97,114,116,109,101,110,116,115,105 +,110,100,105,99,97,116,105,111,110,100,117,114,105,110,103,32,116,104,101,117, +110,108,101,115,115,32,116,104,101,104,105,115,116,111,114,105,99,97,108,104,97, +100,32,98,101,101,110,32,97,100,101,102,105,110,105,116,105,118,101,105,110,103, +114,101,100,105,101,110,116,97,116,116,101,110,100,97,110,99,101,67,101,110,116, +101,114,32,102,111,114,112,114,111,109,105,110,101,110,99,101,114,101,97,100,121 +,83,116,97,116,101,115,116,114,97,116,101,103,105,101,115,98,117,116,32,105,110, +32,116,104,101,97,115,32,112,97,114,116,32,111,102,99,111,110,115,116,105,116, +117,116,101,99,108,97,105,109,32,116,104,97,116,108,97,98,111,114,97,116,111,114 +,121,99,111,109,112,97,116,105,98,108,101,102,97,105,108,117,114,101,32,111,102, +44,32,115,117,99,104,32,97,115,32,98,101,103,97,110,32,119,105,116,104,117,115, +105,110,103,32,116,104,101,32,116,111,32,112,114,111,118,105,100,101,102,101,97, +116,117,114,101,32,111,102,102,114,111,109,32,119,104,105,99,104,47,34,32,99,108 +,97,115,115,61,34,103,101,111,108,111,103,105,99,97,108,115,101,118,101,114,97, +108,32,111,102,100,101,108,105,98,101,114,97,116,101,105,109,112,111,114,116,97, +110,116,32,104,111,108,100,115,32,116,104,97,116,105,110,103,38,113,117,111,116, +59,32,118,97,108,105,103,110,61,116,111,112,116,104,101,32,71,101,114,109,97,110 +,111,117,116,115,105,100,101,32,111,102,110,101,103,111,116,105,97,116,101,100, +104,105,115,32,99,97,114,101,101,114,115,101,112,97,114,97,116,105,111,110,105, +100,61,34,115,101,97,114,99,104,119,97,115,32,99,97,108,108,101,100,116,104,101, +32,102,111,117,114,116,104,114,101,99,114,101,97,116,105,111,110,111,116,104,101 +,114,32,116,104,97,110,112,114,101,118,101,110,116,105,111,110,119,104,105,108, +101,32,116,104,101,32,101,100,117,99,97,116,105,111,110,44,99,111,110,110,101,99 +,116,105,110,103,97,99,99,117,114,97,116,101,108,121,119,101,114,101,32,98,117, +105,108,116,119,97,115,32,107,105,108,108,101,100,97,103,114,101,101,109,101,110 +,116,115,109,117,99,104,32,109,111,114,101,32,68,117,101,32,116,111,32,116,104, +101,119,105,100,116,104,58,32,49,48,48,115,111,109,101,32,111,116,104,101,114,75 +,105,110,103,100,111,109,32,111,102,116,104,101,32,101,110,116,105,114,101,102, +97,109,111,117,115,32,102,111,114,116,111,32,99,111,110,110,101,99,116,111,98, +106,101,99,116,105,118,101,115,116,104,101,32,70,114,101,110,99,104,112,101,111, +112,108,101,32,97,110,100,102,101,97,116,117,114,101,100,34,62,105,115,32,115,97 +,105,100,32,116,111,115,116,114,117,99,116,117,114,97,108,114,101,102,101,114, +101,110,100,117,109,109,111,115,116,32,111,102,116,101,110,97,32,115,101,112,97, +114,97,116,101,45,62,10,60,100,105,118,32,105,100,32,79,102,102,105,99,105,97, +108,32,119,111,114,108,100,119,105,100,101,46,97,114,105,97,45,108,97,98,101,108 +,116,104,101,32,112,108,97,110,101,116,97,110,100,32,105,116,32,119,97,115,100, +34,32,118,97,108,117,101,61,34,108,111,111,107,105,110,103,32,97,116,98,101,110, +101,102,105,99,105,97,108,97,114,101,32,105,110,32,116,104,101,109,111,110,105, +116,111,114,105,110,103,114,101,112,111,114,116,101,100,108,121,116,104,101,32, +109,111,100,101,114,110,119,111,114,107,105,110,103,32,111,110,97,108,108,111, +119,101,100,32,116,111,119,104,101,114,101,32,116,104,101,32,105,110,110,111,118 +,97,116,105,118,101,60,47,97,62,60,47,100,105,118,62,115,111,117,110,100,116,114 +,97,99,107,115,101,97,114,99,104,70,111,114,109,116,101,110,100,32,116,111,32,98 +,101,105,110,112,117,116,32,105,100,61,34,111,112,101,110,105,110,103,32,111,102 +,114,101,115,116,114,105,99,116,101,100,97,100,111,112,116,101,100,32,98,121,97, +100,100,114,101,115,115,105,110,103,116,104,101,111,108,111,103,105,97,110,109, +101,116,104,111,100,115,32,111,102,118,97,114,105,97,110,116,32,111,102,67,104, +114,105,115,116,105,97,110,32,118,101,114,121,32,108,97,114,103,101,97,117,116, +111,109,111,116,105,118,101,98,121,32,102,97,114,32,116,104,101,114,97,110,103, +101,32,102,114,111,109,112,117,114,115,117,105,116,32,111,102,102,111,108,108, +111,119,32,116,104,101,98,114,111,117,103,104,116,32,116,111,105,110,32,69,110, +103,108,97,110,100,97,103,114,101,101,32,116,104,97,116,97,99,99,117,115,101,100 +,32,111,102,99,111,109,101,115,32,102,114,111,109,112,114,101,118,101,110,116, +105,110,103,100,105,118,32,115,116,121,108,101,61,104,105,115,32,111,114,32,104, +101,114,116,114,101,109,101,110,100,111,117,115,102,114,101,101,100,111,109,32, +111,102,99,111,110,99,101,114,110,105,110,103,48,32,49,101,109,32,49,101,109,59, +66,97,115,107,101,116,98,97,108,108,47,115,116,121,108,101,46,99,115,115,97,110, +32,101,97,114,108,105,101,114,101,118,101,110,32,97,102,116,101,114,47,34,32,116 +,105,116,108,101,61,34,46,99,111,109,47,105,110,100,101,120,116,97,107,105,110, +103,32,116,104,101,112,105,116,116,115,98,117,114,103,104,99,111,110,116,101,110 +,116,34,62,13,60,115,99,114,105,112,116,62,40,102,116,117,114,110,101,100,32,111 +,117,116,104,97,118,105,110,103,32,116,104,101,60,47,115,112,97,110,62,13,10,32, +111,99,99,97,115,105,111,110,97,108,98,101,99,97,117,115,101,32,105,116,115,116, +97,114,116,101,100,32,116,111,112,104,121,115,105,99,97,108,108,121,62,60,47,100 +,105,118,62,10,32,32,99,114,101,97,116,101,100,32,98,121,67,117,114,114,101,110, +116,108,121,44,32,98,103,99,111,108,111,114,61,34,116,97,98,105,110,100,101,120, +61,34,100,105,115,97,115,116,114,111,117,115,65,110,97,108,121,116,105,99,115,32 +,97,108,115,111,32,104,97,115,32,97,62,60,100,105,118,32,105,100,61,34,60,47,115 +,116,121,108,101,62,10,60,99,97,108,108,101,100,32,102,111,114,115,105,110,103, +101,114,32,97,110,100,46,115,114,99,32,61,32,34,47,47,118,105,111,108,97,116,105 +,111,110,115,116,104,105,115,32,112,111,105,110,116,99,111,110,115,116,97,110, +116,108,121,105,115,32,108,111,99,97,116,101,100,114,101,99,111,114,100,105,110, +103,115,100,32,102,114,111,109,32,116,104,101,110,101,100,101,114,108,97,110,100 +,115,112,111,114,116,117,103,117,195,170,115,215,162,215,145,215,168,215,153,215 +,170,217,129,216,167,216,177,216,179,219,140,100,101,115,97,114,114,111,108,108, +111,99,111,109,101,110,116,97,114,105,111,101,100,117,99,97,99,105,195,179,110, +115,101,112,116,105,101,109,98,114,101,114,101,103,105,115,116,114,97,100,111, +100,105,114,101,99,99,105,195,179,110,117,98,105,99,97,99,105,195,179,110,112, +117,98,108,105,99,105,100,97,100,114,101,115,112,117,101,115,116,97,115,114,101, +115,117,108,116,97,100,111,115,105,109,112,111,114,116,97,110,116,101,114,101, +115,101,114,118,97,100,111,115,97,114,116,195,173,99,117,108,111,115,100,105,102 +,101,114,101,110,116,101,115,115,105,103,117,105,101,110,116,101,115,114,101,112 +,195,186,98,108,105,99,97,115,105,116,117,97,99,105,195,179,110,109,105,110,105, +115,116,101,114,105,111,112,114,105,118,97,99,105,100,97,100,100,105,114,101,99, +116,111,114,105,111,102,111,114,109,97,99,105,195,179,110,112,111,98,108,97,99, +105,195,179,110,112,114,101,115,105,100,101,110,116,101,99,111,110,116,101,110, +105,100,111,115,97,99,99,101,115,111,114,105,111,115,116,101,99,104,110,111,114, +97,116,105,112,101,114,115,111,110,97,108,101,115,99,97,116,101,103,111,114,195, +173,97,101,115,112,101,99,105,97,108,101,115,100,105,115,112,111,110,105,98,108, +101,97,99,116,117,97,108,105,100,97,100,114,101,102,101,114,101,110,99,105,97, +118,97,108,108,97,100,111,108,105,100,98,105,98,108,105,111,116,101,99,97,114, +101,108,97,99,105,111,110,101,115,99,97,108,101,110,100,97,114,105,111,112,111, +108,195,173,116,105,99,97,115,97,110,116,101,114,105,111,114,101,115,100,111,99, +117,109,101,110,116,111,115,110,97,116,117,114,97,108,101,122,97,109,97,116,101, +114,105,97,108,101,115,100,105,102,101,114,101,110,99,105,97,101,99,111,110,195, +179,109,105,99,97,116,114,97,110,115,112,111,114,116,101,114,111,100,114,195,173 +,103,117,101,122,112,97,114,116,105,99,105,112,97,114,101,110,99,117,101,110,116 +,114,97,110,100,105,115,99,117,115,105,195,179,110,101,115,116,114,117,99,116, +117,114,97,102,117,110,100,97,99,105,195,179,110,102,114,101,99,117,101,110,116, +101,115,112,101,114,109,97,110,101,110,116,101,116,111,116,97,108,109,101,110, +116,101,208,188,208,190,208,182,208,189,208,190,208,177,209,131,208,180,208,181, +209,130,208,188,208,190,208,182,208,181,209,130,208,178,209,128,208,181,208,188, +209,143,209,130,208,176,208,186,208,182,208,181,209,135,209,130,208,190,208,177, +209,139,208,177,208,190,208,187,208,181,208,181,208,190,209,135,208,181,208,189, +209,140,209,141,209,130,208,190,208,179,208,190,208,186,208,190,208,179,208,180, +208,176,208,191,208,190,209,129,208,187,208,181,208,178,209,129,208,181,208,179, +208,190,209,129,208,176,208,185,209,130,208,181,209,135,208,181,209,128,208,181, +208,183,208,188,208,190,208,179,209,131,209,130,209,129,208,176,208,185,209,130, +208,176,208,182,208,184,208,183,208,189,208,184,208,188,208,181,208,182,208,180, +209,131,208,177,209,131,208,180,209,131,209,130,208,159,208,190,208,184,209,129, +208,186,208,183,208,180,208,181,209,129,209,140,208,178,208,184,208,180,208,181, +208,190,209,129,208,178,209,143,208,183,208,184,208,189,209,131,208,182,208,189, +208,190,209,129,208,178,208,190,208,181,208,185,208,187,209,142,208,180,208,181, +208,185,208,191,208,190,209,128,208,189,208,190,208,188,208,189,208,190,208,179, +208,190,208,180,208,181,209,130,208,181,208,185,209,129,208,178,208,190,208,184, +209,133,208,191,209,128,208,176,208,178,208,176,209,130,208,176,208,186,208,190, +208,185,208,188,208,181,209,129,209,130,208,190,208,184,208,188,208,181,208,181, +209,130,208,182,208,184,208,183,208,189,209,140,208,190,208,180,208,189,208,190, +208,185,208,187,209,131,209,135,209,136,208,181,208,191,208,181,209,128,208,181, +208,180,209,135,208,176,209,129,209,130,208,184,209,135,208,176,209,129,209,130, +209,140,209,128,208,176,208,177,208,190,209,130,208,189,208,190,208,178,209,139, +209,133,208,191,209,128,208,176,208,178,208,190,209,129,208,190,208,177,208,190, +208,185,208,191,208,190,209,130,208,190,208,188,208,188,208,181,208,189,208,181, +208,181,209,135,208,184,209,129,208,187,208,181,208,189,208,190,208,178,209,139, +208,181,209,131,209,129,208,187,209,131,208,179,208,190,208,186,208,190,208,187, +208,190,208,189,208,176,208,183,208,176,208,180,209,130,208,176,208,186,208,190, +208,181,209,130,208,190,208,179,208,180,208,176,208,191,208,190,209,135,209,130, +208,184,208,159,208,190,209,129,208,187,208,181,209,130,208,176,208,186,208,184, +208,181,208,189,208,190,208,178,209,139,208,185,209,129,209,130,208,190,208,184, +209,130,209,130,208,176,208,186,208,184,209,133,209,129,209,128,208,176,208,183, +209,131,208,161,208,176,208,189,208,186,209,130,209,132,208,190,209,128,209,131, +208,188,208,154,208,190,208,179,208,180,208,176,208,186,208,189,208,184,208,179, +208,184,209,129,208,187,208,190,208,178,208,176,208,189,208,176,209,136,208,181, +208,185,208,189,208,176,208,185,209,130,208,184,209,129,208,178,208,190,208,184, +208,188,209,129,208,178,209,143,208,183,209,140,208,187,209,142,208,177,208,190, +208,185,209,135,208,176,209,129,209,130,208,190,209,129,209,128,208,181,208,180, +208,184,208,154,209,128,208,190,208,188,208,181,208,164,208,190,209,128,209,131, +208,188,209,128,209,139,208,189,208,186,208,181,209,129,209,130,208,176,208,187, +208,184,208,191,208,190,208,184,209,129,208,186,209,130,209,139,209,129,209,143, +209,135,208,188,208,181,209,129,209,143,209,134,209,134,208,181,208,189,209,130, +209,128,209,130,209,128,209,131,208,180,208,176,209,129,208,176,208,188,209,139, +209,133,209,128,209,139,208,189,208,186,208,176,208,157,208,190,208,178,209,139, +208,185,209,135,208,176,209,129,208,190,208,178,208,188,208,181,209,129,209,130, +208,176,209,132,208,184,208,187,209,140,208,188,208,188,208,176,209,128,209,130, +208,176,209,129,209,130,209,128,208,176,208,189,208,188,208,181,209,129,209,130, +208,181,209,130,208,181,208,186,209,129,209,130,208,189,208,176,209,136,208,184, +209,133,208,188,208,184,208,189,209,131,209,130,208,184,208,188,208,181,208,189, +208,184,208,184,208,188,208,181,209,142,209,130,208,189,208,190,208,188,208,181, +209,128,208,179,208,190,209,128,208,190,208,180,209,129,208,176,208,188,208,190, +208,188,209,141,209,130,208,190,208,188,209,131,208,186,208,190,208,189,209,134, +208,181,209,129,208,178,208,190,208,181,208,188,208,186,208,176,208,186,208,190, +208,185,208,144,209,128,209,133,208,184,208,178,217,133,217,134,216,170,216,175, +217,137,216,165,216,177,216,179,216,167,217,132,216,177,216,179,216,167,217,132, +216,169,216,167,217,132,216,185,216,167,217,133,217,131,216,170,216,168,217,135, +216,167,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,138,217,136, +217,133,216,167,217,132,216,181,217,136,216,177,216,172,216,175,217,138,216,175, +216,169,216,167,217,132,216,185,216,182,217,136,216,165,216,182,216,167,217,129, +216,169,216,167,217,132,217,130,216,179,217,133,216,167,217,132,216,185,216,167, +216,168,216,170,216,173,217,133,217,138,217,132,217,133,217,132,217,129,216,167, +216,170,217,133,217,132,216,170,217,130,217,137,216,170,216,185,216,175,217,138, +217,132,216,167,217,132,216,180,216,185,216,177,216,163,216,174,216,168,216,167, +216,177,216,170,216,183,217,136,217,138,216,177,216,185,217,132,217,138,217,131, +217,133,216,165,216,177,217,129,216,167,217,130,216,183,217,132,216,168,216,167, +216,170,216,167,217,132,217,132,216,186,216,169,216,170,216,177,216,170,217,138, +216,168,216,167,217,132,217,134,216,167,216,179,216,167,217,132,216,180,217,138, +216,174,217,133,217,134,216,170,216,175,217,138,216,167,217,132,216,185,216,177, +216,168,216,167,217,132,217,130,216,181,216,181,216,167,217,129,217,132,216,167, +217,133,216,185,217,132,217,138,217,135,216,167,216,170,216,173,216,175,217,138, +216,171,216,167,217,132,217,132,217,135,217,133,216,167,217,132,216,185,217,133, +217,132,217,133,217,131,216,170,216,168,216,169,217,138,217,133,217,131,217,134, +217,131,216,167,217,132,216,183,217,129,217,132,217,129,217,138,216,175,217,138, +217,136,216,165,216,175,216,167,216,177,216,169,216,170,216,167,216,177,217,138, +216,174,216,167,217,132,216,181,216,173,216,169,216,170,216,179,216,172,217,138, +217,132,216,167,217,132,217,136,217,130,216,170,216,185,217,134,216,175,217,133, +216,167,217,133,216,175,217,138,217,134,216,169,216,170,216,181,217,133,217,138, +217,133,216,163,216,177,216,180,217,138,217,129,216,167,217,132,216,176,217,138, +217,134,216,185,216,177,216,168,217,138,216,169,216,168,217,136,216,167,216,168, +216,169,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,179,217,129, +216,177,217,133,216,180,216,167,217,131,217,132,216,170,216,185,216,167,217,132, +217,137,216,167,217,132,216,163,217,136,217,132,216,167,217,132,216,179,217,134, +216,169,216,172,216,167,217,133,216,185,216,169,216,167,217,132,216,181,216,173, +217,129,216,167,217,132,216,175,217,138,217,134,217,131,217,132,217,133,216,167, +216,170,216,167,217,132,216,174,216,167,216,181,216,167,217,132,217,133,217,132, +217,129,216,163,216,185,216,182,216,167,216,161,217,131,216,170,216,167,216,168, +216,169,216,167,217,132,216,174,217,138,216,177,216,177,216,179,216,167,216,166, +217,132,216,167,217,132,217,130,217,132,216,168,216,167,217,132,216,163,216,175, +216,168,217,133,217,130,216,167,216,183,216,185,217,133,216,177,216,167,216,179, +217,132,217,133,217,134,216,183,217,130,216,169,216,167,217,132,217,131,216,170, +216,168,216,167,217,132,216,177,216,172,217,132,216,167,216,180,216,170,216,177, +217,131,216,167,217,132,217,130,216,175,217,133,217,138,216,185,216,183,217,138, +217,131,115,66,121,84,97,103,78,97,109,101,40,46,106,112,103,34,32,97,108,116,61 +,34,49,112,120,32,115,111,108,105,100,32,35,46,103,105,102,34,32,97,108,116,61, +34,116,114,97,110,115,112,97,114,101,110,116,105,110,102,111,114,109,97,116,105, +111,110,97,112,112,108,105,99,97,116,105,111,110,34,32,111,110,99,108,105,99,107 +,61,34,101,115,116,97,98,108,105,115,104,101,100,97,100,118,101,114,116,105,115, +105,110,103,46,112,110,103,34,32,97,108,116,61,34,101,110,118,105,114,111,110, +109,101,110,116,112,101,114,102,111,114,109,97,110,99,101,97,112,112,114,111,112 +,114,105,97,116,101,38,97,109,112,59,109,100,97,115,104,59,105,109,109,101,100, +105,97,116,101,108,121,60,47,115,116,114,111,110,103,62,60,47,114,97,116,104,101 +,114,32,116,104,97,110,116,101,109,112,101,114,97,116,117,114,101,100,101,118, +101,108,111,112,109,101,110,116,99,111,109,112,101,116,105,116,105,111,110,112, +108,97,99,101,104,111,108,100,101,114,118,105,115,105,98,105,108,105,116,121,58, +99,111,112,121,114,105,103,104,116,34,62,48,34,32,104,101,105,103,104,116,61,34, +101,118,101,110,32,116,104,111,117,103,104,114,101,112,108,97,99,101,109,101,110 +,116,100,101,115,116,105,110,97,116,105,111,110,67,111,114,112,111,114,97,116, +105,111,110,60,117,108,32,99,108,97,115,115,61,34,65,115,115,111,99,105,97,116, +105,111,110,105,110,100,105,118,105,100,117,97,108,115,112,101,114,115,112,101, +99,116,105,118,101,115,101,116,84,105,109,101,111,117,116,40,117,114,108,40,104, +116,116,112,58,47,47,109,97,116,104,101,109,97,116,105,99,115,109,97,114,103,105 +,110,45,116,111,112,58,101,118,101,110,116,117,97,108,108,121,32,100,101,115,99, +114,105,112,116,105,111,110,41,32,110,111,45,114,101,112,101,97,116,99,111,108, +108,101,99,116,105,111,110,115,46,74,80,71,124,116,104,117,109,98,124,112,97,114 +,116,105,99,105,112,97,116,101,47,104,101,97,100,62,60,98,111,100,121,102,108, +111,97,116,58,108,101,102,116,59,60,108,105,32,99,108,97,115,115,61,34,104,117, +110,100,114,101,100,115,32,111,102,10,10,72,111,119,101,118,101,114,44,32,99,111 +,109,112,111,115,105,116,105,111,110,99,108,101,97,114,58,98,111,116,104,59,99, +111,111,112,101,114,97,116,105,111,110,119,105,116,104,105,110,32,116,104,101,32 +,108,97,98,101,108,32,102,111,114,61,34,98,111,114,100,101,114,45,116,111,112,58 +,78,101,119,32,90,101,97,108,97,110,100,114,101,99,111,109,109,101,110,100,101, +100,112,104,111,116,111,103,114,97,112,104,121,105,110,116,101,114,101,115,116, +105,110,103,38,108,116,59,115,117,112,38,103,116,59,99,111,110,116,114,111,118, +101,114,115,121,78,101,116,104,101,114,108,97,110,100,115,97,108,116,101,114,110 +,97,116,105,118,101,109,97,120,108,101,110,103,116,104,61,34,115,119,105,116,122 +,101,114,108,97,110,100,68,101,118,101,108,111,112,109,101,110,116,101,115,115, +101,110,116,105,97,108,108,121,10,10,65,108,116,104,111,117,103,104,32,60,47,116 +,101,120,116,97,114,101,97,62,116,104,117,110,100,101,114,98,105,114,100,114,101 +,112,114,101,115,101,110,116,101,100,38,97,109,112,59,110,100,97,115,104,59,115, +112,101,99,117,108,97,116,105,111,110,99,111,109,109,117,110,105,116,105,101,115 +,108,101,103,105,115,108,97,116,105,111,110,101,108,101,99,116,114,111,110,105, +99,115,10,9,60,100,105,118,32,105,100,61,34,105,108,108,117,115,116,114,97,116, +101,100,101,110,103,105,110,101,101,114,105,110,103,116,101,114,114,105,116,111, +114,105,101,115,97,117,116,104,111,114,105,116,105,101,115,100,105,115,116,114, +105,98,117,116,101,100,54,34,32,104,101,105,103,104,116,61,34,115,97,110,115,45, +115,101,114,105,102,59,99,97,112,97,98,108,101,32,111,102,32,100,105,115,97,112, +112,101,97,114,101,100,105,110,116,101,114,97,99,116,105,118,101,108,111,111,107 +,105,110,103,32,102,111,114,105,116,32,119,111,117,108,100,32,98,101,65,102,103, +104,97,110,105,115,116,97,110,119,97,115,32,99,114,101,97,116,101,100,77,97,116, +104,46,102,108,111,111,114,40,115,117,114,114,111,117,110,100,105,110,103,99,97, +110,32,97,108,115,111,32,98,101,111,98,115,101,114,118,97,116,105,111,110,109,97 +,105,110,116,101,110,97,110,99,101,101,110,99,111,117,110,116,101,114,101,100,60 +,104,50,32,99,108,97,115,115,61,34,109,111,114,101,32,114,101,99,101,110,116,105 +,116,32,104,97,115,32,98,101,101,110,105,110,118,97,115,105,111,110,32,111,102, +41,46,103,101,116,84,105,109,101,40,41,102,117,110,100,97,109,101,110,116,97,108 +,68,101,115,112,105,116,101,32,116,104,101,34,62,60,100,105,118,32,105,100,61,34 +,105,110,115,112,105,114,97,116,105,111,110,101,120,97,109,105,110,97,116,105, +111,110,112,114,101,112,97,114,97,116,105,111,110,101,120,112,108,97,110,97,116, +105,111,110,60,105,110,112,117,116,32,105,100,61,34,60,47,97,62,60,47,115,112,97 +,110,62,118,101,114,115,105,111,110,115,32,111,102,105,110,115,116,114,117,109, +101,110,116,115,98,101,102,111,114,101,32,116,104,101,32,32,61,32,39,104,116,116 +,112,58,47,47,68,101,115,99,114,105,112,116,105,111,110,114,101,108,97,116,105, +118,101,108,121,32,46,115,117,98,115,116,114,105,110,103,40,101,97,99,104,32,111 +,102,32,116,104,101,101,120,112,101,114,105,109,101,110,116,115,105,110,102,108, +117,101,110,116,105,97,108,105,110,116,101,103,114,97,116,105,111,110,109,97,110 +,121,32,112,101,111,112,108,101,100,117,101,32,116,111,32,116,104,101,32,99,111, +109,98,105,110,97,116,105,111,110,100,111,32,110,111,116,32,104,97,118,101,77, +105,100,100,108,101,32,69,97,115,116,60,110,111,115,99,114,105,112,116,62,60,99, +111,112,121,114,105,103,104,116,34,32,112,101,114,104,97,112,115,32,116,104,101, +105,110,115,116,105,116,117,116,105,111,110,105,110,32,68,101,99,101,109,98,101, +114,97,114,114,97,110,103,101,109,101,110,116,109,111,115,116,32,102,97,109,111, +117,115,112,101,114,115,111,110,97,108,105,116,121,99,114,101,97,116,105,111,110 +,32,111,102,108,105,109,105,116,97,116,105,111,110,115,101,120,99,108,117,115, +105,118,101,108,121,115,111,118,101,114,101,105,103,110,116,121,45,99,111,110, +116,101,110,116,34,62,10,60,116,100,32,99,108,97,115,115,61,34,117,110,100,101, +114,103,114,111,117,110,100,112,97,114,97,108,108,101,108,32,116,111,100,111,99, +116,114,105,110,101,32,111,102,111,99,99,117,112,105,101,100,32,98,121,116,101, +114,109,105,110,111,108,111,103,121,82,101,110,97,105,115,115,97,110,99,101,97, +32,110,117,109,98,101,114,32,111,102,115,117,112,112,111,114,116,32,102,111,114, +101,120,112,108,111,114,97,116,105,111,110,114,101,99,111,103,110,105,116,105, +111,110,112,114,101,100,101,99,101,115,115,111,114,60,105,109,103,32,115,114,99, +61,34,47,60,104,49,32,99,108,97,115,115,61,34,112,117,98,108,105,99,97,116,105, +111,110,109,97,121,32,97,108,115,111,32,98,101,115,112,101,99,105,97,108,105,122 +,101,100,60,47,102,105,101,108,100,115,101,116,62,112,114,111,103,114,101,115, +115,105,118,101,109,105,108,108,105,111,110,115,32,111,102,115,116,97,116,101, +115,32,116,104,97,116,101,110,102,111,114,99,101,109,101,110,116,97,114,111,117, +110,100,32,116,104,101,32,111,110,101,32,97,110,111,116,104,101,114,46,112,97, +114,101,110,116,78,111,100,101,97,103,114,105,99,117,108,116,117,114,101,65,108, +116,101,114,110,97,116,105,118,101,114,101,115,101,97,114,99,104,101,114,115,116 +,111,119,97,114,100,115,32,116,104,101,77,111,115,116,32,111,102,32,116,104,101, +109,97,110,121,32,111,116,104,101,114,32,40,101,115,112,101,99,105,97,108,108, +121,60,116,100,32,119,105,100,116,104,61,34,59,119,105,100,116,104,58,49,48,48, +37,105,110,100,101,112,101,110,100,101,110,116,60,104,51,32,99,108,97,115,115,61 +,34,32,111,110,99,104,97,110,103,101,61,34,41,46,97,100,100,67,108,97,115,115,40 +,105,110,116,101,114,97,99,116,105,111,110,79,110,101,32,111,102,32,116,104,101, +32,100,97,117,103,104,116,101,114,32,111,102,97,99,99,101,115,115,111,114,105, +101,115,98,114,97,110,99,104,101,115,32,111,102,13,10,60,100,105,118,32,105,100, +61,34,116,104,101,32,108,97,114,103,101,115,116,100,101,99,108,97,114,97,116,105 +,111,110,114,101,103,117,108,97,116,105,111,110,115,73,110,102,111,114,109,97, +116,105,111,110,116,114,97,110,115,108,97,116,105,111,110,100,111,99,117,109,101 +,110,116,97,114,121,105,110,32,111,114,100,101,114,32,116,111,34,62,10,60,104, +101,97,100,62,10,60,34,32,104,101,105,103,104,116,61,34,49,97,99,114,111,115,115 +,32,116,104,101,32,111,114,105,101,110,116,97,116,105,111,110,41,59,60,47,115,99 +,114,105,112,116,62,105,109,112,108,101,109,101,110,116,101,100,99,97,110,32,98, +101,32,115,101,101,110,116,104,101,114,101,32,119,97,115,32,97,100,101,109,111, +110,115,116,114,97,116,101,99,111,110,116,97,105,110,101,114,34,62,99,111,110, +110,101,99,116,105,111,110,115,116,104,101,32,66,114,105,116,105,115,104,119,97, +115,32,119,114,105,116,116,101,110,33,105,109,112,111,114,116,97,110,116,59,112, +120,59,32,109,97,114,103,105,110,45,102,111,108,108,111,119,101,100,32,98,121,97 +,98,105,108,105,116,121,32,116,111,32,99,111,109,112,108,105,99,97,116,101,100, +100,117,114,105,110,103,32,116,104,101,32,105,109,109,105,103,114,97,116,105,111 +,110,97,108,115,111,32,99,97,108,108,101,100,60,104,52,32,99,108,97,115,115,61, +34,100,105,115,116,105,110,99,116,105,111,110,114,101,112,108,97,99,101,100,32, +98,121,103,111,118,101,114,110,109,101,110,116,115,108,111,99,97,116,105,111,110 +,32,111,102,105,110,32,78,111,118,101,109,98,101,114,119,104,101,116,104,101,114 +,32,116,104,101,60,47,112,62,10,60,47,100,105,118,62,97,99,113,117,105,115,105, +116,105,111,110,99,97,108,108,101,100,32,116,104,101,32,112,101,114,115,101,99, +117,116,105,111,110,100,101,115,105,103,110,97,116,105,111,110,123,102,111,110, +116,45,115,105,122,101,58,97,112,112,101,97,114,101,100,32,105,110,105,110,118, +101,115,116,105,103,97,116,101,101,120,112,101,114,105,101,110,99,101,100,109, +111,115,116,32,108,105,107,101,108,121,119,105,100,101,108,121,32,117,115,101, +100,100,105,115,99,117,115,115,105,111,110,115,112,114,101,115,101,110,99,101,32 +,111,102,32,40,100,111,99,117,109,101,110,116,46,101,120,116,101,110,115,105,118 +,101,108,121,73,116,32,104,97,115,32,98,101,101,110,105,116,32,100,111,101,115, +32,110,111,116,99,111,110,116,114,97,114,121,32,116,111,105,110,104,97,98,105, +116,97,110,116,115,105,109,112,114,111,118,101,109,101,110,116,115,99,104,111, +108,97,114,115,104,105,112,99,111,110,115,117,109,112,116,105,111,110,105,110, +115,116,114,117,99,116,105,111,110,102,111,114,32,101,120,97,109,112,108,101,111 +,110,101,32,111,114,32,109,111,114,101,112,120,59,32,112,97,100,100,105,110,103, +116,104,101,32,99,117,114,114,101,110,116,97,32,115,101,114,105,101,115,32,111, +102,97,114,101,32,117,115,117,97,108,108,121,114,111,108,101,32,105,110,32,116, +104,101,112,114,101,118,105,111,117,115,108,121,32,100,101,114,105,118,97,116, +105,118,101,115,101,118,105,100,101,110,99,101,32,111,102,101,120,112,101,114, +105,101,110,99,101,115,99,111,108,111,114,115,99,104,101,109,101,115,116,97,116, +101,100,32,116,104,97,116,99,101,114,116,105,102,105,99,97,116,101,60,47,97,62, +60,47,100,105,118,62,10,32,115,101,108,101,99,116,101,100,61,34,104,105,103,104, +32,115,99,104,111,111,108,114,101,115,112,111,110,115,101,32,116,111,99,111,109, +102,111,114,116,97,98,108,101,97,100,111,112,116,105,111,110,32,111,102,116,104, +114,101,101,32,121,101,97,114,115,116,104,101,32,99,111,117,110,116,114,121,105, +110,32,70,101,98,114,117,97,114,121,115,111,32,116,104,97,116,32,116,104,101,112 +,101,111,112,108,101,32,119,104,111,32,112,114,111,118,105,100,101,100,32,98,121 +,60,112,97,114,97,109,32,110,97,109,101,97,102,102,101,99,116,101,100,32,98,121, +105,110,32,116,101,114,109,115,32,111,102,97,112,112,111,105,110,116,109,101,110 +,116,73,83,79,45,56,56,53,57,45,49,34,119,97,115,32,98,111,114,110,32,105,110, +104,105,115,116,111,114,105,99,97,108,32,114,101,103,97,114,100,101,100,32,97, +115,109,101,97,115,117,114,101,109,101,110,116,105,115,32,98,97,115,101,100,32, +111,110,32,97,110,100,32,111,116,104,101,114,32,58,32,102,117,110,99,116,105,111 +,110,40,115,105,103,110,105,102,105,99,97,110,116,99,101,108,101,98,114,97,116, +105,111,110,116,114,97,110,115,109,105,116,116,101,100,47,106,115,47,106,113,117 +,101,114,121,46,105,115,32,107,110,111,119,110,32,97,115,116,104,101,111,114,101 +,116,105,99,97,108,32,116,97,98,105,110,100,101,120,61,34,105,116,32,99,111,117, +108,100,32,98,101,60,110,111,115,99,114,105,112,116,62,10,104,97,118,105,110,103 +,32,98,101,101,110,13,10,60,104,101,97,100,62,13,10,60,32,38,113,117,111,116,59, +84,104,101,32,99,111,109,112,105,108,97,116,105,111,110,104,101,32,104,97,100,32 +,98,101,101,110,112,114,111,100,117,99,101,100,32,98,121,112,104,105,108,111,115 +,111,112,104,101,114,99,111,110,115,116,114,117,99,116,101,100,105,110,116,101, +110,100,101,100,32,116,111,97,109,111,110,103,32,111,116,104,101,114,99,111,109, +112,97,114,101,100,32,116,111,116,111,32,115,97,121,32,116,104,97,116,69,110,103 +,105,110,101,101,114,105,110,103,97,32,100,105,102,102,101,114,101,110,116,114, +101,102,101,114,114,101,100,32,116,111,100,105,102,102,101,114,101,110,99,101, +115,98,101,108,105,101,102,32,116,104,97,116,112,104,111,116,111,103,114,97,112, +104,115,105,100,101,110,116,105,102,121,105,110,103,72,105,115,116,111,114,121, +32,111,102,32,82,101,112,117,98,108,105,99,32,111,102,110,101,99,101,115,115,97, +114,105,108,121,112,114,111,98,97,98,105,108,105,116,121,116,101,99,104,110,105, +99,97,108,108,121,108,101,97,118,105,110,103,32,116,104,101,115,112,101,99,116, +97,99,117,108,97,114,102,114,97,99,116,105,111,110,32,111,102,101,108,101,99,116 +,114,105,99,105,116,121,104,101,97,100,32,111,102,32,116,104,101,114,101,115,116 +,97,117,114,97,110,116,115,112,97,114,116,110,101,114,115,104,105,112,101,109, +112,104,97,115,105,115,32,111,110,109,111,115,116,32,114,101,99,101,110,116,115, +104,97,114,101,32,119,105,116,104,32,115,97,121,105,110,103,32,116,104,97,116, +102,105,108,108,101,100,32,119,105,116,104,100,101,115,105,103,110,101,100,32, +116,111,105,116,32,105,115,32,111,102,116,101,110,34,62,60,47,105,102,114,97,109 +,101,62,97,115,32,102,111,108,108,111,119,115,58,109,101,114,103,101,100,32,119, +105,116,104,116,104,114,111,117,103,104,32,116,104,101,99,111,109,109,101,114,99 +,105,97,108,32,112,111,105,110,116,101,100,32,111,117,116,111,112,112,111,114, +116,117,110,105,116,121,118,105,101,119,32,111,102,32,116,104,101,114,101,113, +117,105,114,101,109,101,110,116,100,105,118,105,115,105,111,110,32,111,102,112, +114,111,103,114,97,109,109,105,110,103,104,101,32,114,101,99,101,105,118,101,100 +,115,101,116,73,110,116,101,114,118,97,108,34,62,60,47,115,112,97,110,62,60,47, +105,110,32,78,101,119,32,89,111,114,107,97,100,100,105,116,105,111,110,97,108,32 +,99,111,109,112,114,101,115,115,105,111,110,10,10,60,100,105,118,32,105,100,61, +34,105,110,99,111,114,112,111,114,97,116,101,59,60,47,115,99,114,105,112,116,62, +60,97,116,116,97,99,104,69,118,101,110,116,98,101,99,97,109,101,32,116,104,101, +32,34,32,116,97,114,103,101,116,61,34,95,99,97,114,114,105,101,100,32,111,117, +116,83,111,109,101,32,111,102,32,116,104,101,115,99,105,101,110,99,101,32,97,110 +,100,116,104,101,32,116,105,109,101,32,111,102,67,111,110,116,97,105,110,101,114 +,34,62,109,97,105,110,116,97,105,110,105,110,103,67,104,114,105,115,116,111,112, +104,101,114,77,117,99,104,32,111,102,32,116,104,101,119,114,105,116,105,110,103, +115,32,111,102,34,32,104,101,105,103,104,116,61,34,50,115,105,122,101,32,111,102 +,32,116,104,101,118,101,114,115,105,111,110,32,111,102,32,109,105,120,116,117, +114,101,32,111,102,32,98,101,116,119,101,101,110,32,116,104,101,69,120,97,109, +112,108,101,115,32,111,102,101,100,117,99,97,116,105,111,110,97,108,99,111,109, +112,101,116,105,116,105,118,101,32,111,110,115,117,98,109,105,116,61,34,100,105, +114,101,99,116,111,114,32,111,102,100,105,115,116,105,110,99,116,105,118,101,47, +68,84,68,32,88,72,84,77,76,32,114,101,108,97,116,105,110,103,32,116,111,116,101, +110,100,101,110,99,121,32,116,111,112,114,111,118,105,110,99,101,32,111,102,119, +104,105,99,104,32,119,111,117,108,100,100,101,115,112,105,116,101,32,116,104,101 +,115,99,105,101,110,116,105,102,105,99,32,108,101,103,105,115,108,97,116,117,114 +,101,46,105,110,110,101,114,72,84,77,76,32,97,108,108,101,103,97,116,105,111,110 +,115,65,103,114,105,99,117,108,116,117,114,101,119,97,115,32,117,115,101,100,32, +105,110,97,112,112,114,111,97,99,104,32,116,111,105,110,116,101,108,108,105,103, +101,110,116,121,101,97,114,115,32,108,97,116,101,114,44,115,97,110,115,45,115, +101,114,105,102,100,101,116,101,114,109,105,110,105,110,103,80,101,114,102,111, +114,109,97,110,99,101,97,112,112,101,97,114,97,110,99,101,115,44,32,119,104,105, +99,104,32,105,115,32,102,111,117,110,100,97,116,105,111,110,115,97,98,98,114,101 +,118,105,97,116,101,100,104,105,103,104,101,114,32,116,104,97,110,115,32,102,114 +,111,109,32,116,104,101,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109, +112,111,115,101,100,32,111,102,115,117,112,112,111,115,101,100,32,116,111,99,108 +,97,105,109,115,32,116,104,97,116,97,116,116,114,105,98,117,116,105,111,110,102, +111,110,116,45,115,105,122,101,58,49,101,108,101,109,101,110,116,115,32,111,102, +72,105,115,116,111,114,105,99,97,108,32,104,105,115,32,98,114,111,116,104,101, +114,97,116,32,116,104,101,32,116,105,109,101,97,110,110,105,118,101,114,115,97, +114,121,103,111,118,101,114,110,101,100,32,98,121,114,101,108,97,116,101,100,32, +116,111,32,117,108,116,105,109,97,116,101,108,121,32,105,110,110,111,118,97,116, +105,111,110,115,105,116,32,105,115,32,115,116,105,108,108,99,97,110,32,111,110, +108,121,32,98,101,100,101,102,105,110,105,116,105,111,110,115,116,111,71,77,84, +83,116,114,105,110,103,65,32,110,117,109,98,101,114,32,111,102,105,109,103,32,99 +,108,97,115,115,61,34,69,118,101,110,116,117,97,108,108,121,44,119,97,115,32,99, +104,97,110,103,101,100,111,99,99,117,114,114,101,100,32,105,110,110,101,105,103, +104,98,111,114,105,110,103,100,105,115,116,105,110,103,117,105,115,104,119,104, +101,110,32,104,101,32,119,97,115,105,110,116,114,111,100,117,99,105,110,103,116, +101,114,114,101,115,116,114,105,97,108,77,97,110,121,32,111,102,32,116,104,101, +97,114,103,117,101,115,32,116,104,97,116,97,110,32,65,109,101,114,105,99,97,110, +99,111,110,113,117,101,115,116,32,111,102,119,105,100,101,115,112,114,101,97,100 +,32,119,101,114,101,32,107,105,108,108,101,100,115,99,114,101,101,110,32,97,110, +100,32,73,110,32,111,114,100,101,114,32,116,111,101,120,112,101,99,116,101,100, +32,116,111,100,101,115,99,101,110,100,97,110,116,115,97,114,101,32,108,111,99,97 +,116,101,100,108,101,103,105,115,108,97,116,105,118,101,103,101,110,101,114,97, +116,105,111,110,115,32,98,97,99,107,103,114,111,117,110,100,109,111,115,116,32, +112,101,111,112,108,101,121,101,97,114,115,32,97,102,116,101,114,116,104,101,114 +,101,32,105,115,32,110,111,116,104,101,32,104,105,103,104,101,115,116,102,114, +101,113,117,101,110,116,108,121,32,116,104,101,121,32,100,111,32,110,111,116,97, +114,103,117,101,100,32,116,104,97,116,115,104,111,119,101,100,32,116,104,97,116, +112,114,101,100,111,109,105,110,97,110,116,116,104,101,111,108,111,103,105,99,97 +,108,98,121,32,116,104,101,32,116,105,109,101,99,111,110,115,105,100,101,114,105 +,110,103,115,104,111,114,116,45,108,105,118,101,100,60,47,115,112,97,110,62,60, +47,97,62,99,97,110,32,98,101,32,117,115,101,100,118,101,114,121,32,108,105,116, +116,108,101,111,110,101,32,111,102,32,116,104,101,32,104,97,100,32,97,108,114, +101,97,100,121,105,110,116,101,114,112,114,101,116,101,100,99,111,109,109,117, +110,105,99,97,116,101,102,101,97,116,117,114,101,115,32,111,102,103,111,118,101, +114,110,109,101,110,116,44,60,47,110,111,115,99,114,105,112,116,62,101,110,116, +101,114,101,100,32,116,104,101,34,32,104,101,105,103,104,116,61,34,51,73,110,100 +,101,112,101,110,100,101,110,116,112,111,112,117,108,97,116,105,111,110,115,108, +97,114,103,101,45,115,99,97,108,101,46,32,65,108,116,104,111,117,103,104,32,117, +115,101,100,32,105,110,32,116,104,101,100,101,115,116,114,117,99,116,105,111,110 +,112,111,115,115,105,98,105,108,105,116,121,115,116,97,114,116,105,110,103,32, +105,110,116,119,111,32,111,114,32,109,111,114,101,101,120,112,114,101,115,115, +105,111,110,115,115,117,98,111,114,100,105,110,97,116,101,108,97,114,103,101,114 +,32,116,104,97,110,104,105,115,116,111,114,121,32,97,110,100,60,47,111,112,116, +105,111,110,62,13,10,67,111,110,116,105,110,101,110,116,97,108,101,108,105,109, +105,110,97,116,105,110,103,119,105,108,108,32,110,111,116,32,98,101,112,114,97, +99,116,105,99,101,32,111,102,105,110,32,102,114,111,110,116,32,111,102,115,105, +116,101,32,111,102,32,116,104,101,101,110,115,117,114,101,32,116,104,97,116,116, +111,32,99,114,101,97,116,101,32,97,109,105,115,115,105,115,115,105,112,112,105, +112,111,116,101,110,116,105,97,108,108,121,111,117,116,115,116,97,110,100,105, +110,103,98,101,116,116,101,114,32,116,104,97,110,119,104,97,116,32,105,115,32, +110,111,119,115,105,116,117,97,116,101,100,32,105,110,109,101,116,97,32,110,97, +109,101,61,34,84,114,97,100,105,116,105,111,110,97,108,115,117,103,103,101,115, +116,105,111,110,115,84,114,97,110,115,108,97,116,105,111,110,116,104,101,32,102, +111,114,109,32,111,102,97,116,109,111,115,112,104,101,114,105,99,105,100,101,111 +,108,111,103,105,99,97,108,101,110,116,101,114,112,114,105,115,101,115,99,97,108 +,99,117,108,97,116,105,110,103,101,97,115,116,32,111,102,32,116,104,101,114,101, +109,110,97,110,116,115,32,111,102,112,108,117,103,105,110,115,112,97,103,101,47, +105,110,100,101,120,46,112,104,112,63,114,101,109,97,105,110,101,100,32,105,110, +116,114,97,110,115,102,111,114,109,101,100,72,101,32,119,97,115,32,97,108,115, +111,119,97,115,32,97,108,114,101,97,100,121,115,116,97,116,105,115,116,105,99,97 +,108,105,110,32,102,97,118,111,114,32,111,102,77,105,110,105,115,116,114,121,32, +111,102,109,111,118,101,109,101,110,116,32,111,102,102,111,114,109,117,108,97, +116,105,111,110,105,115,32,114,101,113,117,105,114,101,100,60,108,105,110,107,32 +,114,101,108,61,34,84,104,105,115,32,105,115,32,116,104,101,32,60,97,32,104,114, +101,102,61,34,47,112,111,112,117,108,97,114,105,122,101,100,105,110,118,111,108, +118,101,100,32,105,110,97,114,101,32,117,115,101,100,32,116,111,97,110,100,32, +115,101,118,101,114,97,108,109,97,100,101,32,98,121,32,116,104,101,115,101,101, +109,115,32,116,111,32,98,101,108,105,107,101,108,121,32,116,104,97,116,80,97,108 +,101,115,116,105,110,105,97,110,110,97,109,101,100,32,97,102,116,101,114,105,116 +,32,104,97,100,32,98,101,101,110,109,111,115,116,32,99,111,109,109,111,110,116, +111,32,114,101,102,101,114,32,116,111,98,117,116,32,116,104,105,115,32,105,115, +99,111,110,115,101,99,117,116,105,118,101,116,101,109,112,111,114,97,114,105,108 +,121,73,110,32,103,101,110,101,114,97,108,44,99,111,110,118,101,110,116,105,111, +110,115,116,97,107,101,115,32,112,108,97,99,101,115,117,98,100,105,118,105,115, +105,111,110,116,101,114,114,105,116,111,114,105,97,108,111,112,101,114,97,116, +105,111,110,97,108,112,101,114,109,97,110,101,110,116,108,121,119,97,115,32,108, +97,114,103,101,108,121,111,117,116,98,114,101,97,107,32,111,102,105,110,32,116, +104,101,32,112,97,115,116,102,111,108,108,111,119,105,110,103,32,97,32,120,109, +108,110,115,58,111,103,61,34,62,60,97,32,99,108,97,115,115,61,34,99,108,97,115, +115,61,34,116,101,120,116,67,111,110,118,101,114,115,105,111,110,32,109,97,121, +32,98,101,32,117,115,101,100,109,97,110,117,102,97,99,116,117,114,101,97,102,116 +,101,114,32,98,101,105,110,103,99,108,101,97,114,102,105,120,34,62,10,113,117, +101,115,116,105,111,110,32,111,102,119,97,115,32,101,108,101,99,116,101,100,116, +111,32,98,101,99,111,109,101,32,97,98,101,99,97,117,115,101,32,111,102,32,115, +111,109,101,32,112,101,111,112,108,101,105,110,115,112,105,114,101,100,32,98,121 +,115,117,99,99,101,115,115,102,117,108,32,97,32,116,105,109,101,32,119,104,101, +110,109,111,114,101,32,99,111,109,109,111,110,97,109,111,110,103,115,116,32,116, +104,101,97,110,32,111,102,102,105,99,105,97,108,119,105,100,116,104,58,49,48,48, +37,59,116,101,99,104,110,111,108,111,103,121,44,119,97,115,32,97,100,111,112,116 +,101,100,116,111,32,107,101,101,112,32,116,104,101,115,101,116,116,108,101,109, +101,110,116,115,108,105,118,101,32,98,105,114,116,104,115,105,110,100,101,120,46 +,104,116,109,108,34,67,111,110,110,101,99,116,105,99,117,116,97,115,115,105,103, +110,101,100,32,116,111,38,97,109,112,59,116,105,109,101,115,59,97,99,99,111,117, +110,116,32,102,111,114,97,108,105,103,110,61,114,105,103,104,116,116,104,101,32, +99,111,109,112,97,110,121,97,108,119,97,121,115,32,98,101,101,110,114,101,116, +117,114,110,101,100,32,116,111,105,110,118,111,108,118,101,109,101,110,116,66, +101,99,97,117,115,101,32,116,104,101,116,104,105,115,32,112,101,114,105,111,100, +34,32,110,97,109,101,61,34,113,34,32,99,111,110,102,105,110,101,100,32,116,111, +97,32,114,101,115,117,108,116,32,111,102,118,97,108,117,101,61,34,34,32,47,62, +105,115,32,97,99,116,117,97,108,108,121,69,110,118,105,114,111,110,109,101,110, +116,13,10,60,47,104,101,97,100,62,13,10,67,111,110,118,101,114,115,101,108,121, +44,62,10,60,100,105,118,32,105,100,61,34,48,34,32,119,105,100,116,104,61,34,49, +105,115,32,112,114,111,98,97,98,108,121,104,97,118,101,32,98,101,99,111,109,101, +99,111,110,116,114,111,108,108,105,110,103,116,104,101,32,112,114,111,98,108,101 +,109,99,105,116,105,122,101,110,115,32,111,102,112,111,108,105,116,105,99,105,97 +,110,115,114,101,97,99,104,101,100,32,116,104,101,97,115,32,101,97,114,108,121, +32,97,115,58,110,111,110,101,59,32,111,118,101,114,60,116,97,98,108,101,32,99, +101,108,108,118,97,108,105,100,105,116,121,32,111,102,100,105,114,101,99,116,108 +,121,32,116,111,111,110,109,111,117,115,101,100,111,119,110,119,104,101,114,101, +32,105,116,32,105,115,119,104,101,110,32,105,116,32,119,97,115,109,101,109,98, +101,114,115,32,111,102,32,114,101,108,97,116,105,111,110,32,116,111,97,99,99,111 +,109,109,111,100,97,116,101,97,108,111,110,103,32,119,105,116,104,32,73,110,32, +116,104,101,32,108,97,116,101,116,104,101,32,69,110,103,108,105,115,104,100,101, +108,105,99,105,111,117,115,34,62,116,104,105,115,32,105,115,32,110,111,116,116, +104,101,32,112,114,101,115,101,110,116,105,102,32,116,104,101,121,32,97,114,101, +97,110,100,32,102,105,110,97,108,108,121,97,32,109,97,116,116,101,114,32,111,102 +,13,10,9,60,47,100,105,118,62,13,10,13,10,60,47,115,99,114,105,112,116,62,102,97 +,115,116,101,114,32,116,104,97,110,109,97,106,111,114,105,116,121,32,111,102,97, +102,116,101,114,32,119,104,105,99,104,99,111,109,112,97,114,97,116,105,118,101, +116,111,32,109,97,105,110,116,97,105,110,105,109,112,114,111,118,101,32,116,104, +101,97,119,97,114,100,101,100,32,116,104,101,101,114,34,32,99,108,97,115,115,61, +34,102,114,97,109,101,98,111,114,100,101,114,114,101,115,116,111,114,97,116,105, +111,110,105,110,32,116,104,101,32,115,97,109,101,97,110,97,108,121,115,105,115, +32,111,102,116,104,101,105,114,32,102,105,114,115,116,68,117,114,105,110,103,32, +116,104,101,32,99,111,110,116,105,110,101,110,116,97,108,115,101,113,117,101,110 +,99,101,32,111,102,102,117,110,99,116,105,111,110,40,41,123,102,111,110,116,45, +115,105,122,101,58,32,119,111,114,107,32,111,110,32,116,104,101,60,47,115,99,114 +,105,112,116,62,10,60,98,101,103,105,110,115,32,119,105,116,104,106,97,118,97, +115,99,114,105,112,116,58,99,111,110,115,116,105,116,117,101,110,116,119,97,115, +32,102,111,117,110,100,101,100,101,113,117,105,108,105,98,114,105,117,109,97,115 +,115,117,109,101,32,116,104,97,116,105,115,32,103,105,118,101,110,32,98,121,110, +101,101,100,115,32,116,111,32,98,101,99,111,111,114,100,105,110,97,116,101,115, +116,104,101,32,118,97,114,105,111,117,115,97,114,101,32,112,97,114,116,32,111, +102,111,110,108,121,32,105,110,32,116,104,101,115,101,99,116,105,111,110,115,32, +111,102,105,115,32,97,32,99,111,109,109,111,110,116,104,101,111,114,105,101,115, +32,111,102,100,105,115,99,111,118,101,114,105,101,115,97,115,115,111,99,105,97, +116,105,111,110,101,100,103,101,32,111,102,32,116,104,101,115,116,114,101,110, +103,116,104,32,111,102,112,111,115,105,116,105,111,110,32,105,110,112,114,101, +115,101,110,116,45,100,97,121,117,110,105,118,101,114,115,97,108,108,121,116,111 +,32,102,111,114,109,32,116,104,101,98,117,116,32,105,110,115,116,101,97,100,99, +111,114,112,111,114,97,116,105,111,110,97,116,116,97,99,104,101,100,32,116,111, +105,115,32,99,111,109,109,111,110,108,121,114,101,97,115,111,110,115,32,102,111, +114,32,38,113,117,111,116,59,116,104,101,32,99,97,110,32,98,101,32,109,97,100, +101,119,97,115,32,97,98,108,101,32,116,111,119,104,105,99,104,32,109,101,97,110, +115,98,117,116,32,100,105,100,32,110,111,116,111,110,77,111,117,115,101,79,118, +101,114,97,115,32,112,111,115,115,105,98,108,101,111,112,101,114,97,116,101,100, +32,98,121,99,111,109,105,110,103,32,102,114,111,109,116,104,101,32,112,114,105, +109,97,114,121,97,100,100,105,116,105,111,110,32,111,102,102,111,114,32,115,101, +118,101,114,97,108,116,114,97,110,115,102,101,114,114,101,100,97,32,112,101,114, +105,111,100,32,111,102,97,114,101,32,97,98,108,101,32,116,111,104,111,119,101, +118,101,114,44,32,105,116,115,104,111,117,108,100,32,104,97,118,101,109,117,99, +104,32,108,97,114,103,101,114,10,9,60,47,115,99,114,105,112,116,62,97,100,111, +112,116,101,100,32,116,104,101,112,114,111,112,101,114,116,121,32,111,102,100, +105,114,101,99,116,101,100,32,98,121,101,102,102,101,99,116,105,118,101,108,121, +119,97,115,32,98,114,111,117,103,104,116,99,104,105,108,100,114,101,110,32,111, +102,80,114,111,103,114,97,109,109,105,110,103,108,111,110,103,101,114,32,116,104 +,97,110,109,97,110,117,115,99,114,105,112,116,115,119,97,114,32,97,103,97,105, +110,115,116,98,121,32,109,101,97,110,115,32,111,102,97,110,100,32,109,111,115, +116,32,111,102,115,105,109,105,108,97,114,32,116,111,32,112,114,111,112,114,105, +101,116,97,114,121,111,114,105,103,105,110,97,116,105,110,103,112,114,101,115, +116,105,103,105,111,117,115,103,114,97,109,109,97,116,105,99,97,108,101,120,112, +101,114,105,101,110,99,101,46,116,111,32,109,97,107,101,32,116,104,101,73,116,32 +,119,97,115,32,97,108,115,111,105,115,32,102,111,117,110,100,32,105,110,99,111, +109,112,101,116,105,116,111,114,115,105,110,32,116,104,101,32,85,46,83,46,114, +101,112,108,97,99,101,32,116,104,101,98,114,111,117,103,104,116,32,116,104,101, +99,97,108,99,117,108,97,116,105,111,110,102,97,108,108,32,111,102,32,116,104,101 +,116,104,101,32,103,101,110,101,114,97,108,112,114,97,99,116,105,99,97,108,108, +121,105,110,32,104,111,110,111,114,32,111,102,114,101,108,101,97,115,101,100,32, +105,110,114,101,115,105,100,101,110,116,105,97,108,97,110,100,32,115,111,109,101 +,32,111,102,107,105,110,103,32,111,102,32,116,104,101,114,101,97,99,116,105,111, +110,32,116,111,49,115,116,32,69,97,114,108,32,111,102,99,117,108,116,117,114,101 +,32,97,110,100,112,114,105,110,99,105,112,97,108,108,121,60,47,116,105,116,108, +101,62,10,32,32,116,104,101,121,32,99,97,110,32,98,101,98,97,99,107,32,116,111, +32,116,104,101,115,111,109,101,32,111,102,32,104,105,115,101,120,112,111,115,117 +,114,101,32,116,111,97,114,101,32,115,105,109,105,108,97,114,102,111,114,109,32, +111,102,32,116,104,101,97,100,100,70,97,118,111,114,105,116,101,99,105,116,105, +122,101,110,115,104,105,112,112,97,114,116,32,105,110,32,116,104,101,112,101,111 +,112,108,101,32,119,105,116,104,105,110,32,112,114,97,99,116,105,99,101,116,111, +32,99,111,110,116,105,110,117,101,38,97,109,112,59,109,105,110,117,115,59,97,112 +,112,114,111,118,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,97, +108,108,111,119,101,100,32,116,104,101,97,110,100,32,102,111,114,32,116,104,101, +102,117,110,99,116,105,111,110,105,110,103,112,108,97,121,105,110,103,32,116,104 +,101,115,111,108,117,116,105,111,110,32,116,111,104,101,105,103,104,116,61,34,48 +,34,32,105,110,32,104,105,115,32,98,111,111,107,109,111,114,101,32,116,104,97, +110,32,97,102,111,108,108,111,119,115,32,116,104,101,99,114,101,97,116,101,100, +32,116,104,101,112,114,101,115,101,110,99,101,32,105,110,38,110,98,115,112,59,60 +,47,116,100,62,110,97,116,105,111,110,97,108,105,115,116,116,104,101,32,105,100, +101,97,32,111,102,97,32,99,104,97,114,97,99,116,101,114,119,101,114,101,32,102, +111,114,99,101,100,32,99,108,97,115,115,61,34,98,116,110,100,97,121,115,32,111, +102,32,116,104,101,102,101,97,116,117,114,101,100,32,105,110,115,104,111,119,105 +,110,103,32,116,104,101,105,110,116,101,114,101,115,116,32,105,110,105,110,32, +112,108,97,99,101,32,111,102,116,117,114,110,32,111,102,32,116,104,101,116,104, +101,32,104,101,97,100,32,111,102,76,111,114,100,32,111,102,32,116,104,101,112, +111,108,105,116,105,99,97,108,108,121,104,97,115,32,105,116,115,32,111,119,110, +69,100,117,99,97,116,105,111,110,97,108,97,112,112,114,111,118,97,108,32,111,102 +,115,111,109,101,32,111,102,32,116,104,101,101,97,99,104,32,111,116,104,101,114, +44,98,101,104,97,118,105,111,114,32,111,102,97,110,100,32,98,101,99,97,117,115, +101,97,110,100,32,97,110,111,116,104,101,114,97,112,112,101,97,114,101,100,32, +111,110,114,101,99,111,114,100,101,100,32,105,110,98,108,97,99,107,38,113,117, +111,116,59,109,97,121,32,105,110,99,108,117,100,101,116,104,101,32,119,111,114, +108,100,39,115,99,97,110,32,108,101,97,100,32,116,111,114,101,102,101,114,115,32 +,116,111,32,97,98,111,114,100,101,114,61,34,48,34,32,103,111,118,101,114,110,109 +,101,110,116,32,119,105,110,110,105,110,103,32,116,104,101,114,101,115,117,108, +116,101,100,32,105,110,32,119,104,105,108,101,32,116,104,101,32,87,97,115,104, +105,110,103,116,111,110,44,116,104,101,32,115,117,98,106,101,99,116,99,105,116, +121,32,105,110,32,116,104,101,62,60,47,100,105,118,62,13,10,9,9,114,101,102,108, +101,99,116,32,116,104,101,116,111,32,99,111,109,112,108,101,116,101,98,101,99,97 +,109,101,32,109,111,114,101,114,97,100,105,111,97,99,116,105,118,101,114,101,106 +,101,99,116,101,100,32,98,121,119,105,116,104,111,117,116,32,97,110,121,104,105, +115,32,102,97,116,104,101,114,44,119,104,105,99,104,32,99,111,117,108,100,99,111 +,112,121,32,111,102,32,116,104,101,116,111,32,105,110,100,105,99,97,116,101,97, +32,112,111,108,105,116,105,99,97,108,97,99,99,111,117,110,116,115,32,111,102,99, +111,110,115,116,105,116,117,116,101,115,119,111,114,107,101,100,32,119,105,116, +104,101,114,60,47,97,62,60,47,108,105,62,111,102,32,104,105,115,32,108,105,102, +101,97,99,99,111,109,112,97,110,105,101,100,99,108,105,101,110,116,87,105,100, +116,104,112,114,101,118,101,110,116,32,116,104,101,76,101,103,105,115,108,97,116 +,105,118,101,100,105,102,102,101,114,101,110,116,108,121,116,111,103,101,116,104 +,101,114,32,105,110,104,97,115,32,115,101,118,101,114,97,108,102,111,114,32,97, +110,111,116,104,101,114,116,101,120,116,32,111,102,32,116,104,101,102,111,117, +110,100,101,100,32,116,104,101,101,32,119,105,116,104,32,116,104,101,32,105,115, +32,117,115,101,100,32,102,111,114,99,104,97,110,103,101,100,32,116,104,101,117, +115,117,97,108,108,121,32,116,104,101,112,108,97,99,101,32,119,104,101,114,101, +119,104,101,114,101,97,115,32,116,104,101,62,32,60,97,32,104,114,101,102,61,34, +34,62,60,97,32,104,114,101,102,61,34,116,104,101,109,115,101,108,118,101,115,44, +97,108,116,104,111,117,103,104,32,104,101,116,104,97,116,32,99,97,110,32,98,101, +116,114,97,100,105,116,105,111,110,97,108,114,111,108,101,32,111,102,32,116,104, +101,97,115,32,97,32,114,101,115,117,108,116,114,101,109,111,118,101,67,104,105, +108,100,100,101,115,105,103,110,101,100,32,98,121,119,101,115,116,32,111,102,32, +116,104,101,83,111,109,101,32,112,101,111,112,108,101,112,114,111,100,117,99,116 +,105,111,110,44,115,105,100,101,32,111,102,32,116,104,101,110,101,119,115,108, +101,116,116,101,114,115,117,115,101,100,32,98,121,32,116,104,101,100,111,119,110 +,32,116,111,32,116,104,101,97,99,99,101,112,116,101,100,32,98,121,108,105,118, +101,32,105,110,32,116,104,101,97,116,116,101,109,112,116,115,32,116,111,111,117, +116,115,105,100,101,32,116,104,101,102,114,101,113,117,101,110,99,105,101,115,72 +,111,119,101,118,101,114,44,32,105,110,112,114,111,103,114,97,109,109,101,114, +115,97,116,32,108,101,97,115,116,32,105,110,97,112,112,114,111,120,105,109,97, +116,101,97,108,116,104,111,117,103,104,32,105,116,119,97,115,32,112,97,114,116, +32,111,102,97,110,100,32,118,97,114,105,111,117,115,71,111,118,101,114,110,111, +114,32,111,102,116,104,101,32,97,114,116,105,99,108,101,116,117,114,110,101,100, +32,105,110,116,111,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,101,99, +111,110,111,109,121,105,115,32,116,104,101,32,109,111,115,116,109,111,115,116,32 +,119,105,100,101,108,121,119,111,117,108,100,32,108,97,116,101,114,97,110,100,32 +,112,101,114,104,97,112,115,114,105,115,101,32,116,111,32,116,104,101,111,99,99, +117,114,115,32,119,104,101,110,117,110,100,101,114,32,119,104,105,99,104,99,111, +110,100,105,116,105,111,110,115,46,116,104,101,32,119,101,115,116,101,114,110, +116,104,101,111,114,121,32,116,104,97,116,105,115,32,112,114,111,100,117,99,101, +100,116,104,101,32,99,105,116,121,32,111,102,105,110,32,119,104,105,99,104,32, +104,101,115,101,101,110,32,105,110,32,116,104,101,116,104,101,32,99,101,110,116, +114,97,108,98,117,105,108,100,105,110,103,32,111,102,109,97,110,121,32,111,102, +32,104,105,115,97,114,101,97,32,111,102,32,116,104,101,105,115,32,116,104,101,32 +,111,110,108,121,109,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111 +,102,32,116,104,101,116,104,101,32,87,101,115,116,101,114,110,84,104,101,114,101 +,32,105,115,32,110,111,101,120,116,101,110,100,101,100,32,116,111,83,116,97,116, +105,115,116,105,99,97,108,99,111,108,115,112,97,110,61,50,32,124,115,104,111,114 +,116,32,115,116,111,114,121,112,111,115,115,105,98,108,101,32,116,111,116,111, +112,111,108,111,103,105,99,97,108,99,114,105,116,105,99,97,108,32,111,102,114, +101,112,111,114,116,101,100,32,116,111,97,32,67,104,114,105,115,116,105,97,110, +100,101,99,105,115,105,111,110,32,116,111,105,115,32,101,113,117,97,108,32,116, +111,112,114,111,98,108,101,109,115,32,111,102,84,104,105,115,32,99,97,110,32,98, +101,109,101,114,99,104,97,110,100,105,115,101,102,111,114,32,109,111,115,116,32, +111,102,110,111,32,101,118,105,100,101,110,99,101,101,100,105,116,105,111,110, +115,32,111,102,101,108,101,109,101,110,116,115,32,105,110,38,113,117,111,116,59, +46,32,84,104,101,99,111,109,47,105,109,97,103,101,115,47,119,104,105,99,104,32, +109,97,107,101,115,116,104,101,32,112,114,111,99,101,115,115,114,101,109,97,105, +110,115,32,116,104,101,108,105,116,101,114,97,116,117,114,101,44,105,115,32,97, +32,109,101,109,98,101,114,116,104,101,32,112,111,112,117,108,97,114,116,104,101, +32,97,110,99,105,101,110,116,112,114,111,98,108,101,109,115,32,105,110,116,105, +109,101,32,111,102,32,116,104,101,100,101,102,101,97,116,101,100,32,98,121,98, +111,100,121,32,111,102,32,116,104,101,97,32,102,101,119,32,121,101,97,114,115, +109,117,99,104,32,111,102,32,116,104,101,116,104,101,32,119,111,114,107,32,111, +102,67,97,108,105,102,111,114,110,105,97,44,115,101,114,118,101,100,32,97,115,32 +,97,103,111,118,101,114,110,109,101,110,116,46,99,111,110,99,101,112,116,115,32, +111,102,109,111,118,101,109,101,110,116,32,105,110,9,9,60,100,105,118,32,105,100 +,61,34,105,116,34,32,118,97,108,117,101,61,34,108,97,110,103,117,97,103,101,32, +111,102,97,115,32,116,104,101,121,32,97,114,101,112,114,111,100,117,99,101,100, +32,105,110,105,115,32,116,104,97,116,32,116,104,101,101,120,112,108,97,105,110, +32,116,104,101,100,105,118,62,60,47,100,105,118,62,10,72,111,119,101,118,101,114 +,32,116,104,101,108,101,97,100,32,116,111,32,116,104,101,9,60,97,32,104,114,101, +102,61,34,47,119,97,115,32,103,114,97,110,116,101,100,112,101,111,112,108,101,32 +,104,97,118,101,99,111,110,116,105,110,117,97,108,108,121,119,97,115,32,115,101, +101,110,32,97,115,97,110,100,32,114,101,108,97,116,101,100,116,104,101,32,114, +111,108,101,32,111,102,112,114,111,112,111,115,101,100,32,98,121,111,102,32,116, +104,101,32,98,101,115,116,101,97,99,104,32,111,116,104,101,114,46,67,111,110,115 +,116,97,110,116,105,110,101,112,101,111,112,108,101,32,102,114,111,109,100,105, +97,108,101,99,116,115,32,111,102,116,111,32,114,101,118,105,115,105,111,110,119, +97,115,32,114,101,110,97,109,101,100,97,32,115,111,117,114,99,101,32,111,102,116 +,104,101,32,105,110,105,116,105,97,108,108,97,117,110,99,104,101,100,32,105,110, +112,114,111,118,105,100,101,32,116,104,101,116,111,32,116,104,101,32,119,101,115 +,116,119,104,101,114,101,32,116,104,101,114,101,97,110,100,32,115,105,109,105, +108,97,114,98,101,116,119,101,101,110,32,116,119,111,105,115,32,97,108,115,111, +32,116,104,101,69,110,103,108,105,115,104,32,97,110,100,99,111,110,100,105,116, +105,111,110,115,44,116,104,97,116,32,105,116,32,119,97,115,101,110,116,105,116, +108,101,100,32,116,111,116,104,101,109,115,101,108,118,101,115,46,113,117,97,110 +,116,105,116,121,32,111,102,114,97,110,115,112,97,114,101,110,99,121,116,104,101 +,32,115,97,109,101,32,97,115,116,111,32,106,111,105,110,32,116,104,101,99,111, +117,110,116,114,121,32,97,110,100,116,104,105,115,32,105,115,32,116,104,101,84, +104,105,115,32,108,101,100,32,116,111,97,32,115,116,97,116,101,109,101,110,116, +99,111,110,116,114,97,115,116,32,116,111,108,97,115,116,73,110,100,101,120,79, +102,116,104,114,111,117,103,104,32,104,105,115,105,115,32,100,101,115,105,103, +110,101,100,116,104,101,32,116,101,114,109,32,105,115,105,115,32,112,114,111,118 +,105,100,101,100,112,114,111,116,101,99,116,32,116,104,101,110,103,60,47,97,62, +60,47,108,105,62,84,104,101,32,99,117,114,114,101,110,116,116,104,101,32,115,105 +,116,101,32,111,102,115,117,98,115,116,97,110,116,105,97,108,101,120,112,101,114 +,105,101,110,99,101,44,105,110,32,116,104,101,32,87,101,115,116,116,104,101,121, +32,115,104,111,117,108,100,115,108,111,118,101,110,196,141,105,110,97,99,111,109 +,101,110,116,97,114,105,111,115,117,110,105,118,101,114,115,105,100,97,100,99, +111,110,100,105,99,105,111,110,101,115,97,99,116,105,118,105,100,97,100,101,115, +101,120,112,101,114,105,101,110,99,105,97,116,101,99,110,111,108,111,103,195,173 +,97,112,114,111,100,117,99,99,105,195,179,110,112,117,110,116,117,97,99,105,195, +179,110,97,112,108,105,99,97,99,105,195,179,110,99,111,110,116,114,97,115,101, +195,177,97,99,97,116,101,103,111,114,195,173,97,115,114,101,103,105,115,116,114, +97,114,115,101,112,114,111,102,101,115,105,111,110,97,108,116,114,97,116,97,109, +105,101,110,116,111,114,101,103,195,173,115,116,114,97,116,101,115,101,99,114, +101,116,97,114,195,173,97,112,114,105,110,99,105,112,97,108,101,115,112,114,111, +116,101,99,99,105,195,179,110,105,109,112,111,114,116,97,110,116,101,115,105,109 +,112,111,114,116,97,110,99,105,97,112,111,115,105,98,105,108,105,100,97,100,105, +110,116,101,114,101,115,97,110,116,101,99,114,101,99,105,109,105,101,110,116,111 +,110,101,99,101,115,105,100,97,100,101,115,115,117,115,99,114,105,98,105,114,115 +,101,97,115,111,99,105,97,99,105,195,179,110,100,105,115,112,111,110,105,98,108, +101,115,101,118,97,108,117,97,99,105,195,179,110,101,115,116,117,100,105,97,110, +116,101,115,114,101,115,112,111,110,115,97,98,108,101,114,101,115,111,108,117,99 +,105,195,179,110,103,117,97,100,97,108,97,106,97,114,97,114,101,103,105,115,116, +114,97,100,111,115,111,112,111,114,116,117,110,105,100,97,100,99,111,109,101,114 +,99,105,97,108,101,115,102,111,116,111,103,114,97,102,195,173,97,97,117,116,111, +114,105,100,97,100,101,115,105,110,103,101,110,105,101,114,195,173,97,116,101, +108,101,118,105,115,105,195,179,110,99,111,109,112,101,116,101,110,99,105,97,111 +,112,101,114,97,99,105,111,110,101,115,101,115,116,97,98,108,101,99,105,100,111, +115,105,109,112,108,101,109,101,110,116,101,97,99,116,117,97,108,109,101,110,116 +,101,110,97,118,101,103,97,99,105,195,179,110,99,111,110,102,111,114,109,105,100 +,97,100,108,105,110,101,45,104,101,105,103,104,116,58,102,111,110,116,45,102,97, +109,105,108,121,58,34,32,58,32,34,104,116,116,112,58,47,47,97,112,112,108,105,99 +,97,116,105,111,110,115,108,105,110,107,34,32,104,114,101,102,61,34,115,112,101, +99,105,102,105,99,97,108,108,121,47,47,60,33,91,67,68,65,84,65,91,10,79,114,103, +97,110,105,122,97,116,105,111,110,100,105,115,116,114,105,98,117,116,105,111,110 +,48,112,120,59,32,104,101,105,103,104,116,58,114,101,108,97,116,105,111,110,115, +104,105,112,100,101,118,105,99,101,45,119,105,100,116,104,60,100,105,118,32,99, +108,97,115,115,61,34,60,108,97,98,101,108,32,102,111,114,61,34,114,101,103,105, +115,116,114,97,116,105,111,110,60,47,110,111,115,99,114,105,112,116,62,10,47,105 +,110,100,101,120,46,104,116,109,108,34,119,105,110,100,111,119,46,111,112,101, +110,40,32,33,105,109,112,111,114,116,97,110,116,59,97,112,112,108,105,99,97,116, +105,111,110,47,105,110,100,101,112,101,110,100,101,110,99,101,47,47,119,119,119, +46,103,111,111,103,108,101,111,114,103,97,110,105,122,97,116,105,111,110,97,117, +116,111,99,111,109,112,108,101,116,101,114,101,113,117,105,114,101,109,101,110, +116,115,99,111,110,115,101,114,118,97,116,105,118,101,60,102,111,114,109,32,110, +97,109,101,61,34,105,110,116,101,108,108,101,99,116,117,97,108,109,97,114,103, +105,110,45,108,101,102,116,58,49,56,116,104,32,99,101,110,116,117,114,121,97,110 +,32,105,109,112,111,114,116,97,110,116,105,110,115,116,105,116,117,116,105,111, +110,115,97,98,98,114,101,118,105,97,116,105,111,110,60,105,109,103,32,99,108,97, +115,115,61,34,111,114,103,97,110,105,115,97,116,105,111,110,99,105,118,105,108, +105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,97,114,99 +,104,105,116,101,99,116,117,114,101,105,110,99,111,114,112,111,114,97,116,101, +100,50,48,116,104,32,99,101,110,116,117,114,121,45,99,111,110,116,97,105,110,101 +,114,34,62,109,111,115,116,32,110,111,116,97,98,108,121,47,62,60,47,97,62,60,47, +100,105,118,62,110,111,116,105,102,105,99,97,116,105,111,110,39,117,110,100,101, +102,105,110,101,100,39,41,70,117,114,116,104,101,114,109,111,114,101,44,98,101, +108,105,101,118,101,32,116,104,97,116,105,110,110,101,114,72,84,77,76,32,61,32, +112,114,105,111,114,32,116,111,32,116,104,101,100,114,97,109,97,116,105,99,97, +108,108,121,114,101,102,101,114,114,105,110,103,32,116,111,110,101,103,111,116, +105,97,116,105,111,110,115,104,101,97,100,113,117,97,114,116,101,114,115,83,111, +117,116,104,32,65,102,114,105,99,97,117,110,115,117,99,99,101,115,115,102,117, +108,80,101,110,110,115,121,108,118,97,110,105,97,65,115,32,97,32,114,101,115,117 +,108,116,44,60,104,116,109,108,32,108,97,110,103,61,34,38,108,116,59,47,115,117, +112,38,103,116,59,100,101,97,108,105,110,103,32,119,105,116,104,112,104,105,108, +97,100,101,108,112,104,105,97,104,105,115,116,111,114,105,99,97,108,108,121,41, +59,60,47,115,99,114,105,112,116,62,10,112,97,100,100,105,110,103,45,116,111,112, +58,101,120,112,101,114,105,109,101,110,116,97,108,103,101,116,65,116,116,114,105 +,98,117,116,101,105,110,115,116,114,117,99,116,105,111,110,115,116,101,99,104, +110,111,108,111,103,105,101,115,112,97,114,116,32,111,102,32,116,104,101,32,61, +102,117,110,99,116,105,111,110,40,41,123,115,117,98,115,99,114,105,112,116,105, +111,110,108,46,100,116,100,34,62,13,10,60,104,116,103,101,111,103,114,97,112,104 +,105,99,97,108,67,111,110,115,116,105,116,117,116,105,111,110,39,44,32,102,117, +110,99,116,105,111,110,40,115,117,112,112,111,114,116,101,100,32,98,121,97,103, +114,105,99,117,108,116,117,114,97,108,99,111,110,115,116,114,117,99,116,105,111, +110,112,117,98,108,105,99,97,116,105,111,110,115,102,111,110,116,45,115,105,122, +101,58,32,49,97,32,118,97,114,105,101,116,121,32,111,102,60,100,105,118,32,115, +116,121,108,101,61,34,69,110,99,121,99,108,111,112,101,100,105,97,105,102,114,97 +,109,101,32,115,114,99,61,34,100,101,109,111,110,115,116,114,97,116,101,100,97, +99,99,111,109,112,108,105,115,104,101,100,117,110,105,118,101,114,115,105,116, +105,101,115,68,101,109,111,103,114,97,112,104,105,99,115,41,59,60,47,115,99,114, +105,112,116,62,60,100,101,100,105,99,97,116,101,100,32,116,111,107,110,111,119, +108,101,100,103,101,32,111,102,115,97,116,105,115,102,97,99,116,105,111,110,112, +97,114,116,105,99,117,108,97,114,108,121,60,47,100,105,118,62,60,47,100,105,118, +62,69,110,103,108,105,115,104,32,40,85,83,41,97,112,112,101,110,100,67,104,105, +108,100,40,116,114,97,110,115,109,105,115,115,105,111,110,115,46,32,72,111,119, +101,118,101,114,44,32,105,110,116,101,108,108,105,103,101,110,99,101,34,32,116, +97,98,105,110,100,101,120,61,34,102,108,111,97,116,58,114,105,103,104,116,59,67, +111,109,109,111,110,119,101,97,108,116,104,114,97,110,103,105,110,103,32,102,114 +,111,109,105,110,32,119,104,105,99,104,32,116,104,101,97,116,32,108,101,97,115, +116,32,111,110,101,114,101,112,114,111,100,117,99,116,105,111,110,101,110,99,121 +,99,108,111,112,101,100,105,97,59,102,111,110,116,45,115,105,122,101,58,49,106, +117,114,105,115,100,105,99,116,105,111,110,97,116,32,116,104,97,116,32,116,105, +109,101,34,62,60,97,32,99,108,97,115,115,61,34,73,110,32,97,100,100,105,116,105, +111,110,44,100,101,115,99,114,105,112,116,105,111,110,43,99,111,110,118,101,114, +115,97,116,105,111,110,99,111,110,116,97,99,116,32,119,105,116,104,105,115,32, +103,101,110,101,114,97,108,108,121,114,34,32,99,111,110,116,101,110,116,61,34, +114,101,112,114,101,115,101,110,116,105,110,103,38,108,116,59,109,97,116,104,38, +103,116,59,112,114,101,115,101,110,116,97,116,105,111,110,111,99,99,97,115,105, +111,110,97,108,108,121,60,105,109,103,32,119,105,100,116,104,61,34,110,97,118, +105,103,97,116,105,111,110,34,62,99,111,109,112,101,110,115,97,116,105,111,110, +99,104,97,109,112,105,111,110,115,104,105,112,109,101,100,105,97,61,34,97,108, +108,34,32,118,105,111,108,97,116,105,111,110,32,111,102,114,101,102,101,114,101, +110,99,101,32,116,111,114,101,116,117,114,110,32,116,114,117,101,59,83,116,114, +105,99,116,47,47,69,78,34,32,116,114,97,110,115,97,99,116,105,111,110,115,105, +110,116,101,114,118,101,110,116,105,111,110,118,101,114,105,102,105,99,97,116, +105,111,110,73,110,102,111,114,109,97,116,105,111,110,32,100,105,102,102,105,99, +117,108,116,105,101,115,67,104,97,109,112,105,111,110,115,104,105,112,99,97,112, +97,98,105,108,105,116,105,101,115,60,33,91,101,110,100,105,102,93,45,45,62,125, +10,60,47,115,99,114,105,112,116,62,10,67,104,114,105,115,116,105,97,110,105,116, +121,102,111,114,32,101,120,97,109,112,108,101,44,80,114,111,102,101,115,115,105, +111,110,97,108,114,101,115,116,114,105,99,116,105,111,110,115,115,117,103,103, +101,115,116,32,116,104,97,116,119,97,115,32,114,101,108,101,97,115,101,100,40, +115,117,99,104,32,97,115,32,116,104,101,114,101,109,111,118,101,67,108,97,115, +115,40,117,110,101,109,112,108,111,121,109,101,110,116,116,104,101,32,65,109,101 +,114,105,99,97,110,115,116,114,117,99,116,117,114,101,32,111,102,47,105,110,100, +101,120,46,104,116,109,108,32,112,117,98,108,105,115,104,101,100,32,105,110,115, +112,97,110,32,99,108,97,115,115,61,34,34,62,60,97,32,104,114,101,102,61,34,47, +105,110,116,114,111,100,117,99,116,105,111,110,98,101,108,111,110,103,105,110, +103,32,116,111,99,108,97,105,109,101,100,32,116,104,97,116,99,111,110,115,101, +113,117,101,110,99,101,115,60,109,101,116,97,32,110,97,109,101,61,34,71,117,105, +100,101,32,116,111,32,116,104,101,111,118,101,114,119,104,101,108,109,105,110, +103,97,103,97,105,110,115,116,32,116,104,101,32,99,111,110,99,101,110,116,114,97 +,116,101,100,44,10,46,110,111,110,116,111,117,99,104,32,111,98,115,101,114,118, +97,116,105,111,110,115,60,47,97,62,10,60,47,100,105,118,62,10,102,32,40,100,111, +99,117,109,101,110,116,46,98,111,114,100,101,114,58,32,49,112,120,32,123,102,111 +,110,116,45,115,105,122,101,58,49,116,114,101,97,116,109,101,110,116,32,111,102, +48,34,32,104,101,105,103,104,116,61,34,49,109,111,100,105,102,105,99,97,116,105, +111,110,73,110,100,101,112,101,110,100,101,110,99,101,100,105,118,105,100,101, +100,32,105,110,116,111,103,114,101,97,116,101,114,32,116,104,97,110,97,99,104, +105,101,118,101,109,101,110,116,115,101,115,116,97,98,108,105,115,104,105,110, +103,74,97,118,97,83,99,114,105,112,116,34,32,110,101,118,101,114,116,104,101,108 +,101,115,115,115,105,103,110,105,102,105,99,97,110,99,101,66,114,111,97,100,99, +97,115,116,105,110,103,62,38,110,98,115,112,59,60,47,116,100,62,99,111,110,116, +97,105,110,101,114,34,62,10,115,117,99,104,32,97,115,32,116,104,101,32,105,110, +102,108,117,101,110,99,101,32,111,102,97,32,112,97,114,116,105,99,117,108,97,114 +,115,114,99,61,39,104,116,116,112,58,47,47,110,97,118,105,103,97,116,105,111,110 +,34,32,104,97,108,102,32,111,102,32,116,104,101,32,115,117,98,115,116,97,110,116 +,105,97,108,32,38,110,98,115,112,59,60,47,100,105,118,62,97,100,118,97,110,116, +97,103,101,32,111,102,100,105,115,99,111,118,101,114,121,32,111,102,102,117,110, +100,97,109,101,110,116,97,108,32,109,101,116,114,111,112,111,108,105,116,97,110, +116,104,101,32,111,112,112,111,115,105,116,101,34,32,120,109,108,58,108,97,110, +103,61,34,100,101,108,105,98,101,114,97,116,101,108,121,97,108,105,103,110,61,99 +,101,110,116,101,114,101,118,111,108,117,116,105,111,110,32,111,102,112,114,101, +115,101,114,118,97,116,105,111,110,105,109,112,114,111,118,101,109,101,110,116, +115,98,101,103,105,110,110,105,110,103,32,105,110,74,101,115,117,115,32,67,104, +114,105,115,116,80,117,98,108,105,99,97,116,105,111,110,115,100,105,115,97,103, +114,101,101,109,101,110,116,116,101,120,116,45,97,108,105,103,110,58,114,44,32, +102,117,110,99,116,105,111,110,40,41,115,105,109,105,108,97,114,105,116,105,101, +115,98,111,100,121,62,60,47,104,116,109,108,62,105,115,32,99,117,114,114,101,110 +,116,108,121,97,108,112,104,97,98,101,116,105,99,97,108,105,115,32,115,111,109, +101,116,105,109,101,115,116,121,112,101,61,34,105,109,97,103,101,47,109,97,110, +121,32,111,102,32,116,104,101,32,102,108,111,119,58,104,105,100,100,101,110,59, +97,118,97,105,108,97,98,108,101,32,105,110,100,101,115,99,114,105,98,101,32,116, +104,101,101,120,105,115,116,101,110,99,101,32,111,102,97,108,108,32,111,118,101, +114,32,116,104,101,116,104,101,32,73,110,116,101,114,110,101,116,9,60,117,108,32 +,99,108,97,115,115,61,34,105,110,115,116,97,108,108,97,116,105,111,110,110,101, +105,103,104,98,111,114,104,111,111,100,97,114,109,101,100,32,102,111,114,99,101, +115,114,101,100,117,99,105,110,103,32,116,104,101,99,111,110,116,105,110,117,101 +,115,32,116,111,78,111,110,101,116,104,101,108,101,115,115,44,116,101,109,112, +101,114,97,116,117,114,101,115,10,9,9,60,97,32,104,114,101,102,61,34,99,108,111, +115,101,32,116,111,32,116,104,101,101,120,97,109,112,108,101,115,32,111,102,32, +105,115,32,97,98,111,117,116,32,116,104,101,40,115,101,101,32,98,101,108,111,119 +,41,46,34,32,105,100,61,34,115,101,97,114,99,104,112,114,111,102,101,115,115,105 +,111,110,97,108,105,115,32,97,118,97,105,108,97,98,108,101,116,104,101,32,111, +102,102,105,99,105,97,108,9,9,60,47,115,99,114,105,112,116,62,10,10,9,9,60,100, +105,118,32,105,100,61,34,97,99,99,101,108,101,114,97,116,105,111,110,116,104,114 +,111,117,103,104,32,116,104,101,32,72,97,108,108,32,111,102,32,70,97,109,101,100 +,101,115,99,114,105,112,116,105,111,110,115,116,114,97,110,115,108,97,116,105, +111,110,115,105,110,116,101,114,102,101,114,101,110,99,101,32,116,121,112,101,61 +,39,116,101,120,116,47,114,101,99,101,110,116,32,121,101,97,114,115,105,110,32, +116,104,101,32,119,111,114,108,100,118,101,114,121,32,112,111,112,117,108,97,114 +,123,98,97,99,107,103,114,111,117,110,100,58,116,114,97,100,105,116,105,111,110, +97,108,32,115,111,109,101,32,111,102,32,116,104,101,32,99,111,110,110,101,99,116 +,101,100,32,116,111,101,120,112,108,111,105,116,97,116,105,111,110,101,109,101, +114,103,101,110,99,101,32,111,102,99,111,110,115,116,105,116,117,116,105,111,110 +,65,32,72,105,115,116,111,114,121,32,111,102,115,105,103,110,105,102,105,99,97, +110,116,32,109,97,110,117,102,97,99,116,117,114,101,100,101,120,112,101,99,116, +97,116,105,111,110,115,62,60,110,111,115,99,114,105,112,116,62,60,99,97,110,32, +98,101,32,102,111,117,110,100,98,101,99,97,117,115,101,32,116,104,101,32,104,97, +115,32,110,111,116,32,98,101,101,110,110,101,105,103,104,98,111,117,114,105,110, +103,119,105,116,104,111,117,116,32,116,104,101,32,97,100,100,101,100,32,116,111, +32,116,104,101,9,60,108,105,32,99,108,97,115,115,61,34,105,110,115,116,114,117, +109,101,110,116,97,108,83,111,118,105,101,116,32,85,110,105,111,110,97,99,107, +110,111,119,108,101,100,103,101,100,119,104,105,99,104,32,99,97,110,32,98,101, +110,97,109,101,32,102,111,114,32,116,104,101,97,116,116,101,110,116,105,111,110, +32,116,111,97,116,116,101,109,112,116,115,32,116,111,32,100,101,118,101,108,111, +112,109,101,110,116,115,73,110,32,102,97,99,116,44,32,116,104,101,60,108,105,32, +99,108,97,115,115,61,34,97,105,109,112,108,105,99,97,116,105,111,110,115,115,117 +,105,116,97,98,108,101,32,102,111,114,109,117,99,104,32,111,102,32,116,104,101, +32,99,111,108,111,110,105,122,97,116,105,111,110,112,114,101,115,105,100,101,110 +,116,105,97,108,99,97,110,99,101,108,66,117,98,98,108,101,32,73,110,102,111,114, +109,97,116,105,111,110,109,111,115,116,32,111,102,32,116,104,101,32,105,115,32, +100,101,115,99,114,105,98,101,100,114,101,115,116,32,111,102,32,116,104,101,32, +109,111,114,101,32,111,114,32,108,101,115,115,105,110,32,83,101,112,116,101,109, +98,101,114,73,110,116,101,108,108,105,103,101,110,99,101,115,114,99,61,34,104, +116,116,112,58,47,47,112,120,59,32,104,101,105,103,104,116,58,32,97,118,97,105, +108,97,98,108,101,32,116,111,109,97,110,117,102,97,99,116,117,114,101,114,104, +117,109,97,110,32,114,105,103,104,116,115,108,105,110,107,32,104,114,101,102,61, +34,47,97,118,97,105,108,97,98,105,108,105,116,121,112,114,111,112,111,114,116, +105,111,110,97,108,111,117,116,115,105,100,101,32,116,104,101,32,97,115,116,114, +111,110,111,109,105,99,97,108,104,117,109,97,110,32,98,101,105,110,103,115,110, +97,109,101,32,111,102,32,116,104,101,32,97,114,101,32,102,111,117,110,100,32,105 +,110,97,114,101,32,98,97,115,101,100,32,111,110,115,109,97,108,108,101,114,32, +116,104,97,110,97,32,112,101,114,115,111,110,32,119,104,111,101,120,112,97,110, +115,105,111,110,32,111,102,97,114,103,117,105,110,103,32,116,104,97,116,110,111, +119,32,107,110,111,119,110,32,97,115,73,110,32,116,104,101,32,101,97,114,108,121 +,105,110,116,101,114,109,101,100,105,97,116,101,100,101,114,105,118,101,100,32, +102,114,111,109,83,99,97,110,100,105,110,97,118,105,97,110,60,47,97,62,60,47,100 +,105,118,62,13,10,99,111,110,115,105,100,101,114,32,116,104,101,97,110,32,101, +115,116,105,109,97,116,101,100,116,104,101,32,78,97,116,105,111,110,97,108,60, +100,105,118,32,105,100,61,34,112,97,103,114,101,115,117,108,116,105,110,103,32, +105,110,99,111,109,109,105,115,115,105,111,110,101,100,97,110,97,108,111,103,111 +,117,115,32,116,111,97,114,101,32,114,101,113,117,105,114,101,100,47,117,108,62, +10,60,47,100,105,118,62,10,119,97,115,32,98,97,115,101,100,32,111,110,97,110,100 +,32,98,101,99,97,109,101,32,97,38,110,98,115,112,59,38,110,98,115,112,59,116,34, +32,118,97,108,117,101,61,34,34,32,119,97,115,32,99,97,112,116,117,114,101,100, +110,111,32,109,111,114,101,32,116,104,97,110,114,101,115,112,101,99,116,105,118, +101,108,121,99,111,110,116,105,110,117,101,32,116,111,32,62,13,10,60,104,101,97, +100,62,13,10,60,119,101,114,101,32,99,114,101,97,116,101,100,109,111,114,101,32, +103,101,110,101,114,97,108,105,110,102,111,114,109,97,116,105,111,110,32,117,115 +,101,100,32,102,111,114,32,116,104,101,105,110,100,101,112,101,110,100,101,110, +116,32,116,104,101,32,73,109,112,101,114,105,97,108,99,111,109,112,111,110,101, +110,116,32,111,102,116,111,32,116,104,101,32,110,111,114,116,104,105,110,99,108, +117,100,101,32,116,104,101,32,67,111,110,115,116,114,117,99,116,105,111,110,115, +105,100,101,32,111,102,32,116,104,101,32,119,111,117,108,100,32,110,111,116,32, +98,101,102,111,114,32,105,110,115,116,97,110,99,101,105,110,118,101,110,116,105, +111,110,32,111,102,109,111,114,101,32,99,111,109,112,108,101,120,99,111,108,108, +101,99,116,105,118,101,108,121,98,97,99,107,103,114,111,117,110,100,58,32,116, +101,120,116,45,97,108,105,103,110,58,32,105,116,115,32,111,114,105,103,105,110, +97,108,105,110,116,111,32,97,99,99,111,117,110,116,116,104,105,115,32,112,114, +111,99,101,115,115,97,110,32,101,120,116,101,110,115,105,118,101,104,111,119,101 +,118,101,114,44,32,116,104,101,116,104,101,121,32,97,114,101,32,110,111,116,114, +101,106,101,99,116,101,100,32,116,104,101,99,114,105,116,105,99,105,115,109,32, +111,102,100,117,114,105,110,103,32,119,104,105,99,104,112,114,111,98,97,98,108, +121,32,116,104,101,116,104,105,115,32,97,114,116,105,99,108,101,40,102,117,110, +99,116,105,111,110,40,41,123,73,116,32,115,104,111,117,108,100,32,98,101,97,110, +32,97,103,114,101,101,109,101,110,116,97,99,99,105,100,101,110,116,97,108,108, +121,100,105,102,102,101,114,115,32,102,114,111,109,65,114,99,104,105,116,101,99, +116,117,114,101,98,101,116,116,101,114,32,107,110,111,119,110,97,114,114,97,110, +103,101,109,101,110,116,115,105,110,102,108,117,101,110,99,101,32,111,110,97,116 +,116,101,110,100,101,100,32,116,104,101,105,100,101,110,116,105,99,97,108,32,116 +,111,115,111,117,116,104,32,111,102,32,116,104,101,112,97,115,115,32,116,104,114 +,111,117,103,104,120,109,108,34,32,116,105,116,108,101,61,34,119,101,105,103,104 +,116,58,98,111,108,100,59,99,114,101,97,116,105,110,103,32,116,104,101,100,105, +115,112,108,97,121,58,110,111,110,101,114,101,112,108,97,99,101,100,32,116,104, +101,60,105,109,103,32,115,114,99,61,34,47,105,104,116,116,112,115,58,47,47,119, +119,119,46,87,111,114,108,100,32,87,97,114,32,73,73,116,101,115,116,105,109,111, +110,105,97,108,115,102,111,117,110,100,32,105,110,32,116,104,101,114,101,113,117 +,105,114,101,100,32,116,111,32,97,110,100,32,116,104,97,116,32,116,104,101,98, +101,116,119,101,101,110,32,116,104,101,32,119,97,115,32,100,101,115,105,103,110, +101,100,99,111,110,115,105,115,116,115,32,111,102,32,99,111,110,115,105,100,101, +114,97,98,108,121,112,117,98,108,105,115,104,101,100,32,98,121,116,104,101,32, +108,97,110,103,117,97,103,101,67,111,110,115,101,114,118,97,116,105,111,110,99, +111,110,115,105,115,116,101,100,32,111,102,114,101,102,101,114,32,116,111,32,116 +,104,101,98,97,99,107,32,116,111,32,116,104,101,32,99,115,115,34,32,109,101,100, +105,97,61,34,80,101,111,112,108,101,32,102,114,111,109,32,97,118,97,105,108,97, +98,108,101,32,111,110,112,114,111,118,101,100,32,116,111,32,98,101,115,117,103, +103,101,115,116,105,111,110,115,34,119,97,115,32,107,110,111,119,110,32,97,115, +118,97,114,105,101,116,105,101,115,32,111,102,108,105,107,101,108,121,32,116,111 +,32,98,101,99,111,109,112,114,105,115,101,100,32,111,102,115,117,112,112,111,114 +,116,32,116,104,101,32,104,97,110,100,115,32,111,102,32,116,104,101,99,111,117, +112,108,101,100,32,119,105,116,104,99,111,110,110,101,99,116,32,97,110,100,32,98 +,111,114,100,101,114,58,110,111,110,101,59,112,101,114,102,111,114,109,97,110,99 +,101,115,98,101,102,111,114,101,32,98,101,105,110,103,108,97,116,101,114,32,98, +101,99,97,109,101,99,97,108,99,117,108,97,116,105,111,110,115,111,102,116,101, +110,32,99,97,108,108,101,100,114,101,115,105,100,101,110,116,115,32,111,102,109, +101,97,110,105,110,103,32,116,104,97,116,62,60,108,105,32,99,108,97,115,115,61, +34,101,118,105,100,101,110,99,101,32,102,111,114,101,120,112,108,97,110,97,116, +105,111,110,115,101,110,118,105,114,111,110,109,101,110,116,115,34,62,60,47,97, +62,60,47,100,105,118,62,119,104,105,99,104,32,97,108,108,111,119,115,73,110,116, +114,111,100,117,99,116,105,111,110,100,101,118,101,108,111,112,101,100,32,98,121 +,97,32,119,105,100,101,32,114,97,110,103,101,111,110,32,98,101,104,97,108,102,32 +,111,102,118,97,108,105,103,110,61,34,116,111,112,34,112,114,105,110,99,105,112, +108,101,32,111,102,97,116,32,116,104,101,32,116,105,109,101,44,60,47,110,111,115 +,99,114,105,112,116,62,13,115,97,105,100,32,116,111,32,104,97,118,101,105,110,32 +,116,104,101,32,102,105,114,115,116,119,104,105,108,101,32,111,116,104,101,114, +115,104,121,112,111,116,104,101,116,105,99,97,108,112,104,105,108,111,115,111, +112,104,101,114,115,112,111,119,101,114,32,111,102,32,116,104,101,99,111,110,116 +,97,105,110,101,100,32,105,110,112,101,114,102,111,114,109,101,100,32,98,121,105 +,110,97,98,105,108,105,116,121,32,116,111,119,101,114,101,32,119,114,105,116,116 +,101,110,115,112,97,110,32,115,116,121,108,101,61,34,105,110,112,117,116,32,110, +97,109,101,61,34,116,104,101,32,113,117,101,115,116,105,111,110,105,110,116,101, +110,100,101,100,32,102,111,114,114,101,106,101,99,116,105,111,110,32,111,102,105 +,109,112,108,105,101,115,32,116,104,97,116,105,110,118,101,110,116,101,100,32, +116,104,101,116,104,101,32,115,116,97,110,100,97,114,100,119,97,115,32,112,114, +111,98,97,98,108,121,108,105,110,107,32,98,101,116,119,101,101,110,112,114,111, +102,101,115,115,111,114,32,111,102,105,110,116,101,114,97,99,116,105,111,110,115 +,99,104,97,110,103,105,110,103,32,116,104,101,73,110,100,105,97,110,32,79,99,101 +,97,110,32,99,108,97,115,115,61,34,108,97,115,116,119,111,114,107,105,110,103,32 +,119,105,116,104,39,104,116,116,112,58,47,47,119,119,119,46,121,101,97,114,115, +32,98,101,102,111,114,101,84,104,105,115,32,119,97,115,32,116,104,101,114,101,99 +,114,101,97,116,105,111,110,97,108,101,110,116,101,114,105,110,103,32,116,104, +101,109,101,97,115,117,114,101,109,101,110,116,115,97,110,32,101,120,116,114,101 +,109,101,108,121,118,97,108,117,101,32,111,102,32,116,104,101,115,116,97,114,116 +,32,111,102,32,116,104,101,10,60,47,115,99,114,105,112,116,62,10,10,97,110,32, +101,102,102,111,114,116,32,116,111,105,110,99,114,101,97,115,101,32,116,104,101, +116,111,32,116,104,101,32,115,111,117,116,104,115,112,97,99,105,110,103,61,34,48 +,34,62,115,117,102,102,105,99,105,101,110,116,108,121,116,104,101,32,69,117,114, +111,112,101,97,110,99,111,110,118,101,114,116,101,100,32,116,111,99,108,101,97, +114,84,105,109,101,111,117,116,100,105,100,32,110,111,116,32,104,97,118,101,99, +111,110,115,101,113,117,101,110,116,108,121,102,111,114,32,116,104,101,32,110, +101,120,116,101,120,116,101,110,115,105,111,110,32,111,102,101,99,111,110,111, +109,105,99,32,97,110,100,97,108,116,104,111,117,103,104,32,116,104,101,97,114, +101,32,112,114,111,100,117,99,101,100,97,110,100,32,119,105,116,104,32,116,104, +101,105,110,115,117,102,102,105,99,105,101,110,116,103,105,118,101,110,32,98,121 +,32,116,104,101,115,116,97,116,105,110,103,32,116,104,97,116,101,120,112,101,110 +,100,105,116,117,114,101,115,60,47,115,112,97,110,62,60,47,97,62,10,116,104,111, +117,103,104,116,32,116,104,97,116,111,110,32,116,104,101,32,98,97,115,105,115,99 +,101,108,108,112,97,100,100,105,110,103,61,105,109,97,103,101,32,111,102,32,116, +104,101,114,101,116,117,114,110,105,110,103,32,116,111,105,110,102,111,114,109, +97,116,105,111,110,44,115,101,112,97,114,97,116,101,100,32,98,121,97,115,115,97, +115,115,105,110,97,116,101,100,115,34,32,99,111,110,116,101,110,116,61,34,97,117 +,116,104,111,114,105,116,121,32,111,102,110,111,114,116,104,119,101,115,116,101, +114,110,60,47,100,105,118,62,10,60,100,105,118,32,34,62,60,47,100,105,118,62,13, +10,32,32,99,111,110,115,117,108,116,97,116,105,111,110,99,111,109,109,117,110, +105,116,121,32,111,102,116,104,101,32,110,97,116,105,111,110,97,108,105,116,32, +115,104,111,117,108,100,32,98,101,112,97,114,116,105,99,105,112,97,110,116,115, +32,97,108,105,103,110,61,34,108,101,102,116,116,104,101,32,103,114,101,97,116, +101,115,116,115,101,108,101,99,116,105,111,110,32,111,102,115,117,112,101,114, +110,97,116,117,114,97,108,100,101,112,101,110,100,101,110,116,32,111,110,105,115 +,32,109,101,110,116,105,111,110,101,100,97,108,108,111,119,105,110,103,32,116, +104,101,119,97,115,32,105,110,118,101,110,116,101,100,97,99,99,111,109,112,97, +110,121,105,110,103,104,105,115,32,112,101,114,115,111,110,97,108,97,118,97,105, +108,97,98,108,101,32,97,116,115,116,117,100,121,32,111,102,32,116,104,101,111, +110,32,116,104,101,32,111,116,104,101,114,101,120,101,99,117,116,105,111,110,32, +111,102,72,117,109,97,110,32,82,105,103,104,116,115,116,101,114,109,115,32,111, +102,32,116,104,101,97,115,115,111,99,105,97,116,105,111,110,115,114,101,115,101, +97,114,99,104,32,97,110,100,115,117,99,99,101,101,100,101,100,32,98,121,100,101, +102,101,97,116,101,100,32,116,104,101,97,110,100,32,102,114,111,109,32,116,104, +101,98,117,116,32,116,104,101,121,32,97,114,101,99,111,109,109,97,110,100,101, +114,32,111,102,115,116,97,116,101,32,111,102,32,116,104,101,121,101,97,114,115, +32,111,102,32,97,103,101,116,104,101,32,115,116,117,100,121,32,111,102,60,117, +108,32,99,108,97,115,115,61,34,115,112,108,97,99,101,32,105,110,32,116,104,101, +119,104,101,114,101,32,104,101,32,119,97,115,60,108,105,32,99,108,97,115,115,61, +34,102,116,104,101,114,101,32,97,114,101,32,110,111,119,104,105,99,104,32,98,101 +,99,97,109,101,104,101,32,112,117,98,108,105,115,104,101,100,101,120,112,114,101 +,115,115,101,100,32,105,110,116,111,32,119,104,105,99,104,32,116,104,101,99,111, +109,109,105,115,115,105,111,110,101,114,102,111,110,116,45,119,101,105,103,104, +116,58,116,101,114,114,105,116,111,114,121,32,111,102,101,120,116,101,110,115, +105,111,110,115,34,62,82,111,109,97,110,32,69,109,112,105,114,101,101,113,117,97 +,108,32,116,111,32,116,104,101,73,110,32,99,111,110,116,114,97,115,116,44,104, +111,119,101,118,101,114,44,32,97,110,100,105,115,32,116,121,112,105,99,97,108, +108,121,97,110,100,32,104,105,115,32,119,105,102,101,40,97,108,115,111,32,99,97, +108,108,101,100,62,60,117,108,32,99,108,97,115,115,61,34,101,102,102,101,99,116, +105,118,101,108,121,32,101,118,111,108,118,101,100,32,105,110,116,111,115,101, +101,109,32,116,111,32,104,97,118,101,119,104,105,99,104,32,105,115,32,116,104, +101,116,104,101,114,101,32,119,97,115,32,110,111,97,110,32,101,120,99,101,108, +108,101,110,116,97,108,108,32,111,102,32,116,104,101,115,101,100,101,115,99,114, +105,98,101,100,32,98,121,73,110,32,112,114,97,99,116,105,99,101,44,98,114,111,97 +,100,99,97,115,116,105,110,103,99,104,97,114,103,101,100,32,119,105,116,104,114, +101,102,108,101,99,116,101,100,32,105,110,115,117,98,106,101,99,116,101,100,32, +116,111,109,105,108,105,116,97,114,121,32,97,110,100,116,111,32,116,104,101,32, +112,111,105,110,116,101,99,111,110,111,109,105,99,97,108,108,121,115,101,116,84, +97,114,103,101,116,105,110,103,97,114,101,32,97,99,116,117,97,108,108,121,118, +105,99,116,111,114,121,32,111,118,101,114,40,41,59,60,47,115,99,114,105,112,116, +62,99,111,110,116,105,110,117,111,117,115,108,121,114,101,113,117,105,114,101, +100,32,102,111,114,101,118,111,108,117,116,105,111,110,97,114,121,97,110,32,101, +102,102,101,99,116,105,118,101,110,111,114,116,104,32,111,102,32,116,104,101,44, +32,119,104,105,99,104,32,119,97,115,32,102,114,111,110,116,32,111,102,32,116,104 +,101,111,114,32,111,116,104,101,114,119,105,115,101,115,111,109,101,32,102,111, +114,109,32,111,102,104,97,100,32,110,111,116,32,98,101,101,110,103,101,110,101, +114,97,116,101,100,32,98,121,105,110,102,111,114,109,97,116,105,111,110,46,112, +101,114,109,105,116,116,101,100,32,116,111,105,110,99,108,117,100,101,115,32,116 +,104,101,100,101,118,101,108,111,112,109,101,110,116,44,101,110,116,101,114,101, +100,32,105,110,116,111,116,104,101,32,112,114,101,118,105,111,117,115,99,111,110 +,115,105,115,116,101,110,116,108,121,97,114,101,32,107,110,111,119,110,32,97,115 +,116,104,101,32,102,105,101,108,100,32,111,102,116,104,105,115,32,116,121,112, +101,32,111,102,103,105,118,101,110,32,116,111,32,116,104,101,116,104,101,32,116, +105,116,108,101,32,111,102,99,111,110,116,97,105,110,115,32,116,104,101,105,110, +115,116,97,110,99,101,115,32,111,102,105,110,32,116,104,101,32,110,111,114,116, +104,100,117,101,32,116,111,32,116,104,101,105,114,97,114,101,32,100,101,115,105, +103,110,101,100,99,111,114,112,111,114,97,116,105,111,110,115,119,97,115,32,116, +104,97,116,32,116,104,101,111,110,101,32,111,102,32,116,104,101,115,101,109,111, +114,101,32,112,111,112,117,108,97,114,115,117,99,99,101,101,100,101,100,32,105, +110,115,117,112,112,111,114,116,32,102,114,111,109,105,110,32,100,105,102,102, +101,114,101,110,116,100,111,109,105,110,97,116,101,100,32,98,121,100,101,115,105 +,103,110,101,100,32,102,111,114,111,119,110,101,114,115,104,105,112,32,111,102, +97,110,100,32,112,111,115,115,105,98,108,121,115,116,97,110,100,97,114,100,105, +122,101,100,114,101,115,112,111,110,115,101,84,101,120,116,119,97,115,32,105,110 +,116,101,110,100,101,100,114,101,99,101,105,118,101,100,32,116,104,101,97,115, +115,117,109,101,100,32,116,104,97,116,97,114,101,97,115,32,111,102,32,116,104, +101,112,114,105,109,97,114,105,108,121,32,105,110,116,104,101,32,98,97,115,105, +115,32,111,102,105,110,32,116,104,101,32,115,101,110,115,101,97,99,99,111,117, +110,116,115,32,102,111,114,100,101,115,116,114,111,121,101,100,32,98,121,97,116, +32,108,101,97,115,116,32,116,119,111,119,97,115,32,100,101,99,108,97,114,101,100 +,99,111,117,108,100,32,110,111,116,32,98,101,83,101,99,114,101,116,97,114,121,32 +,111,102,97,112,112,101,97,114,32,116,111,32,98,101,109,97,114,103,105,110,45, +116,111,112,58,49,47,94,92,115,43,124,92,115,43,36,47,103,101,41,123,116,104,114 +,111,119,32,101,125,59,116,104,101,32,115,116,97,114,116,32,111,102,116,119,111, +32,115,101,112,97,114,97,116,101,108,97,110,103,117,97,103,101,32,97,110,100,119 +,104,111,32,104,97,100,32,98,101,101,110,111,112,101,114,97,116,105,111,110,32, +111,102,100,101,97,116,104,32,111,102,32,116,104,101,114,101,97,108,32,110,117, +109,98,101,114,115,9,60,108,105,110,107,32,114,101,108,61,34,112,114,111,118,105 +,100,101,100,32,116,104,101,116,104,101,32,115,116,111,114,121,32,111,102,99,111 +,109,112,101,116,105,116,105,111,110,115,101,110,103,108,105,115,104,32,40,85,75 +,41,101,110,103,108,105,115,104,32,40,85,83,41,208,156,208,190,208,189,208,179, +208,190,208,187,208,161,209,128,208,191,209,129,208,186,208,184,209,129,209,128, +208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,190, +217,132,216,185,216,177,216,168,217,138,216,169,230,173,163,233,171,148,228,184, +173,230,150,135,231,174,128,228,189,147,228,184,173,230,150,135,231,185,129,228, +189,147,228,184,173,230,150,135,230,156,137,233,153,144,229,133,172,229,143,184, +228,186,186,230,176,145,230,148,191,229,186,156,233,152,191,233,135,140,229,183, +180,229,183,180,231,164,190,228,188,154,228,184,187,228,185,137,230,147,141,228, +189,156,231,179,187,231,187,159,230,148,191,231,173,150,230,179,149,232,167,132, +105,110,102,111,114,109,97,99,105,195,179,110,104,101,114,114,97,109,105,101,110 +,116,97,115,101,108,101,99,116,114,195,179,110,105,99,111,100,101,115,99,114,105 +,112,99,105,195,179,110,99,108,97,115,105,102,105,99,97,100,111,115,99,111,110, +111,99,105,109,105,101,110,116,111,112,117,98,108,105,99,97,99,105,195,179,110, +114,101,108,97,99,105,111,110,97,100,97,115,105,110,102,111,114,109,195,161,116, +105,99,97,114,101,108,97,99,105,111,110,97,100,111,115,100,101,112,97,114,116,97 +,109,101,110,116,111,116,114,97,98,97,106,97,100,111,114,101,115,100,105,114,101 +,99,116,97,109,101,110,116,101,97,121,117,110,116,97,109,105,101,110,116,111,109 +,101,114,99,97,100,111,76,105,98,114,101,99,111,110,116,195,161,99,116,101,110, +111,115,104,97,98,105,116,97,99,105,111,110,101,115,99,117,109,112,108,105,109, +105,101,110,116,111,114,101,115,116,97,117,114,97,110,116,101,115,100,105,115, +112,111,115,105,99,105,195,179,110,99,111,110,115,101,99,117,101,110,99,105,97, +101,108,101,99,116,114,195,179,110,105,99,97,97,112,108,105,99,97,99,105,111,110 +,101,115,100,101,115,99,111,110,101,99,116,97,100,111,105,110,115,116,97,108,97, +99,105,195,179,110,114,101,97,108,105,122,97,99,105,195,179,110,117,116,105,108, +105,122,97,99,105,195,179,110,101,110,99,105,99,108,111,112,101,100,105,97,101, +110,102,101,114,109,101,100,97,100,101,115,105,110,115,116,114,117,109,101,110, +116,111,115,101,120,112,101,114,105,101,110,99,105,97,115,105,110,115,116,105, +116,117,99,105,195,179,110,112,97,114,116,105,99,117,108,97,114,101,115,115,117, +98,99,97,116,101,103,111,114,105,97,209,130,208,190,208,187,209,140,208,186,208, +190,208,160,208,190,209,129,209,129,208,184,208,184,209,128,208,176,208,177,208, +190,209,130,209,139,208,177,208,190,208,187,209,140,209,136,208,181,208,191,209, +128,208,190,209,129,209,130,208,190,208,188,208,190,208,182,208,181,209,130,208, +181,208,180,209,128,209,131,208,179,208,184,209,133,209,129,208,187,209,131,209, +135,208,176,208,181,209,129,208,181,208,185,209,135,208,176,209,129,208,178,209, +129,208,181,208,179,208,180,208,176,208,160,208,190,209,129,209,129,208,184,209, +143,208,156,208,190,209,129,208,186,208,178,208,181,208,180,209,128,209,131,208, +179,208,184,208,181,208,179,208,190,209,128,208,190,208,180,208,176,208,178,208, +190,208,191,209,128,208,190,209,129,208,180,208,176,208,189,208,189,209,139,209, +133,208,180,208,190,208,187,208,182,208,189,209,139,208,184,208,188,208,181,208, +189,208,189,208,190,208,156,208,190,209,129,208,186,208,178,209,139,209,128,209, +131,208,177,208,187,208,181,208,185,208,156,208,190,209,129,208,186,208,178,208, +176,209,129,209,130,209,128,208,176,208,189,209,139,208,189,208,184,209,135,208, +181,208,179,208,190,209,128,208,176,208,177,208,190,209,130,208,181,208,180,208, +190,208,187,208,182,208,181,208,189,209,131,209,129,208,187,209,131,208,179,208, +184,209,130,208,181,208,191,208,181,209,128,209,140,208,158,208,180,208,189,208, +176,208,186,208,190,208,191,208,190,209,130,208,190,208,188,209,131,209,128,208, +176,208,177,208,190,209,130,209,131,208,176,208,191,209,128,208,181,208,187,209, +143,208,178,208,190,208,190,208,177,209,137,208,181,208,190,208,180,208,189,208, +190,208,179,208,190,209,129,208,178,208,190,208,181,208,179,208,190,209,129,209, +130,208,176,209,130,209,140,208,184,208,180,209,128,209,131,208,179,208,190,208, +185,209,132,208,190,209,128,209,131,208,188,208,181,209,133,208,190,209,128,208, +190,209,136,208,190,208,191,209,128,208,190,209,130,208,184,208,178,209,129,209, +129,209,139,208,187,208,186,208,176,208,186,208,176,208,182,208,180,209,139,208, +185,208,178,208,187,208,176,209,129,209,130,208,184,208,179,209,128,209,131,208, +191,208,191,209,139,208,178,208,188,208,181,209,129,209,130,208,181,209,128,208, +176,208,177,208,190,209,130,208,176,209,129,208,186,208,176,208,183,208,176,208, +187,208,191,208,181,209,128,208,178,209,139,208,185,208,180,208,181,208,187,208, +176,209,130,209,140,208,180,208,181,208,189,209,140,208,179,208,184,208,191,208, +181,209,128,208,184,208,190,208,180,208,177,208,184,208,183,208,189,208,181,209, +129,208,190,209,129,208,189,208,190,208,178,208,181,208,188,208,190,208,188,208, +181,208,189,209,130,208,186,209,131,208,191,208,184,209,130,209,140,208,180,208, +190,208,187,208,182,208,189,208,176,209,128,208,176,208,188,208,186,208,176,209, +133,208,189,208,176,209,135,208,176,208,187,208,190,208,160,208,176,208,177,208, +190,209,130,208,176,208,162,208,190,208,187,209,140,208,186,208,190,209,129,208, +190,208,178,209,129,208,181,208,188,208,178,209,130,208,190,209,128,208,190,208, +185,208,189,208,176,209,135,208,176,208,187,208,176,209,129,208,191,208,184,209, +129,208,190,208,186,209,129,208,187,209,131,208,182,208,177,209,139,209,129,208, +184,209,129,209,130,208,181,208,188,208,191,208,181,209,135,208,176,209,130,208, +184,208,189,208,190,208,178,208,190,208,179,208,190,208,191,208,190,208,188,208, +190,209,137,208,184,209,129,208,176,208,185,209,130,208,190,208,178,208,191,208, +190,209,135,208,181,208,188,209,131,208,191,208,190,208,188,208,190,209,137,209, +140,208,180,208,190,208,187,208,182,208,189,208,190,209,129,209,129,209,139,208, +187,208,186,208,184,208,177,209,139,209,129,209,130,209,128,208,190,208,180,208, +176,208,189,208,189,209,139,208,181,208,188,208,189,208,190,208,179,208,184,208, +181,208,191,209,128,208,190,208,181,208,186,209,130,208,161,208,181,208,185,209, +135,208,176,209,129,208,188,208,190,208,180,208,181,208,187,208,184,209,130,208, +176,208,186,208,190,208,179,208,190,208,190,208,189,208,187,208,176,208,185,208, +189,208,179,208,190,209,128,208,190,208,180,208,181,208,178,208,181,209,128,209, +129,208,184,209,143,209,129,209,130,209,128,208,176,208,189,208,181,209,132,208, +184,208,187,209,140,208,188,209,139,209,131,209,128,208,190,208,178,208,189,209, +143,209,128,208,176,208,183,208,189,209,139,209,133,208,184,209,129,208,186,208, +176,209,130,209,140,208,189,208,181,208,180,208,181,208,187,209,142,209,143,208, +189,208,178,208,176,209,128,209,143,208,188,208,181,208,189,209,140,209,136,208, +181,208,188,208,189,208,190,208,179,208,184,209,133,208,180,208,176,208,189,208, +189,208,190,208,185,208,183,208,189,208,176,209,135,208,184,209,130,208,189,208, +181,208,187,209,140,208,183,209,143,209,132,208,190,209,128,209,131,208,188,208, +176,208,162,208,181,208,191,208,181,209,128,209,140,208,188,208,181,209,129,209, +143,209,134,208,176,208,183,208,176,209,137,208,184,209,130,209,139,208,155,209, +131,209,135,209,136,208,184,208,181,224,164,168,224,164,185,224,165,128,224,164, +130,224,164,149,224,164,176,224,164,168,224,165,135,224,164,133,224,164,170,224, +164,168,224,165,135,224,164,149,224,164,191,224,164,175,224,164,190,224,164,149, +224,164,176,224,165,135,224,164,130,224,164,133,224,164,168,224,165,141,224,164, +175,224,164,149,224,165,141,224,164,175,224,164,190,224,164,151,224,164,190,224, +164,135,224,164,161,224,164,172,224,164,190,224,164,176,224,165,135,224,164,149, +224,164,191,224,164,184,224,165,128,224,164,166,224,164,191,224,164,175,224,164, +190,224,164,170,224,164,185,224,164,178,224,165,135,224,164,184,224,164,191,224, +164,130,224,164,185,224,164,173,224,164,190,224,164,176,224,164,164,224,164,133, +224,164,170,224,164,168,224,165,128,224,164,181,224,164,190,224,164,178,224,165, +135,224,164,184,224,165,135,224,164,181,224,164,190,224,164,149,224,164,176,224, +164,164,224,165,135,224,164,174,224,165,135,224,164,176,224,165,135,224,164,185, +224,165,139,224,164,168,224,165,135,224,164,184,224,164,149,224,164,164,224,165, +135,224,164,172,224,164,185,224,165,129,224,164,164,224,164,184,224,164,190,224, +164,135,224,164,159,224,164,185,224,165,139,224,164,151,224,164,190,224,164,156, +224,164,190,224,164,168,224,165,135,224,164,174,224,164,191,224,164,168,224,164, +159,224,164,149,224,164,176,224,164,164,224,164,190,224,164,149,224,164,176,224, +164,168,224,164,190,224,164,137,224,164,168,224,164,149,224,165,135,224,164,175, +224,164,185,224,164,190,224,164,129,224,164,184,224,164,172,224,164,184,224,165, +135,224,164,173,224,164,190,224,164,183,224,164,190,224,164,134,224,164,170,224, +164,149,224,165,135,224,164,178,224,164,191,224,164,175,224,165,135,224,164,182, +224,165,129,224,164,176,224,165,130,224,164,135,224,164,184,224,164,149,224,165, +135,224,164,152,224,164,130,224,164,159,224,165,135,224,164,174,224,165,135,224, +164,176,224,165,128,224,164,184,224,164,149,224,164,164,224,164,190,224,164,174, +224,165,135,224,164,176,224,164,190,224,164,178,224,165,135,224,164,149,224,164, +176,224,164,133,224,164,167,224,164,191,224,164,149,224,164,133,224,164,170,224, +164,168,224,164,190,224,164,184,224,164,174,224,164,190,224,164,156,224,164,174, +224,165,129,224,164,157,224,165,135,224,164,149,224,164,190,224,164,176,224,164, +163,224,164,185,224,165,139,224,164,164,224,164,190,224,164,149,224,164,161,224, +164,188,224,165,128,224,164,175,224,164,185,224,164,190,224,164,130,224,164,185, +224,165,139,224,164,159,224,164,178,224,164,182,224,164,172,224,165,141,224,164, +166,224,164,178,224,164,191,224,164,175,224,164,190,224,164,156,224,165,128,224, +164,181,224,164,168,224,164,156,224,164,190,224,164,164,224,164,190,224,164,149, +224,165,136,224,164,184,224,165,135,224,164,134,224,164,170,224,164,149,224,164, +190,224,164,181,224,164,190,224,164,178,224,165,128,224,164,166,224,165,135,224, +164,168,224,165,135,224,164,170,224,165,130,224,164,176,224,165,128,224,164,170, +224,164,190,224,164,168,224,165,128,224,164,137,224,164,184,224,164,149,224,165, +135,224,164,185,224,165,139,224,164,151,224,165,128,224,164,172,224,165,136,224, +164,160,224,164,149,224,164,134,224,164,170,224,164,149,224,165,128,224,164,181, +224,164,176,224,165,141,224,164,183,224,164,151,224,164,190,224,164,130,224,164, +181,224,164,134,224,164,170,224,164,149,224,165,139,224,164,156,224,164,191,224, +164,178,224,164,190,224,164,156,224,164,190,224,164,168,224,164,190,224,164,184, +224,164,185,224,164,174,224,164,164,224,164,185,224,164,174,224,165,135,224,164, +130,224,164,137,224,164,168,224,164,149,224,165,128,224,164,175,224,164,190,224, +164,185,224,165,130,224,164,166,224,164,176,224,165,141,224,164,156,224,164,184, +224,165,130,224,164,154,224,165,128,224,164,170,224,164,184,224,164,130,224,164, +166,224,164,184,224,164,181,224,164,190,224,164,178,224,164,185,224,165,139,224, +164,168,224,164,190,224,164,185,224,165,139,224,164,164,224,165,128,224,164,156, +224,165,136,224,164,184,224,165,135,224,164,181,224,164,190,224,164,170,224,164, +184,224,164,156,224,164,168,224,164,164,224,164,190,224,164,168,224,165,135,224, +164,164,224,164,190,224,164,156,224,164,190,224,164,176,224,165,128,224,164,152, +224,164,190,224,164,175,224,164,178,224,164,156,224,164,191,224,164,178,224,165, +135,224,164,168,224,165,128,224,164,154,224,165,135,224,164,156,224,164,190,224, +164,130,224,164,154,224,164,170,224,164,164,224,165,141,224,164,176,224,164,151, +224,165,130,224,164,151,224,164,178,224,164,156,224,164,190,224,164,164,224,165, +135,224,164,172,224,164,190,224,164,185,224,164,176,224,164,134,224,164,170,224, +164,168,224,165,135,224,164,181,224,164,190,224,164,185,224,164,168,224,164,135, +224,164,184,224,164,149,224,164,190,224,164,184,224,165,129,224,164,172,224,164, +185,224,164,176,224,164,185,224,164,168,224,165,135,224,164,135,224,164,184,224, +164,184,224,165,135,224,164,184,224,164,185,224,164,191,224,164,164,224,164,172, +224,164,161,224,164,188,224,165,135,224,164,152,224,164,159,224,164,168,224,164, +190,224,164,164,224,164,178,224,164,190,224,164,182,224,164,170,224,164,190,224, +164,130,224,164,154,224,164,182,224,165,141,224,164,176,224,165,128,224,164,172, +224,164,161,224,164,188,224,165,128,224,164,185,224,165,139,224,164,164,224,165, +135,224,164,184,224,164,190,224,164,136,224,164,159,224,164,182,224,164,190,224, +164,175,224,164,166,224,164,184,224,164,149,224,164,164,224,165,128,224,164,156, +224,164,190,224,164,164,224,165,128,224,164,181,224,164,190,224,164,178,224,164, +190,224,164,185,224,164,156,224,164,190,224,164,176,224,164,170,224,164,159,224, +164,168,224,164,190,224,164,176,224,164,150,224,164,168,224,165,135,224,164,184, +224,164,161,224,164,188,224,164,149,224,164,174,224,164,191,224,164,178,224,164, +190,224,164,137,224,164,184,224,164,149,224,165,128,224,164,149,224,165,135,224, +164,181,224,164,178,224,164,178,224,164,151,224,164,164,224,164,190,224,164,150, +224,164,190,224,164,168,224,164,190,224,164,133,224,164,176,224,165,141,224,164, +165,224,164,156,224,164,185,224,164,190,224,164,130,224,164,166,224,165,135,224, +164,150,224,164,190,224,164,170,224,164,185,224,164,178,224,165,128,224,164,168, +224,164,191,224,164,175,224,164,174,224,164,172,224,164,191,224,164,168,224,164, +190,224,164,172,224,165,136,224,164,130,224,164,149,224,164,149,224,164,185,224, +165,128,224,164,130,224,164,149,224,164,185,224,164,168,224,164,190,224,164,166, +224,165,135,224,164,164,224,164,190,224,164,185,224,164,174,224,164,178,224,165, +135,224,164,149,224,164,190,224,164,171,224,165,128,224,164,156,224,164,172,224, +164,149,224,164,191,224,164,164,224,165,129,224,164,176,224,164,164,224,164,174, +224,164,190,224,164,130,224,164,151,224,164,181,224,164,185,224,165,128,224,164, +130,224,164,176,224,165,139,224,164,156,224,164,188,224,164,174,224,164,191,224, +164,178,224,165,128,224,164,134,224,164,176,224,165,139,224,164,170,224,164,184, +224,165,135,224,164,168,224,164,190,224,164,175,224,164,190,224,164,166,224,164, +181,224,164,178,224,165,135,224,164,168,224,165,135,224,164,150,224,164,190,224, +164,164,224,164,190,224,164,149,224,164,176,224,165,128,224,164,172,224,164,137, +224,164,168,224,164,149,224,164,190,224,164,156,224,164,181,224,164,190,224,164, +172,224,164,170,224,165,130,224,164,176,224,164,190,224,164,172,224,164,161,224, +164,188,224,164,190,224,164,184,224,165,140,224,164,166,224,164,190,224,164,182, +224,165,135,224,164,175,224,164,176,224,164,149,224,164,191,224,164,175,224,165, +135,224,164,149,224,164,185,224,164,190,224,164,130,224,164,133,224,164,149,224, +164,184,224,164,176,224,164,172,224,164,168,224,164,190,224,164,143,224,164,181, +224,164,185,224,164,190,224,164,130,224,164,184,224,165,141,224,164,165,224,164, +178,224,164,174,224,164,191,224,164,178,224,165,135,224,164,178,224,165,135,224, +164,150,224,164,149,224,164,181,224,164,191,224,164,183,224,164,175,224,164,149, +224,165,141,224,164,176,224,164,130,224,164,184,224,164,174,224,165,130,224,164, +185,224,164,165,224,164,190,224,164,168,224,164,190,216,170,216,179,216,170,216, +183,217,138,216,185,217,133,216,180,216,167,216,177,217,131,216,169,216,168,217, +136,216,167,216,179,216,183,216,169,216,167,217,132,216,181,217,129,216,173,216, +169,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,174,216, +167,216,181,216,169,216,167,217,132,217,133,216,178,217,138,216,175,216,167,217, +132,216,185,216,167,217,133,216,169,216,167,217,132,217,131,216,167,216,170,216, +168,216,167,217,132,216,177,216,175,217,136,216,175,216,168,216,177,217,134,216, +167,217,133,216,172,216,167,217,132,216,175,217,136,217,132,216,169,216,167,217, +132,216,185,216,167,217,132,217,133,216,167,217,132,217,133,217,136,217,130,216, +185,216,167,217,132,216,185,216,177,216,168,217,138,216,167,217,132,216,179,216, +177,217,138,216,185,216,167,217,132,216,172,217,136,216,167,217,132,216,167,217, +132,216,176,217,135,216,167,216,168,216,167,217,132,216,173,217,138,216,167,216, +169,216,167,217,132,216,173,217,130,217,136,217,130,216,167,217,132,217,131,216, +177,217,138,217,133,216,167,217,132,216,185,216,177,216,167,217,130,217,133,216, +173,217,129,217,136,216,184,216,169,216,167,217,132,216,171,216,167,217,134,217, +138,217,133,216,180,216,167,217,135,216,175,216,169,216,167,217,132,217,133,216, +177,216,163,216,169,216,167,217,132,217,130,216,177,216,162,217,134,216,167,217, +132,216,180,216,168,216,167,216,168,216,167,217,132,216,173,217,136,216,167,216, +177,216,167,217,132,216,172,216,175,217,138,216,175,216,167,217,132,216,163,216, +179,216,177,216,169,216,167,217,132,216,185,217,132,217,136,217,133,217,133,216, +172,217,133,217,136,216,185,216,169,216,167,217,132,216,177,216,173,217,133,217, +134,216,167,217,132,217,134,217,130,216,167,216,183,217,129,217,132,216,179,216, +183,217,138,217,134,216,167,217,132,217,131,217,136,217,138,216,170,216,167,217, +132,216,175,217,134,217,138,216,167,216,168,216,177,217,131,216,167,216,170,217, +135,216,167,217,132,216,177,217,138,216,167,216,182,216,170,216,173,217,138,216, +167,216,170,217,138,216,168,216,170,217,136,217,130,217,138,216,170,216,167,217, +132,216,163,217,136,217,132,217,137,216,167,217,132,216,168,216,177,217,138,216, +175,216,167,217,132,217,131,217,132,216,167,217,133,216,167,217,132,216,177,216, +167,216,168,216,183,216,167,217,132,216,180,216,174,216,181,217,138,216,179,217, +138,216,167,216,177,216,167,216,170,216,167,217,132,216,171,216,167,217,132,216, +171,216,167,217,132,216,181,217,132,216,167,216,169,216,167,217,132,216,173,216, +175,217,138,216,171,216,167,217,132,216,178,217,136,216,167,216,177,216,167,217, +132,216,174,217,132,217,138,216,172,216,167,217,132,216,172,217,133,217,138,216, +185,216,167,217,132,216,185,216,167,217,133,217,135,216,167,217,132,216,172,217, +133,216,167,217,132,216,167,217,132,216,179,216,167,216,185,216,169,217,133,216, +180,216,167,217,135,216,175,217,135,216,167,217,132,216,177,216,166,217,138,216, +179,216,167,217,132,216,175,216,174,217,136,217,132,216,167,217,132,217,129,217, +134,217,138,216,169,216,167,217,132,217,131,216,170,216,167,216,168,216,167,217, +132,216,175,217,136,216,177,217,138,216,167,217,132,216,175,216,177,217,136,216, +179,216,167,216,179,216,170,216,186,216,177,217,130,216,170,216,181,216,167,217, +133,217,138,217,133,216,167,217,132,216,168,217,134,216,167,216,170,216,167,217, +132,216,185,216,184,217,138,217,133,101,110,116,101,114,116,97,105,110,109,101, +110,116,117,110,100,101,114,115,116,97,110,100,105,110,103,32,61,32,102,117,110, +99,116,105,111,110,40,41,46,106,112,103,34,32,119,105,100,116,104,61,34,99,111, +110,102,105,103,117,114,97,116,105,111,110,46,112,110,103,34,32,119,105,100,116, +104,61,34,60,98,111,100,121,32,99,108,97,115,115,61,34,77,97,116,104,46,114,97, +110,100,111,109,40,41,99,111,110,116,101,109,112,111,114,97,114,121,32,85,110, +105,116,101,100,32,83,116,97,116,101,115,99,105,114,99,117,109,115,116,97,110,99 +,101,115,46,97,112,112,101,110,100,67,104,105,108,100,40,111,114,103,97,110,105, +122,97,116,105,111,110,115,60,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60 +,105,109,103,32,115,114,99,61,34,47,100,105,115,116,105,110,103,117,105,115,104, +101,100,116,104,111,117,115,97,110,100,115,32,111,102,32,99,111,109,109,117,110, +105,99,97,116,105,111,110,99,108,101,97,114,34,62,60,47,100,105,118,62,105,110, +118,101,115,116,105,103,97,116,105,111,110,102,97,118,105,99,111,110,46,105,99, +111,34,32,109,97,114,103,105,110,45,114,105,103,104,116,58,98,97,115,101,100,32, +111,110,32,116,104,101,32,77,97,115,115,97,99,104,117,115,101,116,116,115,116,97 +,98,108,101,32,98,111,114,100,101,114,61,105,110,116,101,114,110,97,116,105,111, +110,97,108,97,108,115,111,32,107,110,111,119,110,32,97,115,112,114,111,110,117, +110,99,105,97,116,105,111,110,98,97,99,107,103,114,111,117,110,100,58,35,102,112 +,97,100,100,105,110,103,45,108,101,102,116,58,70,111,114,32,101,120,97,109,112, +108,101,44,32,109,105,115,99,101,108,108,97,110,101,111,117,115,38,108,116,59,47 +,109,97,116,104,38,103,116,59,112,115,121,99,104,111,108,111,103,105,99,97,108, +105,110,32,112,97,114,116,105,99,117,108,97,114,101,97,114,99,104,34,32,116,121, +112,101,61,34,102,111,114,109,32,109,101,116,104,111,100,61,34,97,115,32,111,112 +,112,111,115,101,100,32,116,111,83,117,112,114,101,109,101,32,67,111,117,114,116 +,111,99,99,97,115,105,111,110,97,108,108,121,32,65,100,100,105,116,105,111,110, +97,108,108,121,44,78,111,114,116,104,32,65,109,101,114,105,99,97,112,120,59,98, +97,99,107,103,114,111,117,110,100,111,112,112,111,114,116,117,110,105,116,105, +101,115,69,110,116,101,114,116,97,105,110,109,101,110,116,46,116,111,76,111,119, +101,114,67,97,115,101,40,109,97,110,117,102,97,99,116,117,114,105,110,103,112, +114,111,102,101,115,115,105,111,110,97,108,32,99,111,109,98,105,110,101,100,32, +119,105,116,104,70,111,114,32,105,110,115,116,97,110,99,101,44,99,111,110,115, +105,115,116,105,110,103,32,111,102,34,32,109,97,120,108,101,110,103,116,104,61, +34,114,101,116,117,114,110,32,102,97,108,115,101,59,99,111,110,115,99,105,111, +117,115,110,101,115,115,77,101,100,105,116,101,114,114,97,110,101,97,110,101,120 +,116,114,97,111,114,100,105,110,97,114,121,97,115,115,97,115,115,105,110,97,116, +105,111,110,115,117,98,115,101,113,117,101,110,116,108,121,32,98,117,116,116,111 +,110,32,116,121,112,101,61,34,116,104,101,32,110,117,109,98,101,114,32,111,102, +116,104,101,32,111,114,105,103,105,110,97,108,32,99,111,109,112,114,101,104,101, +110,115,105,118,101,114,101,102,101,114,115,32,116,111,32,116,104,101,60,47,117, +108,62,10,60,47,100,105,118,62,10,112,104,105,108,111,115,111,112,104,105,99,97, +108,108,111,99,97,116,105,111,110,46,104,114,101,102,119,97,115,32,112,117,98, +108,105,115,104,101,100,83,97,110,32,70,114,97,110,99,105,115,99,111,40,102,117, +110,99,116,105,111,110,40,41,123,10,60,100,105,118,32,105,100,61,34,109,97,105, +110,115,111,112,104,105,115,116,105,99,97,116,101,100,109,97,116,104,101,109,97, +116,105,99,97,108,32,47,104,101,97,100,62,13,10,60,98,111,100,121,115,117,103, +103,101,115,116,115,32,116,104,97,116,100,111,99,117,109,101,110,116,97,116,105, +111,110,99,111,110,99,101,110,116,114,97,116,105,111,110,114,101,108,97,116,105, +111,110,115,104,105,112,115,109,97,121,32,104,97,118,101,32,98,101,101,110,40, +102,111,114,32,101,120,97,109,112,108,101,44,84,104,105,115,32,97,114,116,105,99 +,108,101,32,105,110,32,115,111,109,101,32,99,97,115,101,115,112,97,114,116,115, +32,111,102,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102, +71,114,101,97,116,32,66,114,105,116,97,105,110,32,99,101,108,108,112,97,100,100, +105,110,103,61,101,113,117,105,118,97,108,101,110,116,32,116,111,112,108,97,99, +101,104,111,108,100,101,114,61,34,59,32,102,111,110,116,45,115,105,122,101,58,32 +,106,117,115,116,105,102,105,99,97,116,105,111,110,98,101,108,105,101,118,101, +100,32,116,104,97,116,115,117,102,102,101,114,101,100,32,102,114,111,109,97,116, +116,101,109,112,116,101,100,32,116,111,32,108,101,97,100,101,114,32,111,102,32, +116,104,101,99,114,105,112,116,34,32,115,114,99,61,34,47,40,102,117,110,99,116, +105,111,110,40,41,32,123,97,114,101,32,97,118,97,105,108,97,98,108,101,10,9,60, +108,105,110,107,32,114,101,108,61,34,32,115,114,99,61,39,104,116,116,112,58,47, +47,105,110,116,101,114,101,115,116,101,100,32,105,110,99,111,110,118,101,110,116 +,105,111,110,97,108,32,34,32,97,108,116,61,34,34,32,47,62,60,47,97,114,101,32, +103,101,110,101,114,97,108,108,121,104,97,115,32,97,108,115,111,32,98,101,101, +110,109,111,115,116,32,112,111,112,117,108,97,114,32,99,111,114,114,101,115,112, +111,110,100,105,110,103,99,114,101,100,105,116,101,100,32,119,105,116,104,116, +121,108,101,61,34,98,111,114,100,101,114,58,60,47,97,62,60,47,115,112,97,110,62, +60,47,46,103,105,102,34,32,119,105,100,116,104,61,34,60,105,102,114,97,109,101, +32,115,114,99,61,34,116,97,98,108,101,32,99,108,97,115,115,61,34,105,110,108,105 +,110,101,45,98,108,111,99,107,59,97,99,99,111,114,100,105,110,103,32,116,111,32, +116,111,103,101,116,104,101,114,32,119,105,116,104,97,112,112,114,111,120,105, +109,97,116,101,108,121,112,97,114,108,105,97,109,101,110,116,97,114,121,109,111, +114,101,32,97,110,100,32,109,111,114,101,100,105,115,112,108,97,121,58,110,111, +110,101,59,116,114,97,100,105,116,105,111,110,97,108,108,121,112,114,101,100,111 +,109,105,110,97,110,116,108,121,38,110,98,115,112,59,124,38,110,98,115,112,59,38 +,110,98,115,112,59,60,47,115,112,97,110,62,32,99,101,108,108,115,112,97,99,105, +110,103,61,60,105,110,112,117,116,32,110,97,109,101,61,34,111,114,34,32,99,111, +110,116,101,110,116,61,34,99,111,110,116,114,111,118,101,114,115,105,97,108,112, +114,111,112,101,114,116,121,61,34,111,103,58,47,120,45,115,104,111,99,107,119,97 +,118,101,45,100,101,109,111,110,115,116,114,97,116,105,111,110,115,117,114,114, +111,117,110,100,101,100,32,98,121,78,101,118,101,114,116,104,101,108,101,115,115 +,44,119,97,115,32,116,104,101,32,102,105,114,115,116,99,111,110,115,105,100,101, +114,97,98,108,101,32,65,108,116,104,111,117,103,104,32,116,104,101,32,99,111,108 +,108,97,98,111,114,97,116,105,111,110,115,104,111,117,108,100,32,110,111,116,32, +98,101,112,114,111,112,111,114,116,105,111,110,32,111,102,60,115,112,97,110,32, +115,116,121,108,101,61,34,107,110,111,119,110,32,97,115,32,116,104,101,32,115, +104,111,114,116,108,121,32,97,102,116,101,114,102,111,114,32,105,110,115,116,97, +110,99,101,44,100,101,115,99,114,105,98,101,100,32,97,115,32,47,104,101,97,100, +62,10,60,98,111,100,121,32,115,116,97,114,116,105,110,103,32,119,105,116,104,105 +,110,99,114,101,97,115,105,110,103,108,121,32,116,104,101,32,102,97,99,116,32, +116,104,97,116,100,105,115,99,117,115,115,105,111,110,32,111,102,109,105,100,100 +,108,101,32,111,102,32,116,104,101,97,110,32,105,110,100,105,118,105,100,117,97, +108,100,105,102,102,105,99,117,108,116,32,116,111,32,112,111,105,110,116,32,111, +102,32,118,105,101,119,104,111,109,111,115,101,120,117,97,108,105,116,121,97,99, +99,101,112,116,97,110,99,101,32,111,102,60,47,115,112,97,110,62,60,47,100,105, +118,62,109,97,110,117,102,97,99,116,117,114,101,114,115,111,114,105,103,105,110, +32,111,102,32,116,104,101,99,111,109,109,111,110,108,121,32,117,115,101,100,105, +109,112,111,114,116,97,110,99,101,32,111,102,100,101,110,111,109,105,110,97,116, +105,111,110,115,98,97,99,107,103,114,111,117,110,100,58,32,35,108,101,110,103, +116,104,32,111,102,32,116,104,101,100,101,116,101,114,109,105,110,97,116,105,111 +,110,97,32,115,105,103,110,105,102,105,99,97,110,116,34,32,98,111,114,100,101, +114,61,34,48,34,62,114,101,118,111,108,117,116,105,111,110,97,114,121,112,114, +105,110,99,105,112,108,101,115,32,111,102,105,115,32,99,111,110,115,105,100,101, +114,101,100,119,97,115,32,100,101,118,101,108,111,112,101,100,73,110,100,111,45, +69,117,114,111,112,101,97,110,118,117,108,110,101,114,97,98,108,101,32,116,111, +112,114,111,112,111,110,101,110,116,115,32,111,102,97,114,101,32,115,111,109,101 +,116,105,109,101,115,99,108,111,115,101,114,32,116,111,32,116,104,101,78,101,119 +,32,89,111,114,107,32,67,105,116,121,32,110,97,109,101,61,34,115,101,97,114,99, +104,97,116,116,114,105,98,117,116,101,100,32,116,111,99,111,117,114,115,101,32, +111,102,32,116,104,101,109,97,116,104,101,109,97,116,105,99,105,97,110,98,121,32 +,116,104,101,32,101,110,100,32,111,102,97,116,32,116,104,101,32,101,110,100,32, +111,102,34,32,98,111,114,100,101,114,61,34,48,34,32,116,101,99,104,110,111,108, +111,103,105,99,97,108,46,114,101,109,111,118,101,67,108,97,115,115,40,98,114,97, +110,99,104,32,111,102,32,116,104,101,101,118,105,100,101,110,99,101,32,116,104, +97,116,33,91,101,110,100,105,102,93,45,45,62,13,10,73,110,115,116,105,116,117, +116,101,32,111,102,32,105,110,116,111,32,97,32,115,105,110,103,108,101,114,101, +115,112,101,99,116,105,118,101,108,121,46,97,110,100,32,116,104,101,114,101,102, +111,114,101,112,114,111,112,101,114,116,105,101,115,32,111,102,105,115,32,108, +111,99,97,116,101,100,32,105,110,115,111,109,101,32,111,102,32,119,104,105,99, +104,84,104,101,114,101,32,105,115,32,97,108,115,111,99,111,110,116,105,110,117, +101,100,32,116,111,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,38,97, +109,112,59,110,100,97,115,104,59,32,100,101,115,99,114,105,98,101,115,32,116,104 +,101,99,111,110,115,105,100,101,114,97,116,105,111,110,97,117,116,104,111,114,32 +,111,102,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,108,121,101, +113,117,105,112,112,101,100,32,119,105,116,104,100,111,101,115,32,110,111,116,32 +,104,97,118,101,60,47,97,62,60,97,32,104,114,101,102,61,34,99,111,110,102,117, +115,101,100,32,119,105,116,104,60,108,105,110,107,32,104,114,101,102,61,34,47,97 +,116,32,116,104,101,32,97,103,101,32,111,102,97,112,112,101,97,114,32,105,110,32 +,116,104,101,84,104,101,115,101,32,105,110,99,108,117,100,101,114,101,103,97,114 +,100,108,101,115,115,32,111,102,99,111,117,108,100,32,98,101,32,117,115,101,100, +32,115,116,121,108,101,61,38,113,117,111,116,59,115,101,118,101,114,97,108,32, +116,105,109,101,115,114,101,112,114,101,115,101,110,116,32,116,104,101,98,111, +100,121,62,10,60,47,104,116,109,108,62,116,104,111,117,103,104,116,32,116,111,32 +,98,101,112,111,112,117,108,97,116,105,111,110,32,111,102,112,111,115,115,105,98 +,105,108,105,116,105,101,115,112,101,114,99,101,110,116,97,103,101,32,111,102,97 +,99,99,101,115,115,32,116,111,32,116,104,101,97,110,32,97,116,116,101,109,112, +116,32,116,111,112,114,111,100,117,99,116,105,111,110,32,111,102,106,113,117,101 +,114,121,47,106,113,117,101,114,121,116,119,111,32,100,105,102,102,101,114,101, +110,116,98,101,108,111,110,103,32,116,111,32,116,104,101,101,115,116,97,98,108, +105,115,104,109,101,110,116,114,101,112,108,97,99,105,110,103,32,116,104,101,100 +,101,115,99,114,105,112,116,105,111,110,34,32,100,101,116,101,114,109,105,110, +101,32,116,104,101,97,118,97,105,108,97,98,108,101,32,102,111,114,65,99,99,111, +114,100,105,110,103,32,116,111,32,119,105,100,101,32,114,97,110,103,101,32,111, +102,9,60,100,105,118,32,99,108,97,115,115,61,34,109,111,114,101,32,99,111,109, +109,111,110,108,121,111,114,103,97,110,105,115,97,116,105,111,110,115,102,117, +110,99,116,105,111,110,97,108,105,116,121,119,97,115,32,99,111,109,112,108,101, +116,101,100,32,38,97,109,112,59,109,100,97,115,104,59,32,112,97,114,116,105,99, +105,112,97,116,105,111,110,116,104,101,32,99,104,97,114,97,99,116,101,114,97,110 +,32,97,100,100,105,116,105,111,110,97,108,97,112,112,101,97,114,115,32,116,111, +32,98,101,102,97,99,116,32,116,104,97,116,32,116,104,101,97,110,32,101,120,97, +109,112,108,101,32,111,102,115,105,103,110,105,102,105,99,97,110,116,108,121,111 +,110,109,111,117,115,101,111,118,101,114,61,34,98,101,99,97,117,115,101,32,116, +104,101,121,32,97,115,121,110,99,32,61,32,116,114,117,101,59,112,114,111,98,108, +101,109,115,32,119,105,116,104,115,101,101,109,115,32,116,111,32,104,97,118,101, +116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,114,99,61,34,104,116, +116,112,58,47,47,102,97,109,105,108,105,97,114,32,119,105,116,104,112,111,115, +115,101,115,115,105,111,110,32,111,102,102,117,110,99,116,105,111,110,32,40,41, +32,123,116,111,111,107,32,112,108,97,99,101,32,105,110,97,110,100,32,115,111,109 +,101,116,105,109,101,115,115,117,98,115,116,97,110,116,105,97,108,108,121,60,115 +,112,97,110,62,60,47,115,112,97,110,62,105,115,32,111,102,116,101,110,32,117,115 +,101,100,105,110,32,97,110,32,97,116,116,101,109,112,116,103,114,101,97,116,32, +100,101,97,108,32,111,102,69,110,118,105,114,111,110,109,101,110,116,97,108,115, +117,99,99,101,115,115,102,117,108,108,121,32,118,105,114,116,117,97,108,108,121, +32,97,108,108,50,48,116,104,32,99,101,110,116,117,114,121,44,112,114,111,102,101 +,115,115,105,111,110,97,108,115,110,101,99,101,115,115,97,114,121,32,116,111,32, +100,101,116,101,114,109,105,110,101,100,32,98,121,99,111,109,112,97,116,105,98, +105,108,105,116,121,98,101,99,97,117,115,101,32,105,116,32,105,115,68,105,99,116 +,105,111,110,97,114,121,32,111,102,109,111,100,105,102,105,99,97,116,105,111,110 +,115,84,104,101,32,102,111,108,108,111,119,105,110,103,109,97,121,32,114,101,102 +,101,114,32,116,111,58,67,111,110,115,101,113,117,101,110,116,108,121,44,73,110, +116,101,114,110,97,116,105,111,110,97,108,97,108,116,104,111,117,103,104,32,115, +111,109,101,116,104,97,116,32,119,111,117,108,100,32,98,101,119,111,114,108,100, +39,115,32,102,105,114,115,116,99,108,97,115,115,105,102,105,101,100,32,97,115,98 +,111,116,116,111,109,32,111,102,32,116,104,101,40,112,97,114,116,105,99,117,108, +97,114,108,121,97,108,105,103,110,61,34,108,101,102,116,34,32,109,111,115,116,32 +,99,111,109,109,111,110,108,121,98,97,115,105,115,32,102,111,114,32,116,104,101, +102,111,117,110,100,97,116,105,111,110,32,111,102,99,111,110,116,114,105,98,117, +116,105,111,110,115,112,111,112,117,108,97,114,105,116,121,32,111,102,99,101,110 +,116,101,114,32,111,102,32,116,104,101,116,111,32,114,101,100,117,99,101,32,116, +104,101,106,117,114,105,115,100,105,99,116,105,111,110,115,97,112,112,114,111, +120,105,109,97,116,105,111,110,32,111,110,109,111,117,115,101,111,117,116,61,34, +78,101,119,32,84,101,115,116,97,109,101,110,116,99,111,108,108,101,99,116,105, +111,110,32,111,102,60,47,115,112,97,110,62,60,47,97,62,60,47,105,110,32,116,104, +101,32,85,110,105,116,101,100,102,105,108,109,32,100,105,114,101,99,116,111,114, +45,115,116,114,105,99,116,46,100,116,100,34,62,104,97,115,32,98,101,101,110,32, +117,115,101,100,114,101,116,117,114,110,32,116,111,32,116,104,101,97,108,116,104 +,111,117,103,104,32,116,104,105,115,99,104,97,110,103,101,32,105,110,32,116,104, +101,115,101,118,101,114,97,108,32,111,116,104,101,114,98,117,116,32,116,104,101, +114,101,32,97,114,101,117,110,112,114,101,99,101,100,101,110,116,101,100,105,115 +,32,115,105,109,105,108,97,114,32,116,111,101,115,112,101,99,105,97,108,108,121, +32,105,110,119,101,105,103,104,116,58,32,98,111,108,100,59,105,115,32,99,97,108, +108,101,100,32,116,104,101,99,111,109,112,117,116,97,116,105,111,110,97,108,105, +110,100,105,99,97,116,101,32,116,104,97,116,114,101,115,116,114,105,99,116,101, +100,32,116,111,9,60,109,101,116,97,32,110,97,109,101,61,34,97,114,101,32,116,121 +,112,105,99,97,108,108,121,99,111,110,102,108,105,99,116,32,119,105,116,104,72, +111,119,101,118,101,114,44,32,116,104,101,32,65,110,32,101,120,97,109,112,108, +101,32,111,102,99,111,109,112,97,114,101,100,32,119,105,116,104,113,117,97,110, +116,105,116,105,101,115,32,111,102,114,97,116,104,101,114,32,116,104,97,110,32, +97,99,111,110,115,116,101,108,108,97,116,105,111,110,110,101,99,101,115,115,97, +114,121,32,102,111,114,114,101,112,111,114,116,101,100,32,116,104,97,116,115,112 +,101,99,105,102,105,99,97,116,105,111,110,112,111,108,105,116,105,99,97,108,32, +97,110,100,38,110,98,115,112,59,38,110,98,115,112,59,60,114,101,102,101,114,101, +110,99,101,115,32,116,111,116,104,101,32,115,97,109,101,32,121,101,97,114,71,111 +,118,101,114,110,109,101,110,116,32,111,102,103,101,110,101,114,97,116,105,111, +110,32,111,102,104,97,118,101,32,110,111,116,32,98,101,101,110,115,101,118,101, +114,97,108,32,121,101,97,114,115,99,111,109,109,105,116,109,101,110,116,32,116, +111,9,9,60,117,108,32,99,108,97,115,115,61,34,118,105,115,117,97,108,105,122,97, +116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,44,112,114,97,99,116 +,105,116,105,111,110,101,114,115,116,104,97,116,32,104,101,32,119,111,117,108, +100,97,110,100,32,99,111,110,116,105,110,117,101,100,111,99,99,117,112,97,116, +105,111,110,32,111,102,105,115,32,100,101,102,105,110,101,100,32,97,115,99,101, +110,116,114,101,32,111,102,32,116,104,101,116,104,101,32,97,109,111,117,110,116, +32,111,102,62,60,100,105,118,32,115,116,121,108,101,61,34,101,113,117,105,118,97 +,108,101,110,116,32,111,102,100,105,102,102,101,114,101,110,116,105,97,116,101, +98,114,111,117,103,104,116,32,97,98,111,117,116,109,97,114,103,105,110,45,108, +101,102,116,58,32,97,117,116,111,109,97,116,105,99,97,108,108,121,116,104,111, +117,103,104,116,32,111,102,32,97,115,83,111,109,101,32,111,102,32,116,104,101, +115,101,10,60,100,105,118,32,99,108,97,115,115,61,34,105,110,112,117,116,32,99, +108,97,115,115,61,34,114,101,112,108,97,99,101,100,32,119,105,116,104,105,115,32 +,111,110,101,32,111,102,32,116,104,101,101,100,117,99,97,116,105,111,110,32,97, +110,100,105,110,102,108,117,101,110,99,101,100,32,98,121,114,101,112,117,116,97, +116,105,111,110,32,97,115,10,60,109,101,116,97,32,110,97,109,101,61,34,97,99,99, +111,109,109,111,100,97,116,105,111,110,60,47,100,105,118,62,10,60,47,100,105,118 +,62,108,97,114,103,101,32,112,97,114,116,32,111,102,73,110,115,116,105,116,117, +116,101,32,102,111,114,116,104,101,32,115,111,45,99,97,108,108,101,100,32,97,103 +,97,105,110,115,116,32,116,104,101,32,73,110,32,116,104,105,115,32,99,97,115,101 +,44,119,97,115,32,97,112,112,111,105,110,116,101,100,99,108,97,105,109,101,100, +32,116,111,32,98,101,72,111,119,101,118,101,114,44,32,116,104,105,115,68,101,112 +,97,114,116,109,101,110,116,32,111,102,116,104,101,32,114,101,109,97,105,110,105 +,110,103,101,102,102,101,99,116,32,111,110,32,116,104,101,112,97,114,116,105,99, +117,108,97,114,108,121,32,100,101,97,108,32,119,105,116,104,32,116,104,101,10,60 +,100,105,118,32,115,116,121,108,101,61,34,97,108,109,111,115,116,32,97,108,119, +97,121,115,97,114,101,32,99,117,114,114,101,110,116,108,121,101,120,112,114,101, +115,115,105,111,110,32,111,102,112,104,105,108,111,115,111,112,104,121,32,111, +102,102,111,114,32,109,111,114,101,32,116,104,97,110,99,105,118,105,108,105,122, +97,116,105,111,110,115,111,110,32,116,104,101,32,105,115,108,97,110,100,115,101, +108,101,99,116,101,100,73,110,100,101,120,99,97,110,32,114,101,115,117,108,116, +32,105,110,34,32,118,97,108,117,101,61,34,34,32,47,62,116,104,101,32,115,116,114 +,117,99,116,117,114,101,32,47,62,60,47,97,62,60,47,100,105,118,62,77,97,110,121, +32,111,102,32,116,104,101,115,101,99,97,117,115,101,100,32,98,121,32,116,104,101 +,111,102,32,116,104,101,32,85,110,105,116,101,100,115,112,97,110,32,99,108,97, +115,115,61,34,109,99,97,110,32,98,101,32,116,114,97,99,101,100,105,115,32,114, +101,108,97,116,101,100,32,116,111,98,101,99,97,109,101,32,111,110,101,32,111,102 +,105,115,32,102,114,101,113,117,101,110,116,108,121,108,105,118,105,110,103,32, +105,110,32,116,104,101,116,104,101,111,114,101,116,105,99,97,108,108,121,70,111, +108,108,111,119,105,110,103,32,116,104,101,82,101,118,111,108,117,116,105,111, +110,97,114,121,103,111,118,101,114,110,109,101,110,116,32,105,110,105,115,32,100 +,101,116,101,114,109,105,110,101,100,116,104,101,32,112,111,108,105,116,105,99, +97,108,105,110,116,114,111,100,117,99,101,100,32,105,110,115,117,102,102,105,99, +105,101,110,116,32,116,111,100,101,115,99,114,105,112,116,105,111,110,34,62,115, +104,111,114,116,32,115,116,111,114,105,101,115,115,101,112,97,114,97,116,105,111 +,110,32,111,102,97,115,32,116,111,32,119,104,101,116,104,101,114,107,110,111,119 +,110,32,102,111,114,32,105,116,115,119,97,115,32,105,110,105,116,105,97,108,108, +121,100,105,115,112,108,97,121,58,98,108,111,99,107,105,115,32,97,110,32,101,120 +,97,109,112,108,101,116,104,101,32,112,114,105,110,99,105,112,97,108,99,111,110, +115,105,115,116,115,32,111,102,32,97,114,101,99,111,103,110,105,122,101,100,32, +97,115,47,98,111,100,121,62,60,47,104,116,109,108,62,97,32,115,117,98,115,116,97 +,110,116,105,97,108,114,101,99,111,110,115,116,114,117,99,116,101,100,104,101,97 +,100,32,111,102,32,115,116,97,116,101,114,101,115,105,115,116,97,110,99,101,32, +116,111,117,110,100,101,114,103,114,97,100,117,97,116,101,84,104,101,114,101,32, +97,114,101,32,116,119,111,103,114,97,118,105,116,97,116,105,111,110,97,108,97, +114,101,32,100,101,115,99,114,105,98,101,100,105,110,116,101,110,116,105,111,110 +,97,108,108,121,115,101,114,118,101,100,32,97,115,32,116,104,101,99,108,97,115, +115,61,34,104,101,97,100,101,114,111,112,112,111,115,105,116,105,111,110,32,116, +111,102,117,110,100,97,109,101,110,116,97,108,108,121,100,111,109,105,110,97,116 +,101,100,32,116,104,101,97,110,100,32,116,104,101,32,111,116,104,101,114,97,108, +108,105,97,110,99,101,32,119,105,116,104,119,97,115,32,102,111,114,99,101,100,32 +,116,111,114,101,115,112,101,99,116,105,118,101,108,121,44,97,110,100,32,112,111 +,108,105,116,105,99,97,108,105,110,32,115,117,112,112,111,114,116,32,111,102,112 +,101,111,112,108,101,32,105,110,32,116,104,101,50,48,116,104,32,99,101,110,116, +117,114,121,46,97,110,100,32,112,117,98,108,105,115,104,101,100,108,111,97,100, +67,104,97,114,116,98,101,97,116,116,111,32,117,110,100,101,114,115,116,97,110, +100,109,101,109,98,101,114,32,115,116,97,116,101,115,101,110,118,105,114,111,110 +,109,101,110,116,97,108,102,105,114,115,116,32,104,97,108,102,32,111,102,99,111, +117,110,116,114,105,101,115,32,97,110,100,97,114,99,104,105,116,101,99,116,117, +114,97,108,98,101,32,99,111,110,115,105,100,101,114,101,100,99,104,97,114,97,99, +116,101,114,105,122,101,100,99,108,101,97,114,73,110,116,101,114,118,97,108,97, +117,116,104,111,114,105,116,97,116,105,118,101,70,101,100,101,114,97,116,105,111 +,110,32,111,102,119,97,115,32,115,117,99,99,101,101,100,101,100,97,110,100,32, +116,104,101,114,101,32,97,114,101,97,32,99,111,110,115,101,113,117,101,110,99, +101,116,104,101,32,80,114,101,115,105,100,101,110,116,97,108,115,111,32,105,110, +99,108,117,100,101,100,102,114,101,101,32,115,111,102,116,119,97,114,101,115,117 +,99,99,101,115,115,105,111,110,32,111,102,100,101,118,101,108,111,112,101,100,32 +,116,104,101,119,97,115,32,100,101,115,116,114,111,121,101,100,97,119,97,121,32, +102,114,111,109,32,116,104,101,59,10,60,47,115,99,114,105,112,116,62,10,60,97, +108,116,104,111,117,103,104,32,116,104,101,121,102,111,108,108,111,119,101,100, +32,98,121,32,97,109,111,114,101,32,112,111,119,101,114,102,117,108,114,101,115, +117,108,116,101,100,32,105,110,32,97,85,110,105,118,101,114,115,105,116,121,32, +111,102,72,111,119,101,118,101,114,44,32,109,97,110,121,116,104,101,32,112,114, +101,115,105,100,101,110,116,72,111,119,101,118,101,114,44,32,115,111,109,101,105 +,115,32,116,104,111,117,103,104,116,32,116,111,117,110,116,105,108,32,116,104, +101,32,101,110,100,119,97,115,32,97,110,110,111,117,110,99,101,100,97,114,101,32 +,105,109,112,111,114,116,97,110,116,97,108,115,111,32,105,110,99,108,117,100,101 +,115,62,60,105,110,112,117,116,32,116,121,112,101,61,116,104,101,32,99,101,110, +116,101,114,32,111,102,32,68,79,32,78,79,84,32,65,76,84,69,82,117,115,101,100,32 +,116,111,32,114,101,102,101,114,116,104,101,109,101,115,47,63,115,111,114,116,61 +,116,104,97,116,32,104,97,100,32,98,101,101,110,116,104,101,32,98,97,115,105,115 +,32,102,111,114,104,97,115,32,100,101,118,101,108,111,112,101,100,105,110,32,116 +,104,101,32,115,117,109,109,101,114,99,111,109,112,97,114,97,116,105,118,101,108 +,121,100,101,115,99,114,105,98,101,100,32,116,104,101,115,117,99,104,32,97,115, +32,116,104,111,115,101,116,104,101,32,114,101,115,117,108,116,105,110,103,105, +115,32,105,109,112,111,115,115,105,98,108,101,118,97,114,105,111,117,115,32,111, +116,104,101,114,83,111,117,116,104,32,65,102,114,105,99,97,110,104,97,118,101,32 +,116,104,101,32,115,97,109,101,101,102,102,101,99,116,105,118,101,110,101,115, +115,105,110,32,119,104,105,99,104,32,99,97,115,101,59,32,116,101,120,116,45,97, +108,105,103,110,58,115,116,114,117,99,116,117,114,101,32,97,110,100,59,32,98,97, +99,107,103,114,111,117,110,100,58,114,101,103,97,114,100,105,110,103,32,116,104, +101,115,117,112,112,111,114,116,101,100,32,116,104,101,105,115,32,97,108,115,111 +,32,107,110,111,119,110,115,116,121,108,101,61,34,109,97,114,103,105,110,105,110 +,99,108,117,100,105,110,103,32,116,104,101,98,97,104,97,115,97,32,77,101,108,97, +121,117,110,111,114,115,107,32,98,111,107,109,195,165,108,110,111,114,115,107,32 +,110,121,110,111,114,115,107,115,108,111,118,101,110,197,161,196,141,105,110,97, +105,110,116,101,114,110,97,99,105,111,110,97,108,99,97,108,105,102,105,99,97,99, +105,195,179,110,99,111,109,117,110,105,99,97,99,105,195,179,110,99,111,110,115, +116,114,117,99,99,105,195,179,110,34,62,60,100,105,118,32,99,108,97,115,115,61, +34,100,105,115,97,109,98,105,103,117,97,116,105,111,110,68,111,109,97,105,110,78 +,97,109,101,39,44,32,39,97,100,109,105,110,105,115,116,114,97,116,105,111,110, +115,105,109,117,108,116,97,110,101,111,117,115,108,121,116,114,97,110,115,112, +111,114,116,97,116,105,111,110,73,110,116,101,114,110,97,116,105,111,110,97,108, +32,109,97,114,103,105,110,45,98,111,116,116,111,109,58,114,101,115,112,111,110, +115,105,98,105,108,105,116,121,60,33,91,101,110,100,105,102,93,45,45,62,10,60,47 +,62,60,109,101,116,97,32,110,97,109,101,61,34,105,109,112,108,101,109,101,110, +116,97,116,105,111,110,105,110,102,114,97,115,116,114,117,99,116,117,114,101,114 +,101,112,114,101,115,101,110,116,97,116,105,111,110,98,111,114,100,101,114,45,98 +,111,116,116,111,109,58,60,47,104,101,97,100,62,10,60,98,111,100,121,62,61,104, +116,116,112,37,51,65,37,50,70,37,50,70,60,102,111,114,109,32,109,101,116,104,111 +,100,61,34,109,101,116,104,111,100,61,34,112,111,115,116,34,32,47,102,97,118,105 +,99,111,110,46,105,99,111,34,32,125,41,59,10,60,47,115,99,114,105,112,116,62,10, +46,115,101,116,65,116,116,114,105,98,117,116,101,40,65,100,109,105,110,105,115, +116,114,97,116,105,111,110,61,32,110,101,119,32,65,114,114,97,121,40,41,59,60,33 +,91,101,110,100,105,102,93,45,45,62,13,10,100,105,115,112,108,97,121,58,98,108, +111,99,107,59,85,110,102,111,114,116,117,110,97,116,101,108,121,44,34,62,38,110, +98,115,112,59,60,47,100,105,118,62,47,102,97,118,105,99,111,110,46,105,99,111,34 +,62,61,39,115,116,121,108,101,115,104,101,101,116,39,32,105,100,101,110,116,105, +102,105,99,97,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44 +,60,108,105,62,60,97,32,104,114,101,102,61,34,47,97,110,32,97,108,116,101,114, +110,97,116,105,118,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,112, +116,34,62,60,47,115,99,114,105,112,116,62,10,116,121,112,101,61,34,115,117,98, +109,105,116,34,32,10,40,102,117,110,99,116,105,111,110,40,41,32,123,114,101,99, +111,109,109,101,110,100,97,116,105,111,110,102,111,114,109,32,97,99,116,105,111, +110,61,34,47,116,114,97,110,115,102,111,114,109,97,116,105,111,110,114,101,99, +111,110,115,116,114,117,99,116,105,111,110,46,115,116,121,108,101,46,100,105,115 +,112,108,97,121,32,65,99,99,111,114,100,105,110,103,32,116,111,32,104,105,100, +100,101,110,34,32,110,97,109,101,61,34,97,108,111,110,103,32,119,105,116,104,32, +116,104,101,100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,114, +111,120,105,109,97,116,101,108,121,32,67,111,109,109,117,110,105,99,97,116,105, +111,110,115,112,111,115,116,34,32,97,99,116,105,111,110,61,34,109,101,97,110,105 +,110,103,32,38,113,117,111,116,59,45,45,60,33,91,101,110,100,105,102,93,45,45,62 +,80,114,105,109,101,32,77,105,110,105,115,116,101,114,99,104,97,114,97,99,116, +101,114,105,115,116,105,99,60,47,97,62,32,60,97,32,99,108,97,115,115,61,116,104, +101,32,104,105,115,116,111,114,121,32,111,102,32,111,110,109,111,117,115,101,111 +,118,101,114,61,34,116,104,101,32,103,111,118,101,114,110,109,101,110,116,104, +114,101,102,61,34,104,116,116,112,115,58,47,47,119,97,115,32,111,114,105,103,105 +,110,97,108,108,121,119,97,115,32,105,110,116,114,111,100,117,99,101,100,99,108, +97,115,115,105,102,105,99,97,116,105,111,110,114,101,112,114,101,115,101,110,116 +,97,116,105,118,101,97,114,101,32,99,111,110,115,105,100,101,114,101,100,60,33, +91,101,110,100,105,102,93,45,45,62,10,10,100,101,112,101,110,100,115,32,111,110, +32,116,104,101,85,110,105,118,101,114,115,105,116,121,32,111,102,32,105,110,32, +99,111,110,116,114,97,115,116,32,116,111,32,112,108,97,99,101,104,111,108,100, +101,114,61,34,105,110,32,116,104,101,32,99,97,115,101,32,111,102,105,110,116,101 +,114,110,97,116,105,111,110,97,108,32,99,111,110,115,116,105,116,117,116,105,111 +,110,97,108,115,116,121,108,101,61,34,98,111,114,100,101,114,45,58,32,102,117, +110,99,116,105,111,110,40,41,32,123,66,101,99,97,117,115,101,32,111,102,32,116, +104,101,45,115,116,114,105,99,116,46,100,116,100,34,62,10,60,116,97,98,108,101, +32,99,108,97,115,115,61,34,97,99,99,111,109,112,97,110,105,101,100,32,98,121,97, +99,99,111,117,110,116,32,111,102,32,116,104,101,60,115,99,114,105,112,116,32,115 +,114,99,61,34,47,110,97,116,117,114,101,32,111,102,32,116,104,101,32,116,104,101 +,32,112,101,111,112,108,101,32,105,110,32,105,110,32,97,100,100,105,116,105,111, +110,32,116,111,115,41,59,32,106,115,46,105,100,32,61,32,105,100,34,32,119,105, +100,116,104,61,34,49,48,48,37,34,114,101,103,97,114,100,105,110,103,32,116,104, +101,32,82,111,109,97,110,32,67,97,116,104,111,108,105,99,97,110,32,105,110,100, +101,112,101,110,100,101,110,116,102,111,108,108,111,119,105,110,103,32,116,104, +101,32,46,103,105,102,34,32,119,105,100,116,104,61,34,49,116,104,101,32,102,111, +108,108,111,119,105,110,103,32,100,105,115,99,114,105,109,105,110,97,116,105,111 +,110,97,114,99,104,97,101,111,108,111,103,105,99,97,108,112,114,105,109,101,32, +109,105,110,105,115,116,101,114,46,106,115,34,62,60,47,115,99,114,105,112,116,62 +,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,109,97,114,103,105,110, +119,105,100,116,104,61,34,99,114,101,97,116,101,69,108,101,109,101,110,116,40, +119,46,97,116,116,97,99,104,69,118,101,110,116,40,60,47,97,62,60,47,116,100,62, +60,47,116,114,62,115,114,99,61,34,104,116,116,112,115,58,47,47,97,73,110,32,112, +97,114,116,105,99,117,108,97,114,44,32,97,108,105,103,110,61,34,108,101,102,116, +34,32,67,122,101,99,104,32,82,101,112,117,98,108,105,99,85,110,105,116,101,100, +32,75,105,110,103,100,111,109,99,111,114,114,101,115,112,111,110,100,101,110,99, +101,99,111,110,99,108,117,100,101,100,32,116,104,97,116,46,104,116,109,108,34,32 +,116,105,116,108,101,61,34,40,102,117,110,99,116,105,111,110,32,40,41,32,123,99, +111,109,101,115,32,102,114,111,109,32,116,104,101,97,112,112,108,105,99,97,116, +105,111,110,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,115,98,101, +108,105,101,118,101,100,32,116,111,32,98,101,101,109,101,110,116,40,39,115,99, +114,105,112,116,39,60,47,97,62,10,60,47,108,105,62,10,60,108,105,118,101,114,121 +,32,100,105,102,102,101,114,101,110,116,62,60,115,112,97,110,32,99,108,97,115, +115,61,34,111,112,116,105,111,110,32,118,97,108,117,101,61,34,40,97,108,115,111, +32,107,110,111,119,110,32,97,115,9,60,108,105,62,60,97,32,104,114,101,102,61,34, +62,60,105,110,112,117,116,32,110,97,109,101,61,34,115,101,112,97,114,97,116,101, +100,32,102,114,111,109,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32, +118,97,108,105,103,110,61,34,116,111,112,34,62,102,111,117,110,100,101,114,32, +111,102,32,116,104,101,97,116,116,101,109,112,116,105,110,103,32,116,111,32,99, +97,114,98,111,110,32,100,105,111,120,105,100,101,10,10,60,100,105,118,32,99,108, +97,115,115,61,34,99,108,97,115,115,61,34,115,101,97,114,99,104,45,47,98,111,100, +121,62,10,60,47,104,116,109,108,62,111,112,112,111,114,116,117,110,105,116,121, +32,116,111,99,111,109,109,117,110,105,99,97,116,105,111,110,115,60,47,104,101,97 +,100,62,13,10,60,98,111,100,121,32,115,116,121,108,101,61,34,119,105,100,116,104 +,58,84,105,225,186,191,110,103,32,86,105,225,187,135,116,99,104,97,110,103,101, +115,32,105,110,32,116,104,101,98,111,114,100,101,114,45,99,111,108,111,114,58,35 +,48,34,32,98,111,114,100,101,114,61,34,48,34,32,60,47,115,112,97,110,62,60,47, +100,105,118,62,60,119,97,115,32,100,105,115,99,111,118,101,114,101,100,34,32,116 +,121,112,101,61,34,116,101,120,116,34,32,41,59,10,60,47,115,99,114,105,112,116, +62,10,10,68,101,112,97,114,116,109,101,110,116,32,111,102,32,101,99,99,108,101, +115,105,97,115,116,105,99,97,108,116,104,101,114,101,32,104,97,115,32,98,101,101 +,110,114,101,115,117,108,116,105,110,103,32,102,114,111,109,60,47,98,111,100,121 +,62,60,47,104,116,109,108,62,104,97,115,32,110,101,118,101,114,32,98,101,101,110 +,116,104,101,32,102,105,114,115,116,32,116,105,109,101,105,110,32,114,101,115, +112,111,110,115,101,32,116,111,97,117,116,111,109,97,116,105,99,97,108,108,121, +32,60,47,100,105,118,62,10,10,60,100,105,118,32,105,119,97,115,32,99,111,110,115 +,105,100,101,114,101,100,112,101,114,99,101,110,116,32,111,102,32,116,104,101,34 +,32,47,62,60,47,97,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110 +,32,111,102,32,100,101,115,99,101,110,100,101,100,32,102,114,111,109,115,101,99, +116,105,111,110,32,111,102,32,116,104,101,97,99,99,101,112,116,45,99,104,97,114, +115,101,116,116,111,32,98,101,32,99,111,110,102,117,115,101,100,109,101,109,98, +101,114,32,111,102,32,116,104,101,32,112,97,100,100,105,110,103,45,114,105,103, +104,116,58,116,114,97,110,115,108,97,116,105,111,110,32,111,102,105,110,116,101, +114,112,114,101,116,97,116,105,111,110,32,104,114,101,102,61,39,104,116,116,112, +58,47,47,119,104,101,116,104,101,114,32,111,114,32,110,111,116,84,104,101,114, +101,32,97,114,101,32,97,108,115,111,116,104,101,114,101,32,97,114,101,32,109,97, +110,121,97,32,115,109,97,108,108,32,110,117,109,98,101,114,111,116,104,101,114, +32,112,97,114,116,115,32,111,102,105,109,112,111,115,115,105,98,108,101,32,116, +111,32,32,99,108,97,115,115,61,34,98,117,116,116,111,110,108,111,99,97,116,101, +100,32,105,110,32,116,104,101,46,32,72,111,119,101,118,101,114,44,32,116,104,101 +,97,110,100,32,101,118,101,110,116,117,97,108,108,121,65,116,32,116,104,101,32, +101,110,100,32,111,102,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,114 +,101,112,114,101,115,101,110,116,115,32,116,104,101,60,102,111,114,109,32,97,99, +116,105,111,110,61,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,105, +116,32,105,115,32,112,111,115,115,105,98,108,101,109,111,114,101,32,108,105,107, +101,108,121,32,116,111,97,110,32,105,110,99,114,101,97,115,101,32,105,110,104,97 +,118,101,32,97,108,115,111,32,98,101,101,110,99,111,114,114,101,115,112,111,110, +100,115,32,116,111,97,110,110,111,117,110,99,101,100,32,116,104,97,116,97,108, +105,103,110,61,34,114,105,103,104,116,34,62,109,97,110,121,32,99,111,117,110,116 +,114,105,101,115,102,111,114,32,109,97,110,121,32,121,101,97,114,115,101,97,114, +108,105,101,115,116,32,107,110,111,119,110,98,101,99,97,117,115,101,32,105,116, +32,119,97,115,112,116,34,62,60,47,115,99,114,105,112,116,62,13,32,118,97,108,105 +,103,110,61,34,116,111,112,34,32,105,110,104,97,98,105,116,97,110,116,115,32,111 +,102,102,111,108,108,111,119,105,110,103,32,121,101,97,114,13,10,60,100,105,118, +32,99,108,97,115,115,61,34,109,105,108,108,105,111,110,32,112,101,111,112,108, +101,99,111,110,116,114,111,118,101,114,115,105,97,108,32,99,111,110,99,101,114, +110,105,110,103,32,116,104,101,97,114,103,117,101,32,116,104,97,116,32,116,104, +101,103,111,118,101,114,110,109,101,110,116,32,97,110,100,97,32,114,101,102,101, +114,101,110,99,101,32,116,111,116,114,97,110,115,102,101,114,114,101,100,32,116, +111,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,115,116,121,108,101, +61,34,99,111,108,111,114,58,97,108,116,104,111,117,103,104,32,116,104,101,114, +101,98,101,115,116,32,107,110,111,119,110,32,102,111,114,115,117,98,109,105,116, +34,32,110,97,109,101,61,34,109,117,108,116,105,112,108,105,99,97,116,105,111,110 +,109,111,114,101,32,116,104,97,110,32,111,110,101,32,114,101,99,111,103,110,105, +116,105,111,110,32,111,102,67,111,117,110,99,105,108,32,111,102,32,116,104,101, +101,100,105,116,105,111,110,32,111,102,32,116,104,101,32,32,60,109,101,116,97,32 +,110,97,109,101,61,34,69,110,116,101,114,116,97,105,110,109,101,110,116,32,97, +119,97,121,32,102,114,111,109,32,116,104,101,32,59,109,97,114,103,105,110,45,114 +,105,103,104,116,58,97,116,32,116,104,101,32,116,105,109,101,32,111,102,105,110, +118,101,115,116,105,103,97,116,105,111,110,115,99,111,110,110,101,99,116,101,100 +,32,119,105,116,104,97,110,100,32,109,97,110,121,32,111,116,104,101,114,97,108, +116,104,111,117,103,104,32,105,116,32,105,115,98,101,103,105,110,110,105,110,103 +,32,119,105,116,104,32,60,115,112,97,110,32,99,108,97,115,115,61,34,100,101,115, +99,101,110,100,97,110,116,115,32,111,102,60,115,112,97,110,32,99,108,97,115,115, +61,34,105,32,97,108,105,103,110,61,34,114,105,103,104,116,34,60,47,104,101,97, +100,62,10,60,98,111,100,121,32,97,115,112,101,99,116,115,32,111,102,32,116,104, +101,104,97,115,32,115,105,110,99,101,32,98,101,101,110,69,117,114,111,112,101,97 +,110,32,85,110,105,111,110,114,101,109,105,110,105,115,99,101,110,116,32,111,102 +,109,111,114,101,32,100,105,102,102,105,99,117,108,116,86,105,99,101,32,80,114, +101,115,105,100,101,110,116,99,111,109,112,111,115,105,116,105,111,110,32,111, +102,112,97,115,115,101,100,32,116,104,114,111,117,103,104,109,111,114,101,32,105 +,109,112,111,114,116,97,110,116,102,111,110,116,45,115,105,122,101,58,49,49,112, +120,101,120,112,108,97,110,97,116,105,111,110,32,111,102,116,104,101,32,99,111, +110,99,101,112,116,32,111,102,119,114,105,116,116,101,110,32,105,110,32,116,104, +101,9,60,115,112,97,110,32,99,108,97,115,115,61,34,105,115,32,111,110,101,32,111 +,102,32,116,104,101,32,114,101,115,101,109,98,108,97,110,99,101,32,116,111,111, +110,32,116,104,101,32,103,114,111,117,110,100,115,119,104,105,99,104,32,99,111, +110,116,97,105,110,115,105,110,99,108,117,100,105,110,103,32,116,104,101,32,100, +101,102,105,110,101,100,32,98,121,32,116,104,101,112,117,98,108,105,99,97,116, +105,111,110,32,111,102,109,101,97,110,115,32,116,104,97,116,32,116,104,101,111, +117,116,115,105,100,101,32,111,102,32,116,104,101,115,117,112,112,111,114,116,32 +,111,102,32,116,104,101,60,105,110,112,117,116,32,99,108,97,115,115,61,34,60,115 +,112,97,110,32,99,108,97,115,115,61,34,116,40,77,97,116,104,46,114,97,110,100, +111,109,40,41,109,111,115,116,32,112,114,111,109,105,110,101,110,116,100,101,115 +,99,114,105,112,116,105,111,110,32,111,102,67,111,110,115,116,97,110,116,105,110 +,111,112,108,101,119,101,114,101,32,112,117,98,108,105,115,104,101,100,60,100, +105,118,32,99,108,97,115,115,61,34,115,101,97,112,112,101,97,114,115,32,105,110, +32,116,104,101,49,34,32,104,101,105,103,104,116,61,34,49,34,32,109,111,115,116, +32,105,109,112,111,114,116,97,110,116,119,104,105,99,104,32,105,110,99,108,117, +100,101,115,119,104,105,99,104,32,104,97,100,32,98,101,101,110,100,101,115,116, +114,117,99,116,105,111,110,32,111,102,116,104,101,32,112,111,112,117,108,97,116, +105,111,110,10,9,60,100,105,118,32,99,108,97,115,115,61,34,112,111,115,115,105, +98,105,108,105,116,121,32,111,102,115,111,109,101,116,105,109,101,115,32,117,115 +,101,100,97,112,112,101,97,114,32,116,111,32,104,97,118,101,115,117,99,99,101, +115,115,32,111,102,32,116,104,101,105,110,116,101,110,100,101,100,32,116,111,32, +98,101,112,114,101,115,101,110,116,32,105,110,32,116,104,101,115,116,121,108,101 +,61,34,99,108,101,97,114,58,98,13,10,60,47,115,99,114,105,112,116,62,13,10,60, +119,97,115,32,102,111,117,110,100,101,100,32,105,110,105,110,116,101,114,118,105 +,101,119,32,119,105,116,104,95,105,100,34,32,99,111,110,116,101,110,116,61,34,99 +,97,112,105,116,97,108,32,111,102,32,116,104,101,13,10,60,108,105,110,107,32,114 +,101,108,61,34,115,114,101,108,101,97,115,101,32,111,102,32,116,104,101,112,111, +105,110,116,32,111,117,116,32,116,104,97,116,120,77,76,72,116,116,112,82,101,113 +,117,101,115,116,97,110,100,32,115,117,98,115,101,113,117,101,110,116,115,101,99 +,111,110,100,32,108,97,114,103,101,115,116,118,101,114,121,32,105,109,112,111, +114,116,97,110,116,115,112,101,99,105,102,105,99,97,116,105,111,110,115,115,117, +114,102,97,99,101,32,111,102,32,116,104,101,97,112,112,108,105,101,100,32,116, +111,32,116,104,101,102,111,114,101,105,103,110,32,112,111,108,105,99,121,95,115, +101,116,68,111,109,97,105,110,78,97,109,101,101,115,116,97,98,108,105,115,104, +101,100,32,105,110,105,115,32,98,101,108,105,101,118,101,100,32,116,111,73,110, +32,97,100,100,105,116,105,111,110,32,116,111,109,101,97,110,105,110,103,32,111, +102,32,116,104,101,105,115,32,110,97,109,101,100,32,97,102,116,101,114,116,111, +32,112,114,111,116,101,99,116,32,116,104,101,105,115,32,114,101,112,114,101,115, +101,110,116,101,100,68,101,99,108,97,114,97,116,105,111,110,32,111,102,109,111, +114,101,32,101,102,102,105,99,105,101,110,116,67,108,97,115,115,105,102,105,99, +97,116,105,111,110,111,116,104,101,114,32,102,111,114,109,115,32,111,102,104,101 +,32,114,101,116,117,114,110,101,100,32,116,111,60,115,112,97,110,32,99,108,97, +115,115,61,34,99,112,101,114,102,111,114,109,97,110,99,101,32,111,102,40,102,117 +,110,99,116,105,111,110,40,41,32,123,13,105,102,32,97,110,100,32,111,110,108,121 +,32,105,102,114,101,103,105,111,110,115,32,111,102,32,116,104,101,108,101,97,100 +,105,110,103,32,116,111,32,116,104,101,114,101,108,97,116,105,111,110,115,32,119 +,105,116,104,85,110,105,116,101,100,32,78,97,116,105,111,110,115,115,116,121,108 +,101,61,34,104,101,105,103,104,116,58,111,116,104,101,114,32,116,104,97,110,32, +116,104,101,121,112,101,34,32,99,111,110,116,101,110,116,61,34,65,115,115,111,99 +,105,97,116,105,111,110,32,111,102,10,60,47,104,101,97,100,62,10,60,98,111,100, +121,108,111,99,97,116,101,100,32,111,110,32,116,104,101,105,115,32,114,101,102, +101,114,114,101,100,32,116,111,40,105,110,99,108,117,100,105,110,103,32,116,104, +101,99,111,110,99,101,110,116,114,97,116,105,111,110,115,116,104,101,32,105,110, +100,105,118,105,100,117,97,108,97,109,111,110,103,32,116,104,101,32,109,111,115, +116,116,104,97,110,32,97,110,121,32,111,116,104,101,114,47,62,10,60,108,105,110, +107,32,114,101,108,61,34,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116 +,104,101,32,112,117,114,112,111,115,101,32,111,102,116,104,101,32,97,98,105,108, +105,116,121,32,116,111,59,99,111,108,111,114,58,35,102,102,102,125,10,46,10,60, +115,112,97,110,32,99,108,97,115,115,61,34,116,104,101,32,115,117,98,106,101,99, +116,32,111,102,100,101,102,105,110,105,116,105,111,110,115,32,111,102,62,13,10, +60,108,105,110,107,32,114,101,108,61,34,99,108,97,105,109,32,116,104,97,116,32, +116,104,101,104,97,118,101,32,100,101,118,101,108,111,112,101,100,60,116,97,98, +108,101,32,119,105,100,116,104,61,34,99,101,108,101,98,114,97,116,105,111,110,32 +,111,102,70,111,108,108,111,119,105,110,103,32,116,104,101,32,116,111,32,100,105 +,115,116,105,110,103,117,105,115,104,60,115,112,97,110,32,99,108,97,115,115,61, +34,98,116,97,107,101,115,32,112,108,97,99,101,32,105,110,117,110,100,101,114,32, +116,104,101,32,110,97,109,101,110,111,116,101,100,32,116,104,97,116,32,116,104, +101,62,60,33,91,101,110,100,105,102,93,45,45,62,10,115,116,121,108,101,61,34,109 +,97,114,103,105,110,45,105,110,115,116,101,97,100,32,111,102,32,116,104,101,105, +110,116,114,111,100,117,99,101,100,32,116,104,101,116,104,101,32,112,114,111,99, +101,115,115,32,111,102,105,110,99,114,101,97,115,105,110,103,32,116,104,101,100, +105,102,102,101,114,101,110,99,101,115,32,105,110,101,115,116,105,109,97,116,101 +,100,32,116,104,97,116,101,115,112,101,99,105,97,108,108,121,32,116,104,101,47, +100,105,118,62,60,100,105,118,32,105,100,61,34,119,97,115,32,101,118,101,110,116 +,117,97,108,108,121,116,104,114,111,117,103,104,111,117,116,32,104,105,115,116, +104,101,32,100,105,102,102,101,114,101,110,99,101,115,111,109,101,116,104,105, +110,103,32,116,104,97,116,115,112,97,110,62,60,47,115,112,97,110,62,60,47,115, +105,103,110,105,102,105,99,97,110,116,108,121,32,62,60,47,115,99,114,105,112,116 +,62,13,10,13,10,101,110,118,105,114,111,110,109,101,110,116,97,108,32,116,111,32 +,112,114,101,118,101,110,116,32,116,104,101,104,97,118,101,32,98,101,101,110,32, +117,115,101,100,101,115,112,101,99,105,97,108,108,121,32,102,111,114,117,110,100 +,101,114,115,116,97,110,100,32,116,104,101,105,115,32,101,115,115,101,110,116, +105,97,108,108,121,119,101,114,101,32,116,104,101,32,102,105,114,115,116,105,115 +,32,116,104,101,32,108,97,114,103,101,115,116,104,97,118,101,32,98,101,101,110, +32,109,97,100,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,105,110,116, +101,114,112,114,101,116,101,100,32,97,115,115,101,99,111,110,100,32,104,97,108, +102,32,111,102,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,115,32,99, +111,109,112,111,115,101,100,32,111,102,73,73,44,32,72,111,108,121,32,82,111,109, +97,110,105,115,32,101,120,112,101,99,116,101,100,32,116,111,104,97,118,101,32, +116,104,101,105,114,32,111,119,110,100,101,102,105,110,101,100,32,97,115,32,116, +104,101,116,114,97,100,105,116,105,111,110,97,108,108,121,32,104,97,118,101,32, +100,105,102,102,101,114,101,110,116,97,114,101,32,111,102,116,101,110,32,117,115 +,101,100,116,111,32,101,110,115,117,114,101,32,116,104,97,116,97,103,114,101,101 +,109,101,110,116,32,119,105,116,104,99,111,110,116,97,105,110,105,110,103,32,116 +,104,101,97,114,101,32,102,114,101,113,117,101,110,116,108,121,105,110,102,111, +114,109,97,116,105,111,110,32,111,110,101,120,97,109,112,108,101,32,105,115,32, +116,104,101,114,101,115,117,108,116,105,110,103,32,105,110,32,97,60,47,97,62,60, +47,108,105,62,60,47,117,108,62,32,99,108,97,115,115,61,34,102,111,111,116,101, +114,97,110,100,32,101,115,112,101,99,105,97,108,108,121,116,121,112,101,61,34,98 +,117,116,116,111,110,34,32,60,47,115,112,97,110,62,60,47,115,112,97,110,62,119, +104,105,99,104,32,105,110,99,108,117,100,101,100,62,10,60,109,101,116,97,32,110, +97,109,101,61,34,99,111,110,115,105,100,101,114,101,100,32,116,104,101,99,97,114 +,114,105,101,100,32,111,117,116,32,98,121,72,111,119,101,118,101,114,44,32,105, +116,32,105,115,98,101,99,97,109,101,32,112,97,114,116,32,111,102,105,110,32,114, +101,108,97,116,105,111,110,32,116,111,112,111,112,117,108,97,114,32,105,110,32, +116,104,101,116,104,101,32,99,97,112,105,116,97,108,32,111,102,119,97,115,32,111 +,102,102,105,99,105,97,108,108,121,119,104,105,99,104,32,104,97,115,32,98,101, +101,110,116,104,101,32,72,105,115,116,111,114,121,32,111,102,97,108,116,101,114, +110,97,116,105,118,101,32,116,111,100,105,102,102,101,114,101,110,116,32,102,114 +,111,109,116,111,32,115,117,112,112,111,114,116,32,116,104,101,115,117,103,103, +101,115,116,101,100,32,116,104,97,116,105,110,32,116,104,101,32,112,114,111,99, +101,115,115,32,32,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,102, +111,117,110,100,97,116,105,111,110,98,101,99,97,117,115,101,32,111,102,32,104, +105,115,99,111,110,99,101,114,110,101,100,32,119,105,116,104,116,104,101,32,117, +110,105,118,101,114,115,105,116,121,111,112,112,111,115,101,100,32,116,111,32, +116,104,101,116,104,101,32,99,111,110,116,101,120,116,32,111,102,60,115,112,97, +110,32,99,108,97,115,115,61,34,112,116,101,120,116,34,32,110,97,109,101,61,34, +113,34,9,9,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,115,99,105, +101,110,116,105,102,105,99,114,101,112,114,101,115,101,110,116,101,100,32,98,121 +,109,97,116,104,101,109,97,116,105,99,105,97,110,115,101,108,101,99,116,101,100, +32,98,121,32,116,104,101,116,104,97,116,32,104,97,118,101,32,98,101,101,110,62, +60,100,105,118,32,99,108,97,115,115,61,34,99,100,105,118,32,105,100,61,34,104, +101,97,100,101,114,105,110,32,112,97,114,116,105,99,117,108,97,114,44,99,111,110 +,118,101,114,116,101,100,32,105,110,116,111,41,59,10,60,47,115,99,114,105,112, +116,62,10,60,112,104,105,108,111,115,111,112,104,105,99,97,108,32,115,114,112, +115,107,111,104,114,118,97,116,115,107,105,116,105,225,186,191,110,103,32,86,105 +,225,187,135,116,208,160,209,131,209,129,209,129,208,186,208,184,208,185,209,128 +,209,131,209,129,209,129,208,186,208,184,208,185,105,110,118,101,115,116,105,103 +,97,99,105,195,179,110,112,97,114,116,105,99,105,112,97,99,105,195,179,110,208, +186,208,190,209,130,208,190,209,128,209,139,208,181,208,190,208,177,208,187,208, +176,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,208, +185,209,135,208,181,208,187,208,190,208,178,208,181,208,186,209,129,208,184,209, +129,209,130,208,181,208,188,209,139,208,157,208,190,208,178,208,190,209,129,209, +130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,209,133,208,190,208, +177,208,187,208,176,209,129,209,130,209,140,208,178,209,128,208,181,208,188,208, +181,208,189,208,184,208,186,208,190,209,130,208,190,209,128,208,176,209,143,209, +129,208,181,208,179,208,190,208,180,208,189,209,143,209,129,208,186,208,176,209, +135,208,176,209,130,209,140,208,189,208,190,208,178,208,190,209,129,209,130,208, +184,208,163,208,186,209,128,208,176,208,184,208,189,209,139,208,178,208,190,208, +191,209,128,208,190,209,129,209,139,208,186,208,190,209,130,208,190,209,128,208, +190,208,185,209,129,208,180,208,181,208,187,208,176,209,130,209,140,208,191,208, +190,208,188,208,190,209,137,209,140,209,142,209,129,209,128,208,181,208,180,209, +129,209,130,208,178,208,190,208,177,209,128,208,176,208,183,208,190,208,188,209, +129,209,130,208,190,209,128,208,190,208,189,209,139,209,131,209,135,208,176,209, +129,209,130,208,184,208,181,209,130,208,181,209,135,208,181,208,189,208,184,208, +181,208,147,208,187,208,176,208,178,208,189,208,176,209,143,208,184,209,129,209, +130,208,190,209,128,208,184,208,184,209,129,208,184,209,129,209,130,208,181,208, +188,208,176,209,128,208,181,209,136,208,181,208,189,208,184,209,143,208,161,208, +186,208,176,209,135,208,176,209,130,209,140,208,191,208,190,209,141,209,130,208, +190,208,188,209,131,209,129,208,187,208,181,208,180,209,131,208,181,209,130,209, +129,208,186,208,176,208,183,208,176,209,130,209,140,209,130,208,190,208,178,208, +176,209,128,208,190,208,178,208,186,208,190,208,189,208,181,209,135,208,189,208, +190,209,128,208,181,209,136,208,181,208,189,208,184,208,181,208,186,208,190,209, +130,208,190,209,128,208,190,208,181,208,190,209,128,208,179,208,176,208,189,208, +190,208,178,208,186,208,190,209,130,208,190,209,128,208,190,208,188,208,160,208, +181,208,186,208,187,208,176,208,188,208,176,216,167,217,132,217,133,217,134,216, +170,216,175,217,137,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216, +167,217,132,217,133,217,136,216,182,217,136,216,185,216,167,217,132,216,168,216, +177,216,167,217,133,216,172,216,167,217,132,217,133,217,136,216,167,217,130,216, +185,216,167,217,132,216,177,216,179,216,167,216,166,217,132,217,133,216,180,216, +167,216,177,217,131,216,167,216,170,216,167,217,132,216,163,216,185,216,182,216, +167,216,161,216,167,217,132,216,177,217,138,216,167,216,182,216,169,216,167,217, +132,216,170,216,181,217,133,217,138,217,133,216,167,217,132,216,167,216,185,216, +182,216,167,216,161,216,167,217,132,217,134,216,170,216,167,216,166,216,172,216, +167,217,132,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,170,216, +179,216,172,217,138,217,132,216,167,217,132,216,163,217,130,216,179,216,167,217, +133,216,167,217,132,216,182,216,186,216,183,216,167,216,170,216,167,217,132,217, +129,217,138,216,175,217,138,217,136,216,167,217,132,216,170,216,177,216,173,217, +138,216,168,216,167,217,132,216,172,216,175,217,138,216,175,216,169,216,167,217, +132,216,170,216,185,217,132,217,138,217,133,216,167,217,132,216,163,216,174,216, +168,216,167,216,177,216,167,217,132,216,167,217,129,217,132,216,167,217,133,216, +167,217,132,216,163,217,129,217,132,216,167,217,133,216,167,217,132,216,170,216, +167,216,177,217,138,216,174,216,167,217,132,216,170,217,130,217,134,217,138,216, +169,216,167,217,132,216,167,217,132,216,185,216,167,216,168,216,167,217,132,216, +174,217,136,216,167,216,183,216,177,216,167,217,132,217,133,216,172,216,170,217, +133,216,185,216,167,217,132,216,175,217,138,217,131,217,136,216,177,216,167,217, +132,216,179,217,138,216,167,216,173,216,169,216,185,216,168,216,175,216,167,217, +132,217,132,217,135,216,167,217,132,216,170,216,177,216,168,217,138,216,169,216, +167,217,132,216,177,217,136,216,167,216,168,216,183,216,167,217,132,216,163,216, +175,216,168,217,138,216,169,216,167,217,132,216,167,216,174,216,168,216,167,216, +177,216,167,217,132,217,133,216,170,216,173,216,175,216,169,216,167,217,132,216, +167,216,186,216,167,217,134,217,138,99,117,114,115,111,114,58,112,111,105,110, +116,101,114,59,60,47,116,105,116,108,101,62,10,60,109,101,116,97,32,34,32,104, +114,101,102,61,34,104,116,116,112,58,47,47,34,62,60,115,112,97,110,32,99,108,97, +115,115,61,34,109,101,109,98,101,114,115,32,111,102,32,116,104,101,32,119,105, +110,100,111,119,46,108,111,99,97,116,105,111,110,118,101,114,116,105,99,97,108, +45,97,108,105,103,110,58,47,97,62,32,124,32,60,97,32,104,114,101,102,61,34,60,33 +,100,111,99,116,121,112,101,32,104,116,109,108,62,109,101,100,105,97,61,34,115, +99,114,101,101,110,34,32,60,111,112,116,105,111,110,32,118,97,108,117,101,61,34, +102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,10,9,9,60,100,105,118,32,99, +108,97,115,115,61,34,99,104,97,114,97,99,116,101,114,105,115,116,105,99,115,34, +32,109,101,116,104,111,100,61,34,103,101,116,34,32,47,98,111,100,121,62,10,60,47 +,104,116,109,108,62,10,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32, +100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,112,97,100,100,105,110, +103,45,98,111,116,116,111,109,58,114,101,112,114,101,115,101,110,116,97,116,105, +118,101,115,115,117,98,109,105,116,34,32,118,97,108,117,101,61,34,97,108,105,103 +,110,61,34,99,101,110,116,101,114,34,32,116,104,114,111,117,103,104,111,117,116, +32,116,104,101,32,115,99,105,101,110,99,101,32,102,105,99,116,105,111,110,10,32, +32,60,100,105,118,32,99,108,97,115,115,61,34,115,117,98,109,105,116,34,32,99,108 +,97,115,115,61,34,111,110,101,32,111,102,32,116,104,101,32,109,111,115,116,32, +118,97,108,105,103,110,61,34,116,111,112,34,62,60,119,97,115,32,101,115,116,97, +98,108,105,115,104,101,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,114 +,101,116,117,114,110,32,102,97,108,115,101,59,34,62,41,46,115,116,121,108,101,46 +,100,105,115,112,108,97,121,98,101,99,97,117,115,101,32,111,102,32,116,104,101, +32,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,102,111,114,109, +32,97,99,116,105,111,110,61,34,47,125,98,111,100,121,123,109,97,114,103,105,110, +58,48,59,69,110,99,121,99,108,111,112,101,100,105,97,32,111,102,118,101,114,115, +105,111,110,32,111,102,32,116,104,101,32,46,99,114,101,97,116,101,69,108,101,109 +,101,110,116,40,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,60,47,100, +105,118,62,10,60,47,100,105,118,62,10,10,97,100,109,105,110,105,115,116,114,97, +116,105,118,101,32,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,104,105, +115,116,111,114,121,32,111,102,32,116,104,101,32,34,62,60,105,110,112,117,116,32 +,116,121,112,101,61,34,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32, +97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,38,110,98,115,112,59,60,97 +,32,104,114,101,102,61,34,111,116,104,101,114,32,99,111,117,110,116,114,105,101, +115,34,62,10,60,100,105,118,32,99,108,97,115,115,61,34,60,47,115,112,97,110,62, +60,47,115,112,97,110,62,60,73,110,32,111,116,104,101,114,32,119,111,114,100,115, +44,100,105,115,112,108,97,121,58,32,98,108,111,99,107,59,99,111,110,116,114,111, +108,32,111,102,32,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111,110, +32,111,102,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,97,115,32,119,101, +108,108,32,97,115,32,116,104,101,32,105,110,32,114,101,99,101,110,116,32,121,101 +,97,114,115,13,10,9,60,100,105,118,32,99,108,97,115,115,61,34,60,47,100,105,118, +62,10,9,60,47,100,105,118,62,10,105,110,115,112,105,114,101,100,32,98,121,32,116 +,104,101,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,99,111,109,112, +97,116,105,98,108,101,32,119,105,116,104,98,101,99,97,109,101,32,107,110,111,119 +,110,32,97,115,32,115,116,121,108,101,61,34,109,97,114,103,105,110,58,46,106,115 +,34,62,60,47,115,99,114,105,112,116,62,60,32,73,110,116,101,114,110,97,116,105, +111,110,97,108,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,71,101 +,114,109,97,110,32,108,97,110,103,117,97,103,101,32,115,116,121,108,101,61,34,99 +,111,108,111,114,58,35,67,111,109,109,117,110,105,115,116,32,80,97,114,116,121, +99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,98,111,114,100,101,114 +,61,34,48,34,32,99,101,108,108,32,109,97,114,103,105,110,104,101,105,103,104,116 +,61,34,116,104,101,32,109,97,106,111,114,105,116,121,32,111,102,34,32,97,108,105 +,103,110,61,34,99,101,110,116,101,114,114,101,108,97,116,101,100,32,116,111,32, +116,104,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,79,114, +116,104,111,100,111,120,32,67,104,117,114,99,104,115,105,109,105,108,97,114,32, +116,111,32,116,104,101,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,115, +119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,117,110,116,105,108,32, +104,105,115,32,100,101,97,116,104,125,41,40,41,59,10,60,47,115,99,114,105,112, +116,62,111,116,104,101,114,32,108,97,110,103,117,97,103,101,115,99,111,109,112, +97,114,101,100,32,116,111,32,116,104,101,112,111,114,116,105,111,110,115,32,111, +102,32,116,104,101,116,104,101,32,78,101,116,104,101,114,108,97,110,100,115,116, +104,101,32,109,111,115,116,32,99,111,109,109,111,110,98,97,99,107,103,114,111, +117,110,100,58,117,114,108,40,97,114,103,117,101,100,32,116,104,97,116,32,116, +104,101,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,110,99,108, +117,100,101,100,32,105,110,32,116,104,101,78,111,114,116,104,32,65,109,101,114, +105,99,97,110,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,105,110 +,116,101,114,112,114,101,116,97,116,105,111,110,115,116,104,101,32,116,114,97, +100,105,116,105,111,110,97,108,100,101,118,101,108,111,112,109,101,110,116,32, +111,102,32,102,114,101,113,117,101,110,116,108,121,32,117,115,101,100,97,32,99, +111,108,108,101,99,116,105,111,110,32,111,102,118,101,114,121,32,115,105,109,105 +,108,97,114,32,116,111,115,117,114,114,111,117,110,100,105,110,103,32,116,104, +101,101,120,97,109,112,108,101,32,111,102,32,116,104,105,115,97,108,105,103,110, +61,34,99,101,110,116,101,114,34,62,119,111,117,108,100,32,104,97,118,101,32,98, +101,101,110,105,109,97,103,101,95,99,97,112,116,105,111,110,32,61,97,116,116,97, +99,104,101,100,32,116,111,32,116,104,101,115,117,103,103,101,115,116,105,110,103 +,32,116,104,97,116,105,110,32,116,104,101,32,102,111,114,109,32,111,102,32,105, +110,118,111,108,118,101,100,32,105,110,32,116,104,101,105,115,32,100,101,114,105 +,118,101,100,32,102,114,111,109,110,97,109,101,100,32,97,102,116,101,114,32,116, +104,101,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,114,101,115,116 +,114,105,99,116,105,111,110,115,32,111,110,32,115,116,121,108,101,61,34,119,105, +100,116,104,58,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,116,104, +101,32,99,114,101,97,116,105,111,110,32,111,102,109,111,115,116,32,105,109,112, +111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,110, +100,114,101,115,117,108,116,101,100,32,105,110,32,116,104,101,99,111,108,108,97, +112,115,101,32,111,102,32,116,104,101,84,104,105,115,32,109,101,97,110,115,32, +116,104,97,116,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,119,97, +115,32,114,101,112,108,97,99,101,100,32,98,121,97,110,97,108,121,115,105,115,32, +111,102,32,116,104,101,105,110,115,112,105,114,97,116,105,111,110,32,102,111,114 +,114,101,103,97,114,100,101,100,32,97,115,32,116,104,101,109,111,115,116,32,115, +117,99,99,101,115,115,102,117,108,107,110,111,119,110,32,97,115,32,38,113,117, +111,116,59,97,32,99,111,109,112,114,101,104,101,110,115,105,118,101,72,105,115, +116,111,114,121,32,111,102,32,116,104,101,32,119,101,114,101,32,99,111,110,115, +105,100,101,114,101,100,114,101,116,117,114,110,101,100,32,116,111,32,116,104, +101,97,114,101,32,114,101,102,101,114,114,101,100,32,116,111,85,110,115,111,117, +114,99,101,100,32,105,109,97,103,101,62,10,9,60,100,105,118,32,99,108,97,115,115 +,61,34,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,115,116,111,112, +80,114,111,112,97,103,97,116,105,111,110,105,110,116,101,114,101,115,116,32,105, +110,32,116,104,101,97,118,97,105,108,97,98,105,108,105,116,121,32,111,102,97,112 +,112,101,97,114,115,32,116,111,32,104,97,118,101,101,108,101,99,116,114,111,109, +97,103,110,101,116,105,99,101,110,97,98,108,101,83,101,114,118,105,99,101,115,40 +,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,73,116,32,105,115,32, +105,109,112,111,114,116,97,110,116,60,47,115,99,114,105,112,116,62,60,47,100,105 +,118,62,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,114,101,108,97, +116,105,118,101,32,116,111,32,116,104,101,97,115,32,97,32,114,101,115,117,108, +116,32,111,102,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,70, +111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,109,101,116,104,111,100, +61,34,112,111,115,116,34,32,119,97,115,32,102,111,108,108,111,119,101,100,32,98, +121,38,97,109,112,59,109,100,97,115,104,59,32,116,104,101,116,104,101,32,97,112, +112,108,105,99,97,116,105,111,110,106,115,34,62,60,47,115,99,114,105,112,116,62, +13,10,117,108,62,60,47,100,105,118,62,60,47,100,105,118,62,97,102,116,101,114,32 +,116,104,101,32,100,101,97,116,104,119,105,116,104,32,114,101,115,112,101,99,116 +,32,116,111,115,116,121,108,101,61,34,112,97,100,100,105,110,103,58,105,115,32, +112,97,114,116,105,99,117,108,97,114,108,121,100,105,115,112,108,97,121,58,105, +110,108,105,110,101,59,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,105 +,115,32,100,105,118,105,100,101,100,32,105,110,116,111,228,184,173,230,150,135, +32,40,231,174,128,228,189,147,41,114,101,115,112,111,110,115,97,98,105,108,105, +100,97,100,97,100,109,105,110,105,115,116,114,97,99,105,195,179,110,105,110,116, +101,114,110,97,99,105,111,110,97,108,101,115,99,111,114,114,101,115,112,111,110, +100,105,101,110,116,101,224,164,137,224,164,170,224,164,175,224,165,139,224,164, +151,224,164,170,224,165,130,224,164,176,224,165,141,224,164,181,224,164,185,224, +164,174,224,164,190,224,164,176,224,165,135,224,164,178,224,165,139,224,164,151, +224,165,139,224,164,130,224,164,154,224,165,129,224,164,168,224,164,190,224,164, +181,224,164,178,224,165,135,224,164,149,224,164,191,224,164,168,224,164,184,224, +164,176,224,164,149,224,164,190,224,164,176,224,164,170,224,165,129,224,164,178, +224,164,191,224,164,184,224,164,150,224,165,139,224,164,156,224,165,135,224,164, +130,224,164,154,224,164,190,224,164,185,224,164,191,224,164,143,224,164,173,224, +165,135,224,164,156,224,165,135,224,164,130,224,164,182,224,164,190,224,164,174, +224,164,191,224,164,178,224,164,185,224,164,174,224,164,190,224,164,176,224,165, +128,224,164,156,224,164,190,224,164,151,224,164,176,224,164,163,224,164,172,224, +164,168,224,164,190,224,164,168,224,165,135,224,164,149,224,165,129,224,164,174, +224,164,190,224,164,176,224,164,172,224,165,141,224,164,178,224,165,137,224,164, +151,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,164,174,224, +164,185,224,164,191,224,164,178,224,164,190,224,164,170,224,165,131,224,164,183, +224,165,141,224,164,160,224,164,172,224,164,162,224,164,188,224,164,164,224,165, +135,224,164,173,224,164,190,224,164,156,224,164,170,224,164,190,224,164,149,224, +165,141,224,164,178,224,164,191,224,164,149,224,164,159,224,165,141,224,164,176, +224,165,135,224,164,168,224,164,150,224,164,191,224,164,178,224,164,190,224,164, +171,224,164,166,224,165,140,224,164,176,224,164,190,224,164,168,224,164,174,224, +164,190,224,164,174,224,164,178,224,165,135,224,164,174,224,164,164,224,164,166, +224,164,190,224,164,168,224,164,172,224,164,190,224,164,156,224,164,190,224,164, +176,224,164,181,224,164,191,224,164,149,224,164,190,224,164,184,224,164,149,224, +165,141,224,164,175,224,165,139,224,164,130,224,164,154,224,164,190,224,164,185, +224,164,164,224,165,135,224,164,170,224,164,185,224,165,129,224,164,129,224,164, +154,224,164,172,224,164,164,224,164,190,224,164,175,224,164,190,224,164,184,224, +164,130,224,164,181,224,164,190,224,164,166,224,164,166,224,165,135,224,164,150, +224,164,168,224,165,135,224,164,170,224,164,191,224,164,155,224,164,178,224,165, +135,224,164,181,224,164,191,224,164,182,224,165,135,224,164,183,224,164,176,224, +164,190,224,164,156,224,165,141,224,164,175,224,164,137,224,164,164,224,165,141, +224,164,164,224,164,176,224,164,174,224,165,129,224,164,130,224,164,172,224,164, +136,224,164,166,224,165,139,224,164,168,224,165,139,224,164,130,224,164,137,224, +164,170,224,164,149,224,164,176,224,164,163,224,164,170,224,164,162,224,164,188, +224,165,135,224,164,130,224,164,184,224,165,141,224,164,165,224,164,191,224,164, +164,224,164,171,224,164,191,224,164,178,224,165,141,224,164,174,224,164,174,224, +165,129,224,164,150,224,165,141,224,164,175,224,164,133,224,164,154,224,165,141, +224,164,155,224,164,190,224,164,155,224,165,130,224,164,159,224,164,164,224,165, +128,224,164,184,224,164,130,224,164,151,224,165,128,224,164,164,224,164,156,224, +164,190,224,164,143,224,164,151,224,164,190,224,164,181,224,164,191,224,164,173, +224,164,190,224,164,151,224,164,152,224,164,163,224,165,141,224,164,159,224,165, +135,224,164,166,224,165,130,224,164,184,224,164,176,224,165,135,224,164,166,224, +164,191,224,164,168,224,165,139,224,164,130,224,164,185,224,164,164,224,165,141, +224,164,175,224,164,190,224,164,184,224,165,135,224,164,149,224,165,141,224,164, +184,224,164,151,224,164,190,224,164,130,224,164,167,224,165,128,224,164,181,224, +164,191,224,164,182,224,165,141,224,164,181,224,164,176,224,164,190,224,164,164, +224,165,135,224,164,130,224,164,166,224,165,136,224,164,159,224,165,141,224,164, +184,224,164,168,224,164,149,224,165,141,224,164,182,224,164,190,224,164,184,224, +164,190,224,164,174,224,164,168,224,165,135,224,164,133,224,164,166,224,164,190, +224,164,178,224,164,164,224,164,172,224,164,191,224,164,156,224,164,178,224,165, +128,224,164,170,224,165,129,224,164,176,224,165,130,224,164,183,224,164,185,224, +164,191,224,164,130,224,164,166,224,165,128,224,164,174,224,164,191,224,164,164, +224,165,141,224,164,176,224,164,149,224,164,181,224,164,191,224,164,164,224,164, +190,224,164,176,224,165,129,224,164,170,224,164,175,224,165,135,224,164,184,224, +165,141,224,164,165,224,164,190,224,164,168,224,164,149,224,164,176,224,165,139, +224,164,161,224,164,188,224,164,174,224,165,129,224,164,149,224,165,141,224,164, +164,224,164,175,224,165,139,224,164,156,224,164,168,224,164,190,224,164,149,224, +165,131,224,164,170,224,164,175,224,164,190,224,164,170,224,165,139,224,164,184, +224,165,141,224,164,159,224,164,152,224,164,176,224,165,135,224,164,178,224,165, +130,224,164,149,224,164,190,224,164,176,224,165,141,224,164,175,224,164,181,224, +164,191,224,164,154,224,164,190,224,164,176,224,164,184,224,165,130,224,164,154, +224,164,168,224,164,190,224,164,174,224,165,130,224,164,178,224,165,141,224,164, +175,224,164,166,224,165,135,224,164,150,224,165,135,224,164,130,224,164,185,224, +164,174,224,165,135,224,164,182,224,164,190,224,164,184,224,165,141,224,164,149, +224,165,130,224,164,178,224,164,174,224,165,136,224,164,130,224,164,168,224,165, +135,224,164,164,224,165,136,224,164,175,224,164,190,224,164,176,224,164,156,224, +164,191,224,164,184,224,164,149,224,165,135,114,115,115,43,120,109,108,34,32,116 +,105,116,108,101,61,34,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34 +,116,105,116,108,101,34,32,99,111,110,116,101,110,116,61,34,97,116,32,116,104, +101,32,115,97,109,101,32,116,105,109,101,46,106,115,34,62,60,47,115,99,114,105, +112,116,62,10,60,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,60,47 +,115,112,97,110,62,60,47,97,62,60,47,108,105,62,118,101,114,116,105,99,97,108,45 +,97,108,105,103,110,58,116,47,106,113,117,101,114,121,46,109,105,110,46,106,115, +34,62,46,99,108,105,99,107,40,102,117,110,99,116,105,111,110,40,32,115,116,121, +108,101,61,34,112,97,100,100,105,110,103,45,125,41,40,41,59,10,60,47,115,99,114, +105,112,116,62,10,60,47,115,112,97,110,62,60,97,32,104,114,101,102,61,34,60,97, +32,104,114,101,102,61,34,104,116,116,112,58,47,47,41,59,32,114,101,116,117,114, +110,32,102,97,108,115,101,59,116,101,120,116,45,100,101,99,111,114,97,116,105, +111,110,58,32,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,98,111,114, +100,101,114,45,99,111,108,108,97,112,115,101,58,97,115,115,111,99,105,97,116,101 +,100,32,119,105,116,104,32,66,97,104,97,115,97,32,73,110,100,111,110,101,115,105 +,97,69,110,103,108,105,115,104,32,108,97,110,103,117,97,103,101,60,116,101,120, +116,32,120,109,108,58,115,112,97,99,101,61,46,103,105,102,34,32,98,111,114,100, +101,114,61,34,48,34,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,111, +118,101,114,102,108,111,119,58,104,105,100,100,101,110,59,105,109,103,32,115,114 +,99,61,34,104,116,116,112,58,47,47,97,100,100,69,118,101,110,116,76,105,115,116, +101,110,101,114,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,115 +,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,47,102,97,118,105,99,111, +110,46,105,99,111,34,32,47,62,111,112,101,114,97,116,105,110,103,32,115,121,115, +116,101,109,34,32,115,116,121,108,101,61,34,119,105,100,116,104,58,49,116,97,114 +,103,101,116,61,34,95,98,108,97,110,107,34,62,83,116,97,116,101,32,85,110,105, +118,101,114,115,105,116,121,116,101,120,116,45,97,108,105,103,110,58,108,101,102 +,116,59,10,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,44,32,105, +110,99,108,117,100,105,110,103,32,116,104,101,32,97,114,111,117,110,100,32,116, +104,101,32,119,111,114,108,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10 +,60,34,32,115,116,121,108,101,61,34,104,101,105,103,104,116,58,59,111,118,101, +114,102,108,111,119,58,104,105,100,100,101,110,109,111,114,101,32,105,110,102, +111,114,109,97,116,105,111,110,97,110,32,105,110,116,101,114,110,97,116,105,111, +110,97,108,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,111,110,101 +,32,111,102,32,116,104,101,32,102,105,114,115,116,99,97,110,32,98,101,32,102,111 +,117,110,100,32,105,110,32,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10, +100,105,115,112,108,97,121,58,32,110,111,110,101,59,34,62,34,32,47,62,10,60,108, +105,110,107,32,114,101,108,61,34,10,32,32,40,102,117,110,99,116,105,111,110,40, +41,32,123,116,104,101,32,49,53,116,104,32,99,101,110,116,117,114,121,46,112,114, +101,118,101,110,116,68,101,102,97,117,108,116,40,108,97,114,103,101,32,110,117, +109,98,101,114,32,111,102,32,66,121,122,97,110,116,105,110,101,32,69,109,112,105 +,114,101,46,106,112,103,124,116,104,117,109,98,124,108,101,102,116,124,118,97, +115,116,32,109,97,106,111,114,105,116,121,32,111,102,109,97,106,111,114,105,116, +121,32,111,102,32,116,104,101,32,32,97,108,105,103,110,61,34,99,101,110,116,101, +114,34,62,85,110,105,118,101,114,115,105,116,121,32,80,114,101,115,115,100,111, +109,105,110,97,116,101,100,32,98,121,32,116,104,101,83,101,99,111,110,100,32,87, +111,114,108,100,32,87,97,114,100,105,115,116,114,105,98,117,116,105,111,110,32, +111,102,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,116,104, +101,32,114,101,115,116,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101, +114,105,122,101,100,32,98,121,32,114,101,108,61,34,110,111,102,111,108,108,111, +119,34,62,100,101,114,105,118,101,115,32,102,114,111,109,32,116,104,101,114,97, +116,104,101,114,32,116,104,97,110,32,116,104,101,32,97,32,99,111,109,98,105,110, +97,116,105,111,110,32,111,102,115,116,121,108,101,61,34,119,105,100,116,104,58, +49,48,48,69,110,103,108,105,115,104,45,115,112,101,97,107,105,110,103,99,111,109 +,112,117,116,101,114,32,115,99,105,101,110,99,101,98,111,114,100,101,114,61,34, +48,34,32,97,108,116,61,34,116,104,101,32,101,120,105,115,116,101,110,99,101,32, +111,102,68,101,109,111,99,114,97,116,105,99,32,80,97,114,116,121,34,32,115,116, +121,108,101,61,34,109,97,114,103,105,110,45,70,111,114,32,116,104,105,115,32,114 +,101,97,115,111,110,44,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,9,115 +,66,121,84,97,103,78,97,109,101,40,115,41,91,48,93,106,115,34,62,60,47,115,99, +114,105,112,116,62,13,10,60,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13, +10,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,39,32,97,108,116,61 +,39,39,32,99,108,97,115,115,61,39,102,111,114,109,97,116,105,111,110,32,111,102, +32,116,104,101,118,101,114,115,105,111,110,115,32,111,102,32,116,104,101,32,60, +47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,47,112,97,103,101,62,10,32,32 +,60,112,97,103,101,62,10,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110, +116,98,101,99,97,109,101,32,116,104,101,32,102,105,114,115,116,98,97,104,97,115, +97,32,73,110,100,111,110,101,115,105,97,101,110,103,108,105,115,104,32,40,115, +105,109,112,108,101,41,206,149,206,187,206,187,206,183,206,189,206,185,206,186, +206,172,209,133,209,128,208,178,208,176,209,130,209,129,208,186,208,184,208,186, +208,190,208,188,208,191,208,176,208,189,208,184,208,184,209,143,208,178,208,187, +209,143,208,181,209,130,209,129,209,143,208,148,208,190,208,177,208,176,208,178, +208,184,209,130,209,140,209,135,208,181,208,187,208,190,208,178,208,181,208,186, +208,176,209,128,208,176,208,183,208,178,208,184,209,130,208,184,209,143,208,152, +208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,158,209,130,208,178, +208,181,209,130,208,184,209,130,209,140,208,189,208,176,208,191,209,128,208,184, +208,188,208,181,209,128,208,184,208,189,209,130,208,181,209,128,208,189,208,181, +209,130,208,186,208,190,209,130,208,190,209,128,208,190,208,179,208,190,209,129, +209,130,209,128,208,176,208,189,208,184,209,134,209,139,208,186,208,176,209,135, +208,181,209,129,209,130,208,178,208,181,209,131,209,129,208,187,208,190,208,178, +208,184,209,143,209,133,208,191,209,128,208,190,208,177,208,187,208,181,208,188, +209,139,208,191,208,190,208,187,209,131,209,135,208,184,209,130,209,140,209,143, +208,178,208,187,209,143,209,142,209,130,209,129,209,143,208,189,208,176,208,184, +208,177,208,190,208,187,208,181,208,181,208,186,208,190,208,188,208,191,208,176, +208,189,208,184,209,143,208,178,208,189,208,184,208,188,208,176,208,189,208,184, +208,181,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,176,216,167, +217,132,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,177, +216,166,217,138,216,179,217,138,216,169,216,167,217,132,216,167,217,134,216,170, +217,130,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170, +217,131,216,167,217,132,216,179,217,138,216,167,216,177,216,167,216,170,216,167, +217,132,217,133,217,131,216,170,217,136,216,168,216,169,216,167,217,132,216,179, +216,185,217,136,216,175,217,138,216,169,216,167,216,173,216,181,216,167,216,166, +217,138,216,167,216,170,216,167,217,132,216,185,216,167,217,132,217,133,217,138, +216,169,216,167,217,132,216,181,217,136,216,170,217,138,216,167,216,170,216,167, +217,132,216,167,217,134,216,170,216,177,217,134,216,170,216,167,217,132,216,170, +216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,165,216,179,217,132, +216,167,217,133,217,138,216,167,217,132,217,133,216,180,216,167,216,177,217,131, +216,169,216,167,217,132,217,133,216,177,216,166,217,138,216,167,216,170,114,111, +98,111,116,115,34,32,99,111,110,116,101,110,116,61,34,60,100,105,118,32,105,100, +61,34,102,111,111,116,101,114,34,62,116,104,101,32,85,110,105,116,101,100,32,83, +116,97,116,101,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47, +46,106,112,103,124,114,105,103,104,116,124,116,104,117,109,98,124,46,106,115,34, +62,60,47,115,99,114,105,112,116,62,13,10,60,108,111,99,97,116,105,111,110,46,112 +,114,111,116,111,99,111,108,102,114,97,109,101,98,111,114,100,101,114,61,34,48, +34,32,115,34,32,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,60,47,97,62, +60,47,100,105,118,62,60,47,100,105,118,62,60,102,111,110,116,45,119,101,105,103, +104,116,58,98,111,108,100,59,38,113,117,111,116,59,32,97,110,100,32,38,113,117, +111,116,59,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109, +97,114,103,105,110,58,48,59,112,97,100,100,105,110,103,58,34,32,114,101,108,61, +34,110,111,102,111,108,108,111,119,34,32,80,114,101,115,105,100,101,110,116,32, +111,102,32,116,104,101,32,116,119,101,110,116,105,101,116,104,32,99,101,110,116, +117,114,121,101,118,105,115,105,111,110,62,10,32,32,60,47,112,97,103,101,73,110, +116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,97,46,97,115,121,110, +99,32,61,32,116,114,117,101,59,13,10,105,110,102,111,114,109,97,116,105,111,110, +32,97,98,111,117,116,60,100,105,118,32,105,100,61,34,104,101,97,100,101,114,34, +62,34,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,97,32,104,114, +101,102,61,34,104,116,116,112,115,58,47,47,60,100,105,118,32,105,100,61,34,99, +111,110,116,101,110,116,34,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10 +,60,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32,60,105,109, +103,32,115,114,99,61,39,104,116,116,112,58,47,47,97,99,99,111,114,100,105,110, +103,32,116,111,32,116,104,101,32,10,60,47,98,111,100,121,62,10,60,47,104,116,109 +,108,62,10,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,115, +99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,65,114,105,97,108,44, +32,72,101,108,118,101,116,105,99,97,44,60,47,97,62,60,115,112,97,110,32,99,108, +97,115,115,61,34,60,47,115,99,114,105,112,116,62,60,115,99,114,105,112,116,32, +112,111,108,105,116,105,99,97,108,32,112,97,114,116,105,101,115,116,100,62,60,47 +,116,114,62,60,47,116,97,98,108,101,62,60,104,114,101,102,61,34,104,116,116,112, +58,47,47,119,119,119,46,105,110,116,101,114,112,114,101,116,97,116,105,111,110, +32,111,102,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,100, +111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,99,104,97,114,115,101 +,116,61,34,117,116,102,45,56,34,62,10,98,101,103,105,110,110,105,110,103,32,111, +102,32,116,104,101,32,114,101,118,101,97,108,101,100,32,116,104,97,116,32,116, +104,101,116,101,108,101,118,105,115,105,111,110,32,115,101,114,105,101,115,34,32 +,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,32,116,97,114,103,101, +116,61,34,95,98,108,97,110,107,34,62,99,108,97,105,109,105,110,103,32,116,104,97 +,116,32,116,104,101,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46, +109,97,110,105,102,101,115,116,97,116,105,111,110,115,32,111,102,80,114,105,109, +101,32,77,105,110,105,115,116,101,114,32,111,102,105,110,102,108,117,101,110,99, +101,100,32,98,121,32,116,104,101,99,108,97,115,115,61,34,99,108,101,97,114,102, +105,120,34,62,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,116,104, +114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,67,104,117,114,99,104, +32,111,102,32,69,110,103,108,97,110,100,111,102,32,78,111,114,116,104,32,67,97, +114,111,108,105,110,97,115,113,117,97,114,101,32,107,105,108,111,109,101,116,114 +,101,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,100,105 +,115,116,105,110,99,116,32,102,114,111,109,32,116,104,101,99,111,109,109,111,110 +,108,121,32,107,110,111,119,110,32,97,115,80,104,111,110,101,116,105,99,32,65, +108,112,104,97,98,101,116,100,101,99,108,97,114,101,100,32,116,104,97,116,32,116 +,104,101,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,66,101, +110,106,97,109,105,110,32,70,114,97,110,107,108,105,110,114,111,108,101,45,112, +108,97,121,105,110,103,32,103,97,109,101,116,104,101,32,85,110,105,118,101,114, +115,105,116,121,32,111,102,105,110,32,87,101,115,116,101,114,110,32,69,117,114, +111,112,101,112,101,114,115,111,110,97,108,32,99,111,109,112,117,116,101,114,80, +114,111,106,101,99,116,32,71,117,116,101,110,98,101,114,103,114,101,103,97,114, +100,108,101,115,115,32,111,102,32,116,104,101,104,97,115,32,98,101,101,110,32, +112,114,111,112,111,115,101,100,116,111,103,101,116,104,101,114,32,119,105,116, +104,32,116,104,101,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,105 +,110,32,115,111,109,101,32,99,111,117,110,116,114,105,101,115,109,105,110,46,106 +,115,34,62,60,47,115,99,114,105,112,116,62,111,102,32,116,104,101,32,112,111,112 +,117,108,97,116,105,111,110,111,102,102,105,99,105,97,108,32,108,97,110,103,117, +97,103,101,60,105,109,103,32,115,114,99,61,34,105,109,97,103,101,115,47,105,100, +101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,110,97,116,117,114,97, +108,32,114,101,115,111,117,114,99,101,115,99,108,97,115,115,105,102,105,99,97, +116,105,111,110,32,111,102,99,97,110,32,98,101,32,99,111,110,115,105,100,101,114 +,101,100,113,117,97,110,116,117,109,32,109,101,99,104,97,110,105,99,115,78,101, +118,101,114,116,104,101,108,101,115,115,44,32,116,104,101,109,105,108,108,105, +111,110,32,121,101,97,114,115,32,97,103,111,60,47,98,111,100,121,62,13,10,60,47, +104,116,109,108,62,13,206,149,206,187,206,187,206,183,206,189,206,185,206,186, +206,172,10,116,97,107,101,32,97,100,118,97,110,116,97,103,101,32,111,102,97,110, +100,44,32,97,99,99,111,114,100,105,110,103,32,116,111,97,116,116,114,105,98,117, +116,101,100,32,116,111,32,116,104,101,77,105,99,114,111,115,111,102,116,32,87, +105,110,100,111,119,115,116,104,101,32,102,105,114,115,116,32,99,101,110,116,117 +,114,121,117,110,100,101,114,32,116,104,101,32,99,111,110,116,114,111,108,100, +105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,115,104,111,114,116, +108,121,32,97,102,116,101,114,32,116,104,101,110,111,116,97,98,108,101,32,101, +120,99,101,112,116,105,111,110,116,101,110,115,32,111,102,32,116,104,111,117,115 +,97,110,100,115,115,101,118,101,114,97,108,32,100,105,102,102,101,114,101,110, +116,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,46,114,101,97, +99,104,105,110,103,32,109,105,108,105,116,97,114,121,105,115,111,108,97,116,101, +100,32,102,114,111,109,32,116,104,101,111,112,112,111,115,105,116,105,111,110,32 +,116,111,32,116,104,101,116,104,101,32,79,108,100,32,84,101,115,116,97,109,101, +110,116,65,102,114,105,99,97,110,32,65,109,101,114,105,99,97,110,115,105,110,115 +,101,114,116,101,100,32,105,110,116,111,32,116,104,101,115,101,112,97,114,97,116 +,101,32,102,114,111,109,32,116,104,101,109,101,116,114,111,112,111,108,105,116, +97,110,32,97,114,101,97,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98, +108,101,97,99,107,110,111,119,108,101,100,103,101,100,32,116,104,97,116,97,114, +103,117,97,98,108,121,32,116,104,101,32,109,111,115,116,116,121,112,101,61,34, +116,101,120,116,47,99,115,115,34,62,10,116,104,101,32,73,110,116,101,114,110,97, +116,105,111,110,97,108,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104, +101,32,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,99,111,105,110 +,99,105,100,101,32,119,105,116,104,32,116,104,101,116,119,111,45,116,104,105,114 +,100,115,32,111,102,32,116,104,101,68,117,114,105,110,103,32,116,104,105,115,32, +116,105,109,101,44,100,117,114,105,110,103,32,116,104,101,32,112,101,114,105,111 +,100,97,110,110,111,117,110,99,101,100,32,116,104,97,116,32,104,101,116,104,101, +32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,110,100,32,109,111,114, +101,32,114,101,99,101,110,116,108,121,98,101,108,105,101,118,101,100,32,116,104, +97,116,32,116,104,101,99,111,110,115,99,105,111,117,115,110,101,115,115,32,97, +110,100,102,111,114,109,101,114,108,121,32,107,110,111,119,110,32,97,115,115,117 +,114,114,111,117,110,100,101,100,32,98,121,32,116,104,101,102,105,114,115,116,32 +,97,112,112,101,97,114,101,100,32,105,110,111,99,99,97,115,105,111,110,97,108, +108,121,32,117,115,101,100,112,111,115,105,116,105,111,110,58,97,98,115,111,108, +117,116,101,59,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,112 +,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,116,101,120, +116,45,97,108,105,103,110,58,99,101,110,116,101,114,59,106,97,120,47,108,105,98, +115,47,106,113,117,101,114,121,47,49,46,98,97,99,107,103,114,111,117,110,100,45, +99,111,108,111,114,58,35,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105, +111,110,47,97,110,103,117,97,103,101,34,32,99,111,110,116,101,110,116,61,34,60, +109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,80,114,105,118,97 +,99,121,32,80,111,108,105,99,121,60,47,97,62,101,40,34,37,51,67,115,99,114,105, +112,116,32,115,114,99,61,39,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110, +107,34,62,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,46, +106,112,103,124,116,104,117,109,98,124,114,105,103,104,116,124,50,60,47,100,105, +118,62,60,100,105,118,32,99,108,97,115,115,61,34,60,100,105,118,32,115,116,121, +108,101,61,34,102,108,111,97,116,58,110,105,110,101,116,101,101,110,116,104,32, +99,101,110,116,117,114,121,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108, +62,13,10,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,115,59,116, +101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,102,111,110,116,45, +119,101,105,103,104,116,58,32,98,111,108,100,59,32,65,99,99,111,114,100,105,110, +103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98, +101,116,119,101,101,110,34,32,102,114,97,109,101,98,111,114,100,101,114,61,34,48 +,34,32,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,108, +105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,104,116,109,108,52 +,47,108,111,111,115,101,46,100,116,100,34,62,10,100,117,114,105,110,103,32,116, +104,105,115,32,112,101,114,105,111,100,60,47,116,100,62,60,47,116,114,62,60,47, +116,97,98,108,101,62,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,32 +,116,111,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,59 +,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,105,110,112,117 +,116,32,116,121,112,101,61,34,116,101,120,116,34,32,60,115,112,97,110,32,115,116 +,121,108,101,61,34,102,111,110,116,45,111,110,114,101,97,100,121,115,116,97,116, +101,99,104,97,110,103,101,9,60,100,105,118,32,99,108,97,115,115,61,34,99,108,101 +,97,114,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,32,70 +,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,32,119,105,100, +101,32,118,97,114,105,101,116,121,32,111,102,32,60,33,68,79,67,84,89,80,69,32, +104,116,109,108,62,13,10,60,38,110,98,115,112,59,38,110,98,115,112,59,38,110,98, +115,112,59,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,116 +,121,108,101,61,34,102,108,111,97,116,58,108,101,102,116,59,99,111,110,99,101, +114,110,101,100,32,119,105,116,104,32,116,104,101,61,104,116,116,112,37,51,65,37 +,50,70,37,50,70,119,119,119,46,105,110,32,112,111,112,117,108,97,114,32,99,117, +108,116,117,114,101,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47 +,62,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,72,97,114 +,118,97,114,100,32,85,110,105,118,101,114,115,105,116,121,116,121,108,101,115, +104,101,101,116,34,32,104,114,101,102,61,34,47,116,104,101,32,109,97,105,110,32, +99,104,97,114,97,99,116,101,114,79,120,102,111,114,100,32,85,110,105,118,101,114 +,115,105,116,121,32,32,110,97,109,101,61,34,107,101,121,119,111,114,100,115,34, +32,99,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104 +,101,32,85,110,105,116,101,100,32,75,105,110,103,100,111,109,102,101,100,101,114 +,97,108,32,103,111,118,101,114,110,109,101,110,116,60,100,105,118,32,115,116,121 +,108,101,61,34,109,97,114,103,105,110,32,100,101,112,101,110,100,105,110,103,32, +111,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102, +32,116,104,101,60,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114, +46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,100,101,115,116, +114,117,99,116,105,111,110,32,111,102,32,116,104,101,115,108,105,103,104,116,108 +,121,32,100,105,102,102,101,114,101,110,116,105,110,32,97,99,99,111,114,100,97, +110,99,101,32,119,105,116,104,116,101,108,101,99,111,109,109,117,110,105,99,97, +116,105,111,110,115,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116, +104,101,115,104,111,114,116,108,121,32,116,104,101,114,101,97,102,116,101,114, +101,115,112,101,99,105,97,108,108,121,32,105,110,32,116,104,101,32,69,117,114, +111,112,101,97,110,32,99,111,117,110,116,114,105,101,115,72,111,119,101,118,101, +114,44,32,116,104,101,114,101,32,97,114,101,115,114,99,61,34,104,116,116,112,58, +47,47,115,116,97,116,105,99,115,117,103,103,101,115,116,101,100,32,116,104,97, +116,32,116,104,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119, +46,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,84,101,108, +101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,34,32,114,101,108,61,34 +,110,111,102,111,108,108,111,119,34,32,116,72,111,108,121,32,82,111,109,97,110, +32,69,109,112,101,114,111,114,97,108,109,111,115,116,32,101,120,99,108,117,115, +105,118,101,108,121,34,32,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34 +,83,101,99,114,101,116,97,114,121,32,111,102,32,83,116,97,116,101,99,117,108,109 +,105,110,97,116,105,110,103,32,105,110,32,116,104,101,67,73,65,32,87,111,114,108 +,100,32,70,97,99,116,98,111,111,107,116,104,101,32,109,111,115,116,32,105,109, +112,111,114,116,97,110,116,97,110,110,105,118,101,114,115,97,114,121,32,111,102, +32,116,104,101,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45 +,60,108,105,62,60,101,109,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,65 +,116,108,97,110,116,105,99,32,79,99,101,97,110,115,116,114,105,99,116,108,121,32 +,115,112,101,97,107,105,110,103,44,115,104,111,114,116,108,121,32,98,101,102,111 +,114,101,32,116,104,101,100,105,102,102,101,114,101,110,116,32,116,121,112,101, +115,32,111,102,116,104,101,32,79,116,116,111,109,97,110,32,69,109,112,105,114, +101,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,65,110,32,73, +110,116,114,111,100,117,99,116,105,111,110,32,116,111,99,111,110,115,101,113,117 +,101,110,99,101,32,111,102,32,116,104,101,100,101,112,97,114,116,117,114,101,32, +102,114,111,109,32,116,104,101,67,111,110,102,101,100,101,114,97,116,101,32,83, +116,97,116,101,115,105,110,100,105,103,101,110,111,117,115,32,112,101,111,112, +108,101,115,80,114,111,99,101,101,100,105,110,103,115,32,111,102,32,116,104,101, +105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,104,101,116,104,101 +,111,114,105,101,115,32,104,97,118,101,32,98,101,101,110,105,110,118,111,108,118 +,101,109,101,110,116,32,105,110,32,116,104,101,100,105,118,105,100,101,100,32, +105,110,116,111,32,116,104,114,101,101,97,100,106,97,99,101,110,116,32,99,111, +117,110,116,114,105,101,115,105,115,32,114,101,115,112,111,110,115,105,98,108, +101,32,102,111,114,100,105,115,115,111,108,117,116,105,111,110,32,111,102,32,116 +,104,101,99,111,108,108,97,98,111,114,97,116,105,111,110,32,119,105,116,104,119, +105,100,101,108,121,32,114,101,103,97,114,100,101,100,32,97,115,104,105,115,32, +99,111,110,116,101,109,112,111,114,97,114,105,101,115,102,111,117,110,100,105, +110,103,32,109,101,109,98,101,114,32,111,102,68,111,109,105,110,105,99,97,110,32 +,82,101,112,117,98,108,105,99,103,101,110,101,114,97,108,108,121,32,97,99,99,101 +,112,116,101,100,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32, +111,102,97,114,101,32,97,108,115,111,32,97,118,97,105,108,97,98,108,101,117,110, +100,101,114,32,99,111,110,115,116,114,117,99,116,105,111,110,114,101,115,116,111 +,114,97,116,105,111,110,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101 +,114,97,108,32,112,117,98,108,105,99,105,115,32,97,108,109,111,115,116,32,101, +110,116,105,114,101,108,121,112,97,115,115,101,115,32,116,104,114,111,117,103, +104,32,116,104,101,104,97,115,32,98,101,101,110,32,115,117,103,103,101,115,116, +101,100,99,111,109,112,117,116,101,114,32,97,110,100,32,118,105,100,101,111,71, +101,114,109,97,110,105,99,32,108,97,110,103,117,97,103,101,115,32,97,99,99,111, +114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110 +,116,32,102,114,111,109,32,116,104,101,115,104,111,114,116,108,121,32,97,102,116 +,101,114,119,97,114,100,115,104,114,101,102,61,34,104,116,116,112,115,58,47,47, +119,119,119,46,114,101,99,101,110,116,32,100,101,118,101,108,111,112,109,101,110 +,116,66,111,97,114,100,32,111,102,32,68,105,114,101,99,116,111,114,115,60,100, +105,118,32,99,108,97,115,115,61,34,115,101,97,114,99,104,124,32,60,97,32,104,114 +,101,102,61,34,104,116,116,112,58,47,47,73,110,32,112,97,114,116,105,99,117,108, +97,114,44,32,116,104,101,77,117,108,116,105,112,108,101,32,102,111,111,116,110, +111,116,101,115,111,114,32,111,116,104,101,114,32,115,117,98,115,116,97,110,99, +101,116,104,111,117,115,97,110,100,115,32,111,102,32,121,101,97,114,115,116,114, +97,110,115,108,97,116,105,111,110,32,111,102,32,116,104,101,60,47,100,105,118,62 +,13,10,60,47,100,105,118,62,13,10,13,10,60,97,32,104,114,101,102,61,34,105,110, +100,101,120,46,112,104,112,119,97,115,32,101,115,116,97,98,108,105,115,104,101, +100,32,105,110,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10, +112,97,114,116,105,99,105,112,97,116,101,32,105,110,32,116,104,101,97,32,115,116 +,114,111,110,103,32,105,110,102,108,117,101,110,99,101,115,116,121,108,101,61,34 +,109,97,114,103,105,110,45,116,111,112,58,114,101,112,114,101,115,101,110,116, +101,100,32,98,121,32,116,104,101,103,114,97,100,117,97,116,101,100,32,102,114, +111,109,32,116,104,101,84,114,97,100,105,116,105,111,110,97,108,108,121,44,32, +116,104,101,69,108,101,109,101,110,116,40,34,115,99,114,105,112,116,34,41,59,72, +111,119,101,118,101,114,44,32,115,105,110,99,101,32,116,104,101,47,100,105,118, +62,10,60,47,100,105,118,62,10,60,100,105,118,32,108,101,102,116,59,32,109,97,114 +,103,105,110,45,108,101,102,116,58,112,114,111,116,101,99,116,105,111,110,32,97, +103,97,105,110,115,116,48,59,32,118,101,114,116,105,99,97,108,45,97,108,105,103, +110,58,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32,116,104,101,116, +121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,47,100,105,118,62, +10,60,100,105,118,32,99,108,97,115,115,61,34,32,99,108,97,115,115,61,34,99,108, +101,97,114,102,105,120,34,62,60,100,105,118,32,99,108,97,115,115,61,34,102,111, +111,116,101,114,9,9,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,116,104, +101,32,109,111,116,105,111,110,32,112,105,99,116,117,114,101,208,145,209,138,208 +,187,208,179,208,176,209,128,209,129,208,186,208,184,208,177,209,138,208,187,208 +,179,208,176,209,128,209,129,208,186,208,184,208,164,208,181,208,180,208,181,209 +,128,208,176,209,134,208,184,208,184,208,189,208,181,209,129,208,186,208,190,208 +,187,209,140,208,186,208,190,209,129,208,190,208,190,208,177,209,137,208,181,208 +,189,208,184,208,181,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208 +,184,209,143,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,209 +,139,208,158,209,130,208,191,209,128,208,176,208,178,208,184,209,130,209,140,208 +,177,208,181,209,129,208,191,208,187,208,176,209,130,208,189,208,190,208,188,208 +,176,209,130,208,181,209,128,208,184,208,176,208,187,209,139,208,191,208,190,208 +,183,208,178,208,190,208,187,209,143,208,181,209,130,208,191,208,190,209,129,208 +,187,208,181,208,180,208,189,208,184,208,181,209,128,208,176,208,183,208,187,208 +,184,209,135,208,189,209,139,209,133,208,191,209,128,208,190,208,180,209,131,208 +,186,209,134,208,184,208,184,208,191,209,128,208,190,208,179,209,128,208,176,208 +,188,208,188,208,176,208,191,208,190,208,187,208,189,208,190,209,129,209,130,209 +,140,209,142,208,189,208,176,209,133,208,190,208,180,208,184,209,130,209,129,209 +,143,208,184,208,183,208,177,209,128,208,176,208,189,208,189,208,190,208,181,208 +,189,208,176,209,129,208,181,208,187,208,181,208,189,208,184,209,143,208,184,208 +,183,208,188,208,181,208,189,208,181,208,189,208,184,209,143,208,186,208,176,209 +,130,208,181,208,179,208,190,209,128,208,184,208,184,208,144,208,187,208,181,208 +,186,209,129,208,176,208,189,208,180,209,128,224,164,166,224,165,141,224,164,181 +,224,164,190,224,164,176,224,164,190,224,164,174,224,165,136,224,164,168,224,165 +,129,224,164,133,224,164,178,224,164,170,224,165,141,224,164,176,224,164,166,224 +,164,190,224,164,168,224,164,173,224,164,190,224,164,176,224,164,164,224,165,128 +,224,164,175,224,164,133,224,164,168,224,165,129,224,164,166,224,165,135,224,164 +,182,224,164,185,224,164,191,224,164,168,224,165,141,224,164,166,224,165,128,224 +,164,135,224,164,130,224,164,161,224,164,191,224,164,175,224,164,190,224,164,166 +,224,164,191,224,164,178,224,165,141,224,164,178,224,165,128,224,164,133,224,164 +,167,224,164,191,224,164,149,224,164,190,224,164,176,224,164,181,224,165,128,224 +,164,161,224,164,191,224,164,175,224,165,139,224,164,154,224,164,191,224,164,159 +,224,165,141,224,164,160,224,165,135,224,164,184,224,164,174,224,164,190,224,164 +,154,224,164,190,224,164,176,224,164,156,224,164,130,224,164,149,224,165,141,224 +,164,182,224,164,168,224,164,166,224,165,129,224,164,168,224,164,191,224,164,175 +,224,164,190,224,164,170,224,165,141,224,164,176,224,164,175,224,165,139,224,164 +,151,224,164,133,224,164,168,224,165,129,224,164,184,224,164,190,224,164,176,224 +,164,145,224,164,168,224,164,178,224,164,190,224,164,135,224,164,168,224,164,170 +,224,164,190,224,164,176,224,165,141,224,164,159,224,165,128,224,164,182,224,164 +,176,224,165,141,224,164,164,224,165,139,224,164,130,224,164,178,224,165,139,224 +,164,149,224,164,184,224,164,173,224,164,190,224,164,171,224,164,188,224,165,141 +,224,164,178,224,165,136,224,164,182,224,164,182,224,164,176,224,165,141,224,164 +,164,224,165,135,224,164,130,224,164,170,224,165,141,224,164,176,224,164,166,224 +,165,135,224,164,182,224,164,170,224,165,141,224,164,178,224,165,135,224,164,175 +,224,164,176,224,164,149,224,165,135,224,164,130,224,164,166,224,165,141,224,164 +,176,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,191,224 +,164,137,224,164,164,224,165,141,224,164,170,224,164,190,224,164,166,224,164,137 +,224,164,168,224,165,141,224,164,185,224,165,135,224,164,130,224,164,154,224,164 +,191,224,164,159,224,165,141,224,164,160,224,164,190,224,164,175,224,164,190,224 +,164,164,224,165,141,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175 +,224,164,190,224,164,166,224,164,190,224,164,170,224,165,129,224,164,176,224,164 +,190,224,164,168,224,165,135,224,164,156,224,165,139,224,164,161,224,164,188,224 +,165,135,224,164,130,224,164,133,224,164,168,224,165,129,224,164,181,224,164,190 +,224,164,166,224,164,182,224,165,141,224,164,176,224,165,135,224,164,163,224,165 +,128,224,164,182,224,164,191,224,164,149,224,165,141,224,164,183,224,164,190,224 +,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184 +,224,164,130,224,164,151,224,165,141,224,164,176,224,164,185,224,164,170,224,164 +,176,224,164,191,224,164,163,224,164,190,224,164,174,224,164,172,224,165,141,224 +,164,176,224,164,190,224,164,130,224,164,161,224,164,172,224,164,154,224,165,141 +,224,164,154,224,165,139,224,164,130,224,164,137,224,164,170,224,164,178,224,164 +,172,224,165,141,224,164,167,224,164,174,224,164,130,224,164,164,224,165,141,224 +,164,176,224,165,128,224,164,184,224,164,130,224,164,170,224,164,176,224,165,141 +,224,164,149,224,164,137,224,164,174,224,165,141,224,164,174,224,165,128,224,164 +,166,224,164,174,224,164,190,224,164,167,224,165,141,224,164,175,224,164,174,224 +,164,184,224,164,185,224,164,190,224,164,175,224,164,164,224,164,190,224,164,182 +,224,164,172,224,165,141,224,164,166,224,165,139,224,164,130,224,164,174,224,165 +,128,224,164,161,224,164,191,224,164,175,224,164,190,224,164,134,224,164,136,224 +,164,170,224,165,128,224,164,143,224,164,178,224,164,174,224,165,139,224,164,172 +,224,164,190,224,164,135,224,164,178,224,164,184,224,164,130,224,164,150,224,165 +,141,224,164,175,224,164,190,224,164,134,224,164,170,224,164,176,224,165,135,224 +,164,182,224,164,168,224,164,133,224,164,168,224,165,129,224,164,172,224,164,130 +,224,164,167,224,164,172,224,164,190,224,164,156,224,164,188,224,164,190,224,164 +,176,224,164,168,224,164,181,224,165,128,224,164,168,224,164,164,224,164,174,224 +,164,170,224,165,141,224,164,176,224,164,174,224,165,129,224,164,150,224,164,170 +,224,165,141,224,164,176,224,164,182,224,165,141,224,164,168,224,164,170,224,164 +,176,224,164,191,224,164,181,224,164,190,224,164,176,224,164,168,224,165,129,224 +,164,149,224,164,184,224,164,190,224,164,168,224,164,184,224,164,174,224,164,176 +,224,165,141,224,164,165,224,164,168,224,164,134,224,164,175,224,165,139,224,164 +,156,224,164,191,224,164,164,224,164,184,224,165,139,224,164,174,224,164,181,224 +,164,190,224,164,176,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216 +,167,216,170,216,167,217,132,217,133,217,134,216,170,216,175,217,138,216,167,216 +,170,216,167,217,132,217,131,217,133,216,168,217,138,217,136,216,170,216,177,216 +,167,217,132,217,133,216,180,216,167,217,135,216,175,216,167,216,170,216,185,216 +,175,216,175,216,167,217,132,216,178,217,136,216,167,216,177,216,185,216,175,216 +,175,216,167,217,132,216,177,216,175,217,136,216,175,216,167,217,132,216,165,216 +,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,217,129,217,136,216 +,170,217,136,216,180,217,136,216,168,216,167,217,132,217,133,216,179,216,167,216 +,168,217,130,216,167,216,170,216,167,217,132,217,133,216,185,217,132,217,136,217 +,133,216,167,216,170,216,167,217,132,217,133,216,179,217,132,216,179,217,132,216 +,167,216,170,216,167,217,132,216,172,216,177,216,167,217,129,217,138,217,131,216 +,179,216,167,217,132,216,167,216,179,217,132,216,167,217,133,217,138,216,169,216 +,167,217,132,216,167,216,170,216,181,216,167,217,132,216,167,216,170,107,101,121 +,119,111,114,100,115,34,32,99,111,110,116,101,110,116,61,34,119,51,46,111,114, +103,47,49,57,57,57,47,120,104,116,109,108,34,62,60,97,32,116,97,114,103,101,116, +61,34,95,98,108,97,110,107,34,32,116,101,120,116,47,104,116,109,108,59,32,99,104 +,97,114,115,101,116,61,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107, +34,62,60,116,97,98,108,101,32,99,101,108,108,112,97,100,100,105,110,103,61,34,97 +,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,116,101,120, +116,45,97,108,105,103,110,58,32,99,101,110,116,101,114,59,116,111,32,108,97,115, +116,32,118,101,114,115,105,111,110,32,98,121,32,98,97,99,107,103,114,111,117,110 +,100,45,99,111,108,111,114,58,32,35,34,32,104,114,101,102,61,34,104,116,116,112, +58,47,47,119,119,119,46,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32 +,105,100,61,60,97,32,104,114,101,102,61,34,35,34,32,99,108,97,115,115,61,34,34, +62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,99,114,105,112, +116,34,32,115,114,99,61,34,104,116,116,112,58,47,47,10,60,115,99,114,105,112,116 +,32,108,97,110,103,117,97,103,101,61,34,47,47,69,78,34,32,34,104,116,116,112,58, +47,47,119,119,119,46,119,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110, +101,110,116,40,34,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116, +58,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,101,110,116,100,111, +99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,115,99,112,111,115,105, +116,105,111,110,58,32,97,98,115,111,108,117,116,101,59,115,99,114,105,112,116,32 +,115,114,99,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,109,97, +114,103,105,110,45,116,111,112,58,46,109,105,110,46,106,115,34,62,60,47,115,99, +114,105,112,116,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115, +115,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,10, +13,10,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,100,105,115,116,105 +,110,99,116,105,111,110,32,98,101,116,119,101,101,110,47,34,32,116,97,114,103, +101,116,61,34,95,98,108,97,110,107,34,62,60,108,105,110,107,32,104,114,101,102, +61,34,104,116,116,112,58,47,47,101,110,99,111,100,105,110,103,61,34,117,116,102, +45,56,34,63,62,10,119,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110, +101,114,63,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,119,119,119,46, +105,99,111,110,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,115,116, +121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,58,116,121,112,101,61,34, +116,101,120,116,47,99,115,115,34,32,47,62,10,109,101,116,97,32,112,114,111,112, +101,114,116,121,61,34,111,103,58,116,60,105,110,112,117,116,32,116,121,112,101, +61,34,116,101,120,116,34,32,32,115,116,121,108,101,61,34,116,101,120,116,45,97, +108,105,103,110,58,116,104,101,32,100,101,118,101,108,111,112,109,101,110,116,32 +,111,102,32,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, +101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,105,115 +,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,116,97,98,108, +101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,73,110,32,97,100,100,105,116, +105,111,110,32,116,111,32,116,104,101,32,99,111,110,116,114,105,98,117,116,101, +100,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,32, +98,101,116,119,101,101,110,100,101,118,101,108,111,112,109,101,110,116,32,111, +102,32,116,104,101,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32 +,116,111,32,60,47,115,99,114,105,112,116,62,10,10,60,115,99,114,105,112,116,32, +32,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,49,62,60,47, +115,112,97,110,62,60,115,112,97,110,32,105,100,61,103,98,76,105,98,114,97,114, +121,32,111,102,32,67,111,110,103,114,101,115,115,60,105,109,103,32,115,114,99,61 +,34,104,116,116,112,58,47,47,105,109,69,110,103,108,105,115,104,32,116,114,97, +110,115,108,97,116,105,111,110,65,99,97,100,101,109,121,32,111,102,32,83,99,105, +101,110,99,101,115,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108, +97,121,58,99,111,110,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104, +101,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,105,100,41,105, +110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,69,108,101, +109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,32,60,109,101,116,97,32, +112,114,111,112,101,114,116,121,61,34,111,103,58,208,145,209,138,208,187,208,179 +,208,176,209,128,209,129,208,186,208,184,10,32,116,121,112,101,61,34,116,101,120 +,116,34,32,110,97,109,101,61,34,62,80,114,105,118,97,99,121,32,80,111,108,105,99 +,121,60,47,97,62,97,100,109,105,110,105,115,116,101,114,101,100,32,98,121,32,116 +,104,101,101,110,97,98,108,101,83,105,110,103,108,101,82,101,113,117,101,115,116 +,115,116,121,108,101,61,38,113,117,111,116,59,109,97,114,103,105,110,58,60,47, +100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,62,60,105,109,103,32 +,115,114,99,61,34,104,116,116,112,58,47,47,105,32,115,116,121,108,101,61,38,113, +117,111,116,59,102,108,111,97,116,58,114,101,102,101,114,114,101,100,32,116,111, +32,97,115,32,116,104,101,32,116,111,116,97,108,32,112,111,112,117,108,97,116,105 +,111,110,32,111,102,105,110,32,87,97,115,104,105,110,103,116,111,110,44,32,68,46 +,67,46,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,97, +109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,44,111,114,103 +,97,110,105,122,97,116,105,111,110,32,111,102,32,116,104,101,112,97,114,116,105, +99,105,112,97,116,101,100,32,105,110,32,116,104,101,116,104,101,32,105,110,116, +114,111,100,117,99,116,105,111,110,32,111,102,105,100,101,110,116,105,102,105, +101,100,32,119,105,116,104,32,116,104,101,102,105,99,116,105,111,110,97,108,32, +99,104,97,114,97,99,116,101,114,32,79,120,102,111,114,100,32,85,110,105,118,101, +114,115,105,116,121,32,109,105,115,117,110,100,101,114,115,116,97,110,100,105, +110,103,32,111,102,84,104,101,114,101,32,97,114,101,44,32,104,111,119,101,118, +101,114,44,115,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34, +47,67,111,108,117,109,98,105,97,32,85,110,105,118,101,114,115,105,116,121,101, +120,112,97,110,100,101,100,32,116,111,32,105,110,99,108,117,100,101,117,115,117, +97,108,108,121,32,114,101,102,101,114,114,101,100,32,116,111,105,110,100,105,99, +97,116,105,110,103,32,116,104,97,116,32,116,104,101,104,97,118,101,32,115,117, +103,103,101,115,116,101,100,32,116,104,97,116,97,102,102,105,108,105,97,116,101, +100,32,119,105,116,104,32,116,104,101,99,111,114,114,101,108,97,116,105,111,110, +32,98,101,116,119,101,101,110,110,117,109,98,101,114,32,111,102,32,100,105,102, +102,101,114,101,110,116,62,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108 +,101,62,82,101,112,117,98,108,105,99,32,111,102,32,73,114,101,108,97,110,100,10, +60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,117,110,100,101, +114,32,116,104,101,32,105,110,102,108,117,101,110,99,101,99,111,110,116,114,105, +98,117,116,105,111,110,32,116,111,32,116,104,101,79,102,102,105,99,105,97,108,32 +,119,101,98,115,105,116,101,32,111,102,104,101,97,100,113,117,97,114,116,101,114 +,115,32,111,102,32,116,104,101,99,101,110,116,101,114,101,100,32,97,114,111,117, +110,100,32,116,104,101,105,109,112,108,105,99,97,116,105,111,110,115,32,111,102, +32,116,104,101,104,97,118,101,32,98,101,101,110,32,100,101,118,101,108,111,112, +101,100,70,101,100,101,114,97,108,32,82,101,112,117,98,108,105,99,32,111,102,98, +101,99,97,109,101,32,105,110,99,114,101,97,115,105,110,103,108,121,99,111,110, +116,105,110,117,97,116,105,111,110,32,111,102,32,116,104,101,78,111,116,101,44, +32,104,111,119,101,118,101,114,44,32,116,104,97,116,115,105,109,105,108,97,114, +32,116,111,32,116,104,97,116,32,111,102,32,99,97,112,97,98,105,108,105,116,105, +101,115,32,111,102,32,116,104,101,97,99,99,111,114,100,97,110,99,101,32,119,105, +116,104,32,116,104,101,112,97,114,116,105,99,105,112,97,110,116,115,32,105,110, +32,116,104,101,102,117,114,116,104,101,114,32,100,101,118,101,108,111,112,109, +101,110,116,117,110,100,101,114,32,116,104,101,32,100,105,114,101,99,116,105,111 +,110,105,115,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100, +104,105,115,32,121,111,117,110,103,101,114,32,98,114,111,116,104,101,114,60,47, +116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,97,32,104,116,116,112, +45,101,113,117,105,118,61,34,88,45,85,65,45,112,104,121,115,105,99,97,108,32,112 +,114,111,112,101,114,116,105,101,115,111,102,32,66,114,105,116,105,115,104,32,67 +,111,108,117,109,98,105,97,104,97,115,32,98,101,101,110,32,99,114,105,116,105,99 +,105,122,101,100,40,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105 +,111,110,113,117,101,115,116,105,111,110,115,32,97,98,111,117,116,32,116,104,101 +,112,97,115,115,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,48,34, +32,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,116,104,111,117,115, +97,110,100,115,32,111,102,32,112,101,111,112,108,101,114,101,100,105,114,101,99, +116,115,32,104,101,114,101,46,32,70,111,114,104,97,118,101,32,99,104,105,108,100 +,114,101,110,32,117,110,100,101,114,37,51,69,37,51,67,47,115,99,114,105,112,116, +37,51,69,34,41,41,59,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119 +,119,119,46,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47, +47,115,105,116,101,95,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,116, +101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,110,111,110,101,115,116, +121,108,101,61,34,100,105,115,112,108,97,121,58,32,110,111,110,101,60,109,101, +116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,110,101,119,32,68, +97,116,101,40,41,46,103,101,116,84,105,109,101,40,41,32,116,121,112,101,61,34, +105,109,97,103,101,47,120,45,105,99,111,110,34,60,47,115,112,97,110,62,60,115, +112,97,110,32,99,108,97,115,115,61,34,108,97,110,103,117,97,103,101,61,34,106,97 +,118,97,115,99,114,105,112,116,119,105,110,100,111,119,46,108,111,99,97,116,105, +111,110,46,104,114,101,102,60,97,32,104,114,101,102,61,34,106,97,118,97,115,99, +114,105,112,116,58,45,45,62,13,10,60,115,99,114,105,112,116,32,116,121,112,101, +61,34,116,60,97,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,119,119,46 +,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,60,47, +100,105,118,62,13,10,60,100,105,118,32,99,108,97,115,115,61,34,60,115,99,114,105 +,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,34,32,114,101,108,61,34, +115,116,121,108,101,115,104,101,101,116,34,32,116,60,47,100,105,118,62,10,60,115 +,99,114,105,112,116,32,116,121,112,101,61,47,97,62,32,60,97,32,104,114,101,102, +61,34,104,116,116,112,58,47,47,32,97,108,108,111,119,84,114,97,110,115,112,97, +114,101,110,99,121,61,34,88,45,85,65,45,67,111,109,112,97,116,105,98,108,101,34, +32,99,111,110,114,101,108,97,116,105,111,110,115,104,105,112,32,98,101,116,119, +101,101,110,10,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116, +32,60,47,97,62,60,47,108,105,62,60,47,117,108,62,60,47,100,105,118,62,97,115,115 +,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,103, +114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,60,47,97,62,60,97,32 +,104,114,101,102,61,34,104,116,116,112,58,47,47,60,47,97,62,60,47,108,105,62,60, +108,105,32,99,108,97,115,115,61,34,102,111,114,109,32,97,99,116,105,111,110,61, +34,104,116,116,112,58,47,47,60,100,105,118,32,115,116,121,108,101,61,34,100,105, +115,112,108,97,121,58,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101 +,61,34,113,34,60,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34, +32,98,97,99,107,103,114,111,117,110,100,45,112,111,115,105,116,105,111,110,58,34 +,32,98,111,114,100,101,114,61,34,48,34,32,119,105,100,116,104,61,34,114,101,108, +61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,54,62,60,117, +108,62,60,108,105,62,60,97,32,104,114,101,102,61,34,32,32,60,109,101,116,97,32, +104,116,116,112,45,101,113,117,105,118,61,34,99,115,115,34,32,109,101,100,105,97 +,61,34,115,99,114,101,101,110,34,32,114,101,115,112,111,110,115,105,98,108,101, +32,102,111,114,32,116,104,101,32,34,32,116,121,112,101,61,34,97,112,112,108,105, +99,97,116,105,111,110,47,34,32,115,116,121,108,101,61,34,98,97,99,107,103,114, +111,117,110,100,45,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116, +102,45,56,34,32,97,108,108,111,119,116,114,97,110,115,112,97,114,101,110,99,121, +61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, +101,13,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,62, +60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,48,34,32,99 +,101,108,108,115,112,97,99,105,110,103,61,34,48,34,62,59,10,60,47,115,99,114,105 +,112,116,62,10,60,115,99,114,105,112,116,32,115,111,109,101,116,105,109,101,115, +32,99,97,108,108,101,100,32,116,104,101,100,111,101,115,32,110,111,116,32,110, +101,99,101,115,115,97,114,105,108,121,70,111,114,32,109,111,114,101,32,105,110, +102,111,114,109,97,116,105,111,110,97,116,32,116,104,101,32,98,101,103,105,110, +110,105,110,103,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62, +60,104,116,109,108,112,97,114,116,105,99,117,108,97,114,108,121,32,105,110,32, +116,104,101,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109, +101,61,34,106,97,118,97,115,99,114,105,112,116,58,118,111,105,100,40,48,41,59,34 +,101,102,102,101,99,116,105,118,101,110,101,115,115,32,111,102,32,116,104,101,32 +,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,103,101, +110,101,114,97,108,108,121,32,99,111,110,115,105,100,101,114,101,100,62,60,105, +110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,34,62,60,47,115, +99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,116,104,114,111,117,103, +104,111,117,116,32,116,104,101,32,119,111,114,108,100,99,111,109,109,111,110,32, +109,105,115,99,111,110,99,101,112,116,105,111,110,97,115,115,111,99,105,97,116, +105,111,110,32,119,105,116,104,32,116,104,101,60,47,100,105,118,62,10,60,47,100, +105,118,62,10,60,100,105,118,32,99,100,117,114,105,110,103,32,104,105,115,32,108 +,105,102,101,116,105,109,101,44,99,111,114,114,101,115,112,111,110,100,105,110, +103,32,116,111,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45 +,105,99,111,110,34,32,97,110,32,105,110,99,114,101,97,115,105,110,103,32,110,117 +,109,98,101,114,100,105,112,108,111,109,97,116,105,99,32,114,101,108,97,116,105, +111,110,115,97,114,101,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114, +101,100,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34, +32,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,101,120 +,97,109,112,108,101,115,32,105,110,99,108,117,100,101,32,116,104,101,34,62,60, +105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,112,97,114,116,105, +99,105,112,97,116,105,111,110,32,105,110,32,116,104,101,116,104,101,32,101,115, +116,97,98,108,105,115,104,109,101,110,116,32,111,102,10,60,47,100,105,118,62,10, +60,100,105,118,32,99,108,97,115,115,61,34,38,97,109,112,59,110,98,115,112,59,38, +97,109,112,59,110,98,115,112,59,116,111,32,100,101,116,101,114,109,105,110,101, +32,119,104,101,116,104,101,114,113,117,105,116,101,32,100,105,102,102,101,114, +101,110,116,32,102,114,111,109,109,97,114,107,101,100,32,116,104,101,32,98,101, +103,105,110,110,105,110,103,100,105,115,116,97,110,99,101,32,98,101,116,119,101, +101,110,32,116,104,101,99,111,110,116,114,105,98,117,116,105,111,110,115,32,116, +111,32,116,104,101,99,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110, +32,116,104,101,119,105,100,101,108,121,32,99,111,110,115,105,100,101,114,101,100 +,32,116,111,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114, +115,116,119,105,116,104,32,118,97,114,121,105,110,103,32,100,101,103,114,101,101 +,115,104,97,118,101,32,115,112,101,99,117,108,97,116,101,100,32,116,104,97,116, +40,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,112, +97,114,116,105,99,105,112,97,116,105,110,103,32,105,110,32,116,104,101,111,114, +105,103,105,110,97,108,108,121,32,100,101,118,101,108,111,112,101,100,101,116,97 +,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,32,116,121,112,101, +61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,105,110,116,101,114,99,104,97 +,110,103,101,97,98,108,121,32,119,105,116,104,109,111,114,101,32,99,108,111,115, +101,108,121,32,114,101,108,97,116,101,100,115,111,99,105,97,108,32,97,110,100,32 +,112,111,108,105,116,105,99,97,108,116,104,97,116,32,119,111,117,108,100,32,111, +116,104,101,114,119,105,115,101,112,101,114,112,101,110,100,105,99,117,108,97, +114,32,116,111,32,116,104,101,115,116,121,108,101,32,116,121,112,101,61,34,116, +101,120,116,47,99,115,115,116,121,112,101,61,34,115,117,98,109,105,116,34,32,110 +,97,109,101,61,34,102,97,109,105,108,105,101,115,32,114,101,115,105,100,105,110, +103,32,105,110,100,101,118,101,108,111,112,105,110,103,32,99,111,117,110,116,114 +,105,101,115,99,111,109,112,117,116,101,114,32,112,114,111,103,114,97,109,109, +105,110,103,101,99,111,110,111,109,105,99,32,100,101,118,101,108,111,112,109,101 +,110,116,100,101,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116, +104,101,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111 +,110,111,110,32,115,101,118,101,114,97,108,32,111,99,99,97,115,105,111,110,115, +112,111,114,116,117,103,117,195,170,115,32,40,69,117,114,111,112,101,117,41,208, +163,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,209, +131,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,208, +160,208,190,209,129,209,129,208,184,208,185,209,129,208,186,208,190,208,185,208, +188,208,176,209,130,208,181,209,128,208,184,208,176,208,187,208,190,208,178,208, +184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,208,184,209, +131,208,191,209,128,208,176,208,178,208,187,208,181,208,189,208,184,209,143,208, +189,208,181,208,190,208,177,209,133,208,190,208,180,208,184,208,188,208,190,208, +184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, +152,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, +160,208,181,209,129,208,191,209,131,208,177,208,187,208,184,208,186,208,184,208, +186,208,190,208,187,208,184,209,135,208,181,209,129,209,130,208,178,208,190,208, +184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,142,209, +130,208,181,209,128,209,128,208,184,209,130,208,190,209,128,208,184,208,184,208, +180,208,190,209,129,209,130,208,176,209,130,208,190,209,135,208,189,208,190,216, +167,217,132,217,133,216,170,217,136,216,167,216,172,216,175,217,136,217,134,216, +167,217,132,216,167,216,180,216,170,216,177,216,167,217,131,216,167,216,170,216, +167,217,132,216,167,217,130,216,170,216,177,216,167,216,173,216,167,216,170,104, +116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,32,115,101,116, +84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,100,105,115, +112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,59,60,105,110,112 +,117,116,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,116,121,112,101, +32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,60,105,109,103,32, +115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,34,32,34,104,116,116, +112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,115,104,111,114,116,99,117, +116,32,105,99,111,110,34,32,104,114,101,102,61,34,34,32,97,117,116,111,99,111, +109,112,108,101,116,101,61,34,111,102,102,34,32,60,47,97,62,60,47,100,105,118,62 +,60,100,105,118,32,99,108,97,115,115,61,60,47,97,62,60,47,108,105,62,10,60,108, +105,32,99,108,97,115,115,61,34,99,115,115,34,32,116,121,112,101,61,34,116,101, +120,116,47,99,115,115,34,32,60,102,111,114,109,32,97,99,116,105,111,110,61,34, +104,116,116,112,58,47,47,120,116,47,99,115,115,34,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110 +,97,116,101,34,32,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116, +101,120,116,47,32,111,110,99,108,105,99,107,61,34,106,97,118,97,115,99,114,105, +112,116,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40, +41,125,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32 +,80,101,111,112,108,101,39,115,32,82,101,112,117,98,108,105,99,32,111,102,32,32, +60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,116,101, +120,116,45,100,101,99,111,114,97,116,105,111,110,58,117,110,100,101,114,116,104, +101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,60,47,100 +,105,118,62,10,60,47,100,105,118,62,10,60,47,100,105,118,62,10,101,115,116,97,98 +,108,105,115,104,109,101,110,116,32,111,102,32,116,104,101,32,60,47,100,105,118, +62,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,35,118,105,101,119,112, +111,114,116,123,109,105,110,45,104,101,105,103,104,116,58,10,60,115,99,114,105, +112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,111,112,116,105,111,110,62, +60,111,112,116,105,111,110,32,118,97,108,117,101,61,111,102,116,101,110,32,114, +101,102,101,114,114,101,100,32,116,111,32,97,115,32,47,111,112,116,105,111,110, +62,10,60,111,112,116,105,111,110,32,118,97,108,117,60,33,68,79,67,84,89,80,69,32 +,104,116,109,108,62,10,60,33,45,45,91,73,110,116,101,114,110,97,116,105,111,110, +97,108,32,65,105,114,112,111,114,116,62,10,60,97,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,119,119,119,60,47,97,62,60,97,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,119,224,184,160,224,184,178,224,184,169,224,184,178,224,185 +,132,224,184,151,224,184,162,225,131,165,225,131,144,225,131,160,225,131,151,225 +,131,163,225,131,154,225,131,152,230,173,163,233,171,148,228,184,173,230,150,135 +,32,40,231,185,129,233,171,148,41,224,164,168,224,164,191,224,164,176,224,165, +141,224,164,166,224,165,135,224,164,182,224,164,161,224,164,190,224,164,137,224, +164,168,224,164,178,224,165,139,224,164,161,224,164,149,224,165,141,224,164,183, +224,165,135,224,164,164,224,165,141,224,164,176,224,164,156,224,164,190,224,164, +168,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224, +164,172,224,164,130,224,164,167,224,164,191,224,164,164,224,164,184,224,165,141, +224,164,165,224,164,190,224,164,170,224,164,168,224,164,190,224,164,184,224,165, +141,224,164,181,224,165,128,224,164,149,224,164,190,224,164,176,224,164,184,224, +164,130,224,164,184,224,165,141,224,164,149,224,164,176,224,164,163,224,164,184, +224,164,190,224,164,174,224,164,151,224,165,141,224,164,176,224,165,128,224,164, +154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,139,224,164,130,224, +164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,168, +224,164,133,224,164,174,224,165,135,224,164,176,224,164,191,224,164,149,224,164, +190,224,164,181,224,164,191,224,164,173,224,164,191,224,164,168,224,165,141,224, +164,168,224,164,151,224,164,190,224,164,161,224,164,191,224,164,175,224,164,190, +224,164,129,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164, +149,224,164,191,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224, +164,183,224,164,190,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154, +224,164,164,224,165,128,224,164,170,224,165,141,224,164,176,224,164,172,224,164, +130,224,164,167,224,164,168,224,164,159,224,164,191,224,164,170,224,165,141,224, +164,170,224,164,163,224,165,128,224,164,149,224,165,141,224,164,176,224,164,191, +224,164,149,224,165,135,224,164,159,224,164,170,224,165,141,224,164,176,224,164, +190,224,164,176,224,164,130,224,164,173,224,164,170,224,165,141,224,164,176,224, +164,190,224,164,170,224,165,141,224,164,164,224,164,174,224,164,190,224,164,178, +224,164,191,224,164,149,224,165,139,224,164,130,224,164,176,224,164,171,224,164, +188,224,165,141,224,164,164,224,164,190,224,164,176,224,164,168,224,164,191,224, +164,176,224,165,141,224,164,174,224,164,190,224,164,163,224,164,178,224,164,191, +224,164,174,224,164,191,224,164,159,224,165,135,224,164,161,100,101,115,99,114, +105,112,116,105,111,110,34,32,99,111,110,116,101,110,116,61,34,100,111,99,117, +109,101,110,116,46,108,111,99,97,116,105,111,110,46,112,114,111,116,46,103,101, +116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,60,33,68,79 +,67,84,89,80,69,32,104,116,109,108,62,10,60,104,116,109,108,32,60,109,101,116,97 +,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,58,117,114,108,34,32 +,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,46,99,115,115,34,32, +114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,115,116,121,108,101 +,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,116,121,112,101,61 +,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,119,51,46,111,114, +103,47,49,57,57,57,47,120,104,116,109,108,34,32,120,109,108,116,121,112,101,61, +34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,109,101,116,104 +,111,100,61,34,103,101,116,34,32,97,99,116,105,111,110,61,34,108,105,110,107,32, +114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,32,61,32,100,111 +,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,116,121,112, +101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,47,62,99,101,108,108 +,112,97,100,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,46,99,115,115, +34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,47,97,62,60, +47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,34,32,119,105,100,116 +,104,61,34,49,34,32,104,101,105,103,104,116,61,34,49,34,34,62,60,97,32,104,114, +101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,115,116,121,108,101,61,34, +100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,97,108,116,101,114,110,97 +,116,101,34,32,116,121,112,101,61,34,97,112,112,108,105,45,47,47,87,51,67,47,47, +68,84,68,32,88,72,84,77,76,32,49,46,48,32,101,108,108,115,112,97,99,105,110,103, +61,34,48,34,32,99,101,108,108,112,97,100,32,116,121,112,101,61,34,104,105,100, +100,101,110,34,32,118,97,108,117,101,61,34,47,97,62,38,110,98,115,112,59,60,115, +112,97,110,32,114,111,108,101,61,34,115,10,60,105,110,112,117,116,32,116,121,112 +,101,61,34,104,105,100,100,101,110,34,32,108,97,110,103,117,97,103,101,61,34,74, +97,118,97,83,99,114,105,112,116,34,32,32,100,111,99,117,109,101,110,116,46,103, +101,116,69,108,101,109,101,110,116,115,66,103,61,34,48,34,32,99,101,108,108,115, +112,97,99,105,110,103,61,34,48,34,32,121,112,101,61,34,116,101,120,116,47,99,115 +,115,34,32,109,101,100,105,97,61,34,116,121,112,101,61,39,116,101,120,116,47,106 +,97,118,97,115,99,114,105,112,116,39,119,105,116,104,32,116,104,101,32,101,120, +99,101,112,116,105,111,110,32,111,102,32,121,112,101,61,34,116,101,120,116,47,99 +,115,115,34,32,114,101,108,61,34,115,116,32,104,101,105,103,104,116,61,34,49,34, +32,119,105,100,116,104,61,34,49,34,32,61,39,43,101,110,99,111,100,101,85,82,73, +67,111,109,112,111,110,101,110,116,40,60,108,105,110,107,32,114,101,108,61,34,97 +,108,116,101,114,110,97,116,101,34,32,10,98,111,100,121,44,32,116,114,44,32,105, +110,112,117,116,44,32,116,101,120,116,109,101,116,97,32,110,97,109,101,61,34,114 +,111,98,111,116,115,34,32,99,111,110,109,101,116,104,111,100,61,34,112,111,115, +116,34,32,97,99,116,105,111,110,61,34,62,10,60,97,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,119,119,119,46,99,115,115,34,32,114,101,108,61,34,115,116, +121,108,101,115,104,101,101,116,34,32,60,47,100,105,118,62,60,47,100,105,118,62, +60,100,105,118,32,99,108,97,115,115,108,97,110,103,117,97,103,101,61,34,106,97, +118,97,115,99,114,105,112,116,34,62,97,114,105,97,45,104,105,100,100,101,110,61, +34,116,114,117,101,34,62,194,183,60,114,105,112,116,34,32,116,121,112,101,61,34, +116,101,120,116,47,106,97,118,97,115,108,61,48,59,125,41,40,41,59,10,40,102,117, +110,99,116,105,111,110,40,41,123,98,97,99,107,103,114,111,117,110,100,45,105,109 +,97,103,101,58,32,117,114,108,40,47,97,62,60,47,108,105,62,60,108,105,62,60,97, +32,104,114,101,102,61,34,104,9,9,60,108,105,62,60,97,32,104,114,101,102,61,34, +104,116,116,112,58,47,47,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100, +101,110,61,34,116,114,117,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112, +58,47,47,119,119,119,46,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99 +,114,105,112,116,34,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111, +110,32,118,97,108,117,101,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118, +32,99,108,97,115,115,61,114,97,116,111,114,34,32,97,114,105,97,45,104,105,100, +100,101,110,61,34,116,114,101,61,40,110,101,119,32,68,97,116,101,41,46,103,101, +116,84,105,109,101,40,41,112,111,114,116,117,103,117,195,170,115,32,40,100,111, +32,66,114,97,115,105,108,41,208,190,209,128,208,179,208,176,208,189,208,184,208, +183,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208, +182,208,189,208,190,209,129,209,130,209,140,208,190,208,177,209,128,208,176,208, +183,208,190,208,178,208,176,208,189,208,184,209,143,209,128,208,181,208,179,208, +184,209,129,209,130,209,128,208,176,209,134,208,184,208,184,208,178,208,190,208, +183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,208,184,208,190,208, +177,209,143,208,183,208,176,209,130,208,181,208,187,209,140,208,189,208,176,60, +33,68,79,67,84,89,80,69,32,104,116,109,108,32,80,85,66,76,73,67,32,34,110,116,45 +,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,60,109 +,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101, +114,97,110,115,105,116,105,111,110,97,108,47,47,69,78,34,32,34,104,116,116,112, +58,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119, +119,119,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,84,68, +84,68,47,120,104,116,109,108,49,45,116,114,97,110,115,105,116,105,111,110,97,108 +,47,47,119,119,119,46,119,51,46,111,114,103,47,84,82,47,120,104,116,109,108,49, +47,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116, +39,59,60,109,101,116,97,32,110,97,109,101,61,34,100,101,115,99,114,105,112,116, +105,111,110,112,97,114,101,110,116,78,111,100,101,46,105,110,115,101,114,116,66, +101,102,111,114,101,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100, +100,101,110,34,32,110,97,106,115,34,32,116,121,112,101,61,34,116,101,120,116,47, +106,97,118,97,115,99,114,105,40,100,111,99,117,109,101,110,116,41,46,114,101,97, +100,121,40,102,117,110,99,116,105,115,99,114,105,112,116,32,116,121,112,101,61, +34,116,101,120,116,47,106,97,118,97,115,105,109,97,103,101,34,32,99,111,110,116, +101,110,116,61,34,104,116,116,112,58,47,47,85,65,45,67,111,109,112,97,116,105,98 +,108,101,34,32,99,111,110,116,101,110,116,61,116,109,108,59,32,99,104,97,114,115 +,101,116,61,117,116,102,45,56,34,32,47,62,10,108,105,110,107,32,114,101,108,61, +34,115,104,111,114,116,99,117,116,32,105,99,111,110,60,108,105,110,107,32,114, +101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,115,99,114,105 +,112,116,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,61,32,100,111,99, +117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,60,97,32,116 +,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,104,114,101,102,61,32,100, +111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,105, +110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61 +,97,46,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114, +105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110, +97,109,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56, +34,32,47,62,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,34 +,104,116,116,112,45,47,47,87,51,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49, +32,84,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,115,99,114,105,112, +116,39,41,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110, +34,32,110,97,109,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120, +116,47,106,97,118,97,115,34,32,115,116,121,108,101,61,34,100,105,115,112,108,97, +121,58,110,111,110,101,59,34,62,100,111,99,117,109,101,110,116,46,103,101,116,69 +,108,101,109,101,110,116,66,121,73,100,40,61,100,111,99,117,109,101,110,116,46, +99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,32,116,121,112,101,61,39, +116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,105,110,112,117,116, +32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,100,46,103, +101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,115,110 +,105,99,97,108,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119, +46,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,114,97,110,115,105,116, +60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34 +,62,10,10,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99, +115,115,34,62,105,111,110,97,108,46,100,116,100,34,62,10,60,104,116,109,108,32, +120,109,108,110,115,61,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110, +116,101,110,116,45,84,121,112,101,100,105,110,103,61,34,48,34,32,99,101,108,108, +115,112,97,99,105,110,103,61,34,48,34,104,116,109,108,59,32,99,104,97,114,115, +101,116,61,117,116,102,45,56,34,32,47,62,10,32,115,116,121,108,101,61,34,100,105 +,115,112,108,97,121,58,110,111,110,101,59,34,62,60,60,108,105,62,60,97,32,104, +114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,32,116,121,112,101,61, +39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,62,208,180,208,181 +,209,143,209,130,208,181,208,187,209,140,208,189,208,190,209,129,209,130,208,184 +,209,129,208,190,208,190,209,130,208,178,208,181,209,130,209,129,209,130,208,178 +,208,184,208,184,208,191,209,128,208,190,208,184,208,183,208,178,208,190,208,180 +,209,129,209,130,208,178,208,176,208,177,208,181,208,183,208,190,208,191,208,176 +,209,129,208,189,208,190,209,129,209,130,208,184,224,164,170,224,165,129,224,164 +,184,224,165,141,224,164,164,224,164,191,224,164,149,224,164,190,224,164,149,224 +,164,190,224,164,130,224,164,151,224,165,141,224,164,176,224,165,135,224,164,184 +,224,164,137,224,164,168,224,165,141,224,164,185,224,165,139,224,164,130,224,164 +,168,224,165,135,224,164,181,224,164,191,224,164,167,224,164,190,224,164,168,224 +,164,184,224,164,173,224,164,190,224,164,171,224,164,191,224,164,149,224,165,141 +,224,164,184,224,164,191,224,164,130,224,164,151,224,164,184,224,165,129,224,164 +,176,224,164,149,224,165,141,224,164,183,224,164,191,224,164,164,224,164,149,224 +,165,137,224,164,170,224,165,128,224,164,176,224,164,190,224,164,135,224,164,159 +,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164 +,170,224,164,168,224,164,149,224,164,190,224,164,176,224,165,141,224,164,176,224 +,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176 +,224,164,191,224,164,175,224,164,164,224,164,190 +}; diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/platform.c firefox-esr-140.10.0esr/modules/brotli/common/platform.c --- firefox-esr-140.9.1esr/modules/brotli/common/platform.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/platform.c 2026-04-15 01:59:55.000000000 +0000 @@ -4,10 +4,6 @@ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ -#include - -#include - #include "platform.h" /* Default brotli_alloc_func */ diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/platform.h firefox-esr-140.10.0esr/modules/brotli/common/platform.h --- firefox-esr-140.9.1esr/modules/brotli/common/platform.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/platform.h 2026-04-15 01:59:55.000000000 +0000 @@ -24,22 +24,13 @@ #ifndef BROTLI_COMMON_PLATFORM_H_ #define BROTLI_COMMON_PLATFORM_H_ -#include /* memcpy */ +#include +#include /* IWYU pragma: export memcmp, memcpy, memset */ +#include /* IWYU pragma: export exit, free, malloc */ +#include /* should include endian.h for us */ -#include -#include - -#if defined(OS_LINUX) || defined(OS_CYGWIN) || defined(__EMSCRIPTEN__) -#include -#elif defined(OS_FREEBSD) -#include -#elif defined(OS_MACOSX) -#include -/* Let's try and follow the Linux convention */ -#define BROTLI_X_BYTE_ORDER BYTE_ORDER -#define BROTLI_X_LITTLE_ENDIAN LITTLE_ENDIAN -#define BROTLI_X_BIG_ENDIAN BIG_ENDIAN -#endif +#include /* IWYU pragma: export */ +#include /* IWYU pragma: export */ #if BROTLI_MSVC_VERSION_CHECK(18, 0, 0) #include @@ -213,9 +204,23 @@ #define BROTLI_TARGET_LOONGARCH64 #endif +/* This does not seem to be an indicator of z/Architecture (64-bit); neither + that allows to use unaligned loads. */ +#if defined(__s390x__) +#define BROTLI_TARGET_S390X +#endif + +#if defined(__mips64) +#define BROTLI_TARGET_MIPS64 +#endif + +#if defined(__ia64__) || defined(_M_IA64) +#define BROTLI_TARGET_IA64 +#endif + #if defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8_64) || \ defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64) || \ - defined(BROTLI_TARGET_LOONGARCH64) + defined(BROTLI_TARGET_LOONGARCH64) || defined(BROTLI_TARGET_MIPS64) #define BROTLI_TARGET_64_BITS 1 #else #define BROTLI_TARGET_64_BITS 0 @@ -248,13 +253,12 @@ #define BROTLI_LITTLE_ENDIAN 1 #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) #define BROTLI_BIG_ENDIAN 1 -#elif defined(BROTLI_X_BYTE_ORDER) -#if BROTLI_X_BYTE_ORDER == BROTLI_X_LITTLE_ENDIAN +/* Likely target platform is iOS / OSX. */ +#elif defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN) #define BROTLI_LITTLE_ENDIAN 1 -#elif BROTLI_X_BYTE_ORDER == BROTLI_X_BIG_ENDIAN +#elif defined(BYTE_ORDER) && (BYTE_ORDER == BIG_ENDIAN) #define BROTLI_BIG_ENDIAN 1 #endif -#endif /* BROTLI_X_BYTE_ORDER */ #if !defined(BROTLI_LITTLE_ENDIAN) #define BROTLI_LITTLE_ENDIAN 0 @@ -264,12 +268,6 @@ #define BROTLI_BIG_ENDIAN 0 #endif -#if defined(BROTLI_X_BYTE_ORDER) -#undef BROTLI_X_BYTE_ORDER -#undef BROTLI_X_LITTLE_ENDIAN -#undef BROTLI_X_BIG_ENDIAN -#endif - #if defined(BROTLI_BUILD_NO_UNALIGNED_READ_FAST) #define BROTLI_UNALIGNED_READ_FAST (!!0) #elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \ @@ -284,6 +282,46 @@ #endif /* Portable unaligned memory access: read / write values via memcpy. */ +#if !defined(BROTLI_USE_PACKED_FOR_UNALIGNED) +#if defined(__mips__) && (!defined(__mips_isa_rev) || __mips_isa_rev < 6) +#define BROTLI_USE_PACKED_FOR_UNALIGNED 1 +#else +#define BROTLI_USE_PACKED_FOR_UNALIGNED 0 +#endif +#endif /* defined(BROTLI_USE_PACKED_FOR_UNALIGNED) */ + +#if BROTLI_USE_PACKED_FOR_UNALIGNED + +typedef union BrotliPackedValue { + uint16_t u16; + uint32_t u32; + uint64_t u64; + size_t szt; +} __attribute__ ((packed)) BrotliPackedValue; + +static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->u16; +} +static BROTLI_INLINE uint32_t BrotliUnalignedRead32(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->u32; +} +static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->u64; +} +static BROTLI_INLINE size_t BrotliUnalignedReadSizeT(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->szt; +} +static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { + BrotliPackedValue* address = (BrotliPackedValue*)p; + address->u64 = v; +} + +#else /* not BROTLI_USE_PACKED_FOR_UNALIGNED */ + static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) { uint16_t t; memcpy(&t, p, sizeof t); @@ -299,10 +337,43 @@ memcpy(&t, p, sizeof t); return t; } +static BROTLI_INLINE size_t BrotliUnalignedReadSizeT(const void* p) { + size_t t; + memcpy(&t, p, sizeof t); + return t; +} static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { memcpy(p, &v, sizeof v); } +#endif /* BROTLI_USE_PACKED_FOR_UNALIGNED */ + +#if BROTLI_GNUC_HAS_BUILTIN(__builtin_bswap16, 4, 3, 0) +#define BROTLI_BSWAP16(V) ((uint16_t)__builtin_bswap16(V)) +#else +#define BROTLI_BSWAP16(V) ((uint16_t)( \ + (((V) & 0xFFU) << 8) | \ + (((V) >> 8) & 0xFFU))) +#endif + +#if BROTLI_GNUC_HAS_BUILTIN(__builtin_bswap32, 4, 3, 0) +#define BROTLI_BSWAP32(V) ((uint32_t)__builtin_bswap32(V)) +#else +#define BROTLI_BSWAP32(V) ((uint32_t)( \ + (((V) & 0xFFU) << 24) | (((V) & 0xFF00U) << 8) | \ + (((V) >> 8) & 0xFF00U) | (((V) >> 24) & 0xFFU))) +#endif + +#if BROTLI_GNUC_HAS_BUILTIN(__builtin_bswap64, 4, 3, 0) +#define BROTLI_BSWAP64(V) ((uint64_t)__builtin_bswap64(V)) +#else +#define BROTLI_BSWAP64(V) ((uint64_t)( \ + (((V) & 0xFFU) << 56) | (((V) & 0xFF00U) << 40) | \ + (((V) & 0xFF0000U) << 24) | (((V) & 0xFF000000U) << 8) | \ + (((V) >> 8) & 0xFF000000U) | (((V) >> 24) & 0xFF0000U) | \ + (((V) >> 40) & 0xFF00U) | (((V) >> 56) & 0xFFU))) +#endif + #if BROTLI_LITTLE_ENDIAN /* Straight endianness. Just read / write values. */ #define BROTLI_UNALIGNED_LOAD16LE BrotliUnalignedRead16 @@ -310,32 +381,20 @@ #define BROTLI_UNALIGNED_LOAD64LE BrotliUnalignedRead64 #define BROTLI_UNALIGNED_STORE64LE BrotliUnalignedWrite64 #elif BROTLI_BIG_ENDIAN /* BROTLI_LITTLE_ENDIAN */ -/* Explain compiler to byte-swap values. */ -#define BROTLI_BSWAP16_(V) ((uint16_t)( \ - (((V) & 0xFFU) << 8) | \ - (((V) >> 8) & 0xFFU))) static BROTLI_INLINE uint16_t BROTLI_UNALIGNED_LOAD16LE(const void* p) { uint16_t value = BrotliUnalignedRead16(p); - return BROTLI_BSWAP16_(value); + return BROTLI_BSWAP16(value); } -#define BROTLI_BSWAP32_(V) ( \ - (((V) & 0xFFU) << 24) | (((V) & 0xFF00U) << 8) | \ - (((V) >> 8) & 0xFF00U) | (((V) >> 24) & 0xFFU)) static BROTLI_INLINE uint32_t BROTLI_UNALIGNED_LOAD32LE(const void* p) { uint32_t value = BrotliUnalignedRead32(p); - return BROTLI_BSWAP32_(value); + return BROTLI_BSWAP32(value); } -#define BROTLI_BSWAP64_(V) ( \ - (((V) & 0xFFU) << 56) | (((V) & 0xFF00U) << 40) | \ - (((V) & 0xFF0000U) << 24) | (((V) & 0xFF000000U) << 8) | \ - (((V) >> 8) & 0xFF000000U) | (((V) >> 24) & 0xFF0000U) | \ - (((V) >> 40) & 0xFF00U) | (((V) >> 56) & 0xFFU)) static BROTLI_INLINE uint64_t BROTLI_UNALIGNED_LOAD64LE(const void* p) { uint64_t value = BrotliUnalignedRead64(p); - return BROTLI_BSWAP64_(value); + return BROTLI_BSWAP64(value); } static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) { - uint64_t value = BROTLI_BSWAP64_(v); + uint64_t value = BROTLI_BSWAP64(v); BrotliUnalignedWrite64(p, value); } #else /* BROTLI_LITTLE_ENDIAN */ @@ -464,6 +523,14 @@ #define BROTLI_MIN(T, A, B) (brotli_min_ ## T((A), (B))) #define BROTLI_MAX(T, A, B) (brotli_max_ ## T((A), (B))) +static BROTLI_INLINE int brotli_safe_add_int(int a, int b, int* result) { + if (b > 0 && a > INT_MAX - b) return 0; + if (b < 0 && a < INT_MIN - b) return 0; + *result = a + b; + return 1; +} +#define BROTLI_SAFE_ADD(T, A, B, R) (brotli_safe_add_ ## T((A), (B), (R))) + #define BROTLI_SWAP(T, A, I, J) { \ T __brotli_swap_tmp = (A)[(I)]; \ (A)[(I)] = (A)[(J)]; \ @@ -475,7 +542,7 @@ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) #define BROTLI_TZCNT64 __builtin_ctzll #elif BROTLI_MSVC_VERSION_CHECK(18, 0, 0) -#if defined(BROTLI_TARGET_X64) +#if defined(BROTLI_TARGET_X64) && !defined(_M_ARM64EC) #define BROTLI_TZCNT64 _tzcnt_u64 #else /* BROTLI_TARGET_X64 */ static BROTLI_INLINE uint32_t BrotliBsf64Msvc(uint64_t x) { @@ -506,11 +573,29 @@ /* Default brotli_free_func */ BROTLI_COMMON_API void BrotliDefaultFreeFunc(void* opaque, void* address); +/* Circular logical rotates. */ +static BROTLI_INLINE uint16_t BrotliRotateRight16(uint16_t const value, + size_t count) { + count &= 0x0F; /* for fickle pattern recognition */ + return (value >> count) | (uint16_t)(value << ((0U - count) & 0x0F)); +} +static BROTLI_INLINE uint32_t BrotliRotateRight32(uint32_t const value, + size_t count) { + count &= 0x1F; /* for fickle pattern recognition */ + return (value >> count) | (uint32_t)(value << ((0U - count) & 0x1F)); +} +static BROTLI_INLINE uint64_t BrotliRotateRight64(uint64_t const value, + size_t count) { + count &= 0x3F; /* for fickle pattern recognition */ + return (value >> count) | (uint64_t)(value << ((0U - count) & 0x3F)); +} + BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) { BROTLI_UNUSED(&BrotliSuppressUnusedFunctions); BROTLI_UNUSED(&BrotliUnalignedRead16); BROTLI_UNUSED(&BrotliUnalignedRead32); BROTLI_UNUSED(&BrotliUnalignedRead64); + BROTLI_UNUSED(&BrotliUnalignedReadSizeT); BROTLI_UNUSED(&BrotliUnalignedWrite64); BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD16LE); BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD32LE); @@ -531,11 +616,80 @@ BROTLI_UNUSED(&brotli_max_uint32_t); BROTLI_UNUSED(&brotli_min_uint8_t); BROTLI_UNUSED(&brotli_max_uint8_t); + BROTLI_UNUSED(&brotli_safe_add_int); BROTLI_UNUSED(&BrotliDefaultAllocFunc); BROTLI_UNUSED(&BrotliDefaultFreeFunc); + BROTLI_UNUSED(&BrotliRotateRight16); + BROTLI_UNUSED(&BrotliRotateRight32); + BROTLI_UNUSED(&BrotliRotateRight64); #if BROTLI_ENABLE_DUMP BROTLI_UNUSED(&BrotliDump); #endif } +#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) && \ + !defined(_M_ARM64EC) +/* _mm_prefetch() is not defined outside of x86/x64 */ +/* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +#include +#define PREFETCH_L1(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +#define PREFETCH_L2(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T1) +#elif BROTLI_GNUC_HAS_BUILTIN(__builtin_prefetch, 3, 1, 0) +#define PREFETCH_L1(ptr) \ + __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +#define PREFETCH_L2(ptr) \ + __builtin_prefetch((ptr), 0 /* rw==read */, 2 /* locality */) +#elif defined(__aarch64__) +#define PREFETCH_L1(ptr) \ + do { \ + __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr))); \ + } while (0) +#define PREFETCH_L2(ptr) \ + do { \ + __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr))); \ + } while (0) +#else +#define PREFETCH_L1(ptr) \ + do { \ + (void)(ptr); \ + } while (0) /* disabled */ +#define PREFETCH_L2(ptr) \ + do { \ + (void)(ptr); \ + } while (0) /* disabled */ +#endif + +/* The SIMD matchers are only faster at certain quality levels. */ +#if defined(_M_X64) && defined(BROTLI_TZCNT64) +#define BROTLI_MAX_SIMD_QUALITY 7 +#elif defined(BROTLI_TZCNT64) +#define BROTLI_MAX_SIMD_QUALITY 6 +#endif + +#if defined(_MSC_VER) +#define BROTLI_CRASH() __debugbreak(), (void)abort() +#elif BROTLI_GNUC_HAS_BUILTIN(__builtin_trap, 3, 0, 0) +#define BROTLI_CRASH() (void)__builtin_trap() +#else +#define BROTLI_CRASH() (void)abort() +#endif + +/* Make BROTLI_TEST=0 act same as undefined. */ +#if defined(BROTLI_TEST) && ((1-BROTLI_TEST-1) == 0) +#undef BROTLI_TEST +#endif + +#if !defined(BROTLI_MODEL) && BROTLI_GNUC_HAS_ATTRIBUTE(model, 3, 0, 3) && \ + !defined(BROTLI_TARGET_IA64) && !defined(BROTLI_TARGET_LOONGARCH64) +#define BROTLI_MODEL(M) __attribute__((model(M))) +#else +#define BROTLI_MODEL(M) /* M */ +#endif + +#if !defined(BROTLI_COLD) && BROTLI_GNUC_HAS_ATTRIBUTE(cold, 4, 3, 0) +#define BROTLI_COLD __attribute__((cold)) +#else +#define BROTLI_COLD /* cold */ +#endif + #endif /* BROTLI_COMMON_PLATFORM_H_ */ diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/shared_dictionary.c firefox-esr-140.10.0esr/modules/brotli/common/shared_dictionary.c --- firefox-esr-140.9.1esr/modules/brotli/common/shared_dictionary.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/shared_dictionary.c 2026-04-15 01:59:56.000000000 +0000 @@ -8,10 +8,6 @@ #include -#include -#include /* malloc, free */ -#include - #include "dictionary.h" #include "platform.h" #include "shared_dictionary_internal.h" @@ -279,7 +275,7 @@ size_t pos = 0; uint32_t chunk_size = 0; size_t total_prefix_suffix_count = 0; - size_t trasform_list_start[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS]; + size_t transform_list_start[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS]; uint16_t temporary_prefix_suffix_table[256]; /* Skip magic header bytes. */ @@ -333,7 +329,7 @@ for (i = 0; i < dict->num_transform_lists; i++) { BROTLI_BOOL ok = BROTLI_FALSE; size_t prefix_suffix_count = 0; - trasform_list_start[i] = pos; + transform_list_start[i] = pos; dict->transforms_instances[i].prefix_suffix_map = temporary_prefix_suffix_table; ok = ParseTransformsList( @@ -351,7 +347,7 @@ total_prefix_suffix_count = 0; for (i = 0; i < dict->num_transform_lists; i++) { size_t prefix_suffix_count = 0; - size_t position = trasform_list_start[i]; + size_t position = transform_list_start[i]; uint16_t* prefix_suffix_map = &dict->prefix_suffix_maps[total_prefix_suffix_count]; BROTLI_BOOL ok = ParsePrefixSuffixTable( diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/shared_dictionary_internal.h firefox-esr-140.10.0esr/modules/brotli/common/shared_dictionary_internal.h --- firefox-esr-140.9.1esr/modules/brotli/common/shared_dictionary_internal.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/shared_dictionary_internal.h 2026-04-15 01:59:56.000000000 +0000 @@ -10,9 +10,9 @@ #define BROTLI_COMMON_SHARED_DICTIONARY_INTERNAL_H_ #include -#include #include "dictionary.h" +#include "platform.h" #include "transform.h" #if defined(__cplusplus) || defined(c_plusplus) diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/static_init.h firefox-esr-140.10.0esr/modules/brotli/common/static_init.h --- firefox-esr-140.9.1esr/modules/brotli/common/static_init.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/static_init.h 2026-04-15 01:59:56.000000000 +0000 @@ -0,0 +1,56 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* + Central point for static initialization. + + In case of "lazy" mode `BrotliXxxLazyStaticInit` is not provided by the + library. Embedder is responsible for providing it. This function should call + `BrotliXxxLazyStaticInitInner` on the first invocation. This function should + not return until execution of `BrotliXxxLazyStaticInitInner` is finished. + In C or before C++11 it is possible to call `BrotliXxxLazyStaticInitInner` + on start-up path and then `BrotliEncoderLazyStaticInit` is could be no-op; + another option is to use available thread execution controls to meet the + requirements. For possible C++11 implementation see static_init_lazy.cc. +*/ + +#ifndef THIRD_PARTY_BROTLI_COMMON_STATIC_INIT_H_ +#define THIRD_PARTY_BROTLI_COMMON_STATIC_INIT_H_ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +/* Static data is "initialized" in compile time. */ +#define BROTLI_STATIC_INIT_NONE 0 +/* Static data is initialized before "main". */ +#define BROTLI_STATIC_INIT_EARLY 1 +/* Static data is initialized when first encoder is created. */ +#define BROTLI_STATIC_INIT_LAZY 2 + +#define BROTLI_STATIC_INIT_DEFAULT BROTLI_STATIC_INIT_NONE + +#if !defined(BROTLI_STATIC_INIT) +#define BROTLI_STATIC_INIT BROTLI_STATIC_INIT_DEFAULT +#endif + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) && \ + (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_EARLY) && \ + (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_LAZY) +#error Invalid value for BROTLI_STATIC_INIT +#endif + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) +#if defined(BROTLI_EXTERNAL_DICTIONARY_DATA) +#error BROTLI_STATIC_INIT_EARLY will fail with BROTLI_EXTERNAL_DICTIONARY_DATA +#endif +#endif /* BROTLI_STATIC_INIT */ + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif + +#endif // THIRD_PARTY_BROTLI_COMMON_STATIC_INIT_H_ diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/transform.c firefox-esr-140.10.0esr/modules/brotli/common/transform.c --- firefox-esr-140.9.1esr/modules/brotli/common/transform.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/transform.c 2026-04-15 01:59:56.000000000 +0000 @@ -4,6 +4,7 @@ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ +#include "platform.h" #include "transform.h" #if defined(__cplusplus) || defined(c_plusplus) @@ -11,7 +12,7 @@ #endif /* RFC 7932 transforms string data */ -static const char kPrefixSuffix[217] = +static const BROTLI_MODEL("small") char kPrefixSuffix[217] = "\1 \2, \10 of the \4 of \2s \1.\5 and \4 " /* 0x _0 _2 __5 _E _3 _6 _8 _E */ "in \1\"\4 to \2\">\1\n\2. \1]\5 for \3 a \6 " @@ -27,7 +28,7 @@ "t \4ize \2\xc2\xa0\4ous \5 the \2e "; /* \0 - implicit trailing zero. */ /* Cx _2 _7___ ___ _A _F _5 _8 */ -static const uint16_t kPrefixSuffixMap[50] = { +static const BROTLI_MODEL("small") uint16_t kPrefixSuffixMap[50] = { 0x00, 0x02, 0x05, 0x0E, 0x13, 0x16, 0x18, 0x1E, 0x23, 0x25, 0x2A, 0x2D, 0x2F, 0x32, 0x34, 0x3A, 0x3E, 0x45, 0x47, 0x4E, 0x55, 0x5A, 0x5C, 0x63, 0x68, 0x6D, 0x72, 0x77, 0x7A, 0x7C, @@ -36,7 +37,7 @@ }; /* RFC 7932 transforms */ -static const uint8_t kTransformsData[] = { +static const BROTLI_MODEL("small") uint8_t kTransformsData[] = { 49, BROTLI_TRANSFORM_IDENTITY, 49, 49, BROTLI_TRANSFORM_IDENTITY, 0, 0, BROTLI_TRANSFORM_IDENTITY, 0, @@ -160,7 +161,8 @@ 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 34, }; -static const BrotliTransforms kBrotliTransforms = { +static const BROTLI_MODEL("small") +BrotliTransforms kBrotliTransforms = { sizeof(kPrefixSuffix), (const uint8_t*)kPrefixSuffix, kPrefixSuffixMap, diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/transform.h firefox-esr-140.10.0esr/modules/brotli/common/transform.h --- firefox-esr-140.9.1esr/modules/brotli/common/transform.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/transform.h 2026-04-15 01:59:56.000000000 +0000 @@ -8,8 +8,7 @@ #ifndef BROTLI_COMMON_TRANSFORM_H_ #define BROTLI_COMMON_TRANSFORM_H_ -#include -#include +#include "platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff -Nru firefox-esr-140.9.1esr/modules/brotli/common/version.h firefox-esr-140.10.0esr/modules/brotli/common/version.h --- firefox-esr-140.9.1esr/modules/brotli/common/version.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/common/version.h 2026-04-15 01:59:56.000000000 +0000 @@ -18,7 +18,7 @@ BrotliEncoderVersion methods. */ #define BROTLI_VERSION_MAJOR 1 -#define BROTLI_VERSION_MINOR 1 +#define BROTLI_VERSION_MINOR 2 #define BROTLI_VERSION_PATCH 0 #define BROTLI_VERSION BROTLI_MAKE_HEX_VERSION( \ @@ -32,9 +32,9 @@ - interfaces not changed -> current:revision+1:age */ -#define BROTLI_ABI_CURRENT 2 +#define BROTLI_ABI_CURRENT 3 #define BROTLI_ABI_REVISION 0 -#define BROTLI_ABI_AGE 1 +#define BROTLI_ABI_AGE 2 #if BROTLI_VERSION_MAJOR != (BROTLI_ABI_CURRENT - BROTLI_ABI_AGE) #error ABI/API version inconsistency diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/bit_reader.c firefox-esr-140.10.0esr/modules/brotli/dec/bit_reader.c --- firefox-esr-140.9.1esr/modules/brotli/dec/bit_reader.c 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/bit_reader.c 2026-04-15 01:59:56.000000000 +0000 @@ -8,15 +8,14 @@ #include "bit_reader.h" -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif -const brotli_reg_t kBrotliBitMask[33] = { 0x00000000, +const BROTLI_MODEL("small") +brotli_reg_t kBrotliBitMask[33] = { 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, @@ -27,12 +26,12 @@ 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF }; -void BrotliInitBitReader(BrotliBitReader* const br) { +void BrotliInitBitReader(BrotliBitReader* br) { br->val_ = 0; br->bit_pos_ = 0; } -BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) { +BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* br) { size_t aligned_read_mask = (sizeof(br->val_) >> 1) - 1; /* Fixing alignment after unaligned BrotliFillWindow would result accumulator overflow. If unalignment is caused by BrotliSafeReadBits, then there is @@ -56,7 +55,7 @@ return BROTLI_TRUE; } -BROTLI_BOOL BrotliSafeReadBits32Slow(BrotliBitReader* const br, +BROTLI_BOOL BrotliSafeReadBits32Slow(BrotliBitReader* br, brotli_reg_t n_bits, brotli_reg_t* val) { brotli_reg_t low_val; brotli_reg_t high_val; diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/bit_reader.h firefox-esr-140.10.0esr/modules/brotli/dec/bit_reader.h --- firefox-esr-140.9.1esr/modules/brotli/dec/bit_reader.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/bit_reader.h 2026-04-15 01:59:56.000000000 +0000 @@ -9,10 +9,6 @@ #ifndef BROTLI_DEC_BIT_READER_H_ #define BROTLI_DEC_BIT_READER_H_ -#include /* memcpy */ - -#include - #include "../common/constants.h" #include "../common/platform.h" diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/decode.c firefox-esr-140.10.0esr/modules/brotli/dec/decode.c --- firefox-esr-140.9.1esr/modules/brotli/dec/decode.c 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/decode.c 2026-04-15 01:59:56.000000000 +0000 @@ -6,9 +6,6 @@ #include -#include /* free, malloc */ -#include /* memcpy, memset */ - #include "../common/constants.h" #include "../common/context.h" #include "../common/dictionary.h" @@ -20,6 +17,7 @@ #include "huffman.h" #include "prefix.h" #include "state.h" +#include "static_init.h" #if defined(BROTLI_TARGET_NEON) #include @@ -46,16 +44,19 @@ 255 prefix + 32 base + 255 suffix */ static const brotli_reg_t kRingBufferWriteAheadSlack = 542; -static const uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = { +static const BROTLI_MODEL("small") +uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = { 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, }; /* Static prefix code for the complex code length code lengths. */ -static const uint8_t kCodeLengthPrefixLength[16] = { +static const BROTLI_MODEL("small") +uint8_t kCodeLengthPrefixLength[16] = { 2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 4, }; -static const uint8_t kCodeLengthPrefixValue[16] = { +static const BROTLI_MODEL("small") +uint8_t kCodeLengthPrefixValue[16] = { 0, 4, 3, 2, 0, 4, 3, 1, 0, 4, 3, 2, 0, 4, 3, 5, }; @@ -78,6 +79,10 @@ BrotliDecoderState* BrotliDecoderCreateInstance( brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) { BrotliDecoderState* state = 0; + if (!BrotliDecoderEnsureStaticInit()) { + BROTLI_DUMP(); + return 0; + } if (!alloc_func && !free_func) { state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState)); } else if (alloc_func && free_func) { @@ -217,7 +222,7 @@ s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG; return BROTLI_DECODER_NEEDS_MORE_INPUT; } - *value = (1U << *value) + bits; + *value = ((brotli_reg_t)1U << *value) + bits; s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE; return BROTLI_DECODER_SUCCESS; @@ -466,6 +471,53 @@ return result; } +/* Reads up to limit symbols from br and copies them into ringbuffer, + starting from pos. Caller must ensure that there is enough space + for the write. Returns the amount of symbols actually copied. */ +static BROTLI_INLINE int BrotliCopyPreloadedSymbolsToU8(const HuffmanCode* table, + BrotliBitReader* br, + brotli_reg_t* bits, + brotli_reg_t* value, + uint8_t* ringbuffer, + int pos, + const int limit) { + /* Calculate range where CheckInputAmount is always true. + Start with the number of bytes we can read. */ + int64_t new_lim = br->guard_in - br->next_in; + /* Convert to bits, since symbols use variable number of bits. */ + new_lim *= 8; + /* At most 15 bits per symbol, so this is safe. */ + new_lim /= 15; + const int kMaximalOverread = 4; + int pos_limit = limit; + int copies = 0; + if ((new_lim - kMaximalOverread) <= limit) { + // Safe cast, since new_lim is already < num_steps + pos_limit = (int)(new_lim - kMaximalOverread); + } + if (pos_limit < 0) { + pos_limit = 0; + } + copies = pos_limit; + pos_limit += pos; + /* Fast path, caller made sure it is safe to write, + we verified that is is safe to read. */ + for (; pos < pos_limit; pos++) { + BROTLI_DCHECK(BrotliCheckInputAmount(br)); + ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value); + BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos); + } + /* Do the remainder, caller made sure it is safe to write, + we need to bverify that it is safe to read. */ + while (BrotliCheckInputAmount(br) && copies < limit) { + ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value); + BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos); + pos++; + copies++; + } + return copies; +} + static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) { brotli_reg_t result = 0; while (x) { @@ -1089,7 +1141,7 @@ h->context_index = context_index; return BROTLI_DECODER_NEEDS_MORE_INPUT; } - reps += 1U << code; + reps += (brotli_reg_t)1U << code; BROTLI_LOG_UINT(reps); if (context_index + reps > context_map_size) { return @@ -1124,7 +1176,7 @@ /* Decodes a command or literal and updates block type ring-buffer. Reads 3..54 bits. */ -static BROTLI_INLINE BROTLI_BOOL DecodeBlockTypeAndLength( +static BROTLI_INLINE BrotliDecoderErrorCode DecodeBlockTypeAndLength( int safe, BrotliDecoderState* s, int tree_type) { brotli_reg_t max_block_type = s->num_block_types[tree_type]; const HuffmanCode* type_tree = &s->block_type_trees[ @@ -1135,7 +1187,7 @@ brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2]; brotli_reg_t block_type; if (max_block_type <= 1) { - return BROTLI_FALSE; + return BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH; } /* Read 0..15 + 3..39 bits. */ @@ -1145,11 +1197,13 @@ } else { BrotliBitReaderState memento; BrotliBitReaderSaveState(br, &memento); - if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE; + if (!SafeReadSymbol(type_tree, br, &block_type)) { + return BROTLI_DECODER_NEEDS_MORE_INPUT; + } if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) { s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE; BrotliBitReaderRestoreState(br, &memento); - return BROTLI_FALSE; + return BROTLI_DECODER_NEEDS_MORE_INPUT; } } @@ -1165,7 +1219,7 @@ } ringbuffer[0] = ringbuffer[1]; ringbuffer[1] = block_type; - return BROTLI_TRUE; + return BROTLI_DECODER_SUCCESS; } static BROTLI_INLINE void DetectTrivialLiteralBlockTypes( @@ -1202,59 +1256,65 @@ /* Decodes the block type and updates the state for literal context. Reads 3..54 bits. */ -static BROTLI_INLINE BROTLI_BOOL DecodeLiteralBlockSwitchInternal( +static BROTLI_INLINE BrotliDecoderErrorCode DecodeLiteralBlockSwitchInternal( int safe, BrotliDecoderState* s) { - if (!DecodeBlockTypeAndLength(safe, s, 0)) { - return BROTLI_FALSE; + BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 0); + if (result != BROTLI_DECODER_SUCCESS) { + return result; } PrepareLiteralDecoding(s); - return BROTLI_TRUE; + return BROTLI_DECODER_SUCCESS; } -static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) { - DecodeLiteralBlockSwitchInternal(0, s); +static BROTLI_NOINLINE BrotliDecoderErrorCode +DecodeLiteralBlockSwitch(BrotliDecoderState* s) { + return DecodeLiteralBlockSwitchInternal(0, s); } -static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch( +static BROTLI_NOINLINE BrotliDecoderErrorCode SafeDecodeLiteralBlockSwitch( BrotliDecoderState* s) { return DecodeLiteralBlockSwitchInternal(1, s); } /* Block switch for insert/copy length. Reads 3..54 bits. */ -static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal( +static BROTLI_INLINE BrotliDecoderErrorCode DecodeCommandBlockSwitchInternal( int safe, BrotliDecoderState* s) { - if (!DecodeBlockTypeAndLength(safe, s, 1)) { - return BROTLI_FALSE; + BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 1); + if (result != BROTLI_DECODER_SUCCESS) { + return result; } s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]]; - return BROTLI_TRUE; + return BROTLI_DECODER_SUCCESS; } -static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) { - DecodeCommandBlockSwitchInternal(0, s); +static BROTLI_NOINLINE BrotliDecoderErrorCode +DecodeCommandBlockSwitch(BrotliDecoderState* s) { + return DecodeCommandBlockSwitchInternal(0, s); } -static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch( - BrotliDecoderState* s) { +static BROTLI_NOINLINE BrotliDecoderErrorCode +SafeDecodeCommandBlockSwitch(BrotliDecoderState* s) { return DecodeCommandBlockSwitchInternal(1, s); } /* Block switch for distance codes. Reads 3..54 bits. */ -static BROTLI_INLINE BROTLI_BOOL DecodeDistanceBlockSwitchInternal( +static BROTLI_INLINE BrotliDecoderErrorCode DecodeDistanceBlockSwitchInternal( int safe, BrotliDecoderState* s) { - if (!DecodeBlockTypeAndLength(safe, s, 2)) { - return BROTLI_FALSE; + BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 2); + if (result != BROTLI_DECODER_SUCCESS) { + return result; } s->dist_context_map_slice = s->dist_context_map + (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS); s->dist_htree_index = s->dist_context_map_slice[s->distance_context]; - return BROTLI_TRUE; + return BROTLI_DECODER_SUCCESS; } -static void BROTLI_NOINLINE DecodeDistanceBlockSwitch(BrotliDecoderState* s) { - DecodeDistanceBlockSwitchInternal(0, s); +static BROTLI_NOINLINE BrotliDecoderErrorCode +DecodeDistanceBlockSwitch(BrotliDecoderState* s) { + return DecodeDistanceBlockSwitchInternal(0, s); } static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch( @@ -1363,6 +1423,7 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE SkipMetadataBlock(BrotliDecoderState* s) { BrotliBitReader* br = &s->br; + int nbytes; if (s->meta_block_remaining_len == 0) { return BROTLI_DECODER_SUCCESS; @@ -1373,7 +1434,7 @@ /* Drain accumulator. */ if (BrotliGetAvailableBits(br) >= 8) { uint8_t buffer[8]; - int nbytes = (int)(BrotliGetAvailableBits(br)) >> 3; + nbytes = (int)(BrotliGetAvailableBits(br)) >> 3; BROTLI_DCHECK(nbytes <= 8); if (nbytes > s->meta_block_remaining_len) { nbytes = s->meta_block_remaining_len; @@ -1390,7 +1451,7 @@ } /* Direct access to metadata is possible. */ - int nbytes = (int)BrotliGetRemainingBytes(br); + nbytes = (int)BrotliGetRemainingBytes(br); if (nbytes > s->meta_block_remaining_len) { nbytes = s->meta_block_remaining_len; } @@ -1465,6 +1526,8 @@ static BROTLI_BOOL AttachCompoundDictionary( BrotliDecoderState* state, const uint8_t* data, size_t size) { BrotliDecoderCompoundDictionary* addon = state->compound_dictionary; + int new_size = (int)size; + if (new_size < 0 || (size_t)new_size != size) return BROTLI_FALSE; if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE; if (!addon) { addon = (BrotliDecoderCompoundDictionary*)BROTLI_DECODER_ALLOC( @@ -1479,14 +1542,17 @@ state->compound_dictionary = addon; } if (addon->num_chunks == 15) return BROTLI_FALSE; + if (!BROTLI_SAFE_ADD(int, addon->total_size, new_size, &new_size)) { + return BROTLI_FALSE; + } addon->chunks[addon->num_chunks] = data; addon->num_chunks++; - addon->total_size += (int)size; - addon->chunk_offsets[addon->num_chunks] = addon->total_size; + addon->total_size = new_size; + addon->chunk_offsets[addon->num_chunks] = new_size; return BROTLI_TRUE; } -static void EnsureCoumpoundDictionaryInitialized(BrotliDecoderState* state) { +static void EnsureCompoundDictionaryInitialized(BrotliDecoderState* state) { BrotliDecoderCompoundDictionary* addon = state->compound_dictionary; /* 256 = (1 << 8) slots in block map. */ int block_bits = 8; @@ -1507,7 +1573,7 @@ int address, int length) { BrotliDecoderCompoundDictionary* addon = s->compound_dictionary; int index; - EnsureCoumpoundDictionaryInitialized(s); + EnsureCompoundDictionaryInitialized(s); index = addon->block_map[address >> addon->block_bits]; while (address >= addon->chunk_offsets[index + 1]) index++; if (addon->total_size < address + length) return BROTLI_FALSE; @@ -1753,7 +1819,7 @@ brotli_reg_t npostfix = s->distance_postfix_bits; brotli_reg_t ndirect = s->num_direct_distance_codes; brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit; - brotli_reg_t postfix = 1u << npostfix; + brotli_reg_t postfix = (brotli_reg_t)1u << npostfix; brotli_reg_t j; brotli_reg_t bits = 1; brotli_reg_t half = 0; @@ -1887,6 +1953,9 @@ return BrotliCheckInputAmount(br); } +/* NB: METHOD should return BROTLI_FALSE only in case there is not enough input; + in case of "unsafe" execution, when input is guaranteed to be sufficient, + result is ignored. */ #define BROTLI_SAFE(METHOD) \ { \ if (safe) { \ @@ -1899,6 +1968,22 @@ } \ } +/* NB: METHOD should return BROTLI_DECODER_SUCCESS, BROTLI_DECODER_ERROR_*, or + BROTLI_DECODER_NEEDS_MORE_INPUT; the later two break the processing. */ +#define BROTLI_SAFE_WITH_STATUS(METHOD) \ + { \ + BrotliDecoderErrorCode status; \ + if (safe) { \ + status = Safe##METHOD; \ + } else { \ + status = METHOD; \ + } \ + if (status != BROTLI_DECODER_SUCCESS) { \ + result = status; \ + goto saveStateAndReturn; \ + } \ + } + static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal( int safe, BrotliDecoderState* s) { int pos = s->pos; @@ -1938,7 +2023,7 @@ goto saveStateAndReturn; } if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) { - BROTLI_SAFE(DecodeCommandBlockSwitch(s)); + BROTLI_SAFE_WITH_STATUS(DecodeCommandBlockSwitch(s)); goto CommandBegin; } /* Read the insert/copy length in the command. */ @@ -1959,35 +2044,72 @@ brotli_reg_t bits; brotli_reg_t value; PreloadSymbol(safe, s->literal_htree, br, &bits, &value); - do { - if (!CheckInputAmount(safe, br)) { - s->state = BROTLI_STATE_COMMAND_INNER; - result = BROTLI_DECODER_NEEDS_MORE_INPUT; - goto saveStateAndReturn; - } - if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) { - goto NextLiteralBlock; - } - if (!safe) { - s->ringbuffer[pos] = - (uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value); - } else { + if (!safe) { + // This is a hottest part of the decode, so we copy the loop below + // and optimize it by calculating the number of steps where all checks + // evaluate to false (ringbuffer size/block size/input size). + // Since all checks are loop invariant, we just need to find + // minimal number of iterations for a simple loop, and run + // the full version for the remainder. + int num_steps = i - 1; + if (num_steps > 0 && ((brotli_reg_t)(num_steps) > s->block_length[0])) { + // Safe cast, since block_length < steps + num_steps = (int)s->block_length[0]; + } + if (s->ringbuffer_size >= pos && + (s->ringbuffer_size - pos) <= num_steps) { + num_steps = s->ringbuffer_size - pos - 1; + } + if (num_steps < 0) { + num_steps = 0; + } + num_steps = BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, + &value, s->ringbuffer, pos, + num_steps); + pos += num_steps; + s->block_length[0] -= (brotli_reg_t)num_steps; + i -= num_steps; + do { + if (!CheckInputAmount(safe, br)) { + s->state = BROTLI_STATE_COMMAND_INNER; + result = BROTLI_DECODER_NEEDS_MORE_INPUT; + goto saveStateAndReturn; + } + if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) { + goto NextLiteralBlock; + } + BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, &value, + s->ringbuffer, pos, 1); + --s->block_length[0]; + BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos); + ++pos; + if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) { + s->state = BROTLI_STATE_COMMAND_INNER_WRITE; + --i; + goto saveStateAndReturn; + } + } while (--i != 0); + } else { /* safe */ + do { + if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) { + goto NextLiteralBlock; + } brotli_reg_t literal; if (!SafeReadSymbol(s->literal_htree, br, &literal)) { result = BROTLI_DECODER_NEEDS_MORE_INPUT; goto saveStateAndReturn; } s->ringbuffer[pos] = (uint8_t)literal; - } - --s->block_length[0]; - BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos); - ++pos; - if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) { - s->state = BROTLI_STATE_COMMAND_INNER_WRITE; - --i; - goto saveStateAndReturn; - } - } while (--i != 0); + --s->block_length[0]; + BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos); + ++pos; + if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) { + s->state = BROTLI_STATE_COMMAND_INNER_WRITE; + --i; + goto saveStateAndReturn; + } + } while (--i != 0); + } } else { uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask]; uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask]; @@ -2046,7 +2168,7 @@ } else { /* Read distance code in the command, unless it was implicitly zero. */ if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) { - BROTLI_SAFE(DecodeDistanceBlockSwitch(s)); + BROTLI_SAFE_WITH_STATUS(DecodeDistanceBlockSwitch(s)); } BROTLI_SAFE(ReadDistance(s, br)); } @@ -2240,7 +2362,7 @@ } NextLiteralBlock: - BROTLI_SAFE(DecodeLiteralBlockSwitch(s)); + BROTLI_SAFE_WITH_STATUS(DecodeLiteralBlockSwitch(s)); goto CommandInner; saveStateAndReturn: @@ -2462,6 +2584,8 @@ if (result != BROTLI_DECODER_SUCCESS) { break; } + BROTLI_DCHECK(s->meta_block_remaining_len <= + (int)BROTLI_BLOCK_SIZE_CAP); BROTLI_LOG_UINT(s->is_last_metablock); BROTLI_LOG_UINT(s->meta_block_remaining_len); BROTLI_LOG_UINT(s->is_metadata); @@ -2855,16 +2979,15 @@ /* Escalate internal functions visibility; for testing purposes only. */ #if defined(BROTLI_TEST) -BROTLI_BOOL SafeReadSymbolForTest( +BROTLI_BOOL BrotliSafeReadSymbolForTest( const HuffmanCode*, BrotliBitReader*, brotli_reg_t*); -BROTLI_BOOL SafeReadSymbolForTest( +BROTLI_BOOL BrotliSafeReadSymbolForTest( const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) { return SafeReadSymbol(table, br, result); } - -void InverseMoveToFrontTransformForTest( +void BrotliInverseMoveToFrontTransformForTest( uint8_t*, brotli_reg_t, BrotliDecoderState*); -void InverseMoveToFrontTransformForTest( +void BrotliInverseMoveToFrontTransformForTest( uint8_t* v, brotli_reg_t l, BrotliDecoderState* s) { InverseMoveToFrontTransform(v, l, s); } diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/huffman.c firefox-esr-140.10.0esr/modules/brotli/dec/huffman.c --- firefox-esr-140.9.1esr/modules/brotli/dec/huffman.c 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/huffman.c 2026-04-15 01:59:56.000000000 +0000 @@ -8,10 +8,6 @@ #include "huffman.h" -#include /* memcpy, memset */ - -#include - #include "../common/constants.h" #include "../common/platform.h" @@ -26,7 +22,8 @@ ((sizeof(brotli_reg_t) << 3) - BROTLI_REVERSE_BITS_MAX) #else #define BROTLI_REVERSE_BITS_BASE 0 -static uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = { +static BROTLI_MODEL("small") +uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = { 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/huffman.h firefox-esr-140.10.0esr/modules/brotli/dec/huffman.h --- firefox-esr-140.9.1esr/modules/brotli/dec/huffman.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/huffman.h 2026-04-15 01:59:56.000000000 +0000 @@ -9,8 +9,6 @@ #ifndef BROTLI_DEC_HUFFMAN_H_ #define BROTLI_DEC_HUFFMAN_H_ -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/prefix.c firefox-esr-140.10.0esr/modules/brotli/dec/prefix.c --- firefox-esr-140.9.1esr/modules/brotli/dec/prefix.c 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/prefix.c 2026-04-15 01:59:56.000000000 +0000 @@ -0,0 +1,67 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +#include "prefix.h" + +#include "../common/platform.h" /* IWYU pragma: keep */ +#include "../common/static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +#include "../common/constants.h" +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_NONE) +/* Embed kCmdLut. */ +#include "prefix_inc.h" +#else +BROTLI_COLD BROTLI_BOOL BrotliDecoderInitCmdLut(CmdLutElement* items) { + static const uint8_t kInsertLengthExtraBits[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, + 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0E, 0x18}; + static const uint8_t kCopyLengthExtraBits[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, + 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x18}; + static const uint8_t kCellPos[11] = {0, 1, 0, 1, 8, 9, 2, 16, 10, 17, 18}; + + uint16_t insert_length_offsets[24]; + uint16_t copy_length_offsets[24]; + insert_length_offsets[0] = 0; + copy_length_offsets[0] = 2; + for (size_t i = 0; i < 23; ++i) { + insert_length_offsets[i + 1] = + insert_length_offsets[i] + (uint16_t)(1u << kInsertLengthExtraBits[i]); + copy_length_offsets[i + 1] = + copy_length_offsets[i] + (uint16_t)(1u << kCopyLengthExtraBits[i]); + } + + for (size_t symbol = 0; symbol < BROTLI_NUM_COMMAND_SYMBOLS; ++symbol) { + CmdLutElement* item = items + symbol; + const size_t cell_idx = symbol >> 6; + const size_t cell_pos = kCellPos[cell_idx]; + const size_t copy_code = ((cell_pos << 3) & 0x18) + (symbol & 0x7); + const uint16_t copy_len_offset = copy_length_offsets[copy_code]; + const size_t insert_code = (cell_pos & 0x18) + ((symbol >> 3) & 0x7); + item->copy_len_extra_bits = kCopyLengthExtraBits[copy_code]; + item->context = (copy_len_offset > 4) ? 3 : ((uint8_t)copy_len_offset - 2); + item->copy_len_offset = copy_len_offset; + item->distance_code = (cell_idx >= 2) ? -1 : 0; + item->insert_len_extra_bits = kInsertLengthExtraBits[insert_code]; + item->insert_len_offset = insert_length_offsets[insert_code]; + } + return BROTLI_TRUE; +} + +BROTLI_MODEL("small") +CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS]; +#endif /* BROTLI_STATIC_INIT */ + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/prefix.h firefox-esr-140.10.0esr/modules/brotli/dec/prefix.h --- firefox-esr-140.9.1esr/modules/brotli/dec/prefix.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/prefix.h 2026-04-15 01:59:55.000000000 +0000 @@ -10,9 +10,13 @@ #ifndef BROTLI_DEC_PREFIX_H_ #define BROTLI_DEC_PREFIX_H_ -#include - #include "../common/constants.h" +#include "../common/platform.h" /* IWYU pragma: keep */ +#include "../common/static_init.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif typedef struct CmdLutElement { uint8_t insert_len_extra_bits; @@ -23,711 +27,17 @@ uint16_t copy_len_offset; } CmdLutElement; -static const CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS] = { - { 0x00, 0x00, 0, 0x00, 0x0000, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0000, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0000, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0001, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0001, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0001, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0002, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0002, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0002, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0003, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0003, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0003, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0004, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0004, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0004, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0005, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0005, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0005, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0009 }, - { 0x01, 0x00, 0, 0x00, 0x0006, 0x0002 }, - { 0x01, 0x00, 0, 0x01, 0x0006, 0x0003 }, - { 0x01, 0x00, 0, 0x02, 0x0006, 0x0004 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0005 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0006 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0007 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0008 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0009 }, - { 0x01, 0x00, 0, 0x00, 0x0008, 0x0002 }, - { 0x01, 0x00, 0, 0x01, 0x0008, 0x0003 }, - { 0x01, 0x00, 0, 0x02, 0x0008, 0x0004 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0005 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0006 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0007 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0008 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0009 }, - { 0x00, 0x01, 0, 0x03, 0x0000, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0000, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0000, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0000, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0000, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0000, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0000, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0000, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0001, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0001, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0001, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0001, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0001, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0001, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0001, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0001, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0002, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0002, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0002, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0002, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0002, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0002, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0002, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0002, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0003, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0003, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0003, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0003, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0003, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0003, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0003, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0003, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0004, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0004, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0004, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0004, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0004, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0004, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0004, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0004, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0005, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0005, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0005, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0005, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0005, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0005, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0005, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0005, 0x0036 }, - { 0x01, 0x01, 0, 0x03, 0x0006, 0x000a }, - { 0x01, 0x01, 0, 0x03, 0x0006, 0x000c }, - { 0x01, 0x02, 0, 0x03, 0x0006, 0x000e }, - { 0x01, 0x02, 0, 0x03, 0x0006, 0x0012 }, - { 0x01, 0x03, 0, 0x03, 0x0006, 0x0016 }, - { 0x01, 0x03, 0, 0x03, 0x0006, 0x001e }, - { 0x01, 0x04, 0, 0x03, 0x0006, 0x0026 }, - { 0x01, 0x04, 0, 0x03, 0x0006, 0x0036 }, - { 0x01, 0x01, 0, 0x03, 0x0008, 0x000a }, - { 0x01, 0x01, 0, 0x03, 0x0008, 0x000c }, - { 0x01, 0x02, 0, 0x03, 0x0008, 0x000e }, - { 0x01, 0x02, 0, 0x03, 0x0008, 0x0012 }, - { 0x01, 0x03, 0, 0x03, 0x0008, 0x0016 }, - { 0x01, 0x03, 0, 0x03, 0x0008, 0x001e }, - { 0x01, 0x04, 0, 0x03, 0x0008, 0x0026 }, - { 0x01, 0x04, 0, 0x03, 0x0008, 0x0036 }, - { 0x00, 0x00, -1, 0x00, 0x0000, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0000, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0000, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0001, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0001, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0001, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0002, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0002, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0002, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0003, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0003, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0003, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0004, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0004, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0004, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0005, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0005, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0005, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0009 }, - { 0x01, 0x00, -1, 0x00, 0x0006, 0x0002 }, - { 0x01, 0x00, -1, 0x01, 0x0006, 0x0003 }, - { 0x01, 0x00, -1, 0x02, 0x0006, 0x0004 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0005 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0006 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0007 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0008 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0009 }, - { 0x01, 0x00, -1, 0x00, 0x0008, 0x0002 }, - { 0x01, 0x00, -1, 0x01, 0x0008, 0x0003 }, - { 0x01, 0x00, -1, 0x02, 0x0008, 0x0004 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0005 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0006 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0007 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0008 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0009 }, - { 0x00, 0x01, -1, 0x03, 0x0000, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0000, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0000, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0000, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0000, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0000, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0000, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0000, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0001, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0001, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0001, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0001, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0001, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0001, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0001, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0001, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0002, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0002, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0002, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0002, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0002, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0002, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0002, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0002, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0003, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0003, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0003, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0003, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0003, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0003, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0003, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0003, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0004, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0004, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0004, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0004, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0004, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0004, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0004, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0004, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0005, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0005, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0005, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0005, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0005, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0005, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0005, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0005, 0x0036 }, - { 0x01, 0x01, -1, 0x03, 0x0006, 0x000a }, - { 0x01, 0x01, -1, 0x03, 0x0006, 0x000c }, - { 0x01, 0x02, -1, 0x03, 0x0006, 0x000e }, - { 0x01, 0x02, -1, 0x03, 0x0006, 0x0012 }, - { 0x01, 0x03, -1, 0x03, 0x0006, 0x0016 }, - { 0x01, 0x03, -1, 0x03, 0x0006, 0x001e }, - { 0x01, 0x04, -1, 0x03, 0x0006, 0x0026 }, - { 0x01, 0x04, -1, 0x03, 0x0006, 0x0036 }, - { 0x01, 0x01, -1, 0x03, 0x0008, 0x000a }, - { 0x01, 0x01, -1, 0x03, 0x0008, 0x000c }, - { 0x01, 0x02, -1, 0x03, 0x0008, 0x000e }, - { 0x01, 0x02, -1, 0x03, 0x0008, 0x0012 }, - { 0x01, 0x03, -1, 0x03, 0x0008, 0x0016 }, - { 0x01, 0x03, -1, 0x03, 0x0008, 0x001e }, - { 0x01, 0x04, -1, 0x03, 0x0008, 0x0026 }, - { 0x01, 0x04, -1, 0x03, 0x0008, 0x0036 }, - { 0x02, 0x00, -1, 0x00, 0x000a, 0x0002 }, - { 0x02, 0x00, -1, 0x01, 0x000a, 0x0003 }, - { 0x02, 0x00, -1, 0x02, 0x000a, 0x0004 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0005 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0006 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0007 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0008 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0009 }, - { 0x02, 0x00, -1, 0x00, 0x000e, 0x0002 }, - { 0x02, 0x00, -1, 0x01, 0x000e, 0x0003 }, - { 0x02, 0x00, -1, 0x02, 0x000e, 0x0004 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0005 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0006 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0007 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0008 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0009 }, - { 0x03, 0x00, -1, 0x00, 0x0012, 0x0002 }, - { 0x03, 0x00, -1, 0x01, 0x0012, 0x0003 }, - { 0x03, 0x00, -1, 0x02, 0x0012, 0x0004 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0005 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0006 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0007 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0008 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0009 }, - { 0x03, 0x00, -1, 0x00, 0x001a, 0x0002 }, - { 0x03, 0x00, -1, 0x01, 0x001a, 0x0003 }, - { 0x03, 0x00, -1, 0x02, 0x001a, 0x0004 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0005 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0006 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0007 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0008 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0009 }, - { 0x04, 0x00, -1, 0x00, 0x0022, 0x0002 }, - { 0x04, 0x00, -1, 0x01, 0x0022, 0x0003 }, - { 0x04, 0x00, -1, 0x02, 0x0022, 0x0004 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0005 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0006 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0007 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0008 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0009 }, - { 0x04, 0x00, -1, 0x00, 0x0032, 0x0002 }, - { 0x04, 0x00, -1, 0x01, 0x0032, 0x0003 }, - { 0x04, 0x00, -1, 0x02, 0x0032, 0x0004 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0005 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0006 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0007 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0008 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0009 }, - { 0x05, 0x00, -1, 0x00, 0x0042, 0x0002 }, - { 0x05, 0x00, -1, 0x01, 0x0042, 0x0003 }, - { 0x05, 0x00, -1, 0x02, 0x0042, 0x0004 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0005 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0006 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0007 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0008 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0009 }, - { 0x05, 0x00, -1, 0x00, 0x0062, 0x0002 }, - { 0x05, 0x00, -1, 0x01, 0x0062, 0x0003 }, - { 0x05, 0x00, -1, 0x02, 0x0062, 0x0004 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0005 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0006 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0007 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0008 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0009 }, - { 0x02, 0x01, -1, 0x03, 0x000a, 0x000a }, - { 0x02, 0x01, -1, 0x03, 0x000a, 0x000c }, - { 0x02, 0x02, -1, 0x03, 0x000a, 0x000e }, - { 0x02, 0x02, -1, 0x03, 0x000a, 0x0012 }, - { 0x02, 0x03, -1, 0x03, 0x000a, 0x0016 }, - { 0x02, 0x03, -1, 0x03, 0x000a, 0x001e }, - { 0x02, 0x04, -1, 0x03, 0x000a, 0x0026 }, - { 0x02, 0x04, -1, 0x03, 0x000a, 0x0036 }, - { 0x02, 0x01, -1, 0x03, 0x000e, 0x000a }, - { 0x02, 0x01, -1, 0x03, 0x000e, 0x000c }, - { 0x02, 0x02, -1, 0x03, 0x000e, 0x000e }, - { 0x02, 0x02, -1, 0x03, 0x000e, 0x0012 }, - { 0x02, 0x03, -1, 0x03, 0x000e, 0x0016 }, - { 0x02, 0x03, -1, 0x03, 0x000e, 0x001e }, - { 0x02, 0x04, -1, 0x03, 0x000e, 0x0026 }, - { 0x02, 0x04, -1, 0x03, 0x000e, 0x0036 }, - { 0x03, 0x01, -1, 0x03, 0x0012, 0x000a }, - { 0x03, 0x01, -1, 0x03, 0x0012, 0x000c }, - { 0x03, 0x02, -1, 0x03, 0x0012, 0x000e }, - { 0x03, 0x02, -1, 0x03, 0x0012, 0x0012 }, - { 0x03, 0x03, -1, 0x03, 0x0012, 0x0016 }, - { 0x03, 0x03, -1, 0x03, 0x0012, 0x001e }, - { 0x03, 0x04, -1, 0x03, 0x0012, 0x0026 }, - { 0x03, 0x04, -1, 0x03, 0x0012, 0x0036 }, - { 0x03, 0x01, -1, 0x03, 0x001a, 0x000a }, - { 0x03, 0x01, -1, 0x03, 0x001a, 0x000c }, - { 0x03, 0x02, -1, 0x03, 0x001a, 0x000e }, - { 0x03, 0x02, -1, 0x03, 0x001a, 0x0012 }, - { 0x03, 0x03, -1, 0x03, 0x001a, 0x0016 }, - { 0x03, 0x03, -1, 0x03, 0x001a, 0x001e }, - { 0x03, 0x04, -1, 0x03, 0x001a, 0x0026 }, - { 0x03, 0x04, -1, 0x03, 0x001a, 0x0036 }, - { 0x04, 0x01, -1, 0x03, 0x0022, 0x000a }, - { 0x04, 0x01, -1, 0x03, 0x0022, 0x000c }, - { 0x04, 0x02, -1, 0x03, 0x0022, 0x000e }, - { 0x04, 0x02, -1, 0x03, 0x0022, 0x0012 }, - { 0x04, 0x03, -1, 0x03, 0x0022, 0x0016 }, - { 0x04, 0x03, -1, 0x03, 0x0022, 0x001e }, - { 0x04, 0x04, -1, 0x03, 0x0022, 0x0026 }, - { 0x04, 0x04, -1, 0x03, 0x0022, 0x0036 }, - { 0x04, 0x01, -1, 0x03, 0x0032, 0x000a }, - { 0x04, 0x01, -1, 0x03, 0x0032, 0x000c }, - { 0x04, 0x02, -1, 0x03, 0x0032, 0x000e }, - { 0x04, 0x02, -1, 0x03, 0x0032, 0x0012 }, - { 0x04, 0x03, -1, 0x03, 0x0032, 0x0016 }, - { 0x04, 0x03, -1, 0x03, 0x0032, 0x001e }, - { 0x04, 0x04, -1, 0x03, 0x0032, 0x0026 }, - { 0x04, 0x04, -1, 0x03, 0x0032, 0x0036 }, - { 0x05, 0x01, -1, 0x03, 0x0042, 0x000a }, - { 0x05, 0x01, -1, 0x03, 0x0042, 0x000c }, - { 0x05, 0x02, -1, 0x03, 0x0042, 0x000e }, - { 0x05, 0x02, -1, 0x03, 0x0042, 0x0012 }, - { 0x05, 0x03, -1, 0x03, 0x0042, 0x0016 }, - { 0x05, 0x03, -1, 0x03, 0x0042, 0x001e }, - { 0x05, 0x04, -1, 0x03, 0x0042, 0x0026 }, - { 0x05, 0x04, -1, 0x03, 0x0042, 0x0036 }, - { 0x05, 0x01, -1, 0x03, 0x0062, 0x000a }, - { 0x05, 0x01, -1, 0x03, 0x0062, 0x000c }, - { 0x05, 0x02, -1, 0x03, 0x0062, 0x000e }, - { 0x05, 0x02, -1, 0x03, 0x0062, 0x0012 }, - { 0x05, 0x03, -1, 0x03, 0x0062, 0x0016 }, - { 0x05, 0x03, -1, 0x03, 0x0062, 0x001e }, - { 0x05, 0x04, -1, 0x03, 0x0062, 0x0026 }, - { 0x05, 0x04, -1, 0x03, 0x0062, 0x0036 }, - { 0x00, 0x05, -1, 0x03, 0x0000, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0000, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0000, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0000, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0000, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0000, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0000, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0000, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0001, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0001, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0001, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0001, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0001, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0001, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0001, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0001, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0002, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0002, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0002, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0002, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0002, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0002, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0002, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0002, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0003, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0003, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0003, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0003, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0003, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0003, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0003, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0003, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0004, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0004, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0004, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0004, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0004, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0004, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0004, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0004, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0005, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0005, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0005, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0005, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0005, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0005, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0005, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0005, 0x0846 }, - { 0x01, 0x05, -1, 0x03, 0x0006, 0x0046 }, - { 0x01, 0x05, -1, 0x03, 0x0006, 0x0066 }, - { 0x01, 0x06, -1, 0x03, 0x0006, 0x0086 }, - { 0x01, 0x07, -1, 0x03, 0x0006, 0x00c6 }, - { 0x01, 0x08, -1, 0x03, 0x0006, 0x0146 }, - { 0x01, 0x09, -1, 0x03, 0x0006, 0x0246 }, - { 0x01, 0x0a, -1, 0x03, 0x0006, 0x0446 }, - { 0x01, 0x18, -1, 0x03, 0x0006, 0x0846 }, - { 0x01, 0x05, -1, 0x03, 0x0008, 0x0046 }, - { 0x01, 0x05, -1, 0x03, 0x0008, 0x0066 }, - { 0x01, 0x06, -1, 0x03, 0x0008, 0x0086 }, - { 0x01, 0x07, -1, 0x03, 0x0008, 0x00c6 }, - { 0x01, 0x08, -1, 0x03, 0x0008, 0x0146 }, - { 0x01, 0x09, -1, 0x03, 0x0008, 0x0246 }, - { 0x01, 0x0a, -1, 0x03, 0x0008, 0x0446 }, - { 0x01, 0x18, -1, 0x03, 0x0008, 0x0846 }, - { 0x06, 0x00, -1, 0x00, 0x0082, 0x0002 }, - { 0x06, 0x00, -1, 0x01, 0x0082, 0x0003 }, - { 0x06, 0x00, -1, 0x02, 0x0082, 0x0004 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0005 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0006 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0007 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0008 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0009 }, - { 0x07, 0x00, -1, 0x00, 0x00c2, 0x0002 }, - { 0x07, 0x00, -1, 0x01, 0x00c2, 0x0003 }, - { 0x07, 0x00, -1, 0x02, 0x00c2, 0x0004 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0005 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0006 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0007 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0008 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0009 }, - { 0x08, 0x00, -1, 0x00, 0x0142, 0x0002 }, - { 0x08, 0x00, -1, 0x01, 0x0142, 0x0003 }, - { 0x08, 0x00, -1, 0x02, 0x0142, 0x0004 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0005 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0006 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0007 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0008 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0009 }, - { 0x09, 0x00, -1, 0x00, 0x0242, 0x0002 }, - { 0x09, 0x00, -1, 0x01, 0x0242, 0x0003 }, - { 0x09, 0x00, -1, 0x02, 0x0242, 0x0004 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0005 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0006 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0007 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0008 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0009 }, - { 0x0a, 0x00, -1, 0x00, 0x0442, 0x0002 }, - { 0x0a, 0x00, -1, 0x01, 0x0442, 0x0003 }, - { 0x0a, 0x00, -1, 0x02, 0x0442, 0x0004 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0005 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0006 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0007 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0008 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0009 }, - { 0x0c, 0x00, -1, 0x00, 0x0842, 0x0002 }, - { 0x0c, 0x00, -1, 0x01, 0x0842, 0x0003 }, - { 0x0c, 0x00, -1, 0x02, 0x0842, 0x0004 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0005 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0006 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0007 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0008 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0009 }, - { 0x0e, 0x00, -1, 0x00, 0x1842, 0x0002 }, - { 0x0e, 0x00, -1, 0x01, 0x1842, 0x0003 }, - { 0x0e, 0x00, -1, 0x02, 0x1842, 0x0004 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0005 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0006 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0007 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0008 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0009 }, - { 0x18, 0x00, -1, 0x00, 0x5842, 0x0002 }, - { 0x18, 0x00, -1, 0x01, 0x5842, 0x0003 }, - { 0x18, 0x00, -1, 0x02, 0x5842, 0x0004 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0005 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0006 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0007 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0008 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0009 }, - { 0x02, 0x05, -1, 0x03, 0x000a, 0x0046 }, - { 0x02, 0x05, -1, 0x03, 0x000a, 0x0066 }, - { 0x02, 0x06, -1, 0x03, 0x000a, 0x0086 }, - { 0x02, 0x07, -1, 0x03, 0x000a, 0x00c6 }, - { 0x02, 0x08, -1, 0x03, 0x000a, 0x0146 }, - { 0x02, 0x09, -1, 0x03, 0x000a, 0x0246 }, - { 0x02, 0x0a, -1, 0x03, 0x000a, 0x0446 }, - { 0x02, 0x18, -1, 0x03, 0x000a, 0x0846 }, - { 0x02, 0x05, -1, 0x03, 0x000e, 0x0046 }, - { 0x02, 0x05, -1, 0x03, 0x000e, 0x0066 }, - { 0x02, 0x06, -1, 0x03, 0x000e, 0x0086 }, - { 0x02, 0x07, -1, 0x03, 0x000e, 0x00c6 }, - { 0x02, 0x08, -1, 0x03, 0x000e, 0x0146 }, - { 0x02, 0x09, -1, 0x03, 0x000e, 0x0246 }, - { 0x02, 0x0a, -1, 0x03, 0x000e, 0x0446 }, - { 0x02, 0x18, -1, 0x03, 0x000e, 0x0846 }, - { 0x03, 0x05, -1, 0x03, 0x0012, 0x0046 }, - { 0x03, 0x05, -1, 0x03, 0x0012, 0x0066 }, - { 0x03, 0x06, -1, 0x03, 0x0012, 0x0086 }, - { 0x03, 0x07, -1, 0x03, 0x0012, 0x00c6 }, - { 0x03, 0x08, -1, 0x03, 0x0012, 0x0146 }, - { 0x03, 0x09, -1, 0x03, 0x0012, 0x0246 }, - { 0x03, 0x0a, -1, 0x03, 0x0012, 0x0446 }, - { 0x03, 0x18, -1, 0x03, 0x0012, 0x0846 }, - { 0x03, 0x05, -1, 0x03, 0x001a, 0x0046 }, - { 0x03, 0x05, -1, 0x03, 0x001a, 0x0066 }, - { 0x03, 0x06, -1, 0x03, 0x001a, 0x0086 }, - { 0x03, 0x07, -1, 0x03, 0x001a, 0x00c6 }, - { 0x03, 0x08, -1, 0x03, 0x001a, 0x0146 }, - { 0x03, 0x09, -1, 0x03, 0x001a, 0x0246 }, - { 0x03, 0x0a, -1, 0x03, 0x001a, 0x0446 }, - { 0x03, 0x18, -1, 0x03, 0x001a, 0x0846 }, - { 0x04, 0x05, -1, 0x03, 0x0022, 0x0046 }, - { 0x04, 0x05, -1, 0x03, 0x0022, 0x0066 }, - { 0x04, 0x06, -1, 0x03, 0x0022, 0x0086 }, - { 0x04, 0x07, -1, 0x03, 0x0022, 0x00c6 }, - { 0x04, 0x08, -1, 0x03, 0x0022, 0x0146 }, - { 0x04, 0x09, -1, 0x03, 0x0022, 0x0246 }, - { 0x04, 0x0a, -1, 0x03, 0x0022, 0x0446 }, - { 0x04, 0x18, -1, 0x03, 0x0022, 0x0846 }, - { 0x04, 0x05, -1, 0x03, 0x0032, 0x0046 }, - { 0x04, 0x05, -1, 0x03, 0x0032, 0x0066 }, - { 0x04, 0x06, -1, 0x03, 0x0032, 0x0086 }, - { 0x04, 0x07, -1, 0x03, 0x0032, 0x00c6 }, - { 0x04, 0x08, -1, 0x03, 0x0032, 0x0146 }, - { 0x04, 0x09, -1, 0x03, 0x0032, 0x0246 }, - { 0x04, 0x0a, -1, 0x03, 0x0032, 0x0446 }, - { 0x04, 0x18, -1, 0x03, 0x0032, 0x0846 }, - { 0x05, 0x05, -1, 0x03, 0x0042, 0x0046 }, - { 0x05, 0x05, -1, 0x03, 0x0042, 0x0066 }, - { 0x05, 0x06, -1, 0x03, 0x0042, 0x0086 }, - { 0x05, 0x07, -1, 0x03, 0x0042, 0x00c6 }, - { 0x05, 0x08, -1, 0x03, 0x0042, 0x0146 }, - { 0x05, 0x09, -1, 0x03, 0x0042, 0x0246 }, - { 0x05, 0x0a, -1, 0x03, 0x0042, 0x0446 }, - { 0x05, 0x18, -1, 0x03, 0x0042, 0x0846 }, - { 0x05, 0x05, -1, 0x03, 0x0062, 0x0046 }, - { 0x05, 0x05, -1, 0x03, 0x0062, 0x0066 }, - { 0x05, 0x06, -1, 0x03, 0x0062, 0x0086 }, - { 0x05, 0x07, -1, 0x03, 0x0062, 0x00c6 }, - { 0x05, 0x08, -1, 0x03, 0x0062, 0x0146 }, - { 0x05, 0x09, -1, 0x03, 0x0062, 0x0246 }, - { 0x05, 0x0a, -1, 0x03, 0x0062, 0x0446 }, - { 0x05, 0x18, -1, 0x03, 0x0062, 0x0846 }, - { 0x06, 0x01, -1, 0x03, 0x0082, 0x000a }, - { 0x06, 0x01, -1, 0x03, 0x0082, 0x000c }, - { 0x06, 0x02, -1, 0x03, 0x0082, 0x000e }, - { 0x06, 0x02, -1, 0x03, 0x0082, 0x0012 }, - { 0x06, 0x03, -1, 0x03, 0x0082, 0x0016 }, - { 0x06, 0x03, -1, 0x03, 0x0082, 0x001e }, - { 0x06, 0x04, -1, 0x03, 0x0082, 0x0026 }, - { 0x06, 0x04, -1, 0x03, 0x0082, 0x0036 }, - { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000a }, - { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000c }, - { 0x07, 0x02, -1, 0x03, 0x00c2, 0x000e }, - { 0x07, 0x02, -1, 0x03, 0x00c2, 0x0012 }, - { 0x07, 0x03, -1, 0x03, 0x00c2, 0x0016 }, - { 0x07, 0x03, -1, 0x03, 0x00c2, 0x001e }, - { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0026 }, - { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0036 }, - { 0x08, 0x01, -1, 0x03, 0x0142, 0x000a }, - { 0x08, 0x01, -1, 0x03, 0x0142, 0x000c }, - { 0x08, 0x02, -1, 0x03, 0x0142, 0x000e }, - { 0x08, 0x02, -1, 0x03, 0x0142, 0x0012 }, - { 0x08, 0x03, -1, 0x03, 0x0142, 0x0016 }, - { 0x08, 0x03, -1, 0x03, 0x0142, 0x001e }, - { 0x08, 0x04, -1, 0x03, 0x0142, 0x0026 }, - { 0x08, 0x04, -1, 0x03, 0x0142, 0x0036 }, - { 0x09, 0x01, -1, 0x03, 0x0242, 0x000a }, - { 0x09, 0x01, -1, 0x03, 0x0242, 0x000c }, - { 0x09, 0x02, -1, 0x03, 0x0242, 0x000e }, - { 0x09, 0x02, -1, 0x03, 0x0242, 0x0012 }, - { 0x09, 0x03, -1, 0x03, 0x0242, 0x0016 }, - { 0x09, 0x03, -1, 0x03, 0x0242, 0x001e }, - { 0x09, 0x04, -1, 0x03, 0x0242, 0x0026 }, - { 0x09, 0x04, -1, 0x03, 0x0242, 0x0036 }, - { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000a }, - { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000c }, - { 0x0a, 0x02, -1, 0x03, 0x0442, 0x000e }, - { 0x0a, 0x02, -1, 0x03, 0x0442, 0x0012 }, - { 0x0a, 0x03, -1, 0x03, 0x0442, 0x0016 }, - { 0x0a, 0x03, -1, 0x03, 0x0442, 0x001e }, - { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0026 }, - { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0036 }, - { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000a }, - { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000c }, - { 0x0c, 0x02, -1, 0x03, 0x0842, 0x000e }, - { 0x0c, 0x02, -1, 0x03, 0x0842, 0x0012 }, - { 0x0c, 0x03, -1, 0x03, 0x0842, 0x0016 }, - { 0x0c, 0x03, -1, 0x03, 0x0842, 0x001e }, - { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0026 }, - { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0036 }, - { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000a }, - { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000c }, - { 0x0e, 0x02, -1, 0x03, 0x1842, 0x000e }, - { 0x0e, 0x02, -1, 0x03, 0x1842, 0x0012 }, - { 0x0e, 0x03, -1, 0x03, 0x1842, 0x0016 }, - { 0x0e, 0x03, -1, 0x03, 0x1842, 0x001e }, - { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0026 }, - { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0036 }, - { 0x18, 0x01, -1, 0x03, 0x5842, 0x000a }, - { 0x18, 0x01, -1, 0x03, 0x5842, 0x000c }, - { 0x18, 0x02, -1, 0x03, 0x5842, 0x000e }, - { 0x18, 0x02, -1, 0x03, 0x5842, 0x0012 }, - { 0x18, 0x03, -1, 0x03, 0x5842, 0x0016 }, - { 0x18, 0x03, -1, 0x03, 0x5842, 0x001e }, - { 0x18, 0x04, -1, 0x03, 0x5842, 0x0026 }, - { 0x18, 0x04, -1, 0x03, 0x5842, 0x0036 }, - { 0x06, 0x05, -1, 0x03, 0x0082, 0x0046 }, - { 0x06, 0x05, -1, 0x03, 0x0082, 0x0066 }, - { 0x06, 0x06, -1, 0x03, 0x0082, 0x0086 }, - { 0x06, 0x07, -1, 0x03, 0x0082, 0x00c6 }, - { 0x06, 0x08, -1, 0x03, 0x0082, 0x0146 }, - { 0x06, 0x09, -1, 0x03, 0x0082, 0x0246 }, - { 0x06, 0x0a, -1, 0x03, 0x0082, 0x0446 }, - { 0x06, 0x18, -1, 0x03, 0x0082, 0x0846 }, - { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0046 }, - { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0066 }, - { 0x07, 0x06, -1, 0x03, 0x00c2, 0x0086 }, - { 0x07, 0x07, -1, 0x03, 0x00c2, 0x00c6 }, - { 0x07, 0x08, -1, 0x03, 0x00c2, 0x0146 }, - { 0x07, 0x09, -1, 0x03, 0x00c2, 0x0246 }, - { 0x07, 0x0a, -1, 0x03, 0x00c2, 0x0446 }, - { 0x07, 0x18, -1, 0x03, 0x00c2, 0x0846 }, - { 0x08, 0x05, -1, 0x03, 0x0142, 0x0046 }, - { 0x08, 0x05, -1, 0x03, 0x0142, 0x0066 }, - { 0x08, 0x06, -1, 0x03, 0x0142, 0x0086 }, - { 0x08, 0x07, -1, 0x03, 0x0142, 0x00c6 }, - { 0x08, 0x08, -1, 0x03, 0x0142, 0x0146 }, - { 0x08, 0x09, -1, 0x03, 0x0142, 0x0246 }, - { 0x08, 0x0a, -1, 0x03, 0x0142, 0x0446 }, - { 0x08, 0x18, -1, 0x03, 0x0142, 0x0846 }, - { 0x09, 0x05, -1, 0x03, 0x0242, 0x0046 }, - { 0x09, 0x05, -1, 0x03, 0x0242, 0x0066 }, - { 0x09, 0x06, -1, 0x03, 0x0242, 0x0086 }, - { 0x09, 0x07, -1, 0x03, 0x0242, 0x00c6 }, - { 0x09, 0x08, -1, 0x03, 0x0242, 0x0146 }, - { 0x09, 0x09, -1, 0x03, 0x0242, 0x0246 }, - { 0x09, 0x0a, -1, 0x03, 0x0242, 0x0446 }, - { 0x09, 0x18, -1, 0x03, 0x0242, 0x0846 }, - { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0046 }, - { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0066 }, - { 0x0a, 0x06, -1, 0x03, 0x0442, 0x0086 }, - { 0x0a, 0x07, -1, 0x03, 0x0442, 0x00c6 }, - { 0x0a, 0x08, -1, 0x03, 0x0442, 0x0146 }, - { 0x0a, 0x09, -1, 0x03, 0x0442, 0x0246 }, - { 0x0a, 0x0a, -1, 0x03, 0x0442, 0x0446 }, - { 0x0a, 0x18, -1, 0x03, 0x0442, 0x0846 }, - { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0046 }, - { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0066 }, - { 0x0c, 0x06, -1, 0x03, 0x0842, 0x0086 }, - { 0x0c, 0x07, -1, 0x03, 0x0842, 0x00c6 }, - { 0x0c, 0x08, -1, 0x03, 0x0842, 0x0146 }, - { 0x0c, 0x09, -1, 0x03, 0x0842, 0x0246 }, - { 0x0c, 0x0a, -1, 0x03, 0x0842, 0x0446 }, - { 0x0c, 0x18, -1, 0x03, 0x0842, 0x0846 }, - { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0046 }, - { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0066 }, - { 0x0e, 0x06, -1, 0x03, 0x1842, 0x0086 }, - { 0x0e, 0x07, -1, 0x03, 0x1842, 0x00c6 }, - { 0x0e, 0x08, -1, 0x03, 0x1842, 0x0146 }, - { 0x0e, 0x09, -1, 0x03, 0x1842, 0x0246 }, - { 0x0e, 0x0a, -1, 0x03, 0x1842, 0x0446 }, - { 0x0e, 0x18, -1, 0x03, 0x1842, 0x0846 }, - { 0x18, 0x05, -1, 0x03, 0x5842, 0x0046 }, - { 0x18, 0x05, -1, 0x03, 0x5842, 0x0066 }, - { 0x18, 0x06, -1, 0x03, 0x5842, 0x0086 }, - { 0x18, 0x07, -1, 0x03, 0x5842, 0x00c6 }, - { 0x18, 0x08, -1, 0x03, 0x5842, 0x0146 }, - { 0x18, 0x09, -1, 0x03, 0x5842, 0x0246 }, - { 0x18, 0x0a, -1, 0x03, 0x5842, 0x0446 }, - { 0x18, 0x18, -1, 0x03, 0x5842, 0x0846 }, -}; +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_NONE) +BROTLI_INTERNAL extern const BROTLI_MODEL("small") + CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS]; +#else +BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderInitCmdLut(CmdLutElement* items); +BROTLI_INTERNAL extern BROTLI_MODEL("small") + CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS]; +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif #endif /* BROTLI_DEC_PREFIX_H_ */ diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/prefix_inc.h firefox-esr-140.10.0esr/modules/brotli/dec/prefix_inc.h --- firefox-esr-140.9.1esr/modules/brotli/dec/prefix_inc.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/prefix_inc.h 2026-04-15 01:59:55.000000000 +0000 @@ -0,0 +1,707 @@ +const BROTLI_MODEL("small") +CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS] = { + { 0x00, 0x00, 0, 0x00, 0x0000, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0000, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0000, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0001, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0001, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0001, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0002, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0002, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0002, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0003, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0003, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0003, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0004, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0004, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0004, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0005, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0005, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0005, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0009 }, + { 0x01, 0x00, 0, 0x00, 0x0006, 0x0002 }, + { 0x01, 0x00, 0, 0x01, 0x0006, 0x0003 }, + { 0x01, 0x00, 0, 0x02, 0x0006, 0x0004 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0005 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0006 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0007 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0008 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0009 }, + { 0x01, 0x00, 0, 0x00, 0x0008, 0x0002 }, + { 0x01, 0x00, 0, 0x01, 0x0008, 0x0003 }, + { 0x01, 0x00, 0, 0x02, 0x0008, 0x0004 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0005 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0006 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0007 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0008 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0009 }, + { 0x00, 0x01, 0, 0x03, 0x0000, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0000, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0000, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0000, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0000, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0000, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0000, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0000, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0001, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0001, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0001, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0001, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0001, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0001, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0001, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0001, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0002, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0002, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0002, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0002, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0002, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0002, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0002, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0002, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0003, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0003, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0003, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0003, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0003, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0003, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0003, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0003, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0004, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0004, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0004, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0004, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0004, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0004, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0004, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0004, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0005, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0005, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0005, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0005, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0005, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0005, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0005, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0005, 0x0036 }, + { 0x01, 0x01, 0, 0x03, 0x0006, 0x000a }, + { 0x01, 0x01, 0, 0x03, 0x0006, 0x000c }, + { 0x01, 0x02, 0, 0x03, 0x0006, 0x000e }, + { 0x01, 0x02, 0, 0x03, 0x0006, 0x0012 }, + { 0x01, 0x03, 0, 0x03, 0x0006, 0x0016 }, + { 0x01, 0x03, 0, 0x03, 0x0006, 0x001e }, + { 0x01, 0x04, 0, 0x03, 0x0006, 0x0026 }, + { 0x01, 0x04, 0, 0x03, 0x0006, 0x0036 }, + { 0x01, 0x01, 0, 0x03, 0x0008, 0x000a }, + { 0x01, 0x01, 0, 0x03, 0x0008, 0x000c }, + { 0x01, 0x02, 0, 0x03, 0x0008, 0x000e }, + { 0x01, 0x02, 0, 0x03, 0x0008, 0x0012 }, + { 0x01, 0x03, 0, 0x03, 0x0008, 0x0016 }, + { 0x01, 0x03, 0, 0x03, 0x0008, 0x001e }, + { 0x01, 0x04, 0, 0x03, 0x0008, 0x0026 }, + { 0x01, 0x04, 0, 0x03, 0x0008, 0x0036 }, + { 0x00, 0x00, -1, 0x00, 0x0000, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0000, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0000, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0001, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0001, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0001, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0002, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0002, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0002, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0003, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0003, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0003, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0004, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0004, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0004, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0005, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0005, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0005, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0009 }, + { 0x01, 0x00, -1, 0x00, 0x0006, 0x0002 }, + { 0x01, 0x00, -1, 0x01, 0x0006, 0x0003 }, + { 0x01, 0x00, -1, 0x02, 0x0006, 0x0004 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0005 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0006 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0007 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0008 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0009 }, + { 0x01, 0x00, -1, 0x00, 0x0008, 0x0002 }, + { 0x01, 0x00, -1, 0x01, 0x0008, 0x0003 }, + { 0x01, 0x00, -1, 0x02, 0x0008, 0x0004 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0005 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0006 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0007 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0008 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0009 }, + { 0x00, 0x01, -1, 0x03, 0x0000, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0000, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0000, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0000, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0000, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0000, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0000, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0000, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0001, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0001, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0001, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0001, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0001, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0001, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0001, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0001, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0002, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0002, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0002, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0002, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0002, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0002, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0002, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0002, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0003, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0003, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0003, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0003, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0003, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0003, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0003, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0003, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0004, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0004, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0004, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0004, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0004, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0004, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0004, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0004, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0005, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0005, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0005, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0005, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0005, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0005, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0005, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0005, 0x0036 }, + { 0x01, 0x01, -1, 0x03, 0x0006, 0x000a }, + { 0x01, 0x01, -1, 0x03, 0x0006, 0x000c }, + { 0x01, 0x02, -1, 0x03, 0x0006, 0x000e }, + { 0x01, 0x02, -1, 0x03, 0x0006, 0x0012 }, + { 0x01, 0x03, -1, 0x03, 0x0006, 0x0016 }, + { 0x01, 0x03, -1, 0x03, 0x0006, 0x001e }, + { 0x01, 0x04, -1, 0x03, 0x0006, 0x0026 }, + { 0x01, 0x04, -1, 0x03, 0x0006, 0x0036 }, + { 0x01, 0x01, -1, 0x03, 0x0008, 0x000a }, + { 0x01, 0x01, -1, 0x03, 0x0008, 0x000c }, + { 0x01, 0x02, -1, 0x03, 0x0008, 0x000e }, + { 0x01, 0x02, -1, 0x03, 0x0008, 0x0012 }, + { 0x01, 0x03, -1, 0x03, 0x0008, 0x0016 }, + { 0x01, 0x03, -1, 0x03, 0x0008, 0x001e }, + { 0x01, 0x04, -1, 0x03, 0x0008, 0x0026 }, + { 0x01, 0x04, -1, 0x03, 0x0008, 0x0036 }, + { 0x02, 0x00, -1, 0x00, 0x000a, 0x0002 }, + { 0x02, 0x00, -1, 0x01, 0x000a, 0x0003 }, + { 0x02, 0x00, -1, 0x02, 0x000a, 0x0004 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0005 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0006 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0007 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0008 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0009 }, + { 0x02, 0x00, -1, 0x00, 0x000e, 0x0002 }, + { 0x02, 0x00, -1, 0x01, 0x000e, 0x0003 }, + { 0x02, 0x00, -1, 0x02, 0x000e, 0x0004 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0005 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0006 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0007 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0008 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0009 }, + { 0x03, 0x00, -1, 0x00, 0x0012, 0x0002 }, + { 0x03, 0x00, -1, 0x01, 0x0012, 0x0003 }, + { 0x03, 0x00, -1, 0x02, 0x0012, 0x0004 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0005 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0006 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0007 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0008 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0009 }, + { 0x03, 0x00, -1, 0x00, 0x001a, 0x0002 }, + { 0x03, 0x00, -1, 0x01, 0x001a, 0x0003 }, + { 0x03, 0x00, -1, 0x02, 0x001a, 0x0004 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0005 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0006 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0007 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0008 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0009 }, + { 0x04, 0x00, -1, 0x00, 0x0022, 0x0002 }, + { 0x04, 0x00, -1, 0x01, 0x0022, 0x0003 }, + { 0x04, 0x00, -1, 0x02, 0x0022, 0x0004 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0005 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0006 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0007 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0008 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0009 }, + { 0x04, 0x00, -1, 0x00, 0x0032, 0x0002 }, + { 0x04, 0x00, -1, 0x01, 0x0032, 0x0003 }, + { 0x04, 0x00, -1, 0x02, 0x0032, 0x0004 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0005 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0006 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0007 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0008 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0009 }, + { 0x05, 0x00, -1, 0x00, 0x0042, 0x0002 }, + { 0x05, 0x00, -1, 0x01, 0x0042, 0x0003 }, + { 0x05, 0x00, -1, 0x02, 0x0042, 0x0004 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0005 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0006 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0007 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0008 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0009 }, + { 0x05, 0x00, -1, 0x00, 0x0062, 0x0002 }, + { 0x05, 0x00, -1, 0x01, 0x0062, 0x0003 }, + { 0x05, 0x00, -1, 0x02, 0x0062, 0x0004 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0005 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0006 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0007 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0008 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0009 }, + { 0x02, 0x01, -1, 0x03, 0x000a, 0x000a }, + { 0x02, 0x01, -1, 0x03, 0x000a, 0x000c }, + { 0x02, 0x02, -1, 0x03, 0x000a, 0x000e }, + { 0x02, 0x02, -1, 0x03, 0x000a, 0x0012 }, + { 0x02, 0x03, -1, 0x03, 0x000a, 0x0016 }, + { 0x02, 0x03, -1, 0x03, 0x000a, 0x001e }, + { 0x02, 0x04, -1, 0x03, 0x000a, 0x0026 }, + { 0x02, 0x04, -1, 0x03, 0x000a, 0x0036 }, + { 0x02, 0x01, -1, 0x03, 0x000e, 0x000a }, + { 0x02, 0x01, -1, 0x03, 0x000e, 0x000c }, + { 0x02, 0x02, -1, 0x03, 0x000e, 0x000e }, + { 0x02, 0x02, -1, 0x03, 0x000e, 0x0012 }, + { 0x02, 0x03, -1, 0x03, 0x000e, 0x0016 }, + { 0x02, 0x03, -1, 0x03, 0x000e, 0x001e }, + { 0x02, 0x04, -1, 0x03, 0x000e, 0x0026 }, + { 0x02, 0x04, -1, 0x03, 0x000e, 0x0036 }, + { 0x03, 0x01, -1, 0x03, 0x0012, 0x000a }, + { 0x03, 0x01, -1, 0x03, 0x0012, 0x000c }, + { 0x03, 0x02, -1, 0x03, 0x0012, 0x000e }, + { 0x03, 0x02, -1, 0x03, 0x0012, 0x0012 }, + { 0x03, 0x03, -1, 0x03, 0x0012, 0x0016 }, + { 0x03, 0x03, -1, 0x03, 0x0012, 0x001e }, + { 0x03, 0x04, -1, 0x03, 0x0012, 0x0026 }, + { 0x03, 0x04, -1, 0x03, 0x0012, 0x0036 }, + { 0x03, 0x01, -1, 0x03, 0x001a, 0x000a }, + { 0x03, 0x01, -1, 0x03, 0x001a, 0x000c }, + { 0x03, 0x02, -1, 0x03, 0x001a, 0x000e }, + { 0x03, 0x02, -1, 0x03, 0x001a, 0x0012 }, + { 0x03, 0x03, -1, 0x03, 0x001a, 0x0016 }, + { 0x03, 0x03, -1, 0x03, 0x001a, 0x001e }, + { 0x03, 0x04, -1, 0x03, 0x001a, 0x0026 }, + { 0x03, 0x04, -1, 0x03, 0x001a, 0x0036 }, + { 0x04, 0x01, -1, 0x03, 0x0022, 0x000a }, + { 0x04, 0x01, -1, 0x03, 0x0022, 0x000c }, + { 0x04, 0x02, -1, 0x03, 0x0022, 0x000e }, + { 0x04, 0x02, -1, 0x03, 0x0022, 0x0012 }, + { 0x04, 0x03, -1, 0x03, 0x0022, 0x0016 }, + { 0x04, 0x03, -1, 0x03, 0x0022, 0x001e }, + { 0x04, 0x04, -1, 0x03, 0x0022, 0x0026 }, + { 0x04, 0x04, -1, 0x03, 0x0022, 0x0036 }, + { 0x04, 0x01, -1, 0x03, 0x0032, 0x000a }, + { 0x04, 0x01, -1, 0x03, 0x0032, 0x000c }, + { 0x04, 0x02, -1, 0x03, 0x0032, 0x000e }, + { 0x04, 0x02, -1, 0x03, 0x0032, 0x0012 }, + { 0x04, 0x03, -1, 0x03, 0x0032, 0x0016 }, + { 0x04, 0x03, -1, 0x03, 0x0032, 0x001e }, + { 0x04, 0x04, -1, 0x03, 0x0032, 0x0026 }, + { 0x04, 0x04, -1, 0x03, 0x0032, 0x0036 }, + { 0x05, 0x01, -1, 0x03, 0x0042, 0x000a }, + { 0x05, 0x01, -1, 0x03, 0x0042, 0x000c }, + { 0x05, 0x02, -1, 0x03, 0x0042, 0x000e }, + { 0x05, 0x02, -1, 0x03, 0x0042, 0x0012 }, + { 0x05, 0x03, -1, 0x03, 0x0042, 0x0016 }, + { 0x05, 0x03, -1, 0x03, 0x0042, 0x001e }, + { 0x05, 0x04, -1, 0x03, 0x0042, 0x0026 }, + { 0x05, 0x04, -1, 0x03, 0x0042, 0x0036 }, + { 0x05, 0x01, -1, 0x03, 0x0062, 0x000a }, + { 0x05, 0x01, -1, 0x03, 0x0062, 0x000c }, + { 0x05, 0x02, -1, 0x03, 0x0062, 0x000e }, + { 0x05, 0x02, -1, 0x03, 0x0062, 0x0012 }, + { 0x05, 0x03, -1, 0x03, 0x0062, 0x0016 }, + { 0x05, 0x03, -1, 0x03, 0x0062, 0x001e }, + { 0x05, 0x04, -1, 0x03, 0x0062, 0x0026 }, + { 0x05, 0x04, -1, 0x03, 0x0062, 0x0036 }, + { 0x00, 0x05, -1, 0x03, 0x0000, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0000, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0000, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0000, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0000, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0000, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0000, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0000, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0001, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0001, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0001, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0001, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0001, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0001, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0001, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0001, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0002, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0002, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0002, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0002, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0002, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0002, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0002, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0002, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0003, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0003, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0003, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0003, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0003, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0003, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0003, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0003, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0004, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0004, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0004, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0004, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0004, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0004, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0004, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0004, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0005, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0005, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0005, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0005, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0005, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0005, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0005, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0005, 0x0846 }, + { 0x01, 0x05, -1, 0x03, 0x0006, 0x0046 }, + { 0x01, 0x05, -1, 0x03, 0x0006, 0x0066 }, + { 0x01, 0x06, -1, 0x03, 0x0006, 0x0086 }, + { 0x01, 0x07, -1, 0x03, 0x0006, 0x00c6 }, + { 0x01, 0x08, -1, 0x03, 0x0006, 0x0146 }, + { 0x01, 0x09, -1, 0x03, 0x0006, 0x0246 }, + { 0x01, 0x0a, -1, 0x03, 0x0006, 0x0446 }, + { 0x01, 0x18, -1, 0x03, 0x0006, 0x0846 }, + { 0x01, 0x05, -1, 0x03, 0x0008, 0x0046 }, + { 0x01, 0x05, -1, 0x03, 0x0008, 0x0066 }, + { 0x01, 0x06, -1, 0x03, 0x0008, 0x0086 }, + { 0x01, 0x07, -1, 0x03, 0x0008, 0x00c6 }, + { 0x01, 0x08, -1, 0x03, 0x0008, 0x0146 }, + { 0x01, 0x09, -1, 0x03, 0x0008, 0x0246 }, + { 0x01, 0x0a, -1, 0x03, 0x0008, 0x0446 }, + { 0x01, 0x18, -1, 0x03, 0x0008, 0x0846 }, + { 0x06, 0x00, -1, 0x00, 0x0082, 0x0002 }, + { 0x06, 0x00, -1, 0x01, 0x0082, 0x0003 }, + { 0x06, 0x00, -1, 0x02, 0x0082, 0x0004 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0005 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0006 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0007 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0008 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0009 }, + { 0x07, 0x00, -1, 0x00, 0x00c2, 0x0002 }, + { 0x07, 0x00, -1, 0x01, 0x00c2, 0x0003 }, + { 0x07, 0x00, -1, 0x02, 0x00c2, 0x0004 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0005 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0006 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0007 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0008 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0009 }, + { 0x08, 0x00, -1, 0x00, 0x0142, 0x0002 }, + { 0x08, 0x00, -1, 0x01, 0x0142, 0x0003 }, + { 0x08, 0x00, -1, 0x02, 0x0142, 0x0004 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0005 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0006 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0007 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0008 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0009 }, + { 0x09, 0x00, -1, 0x00, 0x0242, 0x0002 }, + { 0x09, 0x00, -1, 0x01, 0x0242, 0x0003 }, + { 0x09, 0x00, -1, 0x02, 0x0242, 0x0004 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0005 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0006 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0007 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0008 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0009 }, + { 0x0a, 0x00, -1, 0x00, 0x0442, 0x0002 }, + { 0x0a, 0x00, -1, 0x01, 0x0442, 0x0003 }, + { 0x0a, 0x00, -1, 0x02, 0x0442, 0x0004 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0005 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0006 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0007 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0008 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0009 }, + { 0x0c, 0x00, -1, 0x00, 0x0842, 0x0002 }, + { 0x0c, 0x00, -1, 0x01, 0x0842, 0x0003 }, + { 0x0c, 0x00, -1, 0x02, 0x0842, 0x0004 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0005 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0006 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0007 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0008 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0009 }, + { 0x0e, 0x00, -1, 0x00, 0x1842, 0x0002 }, + { 0x0e, 0x00, -1, 0x01, 0x1842, 0x0003 }, + { 0x0e, 0x00, -1, 0x02, 0x1842, 0x0004 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0005 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0006 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0007 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0008 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0009 }, + { 0x18, 0x00, -1, 0x00, 0x5842, 0x0002 }, + { 0x18, 0x00, -1, 0x01, 0x5842, 0x0003 }, + { 0x18, 0x00, -1, 0x02, 0x5842, 0x0004 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0005 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0006 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0007 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0008 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0009 }, + { 0x02, 0x05, -1, 0x03, 0x000a, 0x0046 }, + { 0x02, 0x05, -1, 0x03, 0x000a, 0x0066 }, + { 0x02, 0x06, -1, 0x03, 0x000a, 0x0086 }, + { 0x02, 0x07, -1, 0x03, 0x000a, 0x00c6 }, + { 0x02, 0x08, -1, 0x03, 0x000a, 0x0146 }, + { 0x02, 0x09, -1, 0x03, 0x000a, 0x0246 }, + { 0x02, 0x0a, -1, 0x03, 0x000a, 0x0446 }, + { 0x02, 0x18, -1, 0x03, 0x000a, 0x0846 }, + { 0x02, 0x05, -1, 0x03, 0x000e, 0x0046 }, + { 0x02, 0x05, -1, 0x03, 0x000e, 0x0066 }, + { 0x02, 0x06, -1, 0x03, 0x000e, 0x0086 }, + { 0x02, 0x07, -1, 0x03, 0x000e, 0x00c6 }, + { 0x02, 0x08, -1, 0x03, 0x000e, 0x0146 }, + { 0x02, 0x09, -1, 0x03, 0x000e, 0x0246 }, + { 0x02, 0x0a, -1, 0x03, 0x000e, 0x0446 }, + { 0x02, 0x18, -1, 0x03, 0x000e, 0x0846 }, + { 0x03, 0x05, -1, 0x03, 0x0012, 0x0046 }, + { 0x03, 0x05, -1, 0x03, 0x0012, 0x0066 }, + { 0x03, 0x06, -1, 0x03, 0x0012, 0x0086 }, + { 0x03, 0x07, -1, 0x03, 0x0012, 0x00c6 }, + { 0x03, 0x08, -1, 0x03, 0x0012, 0x0146 }, + { 0x03, 0x09, -1, 0x03, 0x0012, 0x0246 }, + { 0x03, 0x0a, -1, 0x03, 0x0012, 0x0446 }, + { 0x03, 0x18, -1, 0x03, 0x0012, 0x0846 }, + { 0x03, 0x05, -1, 0x03, 0x001a, 0x0046 }, + { 0x03, 0x05, -1, 0x03, 0x001a, 0x0066 }, + { 0x03, 0x06, -1, 0x03, 0x001a, 0x0086 }, + { 0x03, 0x07, -1, 0x03, 0x001a, 0x00c6 }, + { 0x03, 0x08, -1, 0x03, 0x001a, 0x0146 }, + { 0x03, 0x09, -1, 0x03, 0x001a, 0x0246 }, + { 0x03, 0x0a, -1, 0x03, 0x001a, 0x0446 }, + { 0x03, 0x18, -1, 0x03, 0x001a, 0x0846 }, + { 0x04, 0x05, -1, 0x03, 0x0022, 0x0046 }, + { 0x04, 0x05, -1, 0x03, 0x0022, 0x0066 }, + { 0x04, 0x06, -1, 0x03, 0x0022, 0x0086 }, + { 0x04, 0x07, -1, 0x03, 0x0022, 0x00c6 }, + { 0x04, 0x08, -1, 0x03, 0x0022, 0x0146 }, + { 0x04, 0x09, -1, 0x03, 0x0022, 0x0246 }, + { 0x04, 0x0a, -1, 0x03, 0x0022, 0x0446 }, + { 0x04, 0x18, -1, 0x03, 0x0022, 0x0846 }, + { 0x04, 0x05, -1, 0x03, 0x0032, 0x0046 }, + { 0x04, 0x05, -1, 0x03, 0x0032, 0x0066 }, + { 0x04, 0x06, -1, 0x03, 0x0032, 0x0086 }, + { 0x04, 0x07, -1, 0x03, 0x0032, 0x00c6 }, + { 0x04, 0x08, -1, 0x03, 0x0032, 0x0146 }, + { 0x04, 0x09, -1, 0x03, 0x0032, 0x0246 }, + { 0x04, 0x0a, -1, 0x03, 0x0032, 0x0446 }, + { 0x04, 0x18, -1, 0x03, 0x0032, 0x0846 }, + { 0x05, 0x05, -1, 0x03, 0x0042, 0x0046 }, + { 0x05, 0x05, -1, 0x03, 0x0042, 0x0066 }, + { 0x05, 0x06, -1, 0x03, 0x0042, 0x0086 }, + { 0x05, 0x07, -1, 0x03, 0x0042, 0x00c6 }, + { 0x05, 0x08, -1, 0x03, 0x0042, 0x0146 }, + { 0x05, 0x09, -1, 0x03, 0x0042, 0x0246 }, + { 0x05, 0x0a, -1, 0x03, 0x0042, 0x0446 }, + { 0x05, 0x18, -1, 0x03, 0x0042, 0x0846 }, + { 0x05, 0x05, -1, 0x03, 0x0062, 0x0046 }, + { 0x05, 0x05, -1, 0x03, 0x0062, 0x0066 }, + { 0x05, 0x06, -1, 0x03, 0x0062, 0x0086 }, + { 0x05, 0x07, -1, 0x03, 0x0062, 0x00c6 }, + { 0x05, 0x08, -1, 0x03, 0x0062, 0x0146 }, + { 0x05, 0x09, -1, 0x03, 0x0062, 0x0246 }, + { 0x05, 0x0a, -1, 0x03, 0x0062, 0x0446 }, + { 0x05, 0x18, -1, 0x03, 0x0062, 0x0846 }, + { 0x06, 0x01, -1, 0x03, 0x0082, 0x000a }, + { 0x06, 0x01, -1, 0x03, 0x0082, 0x000c }, + { 0x06, 0x02, -1, 0x03, 0x0082, 0x000e }, + { 0x06, 0x02, -1, 0x03, 0x0082, 0x0012 }, + { 0x06, 0x03, -1, 0x03, 0x0082, 0x0016 }, + { 0x06, 0x03, -1, 0x03, 0x0082, 0x001e }, + { 0x06, 0x04, -1, 0x03, 0x0082, 0x0026 }, + { 0x06, 0x04, -1, 0x03, 0x0082, 0x0036 }, + { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000a }, + { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000c }, + { 0x07, 0x02, -1, 0x03, 0x00c2, 0x000e }, + { 0x07, 0x02, -1, 0x03, 0x00c2, 0x0012 }, + { 0x07, 0x03, -1, 0x03, 0x00c2, 0x0016 }, + { 0x07, 0x03, -1, 0x03, 0x00c2, 0x001e }, + { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0026 }, + { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0036 }, + { 0x08, 0x01, -1, 0x03, 0x0142, 0x000a }, + { 0x08, 0x01, -1, 0x03, 0x0142, 0x000c }, + { 0x08, 0x02, -1, 0x03, 0x0142, 0x000e }, + { 0x08, 0x02, -1, 0x03, 0x0142, 0x0012 }, + { 0x08, 0x03, -1, 0x03, 0x0142, 0x0016 }, + { 0x08, 0x03, -1, 0x03, 0x0142, 0x001e }, + { 0x08, 0x04, -1, 0x03, 0x0142, 0x0026 }, + { 0x08, 0x04, -1, 0x03, 0x0142, 0x0036 }, + { 0x09, 0x01, -1, 0x03, 0x0242, 0x000a }, + { 0x09, 0x01, -1, 0x03, 0x0242, 0x000c }, + { 0x09, 0x02, -1, 0x03, 0x0242, 0x000e }, + { 0x09, 0x02, -1, 0x03, 0x0242, 0x0012 }, + { 0x09, 0x03, -1, 0x03, 0x0242, 0x0016 }, + { 0x09, 0x03, -1, 0x03, 0x0242, 0x001e }, + { 0x09, 0x04, -1, 0x03, 0x0242, 0x0026 }, + { 0x09, 0x04, -1, 0x03, 0x0242, 0x0036 }, + { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000a }, + { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000c }, + { 0x0a, 0x02, -1, 0x03, 0x0442, 0x000e }, + { 0x0a, 0x02, -1, 0x03, 0x0442, 0x0012 }, + { 0x0a, 0x03, -1, 0x03, 0x0442, 0x0016 }, + { 0x0a, 0x03, -1, 0x03, 0x0442, 0x001e }, + { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0026 }, + { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0036 }, + { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000a }, + { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000c }, + { 0x0c, 0x02, -1, 0x03, 0x0842, 0x000e }, + { 0x0c, 0x02, -1, 0x03, 0x0842, 0x0012 }, + { 0x0c, 0x03, -1, 0x03, 0x0842, 0x0016 }, + { 0x0c, 0x03, -1, 0x03, 0x0842, 0x001e }, + { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0026 }, + { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0036 }, + { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000a }, + { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000c }, + { 0x0e, 0x02, -1, 0x03, 0x1842, 0x000e }, + { 0x0e, 0x02, -1, 0x03, 0x1842, 0x0012 }, + { 0x0e, 0x03, -1, 0x03, 0x1842, 0x0016 }, + { 0x0e, 0x03, -1, 0x03, 0x1842, 0x001e }, + { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0026 }, + { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0036 }, + { 0x18, 0x01, -1, 0x03, 0x5842, 0x000a }, + { 0x18, 0x01, -1, 0x03, 0x5842, 0x000c }, + { 0x18, 0x02, -1, 0x03, 0x5842, 0x000e }, + { 0x18, 0x02, -1, 0x03, 0x5842, 0x0012 }, + { 0x18, 0x03, -1, 0x03, 0x5842, 0x0016 }, + { 0x18, 0x03, -1, 0x03, 0x5842, 0x001e }, + { 0x18, 0x04, -1, 0x03, 0x5842, 0x0026 }, + { 0x18, 0x04, -1, 0x03, 0x5842, 0x0036 }, + { 0x06, 0x05, -1, 0x03, 0x0082, 0x0046 }, + { 0x06, 0x05, -1, 0x03, 0x0082, 0x0066 }, + { 0x06, 0x06, -1, 0x03, 0x0082, 0x0086 }, + { 0x06, 0x07, -1, 0x03, 0x0082, 0x00c6 }, + { 0x06, 0x08, -1, 0x03, 0x0082, 0x0146 }, + { 0x06, 0x09, -1, 0x03, 0x0082, 0x0246 }, + { 0x06, 0x0a, -1, 0x03, 0x0082, 0x0446 }, + { 0x06, 0x18, -1, 0x03, 0x0082, 0x0846 }, + { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0046 }, + { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0066 }, + { 0x07, 0x06, -1, 0x03, 0x00c2, 0x0086 }, + { 0x07, 0x07, -1, 0x03, 0x00c2, 0x00c6 }, + { 0x07, 0x08, -1, 0x03, 0x00c2, 0x0146 }, + { 0x07, 0x09, -1, 0x03, 0x00c2, 0x0246 }, + { 0x07, 0x0a, -1, 0x03, 0x00c2, 0x0446 }, + { 0x07, 0x18, -1, 0x03, 0x00c2, 0x0846 }, + { 0x08, 0x05, -1, 0x03, 0x0142, 0x0046 }, + { 0x08, 0x05, -1, 0x03, 0x0142, 0x0066 }, + { 0x08, 0x06, -1, 0x03, 0x0142, 0x0086 }, + { 0x08, 0x07, -1, 0x03, 0x0142, 0x00c6 }, + { 0x08, 0x08, -1, 0x03, 0x0142, 0x0146 }, + { 0x08, 0x09, -1, 0x03, 0x0142, 0x0246 }, + { 0x08, 0x0a, -1, 0x03, 0x0142, 0x0446 }, + { 0x08, 0x18, -1, 0x03, 0x0142, 0x0846 }, + { 0x09, 0x05, -1, 0x03, 0x0242, 0x0046 }, + { 0x09, 0x05, -1, 0x03, 0x0242, 0x0066 }, + { 0x09, 0x06, -1, 0x03, 0x0242, 0x0086 }, + { 0x09, 0x07, -1, 0x03, 0x0242, 0x00c6 }, + { 0x09, 0x08, -1, 0x03, 0x0242, 0x0146 }, + { 0x09, 0x09, -1, 0x03, 0x0242, 0x0246 }, + { 0x09, 0x0a, -1, 0x03, 0x0242, 0x0446 }, + { 0x09, 0x18, -1, 0x03, 0x0242, 0x0846 }, + { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0046 }, + { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0066 }, + { 0x0a, 0x06, -1, 0x03, 0x0442, 0x0086 }, + { 0x0a, 0x07, -1, 0x03, 0x0442, 0x00c6 }, + { 0x0a, 0x08, -1, 0x03, 0x0442, 0x0146 }, + { 0x0a, 0x09, -1, 0x03, 0x0442, 0x0246 }, + { 0x0a, 0x0a, -1, 0x03, 0x0442, 0x0446 }, + { 0x0a, 0x18, -1, 0x03, 0x0442, 0x0846 }, + { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0046 }, + { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0066 }, + { 0x0c, 0x06, -1, 0x03, 0x0842, 0x0086 }, + { 0x0c, 0x07, -1, 0x03, 0x0842, 0x00c6 }, + { 0x0c, 0x08, -1, 0x03, 0x0842, 0x0146 }, + { 0x0c, 0x09, -1, 0x03, 0x0842, 0x0246 }, + { 0x0c, 0x0a, -1, 0x03, 0x0842, 0x0446 }, + { 0x0c, 0x18, -1, 0x03, 0x0842, 0x0846 }, + { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0046 }, + { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0066 }, + { 0x0e, 0x06, -1, 0x03, 0x1842, 0x0086 }, + { 0x0e, 0x07, -1, 0x03, 0x1842, 0x00c6 }, + { 0x0e, 0x08, -1, 0x03, 0x1842, 0x0146 }, + { 0x0e, 0x09, -1, 0x03, 0x1842, 0x0246 }, + { 0x0e, 0x0a, -1, 0x03, 0x1842, 0x0446 }, + { 0x0e, 0x18, -1, 0x03, 0x1842, 0x0846 }, + { 0x18, 0x05, -1, 0x03, 0x5842, 0x0046 }, + { 0x18, 0x05, -1, 0x03, 0x5842, 0x0066 }, + { 0x18, 0x06, -1, 0x03, 0x5842, 0x0086 }, + { 0x18, 0x07, -1, 0x03, 0x5842, 0x00c6 }, + { 0x18, 0x08, -1, 0x03, 0x5842, 0x0146 }, + { 0x18, 0x09, -1, 0x03, 0x5842, 0x0246 }, + { 0x18, 0x0a, -1, 0x03, 0x5842, 0x0446 }, + { 0x18, 0x18, -1, 0x03, 0x5842, 0x0846 }, +}; diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/state.c firefox-esr-140.10.0esr/modules/brotli/dec/state.c --- firefox-esr-140.9.1esr/modules/brotli/dec/state.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/state.c 2026-04-15 01:59:55.000000000 +0000 @@ -6,19 +6,32 @@ #include "state.h" -#include /* free, malloc */ - -#include - #include "../common/dictionary.h" +#include "../common/platform.h" #include "huffman.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif +#ifdef BROTLI_REPORTING +/* When BROTLI_REPORTING is defined extra reporting module have to be linked. */ +void BrotliDecoderOnStart(const BrotliDecoderState* s); +void BrotliDecoderOnFinish(const BrotliDecoderState* s); +#define BROTLI_DECODER_ON_START(s) BrotliDecoderOnStart(s); +#define BROTLI_DECODER_ON_FINISH(s) BrotliDecoderOnFinish(s); +#else +#if !defined(BROTLI_DECODER_ON_START) +#define BROTLI_DECODER_ON_START(s) (void)(s); +#endif +#if !defined(BROTLI_DECODER_ON_FINISH) +#define BROTLI_DECODER_ON_FINISH(s) (void)(s); +#endif +#endif + BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s, brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) { + BROTLI_DECODER_ON_START(s); if (!alloc_func) { s->alloc_func = BrotliDefaultAllocFunc; s->free_func = BrotliDefaultFreeFunc; @@ -135,16 +148,6 @@ BROTLI_DECODER_FREE(s, s->distance_hgroup.htrees); } -#ifdef BROTLI_REPORTING -/* When BROTLI_REPORTING is defined extra reporting module have to be linked. */ -void BrotliDecoderOnFinish(const BrotliDecoderState* s); -#define BROTLI_DECODER_ON_FINISH(s) BrotliDecoderOnFinish(s); -#else -#if !defined(BROTLI_DECODER_ON_FINISH) -#define BROTLI_DECODER_ON_FINISH(s) (void)(s); -#endif -#endif - void BrotliDecoderStateCleanup(BrotliDecoderState* s) { BrotliDecoderStateCleanupAfterMetablock(s); @@ -174,7 +177,7 @@ group->alphabet_size_limit = (uint16_t)alphabet_size_limit; group->num_htrees = (uint16_t)ntrees; group->htrees = p; - group->codes = (HuffmanCode*)(&p[ntrees]); + group->codes = p ? (HuffmanCode*)(&p[ntrees]) : NULL; return !!p; } diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/state.h firefox-esr-140.10.0esr/modules/brotli/dec/state.h --- firefox-esr-140.9.1esr/modules/brotli/dec/state.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/state.h 2026-04-15 01:59:55.000000000 +0000 @@ -9,14 +9,10 @@ #ifndef BROTLI_DEC_STATE_H_ #define BROTLI_DEC_STATE_H_ -#include -#include -#include - #include "../common/constants.h" -#include "../common/dictionary.h" #include "../common/platform.h" -#include "../common/transform.h" +#include +#include #include "bit_reader.h" #include "huffman.h" diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/static_init.c firefox-esr-140.10.0esr/modules/brotli/dec/static_init.c --- firefox-esr-140.9.1esr/modules/brotli/dec/static_init.c 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/static_init.c 2026-04-15 01:59:56.000000000 +0000 @@ -0,0 +1,53 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +#include "static_init.h" + +#include "../common/platform.h" +#include "../common/static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +#include "../common/dictionary.h" +#include "prefix.h" +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +static BROTLI_BOOL DoBrotliDecoderStaticInit(void) { + BROTLI_BOOL ok = BrotliDecoderInitCmdLut(kCmdLut); + if (!ok) return BROTLI_FALSE; + return BROTLI_TRUE; +} +#endif /* BROTLI_STATIC_INIT_NONE */ + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) +static BROTLI_BOOL kEarlyInitOk; +static __attribute__((constructor)) void BrotliDecoderStaticInitEarly(void) { + kEarlyInitOk = DoBrotliDecoderStaticInit(); +} +#elif (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_LAZY) +static BROTLI_BOOL kLazyInitOk; +void BrotliDecoderLazyStaticInitInner(void) { + kLazyInitOk = DoBrotliDecoderStaticInit(); +} +#endif /* BROTLI_STATIC_INIT_EARLY */ + +BROTLI_BOOL BrotliDecoderEnsureStaticInit(void) { +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_NONE) + return BROTLI_TRUE; +#elif (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) + return kEarlyInitOk; +#else + return kLazyInitOk; +#endif +} + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif diff -Nru firefox-esr-140.9.1esr/modules/brotli/dec/static_init.h firefox-esr-140.10.0esr/modules/brotli/dec/static_init.h --- firefox-esr-140.9.1esr/modules/brotli/dec/static_init.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/dec/static_init.h 2026-04-15 01:59:56.000000000 +0000 @@ -0,0 +1,30 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* Central point for static initialization. */ + +#ifndef THIRD_PARTY_BROTLI_DEC_STATIC_INIT_H_ +#define THIRD_PARTY_BROTLI_DEC_STATIC_INIT_H_ + +#include "../common/platform.h" +#include "../common/static_init.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_LAZY) +BROTLI_INTERNAL void BrotliDecoderLazyStaticInitInner(void); +BROTLI_INTERNAL void BrotliDecoderLazyStaticInit(void); +#endif /* BROTLI_STATIC_INIT */ + +BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderEnsureStaticInit(void); + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif + +#endif // THIRD_PARTY_BROTLI_DEC_STATIC_INIT_H_ diff -Nru firefox-esr-140.9.1esr/modules/brotli/include/brotli/decode.h firefox-esr-140.10.0esr/modules/brotli/include/brotli/decode.h --- firefox-esr-140.9.1esr/modules/brotli/include/brotli/decode.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/include/brotli/decode.h 2026-04-15 01:59:56.000000000 +0000 @@ -14,7 +14,7 @@ #include #include -#include +#include /* IWYU pragma: export */ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { @@ -85,9 +85,7 @@ BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_1, -14) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_2, -15) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, DISTANCE, -16) SEPARATOR \ - \ - /* -17 code is reserved */ \ - \ + BROTLI_ERROR_CODE(_ERROR_FORMAT_, BLOCK_SWITCH, -17) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_, COMPOUND_DICTIONARY, -18) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_, DICTIONARY_NOT_SET, -19) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_, INVALID_ARGUMENTS, -20) SEPARATOR \ diff -Nru firefox-esr-140.9.1esr/modules/brotli/include/brotli/encode.h firefox-esr-140.10.0esr/modules/brotli/include/brotli/encode.h --- firefox-esr-140.9.1esr/modules/brotli/include/brotli/encode.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/include/brotli/encode.h 2026-04-15 01:59:56.000000000 +0000 @@ -14,7 +14,7 @@ #include #include -#include +#include /* IWYU pragma: export */ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { @@ -283,6 +283,10 @@ * passed to @p alloc_func and @p free_func when they are called. @p free_func * has to return without doing anything when asked to free a NULL pointer. * + * @warning Created instance is "lean"; it does not contain copy of @p data, + * rather it contains only pointer to it; therefore, + * @p data @b MUST outlive the created instance. + * * @param type type of dictionary stored in data * @param data_size size of @p data buffer * @param data pointer to the dictionary data diff -Nru firefox-esr-140.9.1esr/modules/brotli/include/brotli/port.h firefox-esr-140.10.0esr/modules/brotli/include/brotli/port.h --- firefox-esr-140.9.1esr/modules/brotli/include/brotli/port.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/include/brotli/port.h 2026-04-15 01:59:56.000000000 +0000 @@ -239,8 +239,6 @@ #define BROTLI_PUBLIC #endif -/* BROTLI_INTERNAL could be defined to override visibility, e.g. for tests. */ -#if !defined(BROTLI_INTERNAL) #if defined(_WIN32) || defined(__CYGWIN__) #define BROTLI_INTERNAL #elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \ @@ -255,7 +253,6 @@ #else #define BROTLI_INTERNAL #endif -#endif #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ !defined(__STDC_NO_VLA__) && !defined(__cplusplus) && \ @@ -272,20 +269,20 @@ #if defined(_WIN32) #if defined(BROTLICOMMON_SHARED_COMPILATION) #define BROTLI_COMMON_API __declspec(dllexport) -#else +#else /* !BROTLICOMMON_SHARED_COMPILATION */ #define BROTLI_COMMON_API __declspec(dllimport) #endif /* BROTLICOMMON_SHARED_COMPILATION */ #if defined(BROTLIDEC_SHARED_COMPILATION) #define BROTLI_DEC_API __declspec(dllexport) -#else +#else /* !BROTLIDEC_SHARED_COMPILATION */ #define BROTLI_DEC_API __declspec(dllimport) #endif /* BROTLIDEC_SHARED_COMPILATION */ #if defined(BROTLIENC_SHARED_COMPILATION) #define BROTLI_ENC_API __declspec(dllexport) -#else +#else /* !BROTLIENC_SHARED_COMPILATION */ #define BROTLI_ENC_API __declspec(dllimport) #endif /* BROTLIENC_SHARED_COMPILATION */ -#else /* _WIN32 */ +#else /* !_WIN32 */ #define BROTLI_COMMON_API BROTLI_PUBLIC #define BROTLI_DEC_API BROTLI_PUBLIC #define BROTLI_ENC_API BROTLI_PUBLIC diff -Nru firefox-esr-140.9.1esr/modules/brotli/include/brotli/types.h firefox-esr-140.10.0esr/modules/brotli/include/brotli/types.h --- firefox-esr-140.9.1esr/modules/brotli/include/brotli/types.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/include/brotli/types.h 2026-04-15 01:59:56.000000000 +0000 @@ -12,7 +12,7 @@ #ifndef BROTLI_COMMON_TYPES_H_ #define BROTLI_COMMON_TYPES_H_ -#include /* for size_t */ +#include /* IWYU pragma: export */ #if defined(_MSC_VER) && (_MSC_VER < 1600) typedef __int8 int8_t; @@ -24,7 +24,7 @@ typedef unsigned __int64 uint64_t; typedef __int64 int64_t; #else -#include +#include /* IWYU pragma: export */ #endif /* defined(_MSC_VER) && (_MSC_VER < 1600) */ /** diff -Nru firefox-esr-140.9.1esr/modules/brotli/moz.build firefox-esr-140.10.0esr/modules/brotli/moz.build --- firefox-esr-140.9.1esr/modules/brotli/moz.build 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/moz.build 2026-04-15 01:59:56.000000000 +0000 @@ -25,7 +25,9 @@ 'dec/bit_reader.c', 'dec/decode.c', 'dec/huffman.c', + 'dec/prefix.c', 'dec/state.c', + 'dec/static_init.c', ] # We allow warnings for third-party code that can be updated from upstream. diff -Nru firefox-esr-140.9.1esr/modules/brotli/moz.yaml firefox-esr-140.10.0esr/modules/brotli/moz.yaml --- firefox-esr-140.9.1esr/modules/brotli/moz.yaml 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/brotli/moz.yaml 2026-04-15 01:59:56.000000000 +0000 @@ -10,8 +10,8 @@ url: https://github.com/google/brotli - release: ed738e842d2fbdf2d6459e39267a633c4a9b2f5d (2023-08-29T11:00:29Z). - revision: ed738e842d2fbdf2d6459e39267a633c4a9b2f5d + release: 4792c8e4c4235f6b501f13dbd07a8b4b253eee21 (2026-04-08T19:24:31Z). + revision: 4792c8e4c4235f6b501f13dbd07a8b4b253eee21 license: MIT @@ -24,8 +24,10 @@ - ".*" - "*" - docs + - go - python - scripts + - java - tests - c/enc - c/tools @@ -48,3 +50,5 @@ - action: move-dir from: '{vendor_dir}/c/dec' to: '{vendor_dir}/dec' + - action: delete-path + path: '{vendor_dir}/c' diff -Nru firefox-esr-140.9.1esr/modules/libpref/Preferences.cpp firefox-esr-140.10.0esr/modules/libpref/Preferences.cpp --- firefox-esr-140.9.1esr/modules/libpref/Preferences.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/libpref/Preferences.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -6209,7 +6209,6 @@ PREF_LIST_ENTRY("media.peerconnection.nat_simulator.network_delay_ms"), PREF_LIST_ENTRY("media.video_loopback_dev"), PREF_LIST_ENTRY("media.webspeech.service.endpoint"), - PREF_LIST_ENTRY("network.gio.supported-protocols"), PREF_LIST_ENTRY("network.protocol-handler.external."), PREF_LIST_ENTRY("network.security.ports.banned"), PREF_LIST_ENTRY("nimbus.syncdatastore."), diff -Nru firefox-esr-140.9.1esr/modules/libpref/init/StaticPrefList.yaml firefox-esr-140.10.0esr/modules/libpref/init/StaticPrefList.yaml --- firefox-esr-140.9.1esr/modules/libpref/init/StaticPrefList.yaml 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/modules/libpref/init/StaticPrefList.yaml 2026-04-15 01:59:55.000000000 +0000 @@ -4999,9 +4999,15 @@ value: 30000 mirror: always +# TCPSocket API +- name: dom.tcpsocket_in_child.enabled + type: RelaxedAtomicBool + value: false + mirror: always + # UDPSocket API - name: dom.udpsocket.enabled - type: bool + type: RelaxedAtomicBool value: false mirror: always @@ -11257,12 +11263,6 @@ value: @IS_NOT_XP_MACOSX@ mirror: always -# How long in milliseconds before timing out to destroy en/decoders gracefully -- name: media.gmp.coder-shutdown-timeout-ms - type: RelaxedAtomicUint32 - value: 1000 - mirror: always - #if defined(XP_LINUX) && defined(MOZ_SANDBOX) # Whether to allow, on a Linux system that doesn't support the necessary # sandboxing features, loading Gecko Media Plugins unsandboxed. However, EME @@ -15403,7 +15403,7 @@ # Set to * to allow all schemes. - name: network.http_index_format.allowed_schemes type: String - value: "file,moz-gio" + value: "file" mirror: never # Enable off-main-thread decompression of network streams diff -Nru firefox-esr-140.9.1esr/mozglue/interposers/env_interposer.cpp firefox-esr-140.10.0esr/mozglue/interposers/env_interposer.cpp --- firefox-esr-140.9.1esr/mozglue/interposers/env_interposer.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/mozglue/interposers/env_interposer.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -40,6 +40,24 @@ return result; } +MFBT_API char* secure_getenv(const char* name) { + static const auto real_secure_getenv = GET_REAL_SYMBOL(secure_getenv); + + pthread_mutex_lock(&gEnvLock); + char* result = real_secure_getenv(name); + pthread_mutex_unlock(&gEnvLock); + return result; +} + +MFBT_API char* __secure_getenv(const char* name) { + static const auto real___secure_getenv = GET_REAL_SYMBOL(__secure_getenv); + + pthread_mutex_lock(&gEnvLock); + char* result = real___secure_getenv(name); + pthread_mutex_unlock(&gEnvLock); + return result; +} + MFBT_API int putenv(char* string) { static const auto real_putenv = GET_REAL_SYMBOL(putenv); diff -Nru firefox-esr-140.9.1esr/netwerk/base/Tickler.cpp firefox-esr-140.10.0esr/netwerk/base/Tickler.cpp --- firefox-esr-140.9.1esr/netwerk/base/Tickler.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/base/Tickler.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -18,8 +18,6 @@ namespace mozilla { namespace net { -NS_IMPL_ISUPPORTS(Tickler, nsISupportsWeakReference, Tickler) - Tickler::Tickler() : mLock("Tickler::mLock"), mActive(false), @@ -177,9 +175,7 @@ NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSITIMERCALLBACK - explicit TicklerTimer(Tickler* aTickler) { - mTickler = do_GetWeakReference(aTickler); - } + explicit TicklerTimer(Tickler* t) : mTickler(t) {} // nsINamed NS_IMETHOD GetName(nsACString& aName) override { @@ -190,7 +186,7 @@ private: ~TicklerTimer() {} - nsWeakPtr mTickler; + ThreadSafeWeakPtr mTickler; }; void Tickler::StartTickler() { @@ -214,7 +210,7 @@ NS_IMPL_ISUPPORTS(TicklerTimer, nsITimerCallback, nsINamed) NS_IMETHODIMP TicklerTimer::Notify(nsITimer* timer) { - RefPtr tickler = do_QueryReferent(mTickler); + RefPtr tickler(mTickler); if (!tickler) return NS_ERROR_FAILURE; MutexAutoLock lock(tickler->mLock); diff -Nru firefox-esr-140.9.1esr/netwerk/base/Tickler.h firefox-esr-140.10.0esr/netwerk/base/Tickler.h --- firefox-esr-140.9.1esr/netwerk/base/Tickler.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/base/Tickler.h 2026-04-15 01:59:56.000000000 +0000 @@ -41,7 +41,7 @@ # include "nsISupports.h" # include "nsIThread.h" # include "nsITimer.h" -# include "nsWeakReference.h" +# include "mozilla/ThreadSafeWeakPtr.h" # include "prio.h" class nsIPrefBranch; @@ -59,9 +59,9 @@ 0x4af9, \ {0x9f, 0x7e, 0x9e, 0x83, 0x2d, 0xa3, 0x75, 0x4e}} -class Tickler final : public nsSupportsWeakReference { +class Tickler final : public SupportsThreadSafeWeakPtr { public: - NS_DECL_THREADSAFE_ISUPPORTS + MOZ_DECLARE_REFCOUNTED_TYPENAME(Tickler) NS_INLINE_DECL_STATIC_IID(NS_TICKLER_IID) // These methods are main thread only @@ -78,6 +78,7 @@ private: ~Tickler(); + friend class SupportsThreadSafeWeakPtr; friend class TicklerTimer; Mutex mLock MOZ_UNANNOTATED; nsCOMPtr mThread; diff -Nru firefox-esr-140.9.1esr/netwerk/base/nsBaseChannel.cpp firefox-esr-140.10.0esr/netwerk/base/nsBaseChannel.cpp --- firefox-esr-140.9.1esr/netwerk/base/nsBaseChannel.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/base/nsBaseChannel.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -41,7 +41,7 @@ } private: - nsIRequest* mRequest; + nsCOMPtr mRequest; }; // Used to suspend data events from mRequest within a function scope. This is diff -Nru firefox-esr-140.9.1esr/netwerk/base/nsDownloader.cpp firefox-esr-140.10.0esr/netwerk/base/nsDownloader.cpp --- firefox-esr-140.9.1esr/netwerk/base/nsDownloader.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/base/nsDownloader.cpp 2026-04-15 01:59:57.000000000 +0000 @@ -93,6 +93,7 @@ NS_IMETHODIMP nsDownloader::OnDataAvailable(nsIRequest* request, nsIInputStream* inStr, uint64_t sourceOffset, uint32_t count) { + RefPtr self(this); uint32_t n; return inStr->ReadSegments(ConsumeData, this, count, &n); } diff -Nru firefox-esr-140.9.1esr/netwerk/base/nsSyncStreamListener.cpp firefox-esr-140.10.0esr/netwerk/base/nsSyncStreamListener.cpp --- firefox-esr-140.9.1esr/netwerk/base/nsSyncStreamListener.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/base/nsSyncStreamListener.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -105,6 +105,9 @@ NS_IMETHODIMP nsSyncStreamListener::Available(uint64_t* result) { + // Nested event loop can run code that drops the last external reference. + RefPtr self(this); + if (NS_FAILED(mStatus)) return mStatus; mStatus = mPipeIn->Available(result); diff -Nru firefox-esr-140.9.1esr/netwerk/base/nsUDPSocket.cpp firefox-esr-140.10.0esr/netwerk/base/nsUDPSocket.cpp --- firefox-esr-140.9.1esr/netwerk/base/nsUDPSocket.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/base/nsUDPSocket.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -114,17 +114,17 @@ //----------------------------------------------------------------------------- NS_IMPL_ISUPPORTS(nsUDPOutputStream, nsIOutputStream) -nsUDPOutputStream::nsUDPOutputStream(nsUDPSocket* aSocket, PRFileDesc* aFD, +nsUDPOutputStream::nsUDPOutputStream(nsUDPSocket* aSocket, PRNetAddr& aPrClientAddr) - : mSocket(aSocket), - mFD(aFD), - mPrClientAddr(aPrClientAddr), - mIsClosed(false) {} + : mSocket(aSocket), mPrClientAddr(aPrClientAddr), mIsClosed(false) {} NS_IMETHODIMP nsUDPOutputStream::Close() { if (mIsClosed) return NS_BASE_STREAM_CLOSED; mIsClosed = true; + if (mSocket->IsSocketClosed()) { + return NS_BASE_STREAM_CLOSED; + } return NS_OK; } @@ -138,9 +138,18 @@ uint32_t* _retval) { if (mIsClosed) return NS_BASE_STREAM_CLOSED; + if (mSocket->IsSocketClosed()) { + mIsClosed = true; + return NS_BASE_STREAM_CLOSED; + } + *_retval = 0; + PRFileDesc* fd = mSocket->GetFD(); + if (!fd) { + return NS_BASE_STREAM_CLOSED; + } int32_t count = - PR_SendTo(mFD, aBuf, aCount, 0, &mPrClientAddr, PR_INTERVAL_NO_WAIT); + PR_SendTo(fd, aBuf, aCount, 0, &mPrClientAddr, PR_INTERVAL_NO_WAIT); if (count < 0) { PRErrorCode code = PR_GetError(); return ErrorAccordingToNSPR(code); @@ -458,7 +467,7 @@ NS_NewPipe2(getter_AddRefs(pipeIn), getter_AddRefs(pipeOut), true, true, segsize, segcount); - RefPtr os = new nsUDPOutputStream(this, mFD, prClientAddr); + RefPtr os = new nsUDPOutputStream(this, prClientAddr); nsresult rv = NS_AsyncCopy(pipeIn, os, mSts, NS_ASYNCCOPY_VIA_READSEGMENTS, UDP_PACKET_CHUNK_SIZE); @@ -1224,8 +1233,6 @@ mPollFlags = (PR_POLL_WRITE | PR_POLL_READ | PR_POLL_EXCEPT); } -bool nsUDPSocket::IsSocketClosed() { return mFD == nullptr; } - NS_IMETHODIMP nsUDPSocket::SendBinaryStream(const nsACString& aHost, uint16_t aPort, nsIInputStream* aStream) { @@ -1247,7 +1254,10 @@ PR_InitializeNetAddr(PR_IpAddrAny, 0, &prAddr); NetAddrToPRNetAddr(aAddr, &prAddr); - RefPtr os = new nsUDPOutputStream(this, mFD, prAddr); + if (!mFD) { + return NS_BASE_STREAM_CLOSED; + } + RefPtr os = new nsUDPOutputStream(this, prAddr); return NS_AsyncCopy(aStream, os, mSts, NS_ASYNCCOPY_VIA_READSEGMENTS, UDP_PACKET_CHUNK_SIZE); } diff -Nru firefox-esr-140.9.1esr/netwerk/base/nsUDPSocket.h firefox-esr-140.10.0esr/netwerk/base/nsUDPSocket.h --- firefox-esr-140.9.1esr/netwerk/base/nsUDPSocket.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/base/nsUDPSocket.h 2026-04-15 01:59:55.000000000 +0000 @@ -36,6 +36,11 @@ nsUDPSocket(); + PRFileDesc* GetFD() { + MOZ_ASSERT(OnSocketThread(), "not on socket thread"); + return mFD; + } + private: virtual ~nsUDPSocket(); @@ -71,6 +76,15 @@ uint64_t mByteWriteCount{0}; }; +inline bool nsUDPSocket::IsSocketClosed() { +#ifdef DEBUG + bool onSTSThread = false; + mSts->IsOnCurrentThread(&onSTSThread); + MOZ_ASSERT(onSTSThread); +#endif + return !mFD; +} + //----------------------------------------------------------------------------- class nsUDPMessage : public nsIUDPMessage { @@ -98,14 +112,12 @@ NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIOUTPUTSTREAM - nsUDPOutputStream(nsUDPSocket* aSocket, PRFileDesc* aFD, - PRNetAddr& aPrClientAddr); + nsUDPOutputStream(nsUDPSocket* aSocket, PRNetAddr& aPrClientAddr); private: virtual ~nsUDPOutputStream() = default; RefPtr mSocket; - PRFileDesc* mFD; PRNetAddr mPrClientAddr; bool mIsClosed; }; diff -Nru firefox-esr-140.9.1esr/netwerk/build/components.conf firefox-esr-140.10.0esr/netwerk/build/components.conf --- firefox-esr-140.9.1esr/netwerk/build/components.conf 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/build/components.conf 2026-04-15 01:59:55.000000000 +0000 @@ -177,6 +177,7 @@ 'cid': '{15629ada-a41c-4a09-961f-6553cd60b1a2}', 'contract_ids': ['@mozilla.org/network/http-activity-distributor;1'], 'type': 'mozilla::net::nsHttpActivityDistributor', + 'singleton': True, 'headers': ['/netwerk/protocol/http/nsHttpActivityDistributor.h'], 'processes': ProcessSelector.ALLOW_IN_SOCKET_PROCESS, }, diff -Nru firefox-esr-140.9.1esr/netwerk/build/moz.build firefox-esr-140.10.0esr/netwerk/build/moz.build --- firefox-esr-140.9.1esr/netwerk/build/moz.build 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/build/moz.build 2026-04-15 01:59:55.000000000 +0000 @@ -41,12 +41,6 @@ "/extensions/auth", ] -if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - LOCAL_INCLUDES += [ - "/netwerk/protocol/gio", - ] - - LOCAL_INCLUDES += [ "!/netwerk/dns", "/modules/brotli/dec", diff -Nru firefox-esr-140.9.1esr/netwerk/dns/DNS.cpp firefox-esr-140.10.0esr/netwerk/dns/DNS.cpp --- firefox-esr-140.9.1esr/netwerk/dns/DNS.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/dns/DNS.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -113,7 +113,12 @@ } #if defined(XP_UNIX) if (addr->raw.family == AF_LOCAL) { - if (bufSize < sizeof(addr->local.path)) { + // local.path is NOT guaranteed to be NUL-terminated: PR_Accept casts + // PRNetAddr* to struct sockaddr* and Linux sun_path is 108 bytes vs + // our 104, so a peer bound to a >=104-char path fills the whole field + // with non-NUL data. We must write our own terminator, so require + // strictly more than sizeof(path) bytes. + if (bufSize <= sizeof(addr->local.path)) { // Many callers don't bother checking our return value, so // null-terminate just in case. if (bufSize > 0) { @@ -128,26 +133,54 @@ // using the destination's size may cause us to read off the end of the // source. memcpy(buf, addr->local.path, sizeof(addr->local.path)); + buf[sizeof(addr->local.path)] = '\0'; return true; } #endif return false; } +bool NetAddr::ToString(nsACString& aOutput) const { + size_t bufferSize = 0; + if (raw.family == AF_INET) { + bufferSize = INET_ADDRSTRLEN; + } else if (raw.family == AF_INET6) { + bufferSize = INET6_ADDRSTRLEN; + } +#if defined(XP_UNIX) + else if (raw.family == AF_LOCAL) { + // +1 for the NUL terminator that ToStringBuffer writes. + bufferSize = sizeof(local.path) + 1; + } +#endif + + auto handleOrErr = aOutput.BulkWrite(bufferSize, /* aPrefixToPreserve */ 0, + /* aAllowShrinking */ false); + if (handleOrErr.isErr()) { + NS_ABORT_OOM(bufferSize); + return false; + } + auto handle = handleOrErr.unwrap(); + + if (!ToStringBuffer(handle.Elements(), bufferSize)) { + handle.Finish(0, /* aAllowShrinking */ false); + return false; + } + handle.Finish(strlen(handle.Elements()), /* aAllowShrinking */ false); + return true; +} + nsCString NetAddr::ToString() const { nsCString out; - out.SetLength(kNetAddrMaxCStrBufSize); - if (ToStringBuffer(out.BeginWriting(), kNetAddrMaxCStrBufSize)) { - out.SetLength(strlen(out.BeginWriting())); - return out; - } - return ""_ns; + ToString(out); + return out; } void NetAddr::ToAddrPortString(nsACString& aOutput) const { + ToString(aOutput); uint16_t port = 0; GetPort(&port); - aOutput.Assign(nsPrintfCString("%s:%d", ToString().get(), port)); + aOutput.AppendPrintf(":%d", port); } bool NetAddr::IsLoopbackAddr() const { diff -Nru firefox-esr-140.9.1esr/netwerk/dns/DNS.h firefox-esr-140.10.0esr/netwerk/dns/DNS.h --- firefox-esr-140.9.1esr/netwerk/dns/DNS.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/dns/DNS.h 2026-04-15 01:59:56.000000000 +0000 @@ -155,6 +155,7 @@ bool IsIPAddrShared() const; nsresult GetPort(uint16_t* aResult) const; bool ToStringBuffer(char* buf, uint32_t bufSize) const; + bool ToString(nsACString& aOutput) const; nsCString ToString() const; void ToAddrPortString(nsACString& aOutput) const; nsILoadInfo::IPAddressSpace GetIpAddressSpace() const; diff -Nru firefox-esr-140.9.1esr/netwerk/dns/TRRServiceChild.cpp firefox-esr-140.10.0esr/netwerk/dns/TRRServiceChild.cpp --- firefox-esr-140.9.1esr/netwerk/dns/TRRServiceChild.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/dns/TRRServiceChild.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -66,6 +66,8 @@ NS_IMETHODIMP TRRServiceChild::Observe(nsISupports* aSubject, const char* aTopic, const char16_t* aData) { + // Must match + // TRRServiceParent::RecvNotifyNetworkConnectivityServiceObservers() if (!strcmp(aTopic, "network:connectivity-service:ip-checks-complete") || !strcmp(aTopic, "network:connectivity-service:dns-checks-complete")) { Unused << SendNotifyNetworkConnectivityServiceObservers( diff -Nru firefox-esr-140.9.1esr/netwerk/dns/TRRServiceParent.cpp firefox-esr-140.10.0esr/netwerk/dns/TRRServiceParent.cpp --- firefox-esr-140.9.1esr/netwerk/dns/TRRServiceParent.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/dns/TRRServiceParent.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -103,9 +103,22 @@ mozilla::ipc::IPCResult TRRServiceParent::RecvNotifyNetworkConnectivityServiceObservers( const nsCString& aTopic) { + // Must match TRRServiceChild::Observe() + const char* topic = nullptr; + if (!strcmp(aTopic.get(), + "network:connectivity-service:ip-checks-complete-from-socket-" + "process")) { + topic = "network:connectivity-service:ip-checks-complete"; + } else if (!strcmp(aTopic.get(), + "network:connectivity-service:dns-checks-complete-from-" + "socket-process")) { + topic = "network:connectivity-service:dns-checks-complete"; + } else { + return IPC_FAIL(this, "Unexpected notification"); + } nsCOMPtr obs = mozilla::services::GetObserverService(); if (obs) { - obs->NotifyObservers(nullptr, aTopic.get(), nullptr); + obs->NotifyObservers(nullptr, topic, nullptr); } return IPC_OK(); } diff -Nru firefox-esr-140.9.1esr/netwerk/dns/effective_tld_names.dat firefox-esr-140.10.0esr/netwerk/dns/effective_tld_names.dat --- firefox-esr-140.9.1esr/netwerk/dns/effective_tld_names.dat 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/dns/effective_tld_names.dat 2026-04-15 01:59:55.000000000 +0000 @@ -5,8 +5,8 @@ // Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, // rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. -// VERSION: 2026-03-09_08-24-09_UTC -// COMMIT: 3c5eb8e70837e15570608f2cb5abe8579e09c9b9 +// VERSION: 2026-04-10_20-27-44_UTC +// COMMIT: 8f9e04f2be9098ada07aa3cf13592dfe78870985 // Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. @@ -6824,7 +6824,7 @@ // newGTLDs -// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2026-02-18T15:51:43Z +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2026-04-10T15:53:10Z // This list is auto-generated, don't edit it manually. // aaa : American Automobile Association, Inc. // https://www.iana.org/domains/root/db/aaa.html @@ -7566,7 +7566,7 @@ // https://www.iana.org/domains/root/db/cipriani.html cipriani -// circle : Amazon Registry Services, Inc. +// circle : Jolly Host, LLC // https://www.iana.org/domains/root/db/circle.html circle @@ -8418,7 +8418,7 @@ // https://www.iana.org/domains/root/db/gop.html gop -// got : Amazon Registry Services, Inc. +// got : Jolly Host, LLC // https://www.iana.org/domains/root/db/got.html got @@ -8790,7 +8790,7 @@ // https://www.iana.org/domains/root/db/joburg.html joburg -// jot : Amazon Registry Services, Inc. +// jot : Jolly Host, LLC // https://www.iana.org/domains/root/db/jot.html jot @@ -12336,6 +12336,10 @@ // concludes Amazon +// Anomaly : https://opencode.ai +// Submitted by Dax Raad +opentunnel.xyz + // Antagonist B.V. : https://www.antagonist.nl/ // Submitted by Sander Hoentjen antagonist.cloud @@ -12889,6 +12893,10 @@ deno.net sandbox.deno.net +// DeployAgent : https://deployagent.com +// Submitted by Danny +deployagent.com + // deSEC : https://desec.io/ // Submitted by Peter Thomassen dedyn.io @@ -13453,6 +13461,10 @@ relay.evervault.app relay.evervault.dev +// Exe : https://exe.dev +// Submitted by Josh Bleecher Snyder +exe.xyz + // Expo : https://expo.dev/ // Submitted by Phil Pluckthun expo.app @@ -13596,6 +13608,7 @@ // Figma : https://www.figma.com // Submitted by Nick Frost +payload.dev figma.site figma-gov.site preview.site @@ -14020,6 +14033,10 @@ *.id.pub *.kin.pub +// HOOC AG : https://www.hooc.ch +// Submitted by Fabrizio Steiner +seprox.hooc.me + // Hoplix : https://www.hoplix.com // Submitted by Danilo De Franco hoplix.shop @@ -14308,6 +14325,18 @@ // Submitted by Stefan Keim js.org +// K2 Cloud : https://k2.cloud/ +// Submitted by K2 Cloud +elastic.k2.cloud +lb.ru-msk.k2.cloud +s3.ru-msk.k2.cloud +website.ru-msk.k2.cloud +lb.ru-spb.k2.cloud +s3.ru-spb.k2.cloud +website.ru-spb.k2.cloud +s3.k2.cloud +website.k2.cloud + // KaasHosting : http://www.kaashosting.nl/ // Submitted by Wouter Bakker kaas.gg @@ -14890,6 +14919,35 @@ *.database.run *.migration.run +// Northwest Nexus dba NuOz : https://nuoz.net/ +// An RFC 1480 locality domain delegate host +// Submitted by Peter Briggs on behalf of NuOz +aberdeen.wa.us +bainbridge-isl.wa.us +bellevue.wa.us +bremerton.wa.us +centralia.wa.us +chehalis.wa.us +forks.wa.us +gig-harbor.wa.us +hoquiam.wa.us +keyport.wa.us +kingston.wa.us +olympia.wa.us +port-angeles.wa.us +port-ludlow.wa.us +port-orchard.wa.us +port-townsend.wa.us +poulsbo.wa.us +redmond.wa.us +renton.wa.us +sea.wa.us +seattle.wa.us +sequim.wa.us +shelton.wa.us +silverdale.wa.us +yarrow-point.wa.us + // Noticeable : https://noticeable.io // Submitted by Laurent Pellegrino noticeable.news @@ -15059,10 +15117,6 @@ // Submitted by Derek Myers pgfog.com -// PageXL : https://pagexl.com -// Submitted by Yann Guichard -pagexl.com - // Pantheon Systems, Inc. : https://pantheon.io/ // Submitted by Gary Dylina gotpantheon.com @@ -15085,6 +15139,10 @@ // Submitted by Steve Leung mypep.link +// Perplexity AI : https://www.perplexity.ai/ +// Submitted by Alec Xiang +pplx.app + // Perspecta : https://perspecta.com/ // Submitted by Kenneth Van Alstyne perspecta.cloud @@ -15745,6 +15803,7 @@ // Stackryze : https://stackryze.com // Submitted by Sudheer Bhuvana +sryze.cc indevs.in // Staclar : https://staclar.com @@ -16092,6 +16151,11 @@ // Submitted by Deus Team deus-canvas.com +// vivenu GmbH : https://vivenu.com/ +// Submitted by Marvin Frick +vivenushop.com +vivenushop.dev + // Voorloper.com : https://voorloper.com // Submitted by Nathan van Bakel voorloper.cloud diff -Nru firefox-esr-140.9.1esr/netwerk/dns/nsDNSService2.cpp firefox-esr-140.10.0esr/netwerk/dns/nsDNSService2.cpp --- firefox-esr-140.9.1esr/netwerk/dns/nsDNSService2.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/dns/nsDNSService2.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -312,12 +312,14 @@ nsTArray::const_iterator iterCopy = mIter; int iterGenCntCopy = mIterGenCnt; + RefPtr addrInfoCopy = mAddrInfo; NetAddr addr; *result = NS_SUCCEEDED(GetNextAddr(0, &addr)); mIter = iterCopy; mIterGenCnt = iterGenCntCopy; + mAddrInfo = std::move(addrInfoCopy); mDone = false; return NS_OK; diff -Nru firefox-esr-140.9.1esr/netwerk/dns/nsHostResolver.cpp firefox-esr-140.10.0esr/netwerk/dns/nsHostResolver.cpp --- firefox-esr-140.9.1esr/netwerk/dns/nsHostResolver.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/dns/nsHostResolver.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -1601,6 +1601,7 @@ newRRSet->GetTrrFetchDurationNetworkOnly()); addrRec->addr_info = builder.Finish(); + addrRec->addr_info_gencnt++; } old_addr_info = std::move(newRRSet); } @@ -1613,6 +1614,7 @@ auto builder = addrRec->addr_info->Build(); builder.SortAddresses(NetAddrIPv6FirstComparator()); addrRec->addr_info = builder.Finish(); + addrRec->addr_info_gencnt++; } PrepareRecordExpirationAddrRecord(addrRec); diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/DocumentLoadListener.cpp firefox-esr-140.10.0esr/netwerk/ipc/DocumentLoadListener.cpp --- firefox-esr-140.9.1esr/netwerk/ipc/DocumentLoadListener.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/DocumentLoadListener.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -3196,6 +3196,7 @@ const nsACString& aReferrerPolicy, const nsACString& aCSPHeader) { LOG(("DocumentLoadListener::EarlyHint.\n")); + RefPtr kungFuDeathGrip(this); mEarlyHintsService.EarlyHint(aLinkHeader, GetChannelCreationURI(), mChannel, aReferrerPolicy, aCSPHeader, GetLoadingBrowsingContext()); diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/NeckoChannelParams.ipdlh firefox-esr-140.10.0esr/netwerk/ipc/NeckoChannelParams.ipdlh --- firefox-esr-140.9.1esr/netwerk/ipc/NeckoChannelParams.ipdlh 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/NeckoChannelParams.ipdlh 2026-04-15 01:59:55.000000000 +0000 @@ -632,31 +632,6 @@ }; //----------------------------------------------------------------------------- -// GIO IPDL structs -//----------------------------------------------------------------------------- - -struct GIOChannelOpenArgs -{ - URIParams uri; - uint64_t startPos; - nsCString entityID; - IPCStream? uploadStream; - LoadInfoArgs loadInfo; - uint32_t loadFlags; -}; - -struct GIOChannelConnectArgs -{ - uint32_t channelId; -}; - -union GIOChannelCreationArgs -{ - GIOChannelOpenArgs; // For AsyncOpen: the common case. - GIOChannelConnectArgs; // Used for redirected-to channels -}; - -//----------------------------------------------------------------------------- // File IPDL structs //----------------------------------------------------------------------------- diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/NeckoChild.cpp firefox-esr-140.10.0esr/netwerk/ipc/NeckoChild.cpp --- firefox-esr-140.9.1esr/netwerk/ipc/NeckoChild.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/NeckoChild.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -13,9 +13,6 @@ #include "mozilla/net/ChildDNSService.h" #include "mozilla/net/CookieServiceChild.h" #include "mozilla/net/DataChannelChild.h" -#ifdef MOZ_WIDGET_GTK -# include "mozilla/net/GIOChannelChild.h" -#endif #include "mozilla/net/FileChannelChild.h" #include "mozilla/net/WebSocketChannelChild.h" #include "mozilla/net/WebSocketEventListenerChild.h" @@ -129,24 +126,6 @@ return true; } -#ifdef MOZ_WIDGET_GTK -PGIOChannelChild* NeckoChild::AllocPGIOChannelChild( - PBrowserChild* aBrowser, const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs) { - // We don't allocate here: see GIOChannelChild::AsyncOpen() - MOZ_CRASH("AllocPGIOChannelChild should not be called"); - return nullptr; -} - -bool NeckoChild::DeallocPGIOChannelChild(PGIOChannelChild* channel) { - MOZ_ASSERT(IsNeckoChild(), "DeallocPGIOChannelChild called by non-child!"); - - GIOChannelChild* child = static_cast(channel); - child->ReleaseIPDLReference(); - return true; -} -#endif - PCookieServiceChild* NeckoChild::AllocPCookieServiceChild() { // We don't allocate here: see CookieService::GetSingleton() MOZ_ASSERT_UNREACHABLE("AllocPCookieServiceChild should not be called"); diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/NeckoChild.h firefox-esr-140.10.0esr/netwerk/ipc/NeckoChild.h --- firefox-esr-140.9.1esr/netwerk/ipc/NeckoChild.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/NeckoChild.h 2026-04-15 01:59:56.000000000 +0000 @@ -41,12 +41,6 @@ PCookieServiceChild* AllocPCookieServiceChild(); bool DeallocPCookieServiceChild(PCookieServiceChild*); -#ifdef MOZ_WIDGET_GTK - PGIOChannelChild* AllocPGIOChannelChild( - PBrowserChild* aBrowser, const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs); - bool DeallocPGIOChannelChild(PGIOChannelChild*); -#endif PWebSocketChild* AllocPWebSocketChild(PBrowserChild*, const SerializedLoadContext&, const uint32_t&); diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/NeckoMessageUtils.h firefox-esr-140.10.0esr/netwerk/ipc/NeckoMessageUtils.h --- firefox-esr-140.9.1esr/netwerk/ipc/NeckoMessageUtils.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/NeckoMessageUtils.h 2026-04-15 01:59:56.000000000 +0000 @@ -117,14 +117,9 @@ ReadParam(aReader, &aResult->inet6.ip.u64[0]) && ReadParam(aReader, &aResult->inet6.ip.u64[1]) && ReadParam(aReader, &aResult->inet6.scope_id); -#if defined(XP_UNIX) - } else if (aResult->raw.family == AF_LOCAL) { - return aReader->ReadBytesInto(&aResult->local.path, - sizeof(aResult->local.path)); -#endif } - /* We've been tricked by some socket family we don't know about! */ + // We've been tricked by some socket family we don't know about. return false; } }; diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/NeckoParent.cpp firefox-esr-140.10.0esr/netwerk/ipc/NeckoParent.cpp --- firefox-esr-140.9.1esr/netwerk/ipc/NeckoParent.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/NeckoParent.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -18,9 +18,6 @@ #include "mozilla/net/WebSocketChannelParent.h" #include "mozilla/net/WebSocketEventListenerParent.h" #include "mozilla/net/DataChannelParent.h" -#ifdef MOZ_WIDGET_GTK -# include "mozilla/net/GIOChannelParent.h" -#endif #include "mozilla/net/DocumentChannelParent.h" #include "mozilla/net/SimpleChannelParent.h" #include "mozilla/net/AltDataOutputStreamParent.h" @@ -330,51 +327,6 @@ return IPC_OK(); } -#ifdef MOZ_WIDGET_GTK -static already_AddRefed GetRequestingPrincipal( - const GIOChannelCreationArgs& aArgs) { - if (aArgs.type() != GIOChannelCreationArgs::TGIOChannelOpenArgs) { - return nullptr; - } - - const GIOChannelOpenArgs& args = aArgs.get_GIOChannelOpenArgs(); - return GetRequestingPrincipal(args.loadInfo()); -} - -PGIOChannelParent* NeckoParent::AllocPGIOChannelParent( - PBrowserParent* aBrowser, const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs) { - nsCOMPtr requestingPrincipal = - GetRequestingPrincipal(aOpenArgs); - - nsCOMPtr loadContext; - CreateChannelLoadContext(aBrowser, Manager(), aSerialized, - requestingPrincipal, loadContext); - PBOverrideStatus overrideStatus = - PBOverrideStatusFromLoadContext(aSerialized); - GIOChannelParent* p = new GIOChannelParent(BrowserParent::GetFrom(aBrowser), - loadContext, overrideStatus); - p->AddRef(); - return p; -} - -bool NeckoParent::DeallocPGIOChannelParent(PGIOChannelParent* channel) { - GIOChannelParent* p = static_cast(channel); - p->Release(); - return true; -} - -mozilla::ipc::IPCResult NeckoParent::RecvPGIOChannelConstructor( - PGIOChannelParent* actor, PBrowserParent* aBrowser, - const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs) { - GIOChannelParent* p = static_cast(actor); - DebugOnly rv = p->Init(aOpenArgs); - MOZ_ASSERT(rv); - return IPC_OK(); -} -#endif - PSimpleChannelParent* NeckoParent::AllocPSimpleChannelParent( const uint32_t& channelId) { RefPtr p = new SimpleChannelParent(); @@ -432,6 +384,9 @@ mozilla::ipc::IPCResult NeckoParent::RecvPTCPServerSocketConstructor( PTCPServerSocketParent* aActor, const uint16_t& aLocalPort, const uint16_t& aBacklog, const bool& aUseArrayBuffers) { + if (!StaticPrefs::dom_tcpsocket_in_child_enabled()) { + return IPC_FAIL(this, "tcp socket not enabled"); + } static_cast(aActor)->Init(); return IPC_OK(); } @@ -452,6 +407,9 @@ mozilla::ipc::IPCResult NeckoParent::RecvPUDPSocketConstructor( PUDPSocketParent* aActor, nsIPrincipal* aPrincipal, const nsACString& aFilter) { + if (!StaticPrefs::dom_udpsocket_enabled() && aFilter.IsEmpty()) { + return IPC_FAIL(this, "udp socket not enabled"); + } if (!static_cast(aActor)->Init(aPrincipal, aFilter)) { return IPC_FAIL_NO_REASON(this); } diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/NeckoParent.h firefox-esr-140.10.0esr/netwerk/ipc/NeckoParent.h --- firefox-esr-140.9.1esr/netwerk/ipc/NeckoParent.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/NeckoParent.h 2026-04-15 01:59:57.000000000 +0000 @@ -142,17 +142,6 @@ virtual mozilla::ipc::IPCResult RecvPDataChannelConstructor( PDataChannelParent* aActor, const uint32_t& channelId) override; -# ifdef MOZ_WIDGET_GTK - PGIOChannelParent* AllocPGIOChannelParent( - PBrowserParent* aBrowser, const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs); - bool DeallocPGIOChannelParent(PGIOChannelParent* channel); - - virtual mozilla::ipc::IPCResult RecvPGIOChannelConstructor( - PGIOChannelParent* aActor, PBrowserParent* aBrowser, - const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs) override; -# endif PSimpleChannelParent* AllocPSimpleChannelParent(const uint32_t& channelId); bool DeallocPSimpleChannelParent(PSimpleChannelParent* actor); diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/PNecko.ipdl firefox-esr-140.10.0esr/netwerk/ipc/PNecko.ipdl --- firefox-esr-140.9.1esr/netwerk/ipc/PNecko.ipdl 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/PNecko.ipdl 2026-04-15 01:59:55.000000000 +0000 @@ -9,9 +9,6 @@ include protocol PHttpChannel; include protocol PCookieService; include protocol PBrowser; -#ifdef MOZ_WIDGET_GTK -include protocol PGIOChannel; -#endif include protocol PWebSocket; include protocol PWebSocketEventListener; include protocol PTCPSocket; @@ -58,9 +55,6 @@ manages PUDPSocket; manages PDNSRequest; manages PDataChannel; -#ifdef MOZ_WIDGET_GTK - manages PGIOChannel; -#endif manages PSimpleChannel; manages PFileChannel; manages PTransportProvider; @@ -114,9 +108,6 @@ * the parent and the child when we're redirecting to a data: URI. */ async PDataChannel(uint32_t channelId); -#ifdef MOZ_WIDGET_GTK - async PGIOChannel(nullable PBrowser browser, SerializedLoadContext loadContext, GIOChannelCreationArgs args); -#endif async PSimpleChannel(uint32_t channelId); async PFileChannel(); diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/SocketProcessBridgeParent.cpp firefox-esr-140.10.0esr/netwerk/ipc/SocketProcessBridgeParent.cpp --- firefox-esr-140.9.1esr/netwerk/ipc/SocketProcessBridgeParent.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/SocketProcessBridgeParent.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -47,8 +47,8 @@ transportQueue->Dispatch(NS_NewRunnableFunction( "BackgroundDataBridgeParent::Bind", [endpoint = std::move(aEndpoint), aChannelID]() mutable { - RefPtr actor = - new net::BackgroundDataBridgeParent(aChannelID); + RefPtr actor = + BackgroundDataBridgeParent::Create(aChannelID); endpoint.Bind(actor); })); return IPC_OK(); diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/SocketProcessParent.cpp firefox-esr-140.10.0esr/netwerk/ipc/SocketProcessParent.cpp --- firefox-esr-140.9.1esr/netwerk/ipc/SocketProcessParent.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/SocketProcessParent.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -99,33 +99,37 @@ const Maybe& aDMDFile) { mMemoryReportRequest = MakeUnique(aGeneration); - PSocketProcessParent::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [&](const uint32_t& aGeneration2) { - MOZ_ASSERT(gIOService); - if (!gIOService->SocketProcess()) { - return; - } - SocketProcessParent* actor = gIOService->SocketProcess()->GetActor(); - if (!actor) { - return; - } - if (actor->mMemoryReportRequest) { - actor->mMemoryReportRequest->Finish(aGeneration2); - actor->mMemoryReportRequest = nullptr; - } - }, - [&](mozilla::ipc::ResponseRejectReason) { - MOZ_ASSERT(gIOService); - if (!gIOService->SocketProcess()) { - return; - } - SocketProcessParent* actor = gIOService->SocketProcess()->GetActor(); - if (!actor) { - return; - } - actor->mMemoryReportRequest = nullptr; - }); + PSocketProcessParent::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [](uint32_t aGeneration2) { + MOZ_ASSERT(gIOService); + if (!gIOService->SocketProcess()) { + return; + } + SocketProcessParent* actor = + gIOService->SocketProcess()->GetActor(); + if (!actor) { + return; + } + if (actor->mMemoryReportRequest) { + actor->mMemoryReportRequest->Finish(aGeneration2); + actor->mMemoryReportRequest = nullptr; + } + }, + [](mozilla::ipc::ResponseRejectReason) { + MOZ_ASSERT(gIOService); + if (!gIOService->SocketProcess()) { + return; + } + SocketProcessParent* actor = + gIOService->SocketProcess()->GetActor(); + if (!actor) { + return; + } + actor->mMemoryReportRequest = nullptr; + }); return true; } diff -Nru firefox-esr-140.9.1esr/netwerk/ipc/moz.build firefox-esr-140.10.0esr/netwerk/ipc/moz.build --- firefox-esr-140.9.1esr/netwerk/ipc/moz.build 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/ipc/moz.build 2026-04-15 01:59:56.000000000 +0000 @@ -68,7 +68,6 @@ PREPROCESSED_IPDL_SOURCES += [ - "PNecko.ipdl", "PSocketProcess.ipdl", "PSocketProcessBridge.ipdl", ] @@ -79,6 +78,7 @@ "PDocumentChannel.ipdl", "PFileChannel.ipdl", "PInputChannelThrottleQueue.ipdl", + "PNecko.ipdl", "PProxyAutoConfig.ipdl", "PProxyConfigLookup.ipdl", "PSimpleChannel.ipdl", diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/gio/GIOChannelChild.cpp firefox-esr-140.10.0esr/netwerk/protocol/gio/GIOChannelChild.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/gio/GIOChannelChild.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/gio/GIOChannelChild.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,457 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=4 sw=2 sts=2 et tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "mozilla/net/NeckoChild.h" -#include "GIOChannelChild.h" -#include "nsGIOProtocolHandler.h" -#include "mozilla/dom/ContentChild.h" -#include "mozilla/dom/BrowserChild.h" -#include "nsContentUtils.h" -#include "nsIBrowserChild.h" -#include "nsStringStream.h" -#include "nsNetUtil.h" -#include "mozilla/ipc/IPCStreamUtils.h" -#include "mozilla/ipc/URIUtils.h" -#include "SerializedLoadContext.h" -#include "mozilla/ipc/BackgroundUtils.h" -#include "nsIURIMutator.h" -#include "nsContentSecurityManager.h" -#include "SerializedLoadContext.h" -#include "mozilla/Logging.h" - -using mozilla::dom::ContentChild; - -namespace mozilla { -#undef LOG -#define LOG(args) MOZ_LOG(gGIOLog, mozilla::LogLevel::Debug, args) -namespace net { - -GIOChannelChild::GIOChannelChild(nsIURI* aUri) - : mEventQ(new ChannelEventQueue(static_cast(this))) { - SetURI(aUri); - // We could support thread retargeting, but as long as we're being driven by - // IPDL on the main thread it doesn't buy us anything. - DisallowThreadRetargeting(); -} - -void GIOChannelChild::AddIPDLReference() { - MOZ_ASSERT(!mIPCOpen, "Attempt to retain more than one IPDL reference"); - mIPCOpen = true; - AddRef(); -} - -void GIOChannelChild::ReleaseIPDLReference() { - MOZ_ASSERT(mIPCOpen, "Attempt to release nonexistent IPDL reference"); - mIPCOpen = false; - Release(); -} - -//----------------------------------------------------------------------------- -// GIOChannelChild::nsISupports -//----------------------------------------------------------------------------- - -NS_IMPL_ISUPPORTS_INHERITED(GIOChannelChild, nsBaseChannel, nsIChildChannel) - -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelChild::AsyncOpen(nsIStreamListener* aListener) { - nsCOMPtr listener = aListener; - nsresult rv = - nsContentSecurityManager::doContentSecurityCheck(this, listener); - NS_ENSURE_SUCCESS(rv, rv); - - LOG(("GIOChannelChild::AsyncOpen [this=%p]\n", this)); - - NS_ENSURE_TRUE((gNeckoChild), NS_ERROR_FAILURE); - NS_ENSURE_TRUE( - !static_cast(gNeckoChild->Manager())->IsShuttingDown(), - NS_ERROR_FAILURE); - NS_ENSURE_ARG_POINTER(listener); - NS_ENSURE_TRUE(!mIsPending, NS_ERROR_IN_PROGRESS); - NS_ENSURE_TRUE(!mWasOpened, NS_ERROR_ALREADY_OPENED); - - // Port checked in parent, but duplicate here so we can return with error - // immediately, as we've done since before e10s. - rv = NS_CheckPortSafety(nsBaseChannel::URI()); // Need to disambiguate, - // because in the child ipdl, - // a typedef URI is defined... - if (NS_FAILED(rv)) { - return rv; - } - - mozilla::dom::BrowserChild* browserChild = nullptr; - nsCOMPtr iBrowserChild; - NS_QueryNotificationCallbacks(mCallbacks, mLoadGroup, - NS_GET_IID(nsIBrowserChild), - getter_AddRefs(iBrowserChild)); - GetCallback(iBrowserChild); - if (iBrowserChild) { - browserChild = - static_cast(iBrowserChild.get()); - } - - mListener = listener; - - // add ourselves to the load group. - if (mLoadGroup) { - mLoadGroup->AddRequest(this, nullptr); - } - - Maybe ipcStream; - mozilla::ipc::SerializeIPCStream(do_AddRef(mUploadStream), ipcStream, - /* aAllowLazy */ false); - - uint32_t loadFlags = 0; - GetLoadFlags(&loadFlags); - - GIOChannelOpenArgs openArgs; - SerializeURI(nsBaseChannel::URI(), openArgs.uri()); - openArgs.startPos() = mStartPos; - openArgs.entityID() = mEntityID; - openArgs.uploadStream() = ipcStream; - openArgs.loadFlags() = loadFlags; - - nsCOMPtr loadInfo = LoadInfo(); - rv = mozilla::ipc::LoadInfoToLoadInfoArgs(loadInfo, &openArgs.loadInfo()); - NS_ENSURE_SUCCESS(rv, rv); - - // This must happen before the constructor message is sent. - SetupNeckoTarget(); - - // The socket transport layer in the chrome process now has a logical ref to - // us until OnStopRequest is called. - AddIPDLReference(); - - if (!gNeckoChild->SendPGIOChannelConstructor( - this, browserChild, IPC::SerializedLoadContext(this), openArgs)) { - return NS_ERROR_FAILURE; - } - - mIsPending = true; - mWasOpened = true; - - return rv; -} - -NS_IMETHODIMP -GIOChannelChild::IsPending(bool* aResult) { - *aResult = mIsPending; - return NS_OK; -} - -nsresult GIOChannelChild::OpenContentStream(bool aAsync, - nsIInputStream** aStream, - nsIChannel** aChannel) { - MOZ_CRASH("GIOChannel*Child* should never have OpenContentStream called!"); - return NS_OK; -} - -mozilla::ipc::IPCResult GIOChannelChild::RecvOnStartRequest( - const nsresult& aChannelStatus, const int64_t& aContentLength, - const nsACString& aContentType, const nsACString& aEntityID, - const URIParams& aURI) { - LOG(("GIOChannelChild::RecvOnStartRequest [this=%p]\n", this)); - mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent( - this, [self = UnsafePtr(this), aChannelStatus, - aContentLength, aContentType = nsCString(aContentType), - aEntityID = nsCString(aEntityID), aURI]() { - self->DoOnStartRequest(aChannelStatus, aContentLength, aContentType, - aEntityID, aURI); - })); - return IPC_OK(); -} - -void GIOChannelChild::DoOnStartRequest(const nsresult& aChannelStatus, - const int64_t& aContentLength, - const nsACString& aContentType, - const nsACString& aEntityID, - const URIParams& aURI) { - LOG(("GIOChannelChild::DoOnStartRequest [this=%p]\n", this)); - if (!mCanceled && NS_SUCCEEDED(mStatus)) { - mStatus = aChannelStatus; - } - - mContentLength = aContentLength; - SetContentType(aContentType); - mEntityID = aEntityID; - - nsCString spec; - nsCOMPtr uri = DeserializeURI(aURI); - nsresult rv = uri->GetSpec(spec); - if (NS_SUCCEEDED(rv)) { - // Changes nsBaseChannel::URI() - rv = NS_MutateURI(mURI).SetSpec(spec).Finalize(mURI); - } - - if (NS_FAILED(rv)) { - Cancel(rv); - } - - AutoEventEnqueuer ensureSerialDispatch(mEventQ); - rv = mListener->OnStartRequest(this); - if (NS_FAILED(rv)) { - Cancel(rv); - } -} - -mozilla::ipc::IPCResult GIOChannelChild::RecvOnDataAvailable( - const nsresult& aChannelStatus, const nsACString& aData, - const uint64_t& aOffset, const uint32_t& aCount) { - LOG(("GIOChannelChild::RecvOnDataAvailable [this=%p]\n", this)); - mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent( - this, [self = UnsafePtr(this), aChannelStatus, - aData = nsCString(aData), aOffset, aCount]() { - self->DoOnDataAvailable(aChannelStatus, aData, aOffset, aCount); - })); - - return IPC_OK(); -} - -void GIOChannelChild::DoOnDataAvailable(const nsresult& aChannelStatus, - const nsACString& aData, - const uint64_t& aOffset, - const uint32_t& aCount) { - LOG(("GIOChannelChild::DoOnDataAvailable [this=%p]\n", this)); - - if (!mCanceled && NS_SUCCEEDED(mStatus)) { - mStatus = aChannelStatus; - } - - if (mCanceled) { - return; - } - - // NOTE: the OnDataAvailable contract requires the client to read all the data - // in the inputstream. This code relies on that ('data' will go away after - // this function). Apparently the previous, non-e10s behavior was to actually - // support only reading part of the data, allowing later calls to read the - // rest. - nsCOMPtr stringStream; - nsresult rv = - NS_NewByteInputStream(getter_AddRefs(stringStream), - Span(aData).To(aCount), NS_ASSIGNMENT_DEPEND); - if (NS_FAILED(rv)) { - Cancel(rv); - return; - } - - AutoEventEnqueuer ensureSerialDispatch(mEventQ); - rv = mListener->OnDataAvailable(this, stringStream, aOffset, aCount); - if (NS_FAILED(rv)) { - Cancel(rv); - } - stringStream->Close(); -} - -mozilla::ipc::IPCResult GIOChannelChild::RecvOnStopRequest( - const nsresult& aChannelStatus) { - LOG(("GIOChannelChild::RecvOnStopRequest [this=%p status=%" PRIx32 "]\n", - this, static_cast(aChannelStatus))); - - mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent( - this, [self = UnsafePtr(this), aChannelStatus]() { - self->DoOnStopRequest(aChannelStatus); - })); - return IPC_OK(); -} - -void GIOChannelChild::DoOnStopRequest(const nsresult& aChannelStatus) { - LOG(("GIOChannelChild::DoOnStopRequest [this=%p status=%" PRIx32 "]\n", this, - static_cast(aChannelStatus))); - - if (!mCanceled) { - mStatus = aChannelStatus; - } - - { // Ensure that all queued ipdl events are dispatched before - // we initiate protocol deletion below. - mIsPending = false; - AutoEventEnqueuer ensureSerialDispatch(mEventQ); - (void)mListener->OnStopRequest(this, aChannelStatus); - - mListener = nullptr; - - if (mLoadGroup) { - mLoadGroup->RemoveRequest(this, nullptr, aChannelStatus); - } - } - - // This calls NeckoChild::DeallocPGIOChannelChild(), which deletes |this| if - // IPDL holds the last reference. Don't rely on |this| existing after here! - Send__delete__(this); -} - -mozilla::ipc::IPCResult GIOChannelChild::RecvFailedAsyncOpen( - const nsresult& aStatusCode) { - LOG(("GIOChannelChild::RecvFailedAsyncOpen [this=%p status=%" PRIx32 "]\n", - this, static_cast(aStatusCode))); - mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent( - this, [self = UnsafePtr(this), aStatusCode]() { - self->DoFailedAsyncOpen(aStatusCode); - })); - return IPC_OK(); -} - -void GIOChannelChild::DoFailedAsyncOpen(const nsresult& aStatusCode) { - LOG(("GIOChannelChild::DoFailedAsyncOpen [this=%p status=%" PRIx32 "]\n", - this, static_cast(aStatusCode))); - mStatus = aStatusCode; - - if (mLoadGroup) { - mLoadGroup->RemoveRequest(this, nullptr, aStatusCode); - } - - if (mListener) { - mListener->OnStartRequest(this); - mIsPending = false; - mListener->OnStopRequest(this, aStatusCode); - } else { - mIsPending = false; - } - - mListener = nullptr; - - if (mIPCOpen) { - Send__delete__(this); - } -} - -mozilla::ipc::IPCResult GIOChannelChild::RecvDeleteSelf() { - mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent( - this, - [self = UnsafePtr(this)]() { self->DoDeleteSelf(); })); - return IPC_OK(); -} - -void GIOChannelChild::DoDeleteSelf() { - if (mIPCOpen) { - Send__delete__(this); - } -} - -//----------------------------------------------------------------------------- -// GIOChannelChild::nsIResumableChannel -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelChild::Cancel(nsresult aStatus) { - LOG(("GIOChannelChild::Cancel [this=%p]\n", this)); - - if (mCanceled) { - return NS_OK; - } - - mCanceled = true; - mStatus = aStatus; - if (mIPCOpen) { - SendCancel(aStatus); - } - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelChild::Suspend() { - NS_ENSURE_TRUE(mIPCOpen, NS_ERROR_NOT_AVAILABLE); - - LOG(("GIOChannelChild::Suspend [this=%p]\n", this)); - - // SendSuspend only once, when suspend goes from 0 to 1. - if (!mSuspendCount++) { - SendSuspend(); - mSuspendSent = true; - } - mEventQ->Suspend(); - - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelChild::Resume() { - NS_ENSURE_TRUE(mIPCOpen, NS_ERROR_NOT_AVAILABLE); - - LOG(("GIOChannelChild::Resume [this=%p]\n", this)); - - // SendResume only once, when suspend count drops to 0. - if (!--mSuspendCount && mSuspendSent) { - SendResume(); - } - mEventQ->Resume(); - - return NS_OK; -} - -//----------------------------------------------------------------------------- -// GIOChannelChild::nsIChildChannel -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelChild::ConnectParent(uint32_t aId) { - NS_ENSURE_TRUE((gNeckoChild), NS_ERROR_FAILURE); - NS_ENSURE_TRUE( - !static_cast(gNeckoChild->Manager())->IsShuttingDown(), - NS_ERROR_FAILURE); - - LOG(("GIOChannelChild::ConnectParent [this=%p]\n", this)); - - mozilla::dom::BrowserChild* browserChild = nullptr; - nsCOMPtr iBrowserChild; - NS_QueryNotificationCallbacks(mCallbacks, mLoadGroup, - NS_GET_IID(nsIBrowserChild), - getter_AddRefs(iBrowserChild)); - GetCallback(iBrowserChild); - if (iBrowserChild) { - browserChild = - static_cast(iBrowserChild.get()); - } - - // This must happen before the constructor message is sent. - SetupNeckoTarget(); - - // The socket transport in the chrome process now holds a logical ref to us - // until OnStopRequest, or we do a redirect, or we hit an IPDL error. - AddIPDLReference(); - - GIOChannelConnectArgs connectArgs(aId); - - if (!gNeckoChild->SendPGIOChannelConstructor( - this, browserChild, IPC::SerializedLoadContext(this), connectArgs)) { - return NS_ERROR_FAILURE; - } - - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelChild::CompleteRedirectSetup(nsIStreamListener* aListener) { - LOG(("GIOChannelChild::CompleteRedirectSetup [this=%p]\n", this)); - NS_ENSURE_TRUE(!mIsPending, NS_ERROR_IN_PROGRESS); - NS_ENSURE_TRUE(!mWasOpened, NS_ERROR_ALREADY_OPENED); - - mIsPending = true; - mWasOpened = true; - mListener = aListener; - - // add ourselves to the load group. - if (mLoadGroup) { - mLoadGroup->AddRequest(this, nullptr); - } - - // We already have an open IPDL connection to the parent. If on-modify-request - // listeners or load group observers canceled us, let the parent handle it - // and send it back to us naturally. - return NS_OK; -} - -void GIOChannelChild::SetupNeckoTarget() { - if (mNeckoTarget) { - return; - } - mNeckoTarget = GetMainThreadSerialEventTarget(); -} - -} // namespace net -} // namespace mozilla diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/gio/GIOChannelChild.h firefox-esr-140.10.0esr/netwerk/protocol/gio/GIOChannelChild.h --- firefox-esr-140.9.1esr/netwerk/protocol/gio/GIOChannelChild.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/gio/GIOChannelChild.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=4 sw=2 sts=2 et tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef NS_GIOCHANNELCHILD_H -#define NS_GIOCHANNELCHILD_H - -#include "mozilla/net/PGIOChannelChild.h" -#include "mozilla/net/ChannelEventQueue.h" -#include "nsBaseChannel.h" -#include "nsIUploadChannel.h" -#include "nsIProxiedChannel.h" -#include "nsIResumableChannel.h" -#include "nsIChildChannel.h" -#include "nsIEventTarget.h" -#include "nsIStreamListener.h" - -class nsIEventTarget; - -namespace mozilla { -namespace net { - -class GIOChannelChild final : public PGIOChannelChild, - public nsBaseChannel, - public nsIChildChannel { - public: - using nsIStreamListener = ::nsIStreamListener; - - NS_DECL_ISUPPORTS_INHERITED - NS_DECL_NSICHILDCHANNEL - - NS_IMETHOD Cancel(nsresult aStatus) override; - NS_IMETHOD Suspend() override; - NS_IMETHOD Resume() override; - - explicit GIOChannelChild(nsIURI* uri); - - void AddIPDLReference(); - void ReleaseIPDLReference(); - - NS_IMETHOD AsyncOpen(nsIStreamListener* aListener) override; - - // Note that we handle this ourselves, overriding the nsBaseChannel - // default behavior, in order to be e10s-friendly. - NS_IMETHOD IsPending(bool* aResult) override; - - nsresult OpenContentStream(bool aAsync, nsIInputStream** aStream, - nsIChannel** aChannel) override; - - bool IsSuspended() const; - - protected: - virtual ~GIOChannelChild() = default; - - mozilla::ipc::IPCResult RecvOnStartRequest(const nsresult& aChannelStatus, - const int64_t& aContentLength, - const nsACString& aContentType, - const nsACString& aEntityID, - const URIParams& aURI) override; - mozilla::ipc::IPCResult RecvOnDataAvailable(const nsresult& aChannelStatus, - const nsACString& aData, - const uint64_t& aOffset, - const uint32_t& aCount) override; - mozilla::ipc::IPCResult RecvOnStopRequest( - const nsresult& aChannelStatus) override; - mozilla::ipc::IPCResult RecvFailedAsyncOpen( - const nsresult& aStatusCode) override; - mozilla::ipc::IPCResult RecvDeleteSelf() override; - - void DoOnStartRequest(const nsresult& aChannelStatus, - const int64_t& aContentLength, - const nsACString& aContentType, - const nsACString& aEntityID, const URIParams& aURI); - void DoOnDataAvailable(const nsresult& aChannelStatus, - const nsACString& aData, const uint64_t& aOffset, - const uint32_t& aCount); - void DoOnStopRequest(const nsresult& aChannelStatus); - void DoFailedAsyncOpen(const nsresult& aStatusCode); - void DoDeleteSelf(); - - void SetupNeckoTarget() override; - - friend class NeckoTargetChannelFunctionEvent; - - private: - nsCOMPtr mUploadStream; - - bool mIPCOpen = false; - const RefPtr mEventQ; - - bool mCanceled = false; - uint32_t mSuspendCount = 0; - ; - bool mIsPending = false; - - uint64_t mStartPos = 0; - nsCString mEntityID; - - // Set if SendSuspend is called. Determines if SendResume is needed when - // diverting callbacks to parent. - bool mSuspendSent = false; -}; - -inline bool GIOChannelChild::IsSuspended() const { return mSuspendCount != 0; } - -} // namespace net -} // namespace mozilla - -#endif /* NS_GIOCHANNELCHILD_H */ diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/gio/GIOChannelParent.cpp firefox-esr-140.10.0esr/netwerk/protocol/gio/GIOChannelParent.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/gio/GIOChannelParent.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/gio/GIOChannelParent.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,324 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=4 sw=2 sts=2 et tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "GIOChannelParent.h" -#include "nsGIOProtocolHandler.h" -#include "mozilla/Assertions.h" -#include "mozilla/dom/ContentParent.h" -#include "mozilla/dom/BrowserParent.h" -#include "mozilla/net/NeckoParent.h" -#include "nsNetUtil.h" -#include "nsIChannel.h" -#include "mozilla/net/NeckoChannelParams.h" -#include "nsIAuthPrompt.h" -#include "nsIAuthPromptProvider.h" -#include "nsISecureBrowserUI.h" -#include "nsQueryObject.h" -#include "mozilla/Logging.h" -#include "mozilla/net/ChannelEventQueue.h" -#include "mozilla/ipc/URIUtils.h" - -using namespace mozilla::dom; -using namespace mozilla::ipc; - -namespace mozilla { -#undef LOG -#define LOG(args) MOZ_LOG(gGIOLog, mozilla::LogLevel::Debug, args) -namespace net { - -GIOChannelParent::GIOChannelParent(dom::BrowserParent* aIframeEmbedding, - nsILoadContext* aLoadContext, - PBOverrideStatus aOverrideStatus) - : mLoadContext(aLoadContext), - mPBOverride(aOverrideStatus), - mBrowserParent(aIframeEmbedding) { - mEventQ = new ChannelEventQueue(static_cast(this)); -} - -void GIOChannelParent::ActorDestroy(ActorDestroyReason why) { - // We may still have refcount>0 if the channel hasn't called OnStopRequest - // yet, but we must not send any more msgs to child. - mIPCClosed = true; -} - -//----------------------------------------------------------------------------- -// GIOChannelParent::nsISupports -//----------------------------------------------------------------------------- -NS_IMPL_ISUPPORTS(GIOChannelParent, nsIStreamListener, nsIParentChannel, - nsIInterfaceRequestor, nsIRequestObserver) - -//----------------------------------------------------------------------------- -// GIOChannelParent methods -//----------------------------------------------------------------------------- - -bool GIOChannelParent::Init(const GIOChannelCreationArgs& aOpenArgs) { - switch (aOpenArgs.type()) { - case GIOChannelCreationArgs::TGIOChannelOpenArgs: { - const GIOChannelOpenArgs& a = aOpenArgs.get_GIOChannelOpenArgs(); - return DoAsyncOpen(a.uri(), a.startPos(), a.entityID(), a.uploadStream(), - a.loadInfo(), a.loadFlags()); - } - case GIOChannelCreationArgs::TGIOChannelConnectArgs: { - const GIOChannelConnectArgs& cArgs = - aOpenArgs.get_GIOChannelConnectArgs(); - return ConnectChannel(cArgs.channelId()); - } - default: - MOZ_ASSERT_UNREACHABLE("unknown open type"); - return false; - } -} - -bool GIOChannelParent::DoAsyncOpen(const URIParams& aURI, - const uint64_t& aStartPos, - const nsCString& aEntityID, - const Maybe& aUploadStream, - const LoadInfoArgs& aLoadInfoArgs, - const uint32_t& aLoadFlags) { - nsresult rv; - - nsCOMPtr uri = DeserializeURI(aURI); - if (!uri) { - return false; - } - -#ifdef DEBUG - LOG(("GIOChannelParent DoAsyncOpen [this=%p uri=%s]\n", this, - uri->GetSpecOrDefault().get())); -#endif - - nsCOMPtr ios(do_GetIOService(&rv)); - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - nsAutoCString remoteType; - rv = GetRemoteType(remoteType); - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - nsCOMPtr loadInfo; - rv = mozilla::ipc::LoadInfoArgsToLoadInfo(aLoadInfoArgs, remoteType, - getter_AddRefs(loadInfo)); - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - OriginAttributes attrs; - rv = loadInfo->GetOriginAttributes(&attrs); - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - nsCOMPtr chan; - rv = NS_NewChannelInternal(getter_AddRefs(chan), uri, loadInfo, nullptr, - nullptr, nullptr, aLoadFlags, ios); - - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - mChannel = chan; - - nsIChannel* gioChan = static_cast(mChannel.get()); - - rv = gioChan->AsyncOpen(this); - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - return true; -} - -bool GIOChannelParent::ConnectChannel(const uint64_t& channelId) { - nsresult rv; - - LOG(("Looking for a registered channel [this=%p, id=%" PRIx64 "]", this, - channelId)); - - nsCOMPtr channel; - rv = NS_LinkRedirectChannels(channelId, this, getter_AddRefs(channel)); - if (NS_SUCCEEDED(rv)) { - mChannel = channel; - } - - LOG((" found channel %p, rv=%08" PRIx32, mChannel.get(), - static_cast(rv))); - - return true; -} - -mozilla::ipc::IPCResult GIOChannelParent::RecvCancel(const nsresult& status) { - if (mChannel) { - mChannel->Cancel(status); - } - - return IPC_OK(); -} - -mozilla::ipc::IPCResult GIOChannelParent::RecvSuspend() { - if (mChannel) { - mChannel->Suspend(); - } - return IPC_OK(); -} - -mozilla::ipc::IPCResult GIOChannelParent::RecvResume() { - if (mChannel) { - mChannel->Resume(); - } - return IPC_OK(); -} - -//----------------------------------------------------------------------------- -// GIOChannelParent::nsIRequestObserver -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelParent::OnStartRequest(nsIRequest* aRequest) { - LOG(("GIOChannelParent::OnStartRequest [this=%p]\n", this)); - nsCOMPtr chan = do_QueryInterface(aRequest); - MOZ_ASSERT(chan); - NS_ENSURE_TRUE(chan, NS_ERROR_UNEXPECTED); - - int64_t contentLength; - chan->GetContentLength(&contentLength); - nsCString contentType; - chan->GetContentType(contentType); - nsresult channelStatus = NS_OK; - chan->GetStatus(&channelStatus); - - nsCString entityID; - URIParams uriparam; - nsCOMPtr uri; - chan->GetURI(getter_AddRefs(uri)); - SerializeURI(uri, uriparam); - - if (mIPCClosed || !SendOnStartRequest(channelStatus, contentLength, - contentType, entityID, uriparam)) { - return NS_ERROR_UNEXPECTED; - } - - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::OnStopRequest(nsIRequest* aRequest, nsresult aStatusCode) { - LOG(("GIOChannelParent::OnStopRequest: [this=%p status=%" PRIu32 "]\n", this, - static_cast(aStatusCode))); - - if (mIPCClosed || !SendOnStopRequest(aStatusCode)) { - return NS_ERROR_UNEXPECTED; - } - - return NS_OK; -} - -//----------------------------------------------------------------------------- -// GIOChannelParent::nsIStreamListener -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelParent::OnDataAvailable(nsIRequest* aRequest, - nsIInputStream* aInputStream, - uint64_t aOffset, uint32_t aCount) { - LOG(("GIOChannelParent::OnDataAvailable [this=%p]\n", this)); - - nsCString data; - nsresult rv = NS_ReadInputStreamToString(aInputStream, data, aCount); - if (NS_FAILED(rv)) { - return rv; - } - - nsresult channelStatus = NS_OK; - mChannel->GetStatus(&channelStatus); - - if (mIPCClosed || - !SendOnDataAvailable(channelStatus, data, aOffset, aCount)) { - return NS_ERROR_UNEXPECTED; - } - return NS_OK; -} - -//----------------------------------------------------------------------------- -// GIOChannelParent::nsIParentChannel -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelParent::SetParentListener(ParentChannelListener* aListener) { - // Do not need ptr to ParentChannelListener. - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::NotifyClassificationFlags(uint32_t aClassificationFlags, - bool aIsThirdParty) { - // Nothing to do. - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::SetClassifierMatchedInfo(const nsACString& aList, - const nsACString& aProvider, - const nsACString& aFullHash) { - // nothing to do - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::SetClassifierMatchedTrackingInfo( - const nsACString& aLists, const nsACString& aFullHashes) { - // nothing to do - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::Delete() { - if (mIPCClosed || !SendDeleteSelf()) { - return NS_ERROR_UNEXPECTED; - } - - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::GetRemoteType(nsACString& aRemoteType) { - if (!CanSend()) { - return NS_ERROR_UNEXPECTED; - } - - dom::PContentParent* pcp = Manager()->Manager(); - aRemoteType = static_cast(pcp)->GetRemoteType(); - return NS_OK; -} - -//----------------------------------------------------------------------------- -// GIOChannelParent::nsIInterfaceRequestor -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelParent::GetInterface(const nsIID& uuid, void** result) { - if (uuid.Equals(NS_GET_IID(nsIAuthPromptProvider)) || - uuid.Equals(NS_GET_IID(nsISecureBrowserUI))) { - if (mBrowserParent) { - return mBrowserParent->QueryInterface(uuid, result); - } - } - - // Only support nsILoadContext if child channel's callbacks did too - if (uuid.Equals(NS_GET_IID(nsILoadContext)) && mLoadContext) { - nsCOMPtr copy = mLoadContext; - copy.forget(result); - return NS_OK; - } - - return QueryInterface(uuid, result); -} - -//--------------------- -} // namespace net -} // namespace mozilla diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/gio/GIOChannelParent.h firefox-esr-140.10.0esr/netwerk/protocol/gio/GIOChannelParent.h --- firefox-esr-140.9.1esr/netwerk/protocol/gio/GIOChannelParent.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/gio/GIOChannelParent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=4 sw=2 sts=2 et tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef NS_GIOCHANNELPARENT_H -#define NS_GIOCHANNELPARENT_H - -#include "mozilla/net/PGIOChannelParent.h" -#include "mozilla/net/NeckoParent.h" -#include "nsIParentChannel.h" -#include "nsIInterfaceRequestor.h" - -class nsILoadContext; - -namespace mozilla { - -namespace dom { -class BrowserParent; -} // namespace dom - -namespace net { -class ChannelEventQueue; - -class GIOChannelParent final : public PGIOChannelParent, - public nsIParentChannel, - public nsIInterfaceRequestor { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSIREQUESTOBSERVER - NS_DECL_NSISTREAMLISTENER - NS_DECL_NSIPARENTCHANNEL - NS_DECL_NSIINTERFACEREQUESTOR - - GIOChannelParent(dom::BrowserParent* aIframeEmbedding, - nsILoadContext* aLoadContext, - PBOverrideStatus aOverrideStatus); - - bool Init(const GIOChannelCreationArgs& aOpenArgs); - - protected: - virtual ~GIOChannelParent() = default; - - bool DoAsyncOpen(const URIParams& aURI, const uint64_t& aStartPos, - const nsCString& aEntityID, - const Maybe& aUploadStream, - const LoadInfoArgs& aLoadInfoArgs, - const uint32_t& aLoadFlags); - - // used to connect redirected-to channel in parent with just created - // ChildChannel. Used during HTTP->FTP redirects. - bool ConnectChannel(const uint64_t& channelId); - - virtual mozilla::ipc::IPCResult RecvCancel(const nsresult& status) override; - virtual mozilla::ipc::IPCResult RecvSuspend() override; - virtual mozilla::ipc::IPCResult RecvResume() override; - - virtual void ActorDestroy(ActorDestroyReason why) override; - - nsCOMPtr mChannel; - - bool mIPCClosed = false; - - nsCOMPtr mLoadContext; - - PBOverrideStatus mPBOverride; - - // Set to the canceled status value if the main channel was canceled. - nsresult mStatus = NS_OK; - - RefPtr mBrowserParent; - - RefPtr mEventQ; -}; - -} // namespace net -} // namespace mozilla - -#endif /* NS_GIOCHANNELPARENT_H */ diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/gio/PGIOChannel.ipdl firefox-esr-140.10.0esr/netwerk/protocol/gio/PGIOChannel.ipdl --- firefox-esr-140.9.1esr/netwerk/protocol/gio/PGIOChannel.ipdl 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/gio/PGIOChannel.ipdl 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set sw=2 ts=8 et tw=80 ft=cpp : */ - -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -include protocol PNecko; -include URIParams; - -//FIXME: bug #792908 (NeckoChannelParams already included by PNecko) -include NeckoChannelParams; - -using PRTime from "prtime.h"; - -namespace mozilla { -namespace net { - -[ManualDealloc, ChildImpl=virtual, ParentImpl=virtual] -async protocol PGIOChannel -{ - manager PNecko; - -parent: - // Note: channels are opened during construction, so no open method here: - // see PNecko.ipdl - - async __delete__(); - - async Cancel(nsresult status); - async Suspend(); - async Resume(); - -child: - async OnStartRequest(nsresult aChannelStatus, - int64_t aContentLength, - nsCString aContentType, - nsCString aEntityID, - URIParams aURI); - async OnDataAvailable(nsresult channelStatus, - nsCString data, - uint64_t offset, - uint32_t count); - async OnStopRequest(nsresult channelStatus); - async FailedAsyncOpen(nsresult statusCode); - - async DeleteSelf(); -}; - -} // namespace net -} // namespace mozilla diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/gio/components.conf firefox-esr-140.10.0esr/netwerk/protocol/gio/components.conf --- firefox-esr-140.9.1esr/netwerk/protocol/gio/components.conf 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/gio/components.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -Classes = [ - { - 'cid': '{ee706783-3af8-4d19-9e84-e2ebfe213480}', - 'contract_ids': ['@mozilla.org/network/protocol;1?name=moz-gio'], - 'singleton': True, - 'type': 'nsGIOProtocolHandler', - 'headers': ['nsGIOProtocolHandler.h'], - 'constructor': 'nsGIOProtocolHandler::GetSingleton', - 'categories': { 'xpcom-startup': 'nsGIOProtocolHandler' }, - 'protocol_config': { - 'scheme': 'moz-gio', - 'flags': [ - 'URI_STD', - 'URI_DANGEROUS_TO_LOAD', - ], - }, - }, -] diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/gio/moz.build firefox-esr-140.10.0esr/netwerk/protocol/gio/moz.build --- firefox-esr-140.9.1esr/netwerk/protocol/gio/moz.build 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/gio/moz.build 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -XPCOM_MANIFESTS += [ - "components.conf", -] - -EXPORTS += [ - "nsGIOProtocolHandler.h", -] - -EXPORTS.mozilla.net += [ - "GIOChannelChild.h", - "GIOChannelParent.h", -] - -UNIFIED_SOURCES += [ - "GIOChannelChild.cpp", - "GIOChannelParent.cpp", - "nsGIOProtocolHandler.cpp", -] - -IPDL_SOURCES = [ - "PGIOChannel.ipdl", -] - -include("/ipc/chromium/chromium-config.mozbuild") - -LOCAL_INCLUDES += [ - "/netwerk/base", -] - -FINAL_LIBRARY = "xul" - -if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] - -with Files("**"): - BUG_COMPONENT = ("Core", "Widget: Gtk") diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/gio/nsGIOProtocolHandler.cpp firefox-esr-140.10.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/gio/nsGIOProtocolHandler.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1027 +0,0 @@ -/* vim:set ts=2 sw=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/* - * This code is based on original Mozilla gnome-vfs extension. It implements - * input stream provided by GVFS/GIO. - */ -#include "nsGIOProtocolHandler.h" -#include "GIOChannelChild.h" -#include "mozilla/Components.h" -#include "mozilla/ClearOnShutdown.h" -#include "mozilla/Logging.h" -#include "mozilla/net/NeckoChild.h" -#include "mozilla/NullPrincipal.h" -#include "nsIPrefBranch.h" -#include "nsIPrefService.h" -#include "nsIObserver.h" -#include "nsCRT.h" -#include "nsThreadUtils.h" -#include "nsProxyRelease.h" -#include "nsIStringBundle.h" -#include "nsMimeTypes.h" -#include "nsNetCID.h" -#include "nsNetUtil.h" -#include "nsServiceManagerUtils.h" -#include "nsIURI.h" -#include "nsIAuthPrompt.h" -#include "nsIChannel.h" -#include "nsIInputStream.h" -#include "nsIProtocolHandler.h" -#include "mozilla/Monitor.h" -#include "prtime.h" -#include -#include - -using namespace mozilla; - -#define MOZ_GIO_SCHEME "moz-gio" -#define MOZ_GIO_SUPPORTED_PROTOCOLS "network.gio.supported-protocols" - -//----------------------------------------------------------------------------- - -// NSPR_LOG_MODULES=gio:5 -LazyLogModule gGIOLog("gio"); -#undef LOG -#define LOG(args) MOZ_LOG(gGIOLog, mozilla::LogLevel::Debug, args) - -//----------------------------------------------------------------------------- -static nsresult MapGIOResult(gint code) { - switch (code) { - case G_IO_ERROR_NOT_FOUND: - return NS_ERROR_FILE_NOT_FOUND; // shows error - case G_IO_ERROR_INVALID_ARGUMENT: - return NS_ERROR_INVALID_ARG; - case G_IO_ERROR_NOT_SUPPORTED: - return NS_ERROR_NOT_AVAILABLE; - case G_IO_ERROR_NO_SPACE: - return NS_ERROR_FILE_NO_DEVICE_SPACE; - case G_IO_ERROR_READ_ONLY: - return NS_ERROR_FILE_READ_ONLY; - case G_IO_ERROR_PERMISSION_DENIED: - return NS_ERROR_FILE_ACCESS_DENIED; // wrong password/login - case G_IO_ERROR_CLOSED: - return NS_BASE_STREAM_CLOSED; // was EOF - case G_IO_ERROR_NOT_DIRECTORY: - return NS_ERROR_FILE_NOT_DIRECTORY; - case G_IO_ERROR_PENDING: - return NS_ERROR_IN_PROGRESS; - case G_IO_ERROR_EXISTS: - return NS_ERROR_FILE_ALREADY_EXISTS; - case G_IO_ERROR_IS_DIRECTORY: - return NS_ERROR_FILE_IS_DIRECTORY; - case G_IO_ERROR_NOT_MOUNTED: - return NS_ERROR_NOT_CONNECTED; // shows error - case G_IO_ERROR_HOST_NOT_FOUND: - return NS_ERROR_UNKNOWN_HOST; // shows error - case G_IO_ERROR_CANCELLED: - return NS_ERROR_ABORT; - case G_IO_ERROR_NOT_EMPTY: - return NS_ERROR_FILE_DIR_NOT_EMPTY; - case G_IO_ERROR_FILENAME_TOO_LONG: - return NS_ERROR_FILE_NAME_TOO_LONG; - case G_IO_ERROR_INVALID_FILENAME: - return NS_ERROR_FILE_INVALID_PATH; - case G_IO_ERROR_TIMED_OUT: - return NS_ERROR_NET_TIMEOUT; // shows error - case G_IO_ERROR_WOULD_BLOCK: - return NS_BASE_STREAM_WOULD_BLOCK; - case G_IO_ERROR_FAILED_HANDLED: - return NS_ERROR_ABORT; // Cancel on login dialog - - /* unhandled: - G_IO_ERROR_NOT_REGULAR_FILE, - G_IO_ERROR_NOT_SYMBOLIC_LINK, - G_IO_ERROR_NOT_MOUNTABLE_FILE, - G_IO_ERROR_TOO_MANY_LINKS, - G_IO_ERROR_ALREADY_MOUNTED, - G_IO_ERROR_CANT_CREATE_BACKUP, - G_IO_ERROR_WRONG_ETAG, - G_IO_ERROR_WOULD_RECURSE, - G_IO_ERROR_BUSY, - G_IO_ERROR_WOULD_MERGE, - G_IO_ERROR_TOO_MANY_OPEN_FILES - */ - // Make GCC happy - default: - return NS_ERROR_FAILURE; - } -} - -static nsresult MapGIOResult(GError* result) { - if (!result) { - return NS_OK; - } - return MapGIOResult(result->code); -} - -/** Return values for mount operation. - * These enums are used as mount operation return values. - */ -enum class MountOperationResult { - MOUNT_OPERATION_IN_PROGRESS, /** \enum operation in progress */ - MOUNT_OPERATION_SUCCESS, /** \enum operation successful */ - MOUNT_OPERATION_FAILED /** \enum operation not successful */ -}; - -//----------------------------------------------------------------------------- -/** - * Sort function compares according to file type (directory/file) - * and alphabethical order - * @param a pointer to GFileInfo object to compare - * @param b pointer to GFileInfo object to compare - * @return -1 when first object should be before the second, 0 when equal, - * +1 when second object should be before the first - */ -static gint FileInfoComparator(gconstpointer a, gconstpointer b) { - GFileInfo* ia = (GFileInfo*)a; - GFileInfo* ib = (GFileInfo*)b; - if (g_file_info_get_file_type(ia) == G_FILE_TYPE_DIRECTORY && - g_file_info_get_file_type(ib) != G_FILE_TYPE_DIRECTORY) { - return -1; - } - if (g_file_info_get_file_type(ib) == G_FILE_TYPE_DIRECTORY && - g_file_info_get_file_type(ia) != G_FILE_TYPE_DIRECTORY) { - return 1; - } - - return nsCRT::strcasecmp(g_file_info_get_name(ia), g_file_info_get_name(ib)); -} - -/* Declaration of mount callback functions */ -static void mount_enclosing_volume_finished(GObject* source_object, - GAsyncResult* res, - gpointer user_data); -static void mount_operation_ask_password( - GMountOperation* mount_op, const char* message, const char* default_user, - const char* default_domain, GAskPasswordFlags flags, gpointer user_data); -//----------------------------------------------------------------------------- -class nsGIOInputStream final : public nsIInputStream { - public: - NS_DECL_THREADSAFE_ISUPPORTS - NS_DECL_NSIINPUTSTREAM - - explicit nsGIOInputStream(const nsCString& uriSpec) : mSpec(uriSpec) {} - - void SetChannel(nsIChannel* channel) { - // We need to hold an owning reference to our channel. This is done - // so we can access the channel's notification callbacks to acquire - // a reference to a nsIAuthPrompt if we need to handle an interactive - // mount operation. - // - // However, the channel can only be accessed on the main thread, so - // we have to be very careful with ownership. Moreover, it doesn't - // support threadsafe addref/release, so proxying is the answer. - // - // Also, it's important to note that this likely creates a reference - // cycle since the channel likely owns this stream. This reference - // cycle is broken in our Close method. - - mChannel = do_AddRef(channel).take(); - } - void SetMountResult(MountOperationResult result, gint error_code); - - private: - ~nsGIOInputStream() { Close(); } - nsresult DoOpen(); - nsresult DoRead(char* aBuf, uint32_t aCount, uint32_t* aCountRead); - nsresult SetContentTypeOfChannel(const char* contentType); - nsresult MountVolume(); - nsresult DoOpenDirectory(); - nsresult DoOpenFile(GFileInfo* info); - nsCString mSpec; - nsIChannel* mChannel{nullptr}; // manually refcounted - GFile* mHandle{nullptr}; - GFileInputStream* mStream{nullptr}; - uint64_t mBytesRemaining{UINT64_MAX}; - nsresult mStatus{NS_OK}; - GList* mDirList{nullptr}; - GList* mDirListPtr{nullptr}; - nsCString mDirBuf; - uint32_t mDirBufCursor{0}; - bool mDirOpen{false}; - MountOperationResult mMountRes = - MountOperationResult::MOUNT_OPERATION_SUCCESS; - mozilla::Monitor mMonitorMountInProgress MOZ_UNANNOTATED{ - "GIOInputStream::MountFinished"}; - gint mMountErrorCode{}; -}; - -/** - * Set result of mount operation and notify monitor waiting for results. - * This method is called in main thread as long as it is used only - * in mount_enclosing_volume_finished function. - * @param result Result of mount operation - */ -void nsGIOInputStream::SetMountResult(MountOperationResult result, - gint error_code) { - mozilla::MonitorAutoLock mon(mMonitorMountInProgress); - mMountRes = result; - mMountErrorCode = error_code; - mon.Notify(); -} - -/** - * Start mount operation and wait in loop until it is finished. This method is - * called from thread which is trying to read from location. - */ -nsresult nsGIOInputStream::MountVolume() { - GMountOperation* mount_op = g_mount_operation_new(); - g_signal_connect(mount_op, "ask-password", - G_CALLBACK(mount_operation_ask_password), mChannel); - mMountRes = MountOperationResult::MOUNT_OPERATION_IN_PROGRESS; - /* g_file_mount_enclosing_volume uses a dbus request to mount the volume. - Callback mount_enclosing_volume_finished is called in main thread - (not this thread on which this method is called). */ - g_file_mount_enclosing_volume(mHandle, G_MOUNT_MOUNT_NONE, mount_op, nullptr, - mount_enclosing_volume_finished, this); - mozilla::MonitorAutoLock mon(mMonitorMountInProgress); - /* Waiting for finish of mount operation thread */ - while (mMountRes == MountOperationResult::MOUNT_OPERATION_IN_PROGRESS) { - mon.Wait(); - } - - g_object_unref(mount_op); - - if (mMountRes == MountOperationResult::MOUNT_OPERATION_FAILED) { - return MapGIOResult(mMountErrorCode); - } - return NS_OK; -} - -/** - * Create list of infos about objects in opened directory - * Return: NS_OK when list obtained, otherwise error code according - * to failed operation. - */ -nsresult nsGIOInputStream::DoOpenDirectory() { - GError* error = nullptr; - - GFileEnumerator* f_enum = g_file_enumerate_children( - mHandle, "standard::*,time::*", G_FILE_QUERY_INFO_NONE, nullptr, &error); - if (!f_enum) { - nsresult rv = MapGIOResult(error); - g_warning("Cannot read from directory: %s", error->message); - g_error_free(error); - return rv; - } - // fill list of file infos - GFileInfo* info = g_file_enumerator_next_file(f_enum, nullptr, &error); - while (info) { - mDirList = g_list_append(mDirList, info); - info = g_file_enumerator_next_file(f_enum, nullptr, &error); - } - g_object_unref(f_enum); - if (error) { - g_warning("Error reading directory content: %s", error->message); - nsresult rv = MapGIOResult(error); - g_error_free(error); - return rv; - } - mDirOpen = true; - - // Sort list of file infos by using FileInfoComparator function - mDirList = g_list_sort(mDirList, FileInfoComparator); - mDirListPtr = mDirList; - - // Write column names - mDirBuf.AppendLiteral( - "200: filename content-length last-modified file-type\n"); - - SetContentTypeOfChannel(APPLICATION_HTTP_INDEX_FORMAT); - return NS_OK; -} - -/** - * Create file stream and set mime type for channel - * @param info file info used to determine mime type - * @return NS_OK when file stream created successfuly, error code otherwise - */ -nsresult nsGIOInputStream::DoOpenFile(GFileInfo* info) { - GError* error = nullptr; - - mStream = g_file_read(mHandle, nullptr, &error); - if (!mStream) { - nsresult rv = MapGIOResult(error); - g_warning("Cannot read from file: %s", error->message); - g_error_free(error); - return rv; - } - - const char* content_type = g_file_info_get_content_type(info); - if (content_type) { - char* mime_type = g_content_type_get_mime_type(content_type); - if (mime_type) { - if (strcmp(mime_type, APPLICATION_OCTET_STREAM) != 0) { - SetContentTypeOfChannel(mime_type); - } - g_free(mime_type); - } - } else { - g_warning("Missing content type."); - } - - mBytesRemaining = g_file_info_get_size(info); - // Update the content length attribute on the channel. We do this - // synchronously without proxying. This hack is not as bad as it looks! - mChannel->SetContentLength(mBytesRemaining); - - return NS_OK; -} - -/** - * Start file open operation, mount volume when needed and according to file - * type create file output stream or read directory content. - * @return NS_OK when file or directory opened successfully, error code - * otherwise - */ -nsresult nsGIOInputStream::DoOpen() { - nsresult rv; - GError* error = nullptr; - - NS_ASSERTION(mHandle == nullptr, "already open"); - - mHandle = g_file_new_for_uri(mSpec.get()); - - GFileInfo* info = g_file_query_info(mHandle, "standard::*", - G_FILE_QUERY_INFO_NONE, nullptr, &error); - - if (error) { - if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_NOT_MOUNTED) { - // location is not yet mounted, try to mount - g_error_free(error); - if (NS_IsMainThread()) { - return NS_ERROR_NOT_CONNECTED; - } - error = nullptr; - rv = MountVolume(); - if (rv != NS_OK) { - return rv; - } - // get info again - info = g_file_query_info(mHandle, "standard::*", G_FILE_QUERY_INFO_NONE, - nullptr, &error); - // second try to get file info from remote files after media mount - if (!info) { - g_warning("Unable to get file info: %s", error->message); - rv = MapGIOResult(error); - g_error_free(error); - return rv; - } - } else { - g_warning("Unable to get file info: %s", error->message); - rv = MapGIOResult(error); - g_error_free(error); - return rv; - } - } - // Get file type to handle directories and file differently - GFileType f_type = g_file_info_get_file_type(info); - if (f_type == G_FILE_TYPE_DIRECTORY) { - // directory - rv = DoOpenDirectory(); - } else if (f_type != G_FILE_TYPE_UNKNOWN) { - // file - rv = DoOpenFile(info); - } else { - g_warning("Unable to get file type."); - rv = NS_ERROR_FILE_NOT_FOUND; - } - if (info) { - g_object_unref(info); - } - return rv; -} - -/** - * Read content of file or create file list from directory - * @param aBuf read destination buffer - * @param aCount length of destination buffer - * @param aCountRead number of read characters - * @return NS_OK when read successfully, NS_BASE_STREAM_CLOSED when end of file, - * error code otherwise - */ -nsresult nsGIOInputStream::DoRead(char* aBuf, uint32_t aCount, - uint32_t* aCountRead) { - nsresult rv = NS_ERROR_NOT_AVAILABLE; - if (mStream) { - // file read - GError* error = nullptr; - uint32_t bytes_read = g_input_stream_read(G_INPUT_STREAM(mStream), aBuf, - aCount, nullptr, &error); - if (error) { - rv = MapGIOResult(error); - *aCountRead = 0; - g_warning("Cannot read from file: %s", error->message); - g_error_free(error); - return rv; - } - *aCountRead = bytes_read; - mBytesRemaining -= *aCountRead; - return NS_OK; - } - if (mDirOpen) { - // directory read - while (aCount && rv != NS_BASE_STREAM_CLOSED) { - // Copy data out of our buffer - uint32_t bufLen = mDirBuf.Length() - mDirBufCursor; - if (bufLen) { - uint32_t n = std::min(bufLen, aCount); - memcpy(aBuf, mDirBuf.get() + mDirBufCursor, n); - *aCountRead += n; - aBuf += n; - aCount -= n; - mDirBufCursor += n; - } - - if (!mDirListPtr) // Are we at the end of the directory list? - { - rv = NS_BASE_STREAM_CLOSED; - } else if (aCount) // Do we need more data? - { - GFileInfo* info = (GFileInfo*)mDirListPtr->data; - - // Prune '.' and '..' from directory listing. - const char* fname = g_file_info_get_name(info); - if (fname && fname[0] == '.' && - (fname[1] == '\0' || (fname[1] == '.' && fname[2] == '\0'))) { - mDirListPtr = mDirListPtr->next; - continue; - } - - mDirBuf.AssignLiteral("201: "); - - // The "filename" field - nsCString escName; - nsCOMPtr nu = do_GetService(NS_NETUTIL_CONTRACTID); - if (nu && fname) { - nu->EscapeString(nsDependentCString(fname), - nsINetUtil::ESCAPE_URL_PATH, escName); - - mDirBuf.Append(escName); - mDirBuf.Append(' '); - } - - // The "content-length" field - // XXX truncates size from 64-bit to 32-bit - mDirBuf.AppendInt(int32_t(g_file_info_get_size(info))); - mDirBuf.Append(' '); - - // The "last-modified" field - // - // NSPR promises: PRTime is compatible with time_t - // we just need to convert from seconds to microseconds - GTimeVal gtime; - g_file_info_get_modification_time(info, >ime); - - PRExplodedTime tm; - PRTime pt = ((PRTime)gtime.tv_sec) * 1000000; - PR_ExplodeTime(pt, PR_GMTParameters, &tm); - { - char buf[64]; - PR_FormatTimeUSEnglish(buf, sizeof(buf), - "%a,%%20%d%%20%b%%20%Y%%20%H:%M:%S%%20GMT ", - &tm); - mDirBuf.Append(buf); - } - - // The "file-type" field - switch (g_file_info_get_file_type(info)) { - case G_FILE_TYPE_REGULAR: - mDirBuf.AppendLiteral("FILE "); - break; - case G_FILE_TYPE_DIRECTORY: - mDirBuf.AppendLiteral("DIRECTORY "); - break; - case G_FILE_TYPE_SYMBOLIC_LINK: - mDirBuf.AppendLiteral("SYMBOLIC-LINK "); - break; - default: - break; - } - mDirBuf.Append('\n'); - - mDirBufCursor = 0; - mDirListPtr = mDirListPtr->next; - } - } - } - return rv; -} - -/** - * This class is used to implement SetContentTypeOfChannel. - */ -class nsGIOSetContentTypeEvent : public mozilla::Runnable { - public: - nsGIOSetContentTypeEvent(nsIChannel* channel, const char* contentType) - : mozilla::Runnable("nsGIOSetContentTypeEvent"), - mChannel(channel), - mContentType(contentType) { - // stash channel reference in mChannel. no AddRef here! see note - // in SetContentTypeOfchannel. - } - - NS_IMETHOD Run() override { - mChannel->SetContentType(mContentType); - return NS_OK; - } - - private: - nsIChannel* mChannel; - nsCString mContentType; -}; - -nsresult nsGIOInputStream::SetContentTypeOfChannel(const char* contentType) { - // We need to proxy this call over to the main thread. We post an - // asynchronous event in this case so that we don't delay reading data, and - // we know that this is safe to do since the channel's reference will be - // released asynchronously as well. We trust the ordering of the main - // thread's event queue to protect us against memory corruption. - - nsresult rv; - nsCOMPtr ev = - new nsGIOSetContentTypeEvent(mChannel, contentType); - if (!ev) { - rv = NS_ERROR_OUT_OF_MEMORY; - } else { - rv = NS_DispatchToMainThread(ev); - } - return rv; -} - -NS_IMPL_ISUPPORTS(nsGIOInputStream, nsIInputStream) - -/** - * Free all used memory and close stream. - */ -NS_IMETHODIMP -nsGIOInputStream::Close() { - if (mStream) { - g_object_unref(mStream); - mStream = nullptr; - } - - if (mHandle) { - g_object_unref(mHandle); - mHandle = nullptr; - } - - if (mDirList) { - // Destroy the list of GIOFileInfo objects... - g_list_foreach(mDirList, (GFunc)g_object_unref, nullptr); - g_list_free(mDirList); - mDirList = nullptr; - mDirListPtr = nullptr; - } - - if (mChannel) { - NS_ReleaseOnMainThread("nsGIOInputStream::mChannel", dont_AddRef(mChannel)); - - mChannel = nullptr; - } - - mSpec.Truncate(); // free memory - - // Prevent future reads from re-opening the handle. - if (NS_SUCCEEDED(mStatus)) { - mStatus = NS_BASE_STREAM_CLOSED; - } - - return NS_OK; -} - -/** - * Return number of remaining bytes available on input - * @param aResult remaining bytes - */ -NS_IMETHODIMP -nsGIOInputStream::Available(uint64_t* aResult) { - if (NS_FAILED(mStatus)) { - return mStatus; - } - - *aResult = mBytesRemaining; - - return NS_OK; -} - -/** - * Return the status of the input stream - */ -NS_IMETHODIMP -nsGIOInputStream::StreamStatus() { return mStatus; } - -/** - * Trying to read from stream. When location is not available it tries to mount - * it. - * @param aBuf buffer to put read data - * @param aCount length of aBuf - * @param aCountRead number of bytes actually read - */ -NS_IMETHODIMP -nsGIOInputStream::Read(char* aBuf, uint32_t aCount, uint32_t* aCountRead) { - *aCountRead = 0; - // Check if file is already opened, otherwise open it - if (!mStream && !mDirOpen && mStatus == NS_OK) { - mStatus = DoOpen(); - if (NS_FAILED(mStatus)) { - return mStatus; - } - } - - mStatus = DoRead(aBuf, aCount, aCountRead); - // Check if all data has been read - if (mStatus == NS_BASE_STREAM_CLOSED) { - return NS_OK; - } - - // Check whenever any error appears while reading - return mStatus; -} - -NS_IMETHODIMP -nsGIOInputStream::ReadSegments(nsWriteSegmentFun aWriter, void* aClosure, - uint32_t aCount, uint32_t* aResult) { - // There is no way to implement this using GnomeVFS, but fortunately - // that doesn't matter. Because we are a blocking input stream, Necko - // isn't going to call our ReadSegments method. - MOZ_ASSERT_UNREACHABLE("nsGIOInputStream::ReadSegments"); - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_IMETHODIMP -nsGIOInputStream::IsNonBlocking(bool* aResult) { - *aResult = false; - return NS_OK; -} - -//----------------------------------------------------------------------------- - -/** - * Called when finishing mount operation. Result of operation is set in - * nsGIOInputStream. This function is called in main thread as an async request - * typically from dbus. - * @param source_object GFile object which requested the mount - * @param res result object - * @param user_data pointer to nsGIOInputStream - */ -static void mount_enclosing_volume_finished(GObject* source_object, - GAsyncResult* res, - gpointer user_data) { - GError* error = nullptr; - - nsGIOInputStream* istream = static_cast(user_data); - - g_file_mount_enclosing_volume_finish(G_FILE(source_object), res, &error); - - if (error) { - g_warning("Mount failed: %s %d", error->message, error->code); - istream->SetMountResult(MountOperationResult::MOUNT_OPERATION_FAILED, - error->code); - g_error_free(error); - } else { - istream->SetMountResult(MountOperationResult::MOUNT_OPERATION_SUCCESS, 0); - } -} - -/** - * This function is called when username or password are requested from user. - * This function is called in main thread as async request from dbus. - * @param mount_op mount operation - * @param message message to show to user - * @param default_user preffered user - * @param default_domain domain name - * @param flags what type of information is required - * @param user_data nsIChannel - */ -static void mount_operation_ask_password( - GMountOperation* mount_op, const char* message, const char* default_user, - const char* default_domain, GAskPasswordFlags flags, gpointer user_data) { - nsIChannel* channel = (nsIChannel*)user_data; - if (!channel) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - // We can't handle request for domain - if (flags & G_ASK_PASSWORD_NEED_DOMAIN) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - - nsCOMPtr prompt; - NS_QueryNotificationCallbacks(channel, prompt); - - // If no auth prompt, then give up. We could failover to using the - // WindowWatcher service, but that might defeat a consumer's purposeful - // attempt to disable authentication (for whatever reason). - if (!prompt) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - // Parse out the host and port... - nsCOMPtr uri; - channel->GetURI(getter_AddRefs(uri)); - if (!uri) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - - nsAutoCString scheme, hostPort; - uri->GetScheme(scheme); - uri->GetHostPort(hostPort); - - // It doesn't make sense for either of these strings to be empty. What kind - // of funky URI is this? - if (scheme.IsEmpty() || hostPort.IsEmpty()) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - // Construct the single signon key. Altering the value of this key will - // cause people's remembered passwords to be forgotten. Think carefully - // before changing the way this key is constructed. - nsAutoString key, realm; - - NS_ConvertUTF8toUTF16 dispHost(scheme); - dispHost.AppendLiteral("://"); - dispHost.Append(NS_ConvertUTF8toUTF16(hostPort)); - - key = dispHost; - if (*default_domain != '\0') { - // We assume the realm string is ASCII. That might be a bogus assumption, - // but we have no idea what encoding GnomeVFS is using, so for now we'll - // limit ourselves to ISO-Latin-1. XXX What is a better solution? - realm.Append('"'); - realm.Append(NS_ConvertASCIItoUTF16(default_domain)); - realm.Append('"'); - key.Append(' '); - key.Append(realm); - } - // Construct the message string... - // - // We use Necko's string bundle here. This code really should be encapsulated - // behind some Necko API, after all this code is based closely on the code in - // nsHttpChannel.cpp. - nsCOMPtr bundleSvc = - do_GetService(NS_STRINGBUNDLE_CONTRACTID); - if (!bundleSvc) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - nsCOMPtr bundle; - bundleSvc->CreateBundle("chrome://global/locale/commonDialogs.properties", - getter_AddRefs(bundle)); - if (!bundle) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - nsAutoString nsmessage; - - if (flags & G_ASK_PASSWORD_NEED_PASSWORD) { - if (flags & G_ASK_PASSWORD_NEED_USERNAME) { - if (!realm.IsEmpty()) { - AutoTArray strings = {realm, dispHost}; - bundle->FormatStringFromName("EnterLoginForRealm3", strings, nsmessage); - } else { - AutoTArray strings = {dispHost}; - bundle->FormatStringFromName("EnterUserPasswordFor2", strings, - nsmessage); - } - } else { - NS_ConvertUTF8toUTF16 userName(default_user); - AutoTArray strings = {userName, dispHost}; - bundle->FormatStringFromName("EnterPasswordFor", strings, nsmessage); - } - } else { - g_warning("Unknown mount operation request (flags: %x)", flags); - } - - if (nsmessage.IsEmpty()) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - // Prompt the user... - nsresult rv; - bool retval = false; - char16_t *user = nullptr, *pass = nullptr; - if (default_user) { - // user will be freed by PromptUsernameAndPassword - user = ToNewUnicode(NS_ConvertUTF8toUTF16(default_user)); - } - if (flags & G_ASK_PASSWORD_NEED_USERNAME) { - rv = prompt->PromptUsernameAndPassword( - nullptr, nsmessage.get(), key.get(), - nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, &user, &pass, &retval); - } else { - rv = prompt->PromptPassword(nullptr, nsmessage.get(), key.get(), - nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, &pass, - &retval); - } - if (NS_FAILED(rv) || !retval) { // was || user == '\0' || pass == '\0' - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - free(user); - free(pass); - return; - } - /* GIO should accept UTF8 */ - g_mount_operation_set_username(mount_op, NS_ConvertUTF16toUTF8(user).get()); - g_mount_operation_set_password(mount_op, NS_ConvertUTF16toUTF8(pass).get()); - free(user); - free(pass); - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_HANDLED); -} - -//----------------------------------------------------------------------------- - -mozilla::StaticRefPtr nsGIOProtocolHandler::sSingleton; - -already_AddRefed nsGIOProtocolHandler::GetSingleton() { - if (!sSingleton) { - sSingleton = new nsGIOProtocolHandler(); - sSingleton->Init(); - ClearOnShutdown(&sSingleton); - } - return do_AddRef(sSingleton); -} - -NS_IMPL_ISUPPORTS(nsGIOProtocolHandler, nsIProtocolHandler, nsIObserver) - -nsresult nsGIOProtocolHandler::Init() { - if (net::IsNeckoChild()) { - net::NeckoChild::InitNeckoChild(); - } - nsCOMPtr prefs = do_GetService(NS_PREFSERVICE_CONTRACTID); - if (prefs) { - InitSupportedProtocolsPref(prefs); - prefs->AddObserver(MOZ_GIO_SUPPORTED_PROTOCOLS, this, false); - } - - return NS_OK; -} - -void nsGIOProtocolHandler::InitSupportedProtocolsPref(nsIPrefBranch* prefs) { - nsCOMPtr ioService = components::IO::Service(); - if (NS_WARN_IF(!ioService)) { - LOG(("gio: ioservice not available\n")); - return; - } - - // Get user preferences to determine which protocol is supported. - // Gvfs/GIO has a set of supported protocols like obex, network, archive, - // computer, dav, cdda, gphoto2, trash, etc. Some of these seems to be - // irrelevant to process by browser. By default accept only sftp protocol so - // far. - nsAutoCString prefValue; - nsresult rv = prefs->GetCharPref(MOZ_GIO_SUPPORTED_PROTOCOLS, prefValue); - if (NS_SUCCEEDED(rv)) { - prefValue.StripWhitespace(); - ToLowerCase(prefValue); - } else { - prefValue.AssignLiteral("" // use none by default - ); - } - LOG(("gio: supported protocols \"%s\"\n", prefValue.get())); - - // Unregister any previously registered dynamic protocols. - for (const nsCString& scheme : mSupportedProtocols) { - LOG(("gio: unregistering handler for \"%s\"", scheme.get())); - ioService->UnregisterProtocolHandler(scheme); - } - mSupportedProtocols.Clear(); - - // Register each protocol from the pref branch to reference - // nsGIOProtocolHandler. - for (const nsDependentCSubstring& protocol : prefValue.Split(',')) { - if (NS_WARN_IF(!StringEndsWith(protocol, ":"_ns))) { - continue; // each protocol must end with a `:` character to be recognized - } - - nsCString scheme(Substring(protocol, 0, protocol.Length() - 1)); - if (NS_SUCCEEDED(ioService->RegisterProtocolHandler( - scheme, this, - nsIProtocolHandler::URI_STD | - nsIProtocolHandler::URI_DANGEROUS_TO_LOAD, - /* aDefaultPort */ -1))) { - LOG(("gio: successfully registered handler for \"%s\"", scheme.get())); - mSupportedProtocols.AppendElement(scheme); - } else { - LOG(("gio: failed to register handler for \"%s\"", scheme.get())); - } - } -} - -bool nsGIOProtocolHandler::IsSupportedProtocol(const nsCString& aScheme) { - for (const auto& protocol : mSupportedProtocols) { - if (aScheme.EqualsIgnoreCase(protocol)) { - return true; - } - } - return false; -} - -NS_IMETHODIMP -nsGIOProtocolHandler::GetScheme(nsACString& aScheme) { - aScheme.AssignLiteral(MOZ_GIO_SCHEME); - return NS_OK; -} - -static bool IsValidGIOScheme(const nsACString& aScheme) { - // Verify that GIO supports this URI scheme. - GVfs* gvfs = g_vfs_get_default(); - - if (!gvfs) { - g_warning("Cannot get GVfs object."); - return false; - } - - const gchar* const* uri_schemes = g_vfs_get_supported_uri_schemes(gvfs); - - while (*uri_schemes != nullptr) { - // While flatSpec ends with ':' the uri_scheme does not. Therefore do not - // compare last character. - if (aScheme.Equals(*uri_schemes)) { - return true; - } - uri_schemes++; - } - - return false; -} - -NS_IMETHODIMP -nsGIOProtocolHandler::NewChannel(nsIURI* aURI, nsILoadInfo* aLoadInfo, - nsIChannel** aResult) { - NS_ENSURE_ARG_POINTER(aURI); - nsresult rv; - - nsAutoCString spec; - rv = aURI->GetSpec(spec); - if (NS_FAILED(rv)) { - return rv; - } - - nsAutoCString scheme; - rv = aURI->GetScheme(scheme); - if (NS_FAILED(rv)) { - return rv; - } - - if (!IsSupportedProtocol(scheme)) { - return NS_ERROR_UNKNOWN_PROTOCOL; - } - - // g_vfs_get_supported_uri_schemes() returns a very limited list in the - // child due to the sandbox, so we only check if its valid for the parent. - if (XRE_IsParentProcess() && !IsValidGIOScheme(scheme)) { - return NS_ERROR_UNKNOWN_PROTOCOL; - } - - RefPtr channel; - if (net::IsNeckoChild()) { - channel = new mozilla::net::GIOChannelChild(aURI); - // set the loadInfo on the new channel - channel->SetLoadInfo(aLoadInfo); - - rv = channel->SetContentType(nsLiteralCString(UNKNOWN_CONTENT_TYPE)); - NS_ENSURE_SUCCESS(rv, rv); - - channel.forget(aResult); - return NS_OK; - } - - RefPtr stream = new nsGIOInputStream(spec); - if (!stream) { - return NS_ERROR_OUT_OF_MEMORY; - } - - RefPtr tmpStream = stream; - rv = NS_NewInputStreamChannelInternal(aResult, aURI, tmpStream.forget(), - nsLiteralCString(UNKNOWN_CONTENT_TYPE), - ""_ns, // aContentCharset - aLoadInfo); - if (NS_SUCCEEDED(rv)) { - stream->SetChannel(*aResult); - } - - return rv; -} - -NS_IMETHODIMP -nsGIOProtocolHandler::AllowPort(int32_t aPort, const char* aScheme, - bool* aResult) { - // Don't override anything. - *aResult = false; - return NS_OK; -} - -NS_IMETHODIMP -nsGIOProtocolHandler::Observe(nsISupports* aSubject, const char* aTopic, - const char16_t* aData) { - if (strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) == 0) { - nsCOMPtr prefs = do_QueryInterface(aSubject); - InitSupportedProtocolsPref(prefs); - } - return NS_OK; -} diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/gio/nsGIOProtocolHandler.h firefox-esr-140.10.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.h --- firefox-esr-140.9.1esr/netwerk/protocol/gio/nsGIOProtocolHandler.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef nsGIOProtocolHandler_h___ -#define nsGIOProtocolHandler_h___ - -#include "nsIProtocolHandler.h" -#include "nsIObserver.h" -#include "nsIPrefBranch.h" -#include "nsStringFwd.h" - -#include "mozilla/Logging.h" -extern mozilla::LazyLogModule gGIOLog; - -class nsGIOProtocolHandler final : public nsIProtocolHandler, - public nsIObserver { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSIPROTOCOLHANDLER - NS_DECL_NSIOBSERVER - - static already_AddRefed GetSingleton(); - bool IsSupportedProtocol(const nsCString& aScheme); - - protected: - ~nsGIOProtocolHandler() = default; - - private: - nsresult Init(); - - void InitSupportedProtocolsPref(nsIPrefBranch* prefs); - - static mozilla::StaticRefPtr sSingleton; - nsTArray mSupportedProtocols; -}; - -#endif // nsGIOProtocolHandler_h___ diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/BackgroundChannelRegistrar.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/BackgroundChannelRegistrar.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -34,7 +34,7 @@ } // static -already_AddRefed +already_AddRefed BackgroundChannelRegistrar::GetOrCreate() { if (!gSingleton) { gSingleton = new BackgroundChannelRegistrar(); @@ -57,8 +57,22 @@ void BackgroundChannelRegistrar::DeleteChannel(uint64_t aKey) { MOZ_ASSERT(NS_IsMainThread()); - mChannels.Remove(aKey); - mBgChannels.Remove(aKey); + RefPtr channel; + mChannels.Remove(aKey, getter_AddRefs(channel)); + RefPtr bgChannel; + mBgChannels.Remove(aKey, getter_AddRefs(bgChannel)); +} + +void BackgroundChannelRegistrar::DeleteChannelIfMatches( + uint64_t aKey, HttpChannelParent* aExpected) { + MOZ_ASSERT(NS_IsMainThread()); + + RefPtr channel; + if (mChannels.GetWeak(aKey) == aExpected) { + mChannels.Remove(aKey, getter_AddRefs(channel)); + } + RefPtr bgChannel; + mBgChannels.Remove(aKey, getter_AddRefs(bgChannel)); } void BackgroundChannelRegistrar::LinkHttpChannel(uint64_t aKey, diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/BackgroundChannelRegistrar.h firefox-esr-140.10.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.h --- firefox-esr-140.9.1esr/netwerk/protocol/http/BackgroundChannelRegistrar.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.h 2026-04-15 01:59:56.000000000 +0000 @@ -29,12 +29,19 @@ explicit BackgroundChannelRegistrar(); - // Singleton accessor - static already_AddRefed GetOrCreate(); + // Singleton accessors + static already_AddRefed GetOrCreate(); private: virtual ~BackgroundChannelRegistrar(); + // Like DeleteChannel, but only removes the mChannels entry if it matches + // aExpected. Use this in preference to DeleteChannel when the caller knows + // which HttpChannelParent it registered, to avoid accidentally removing an + // entry belonging to a different object that shares the same channel Id. + void DeleteChannelIfMatches(uint64_t aKey, HttpChannelParent* aExpected); + friend class HttpChannelParent; + // A helper function for BackgroundChannelRegistrar itself to callback // HttpChannelParent and HttpBackgroundChannelParent when both objects are // ready. aChannelParent and aBgParent is the pair of HttpChannelParent and diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/BackgroundDataBridgeParent.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/BackgroundDataBridgeParent.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.cpp 2026-04-15 01:59:57.000000000 +0000 @@ -10,16 +10,22 @@ namespace net { BackgroundDataBridgeParent::BackgroundDataBridgeParent(uint64_t aChannelID) - : mChannelID(aChannelID), mBackgroundThread(GetCurrentSerialEventTarget()) { + : mChannelID(aChannelID), mBackgroundThread(GetCurrentSerialEventTarget()) {} + +void BackgroundDataBridgeParent::ActorDestroy(ActorDestroyReason aWhy) { if (SocketProcessChild* child = SocketProcessChild::GetSingleton()) { - child->AddDataBridgeToMap(aChannelID, this); + child->RemoveDataBridgeFromMap(mChannelID); } } -void BackgroundDataBridgeParent::ActorDestroy(ActorDestroyReason aWhy) { +already_AddRefed +BackgroundDataBridgeParent::Create(uint64_t aChannelID) { + RefPtr actor = + new BackgroundDataBridgeParent(aChannelID); if (SocketProcessChild* child = SocketProcessChild::GetSingleton()) { - child->RemoveDataBridgeFromMap(mChannelID); + child->AddDataBridgeToMap(aChannelID, actor); } + return actor.forget(); } already_AddRefed diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/BackgroundDataBridgeParent.h firefox-esr-140.10.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.h --- firefox-esr-140.9.1esr/netwerk/protocol/http/BackgroundDataBridgeParent.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.h 2026-04-15 01:59:56.000000000 +0000 @@ -14,7 +14,7 @@ public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BackgroundDataBridgeParent, override) - explicit BackgroundDataBridgeParent(uint64_t aChannelID); + static already_AddRefed Create(uint64_t aChannelID); void ActorDestroy(ActorDestroyReason aWhy) override; already_AddRefed GetBackgroundThread(); void Destroy(); @@ -24,6 +24,7 @@ const TimeStamp& aOnStopRequestStart); private: + explicit BackgroundDataBridgeParent(uint64_t aChannelID); virtual ~BackgroundDataBridgeParent() = default; uint64_t mChannelID; diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/HttpChannelParent.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/HttpChannelParent.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/HttpChannelParent.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/HttpChannelParent.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -271,12 +271,15 @@ } // This HttpChannelParent might still have a reference from - // BackgroundChannelRegistrar. - nsCOMPtr registrar = + // BackgroundChannelRegistrar. Only remove our own entry; another + // HttpChannelParent may have been registered under the same channel Id + // (e.g. after a redirect), and we must not remove that entry. + RefPtr registrar = BackgroundChannelRegistrar::GetOrCreate(); MOZ_ASSERT(registrar); - - registrar->DeleteChannel(mChannel->ChannelId()); + if (registrar) { + registrar->DeleteChannelIfMatches(mChannel->ChannelId(), this); + } // If mAsyncOpenBarrier is greater than zero, it means AsyncOpen procedure // is still on going. we need to abort AsyncOpen with failure to destroy @@ -980,6 +983,11 @@ MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aCallback); + if (mIPCClosed) { + aCallback->ReadyToVerify(NS_ERROR_FAILURE); + return NS_OK; + } + // Continue the verification procedure if background channel is ready. if (mBgParent) { aCallback->ReadyToVerify(NS_OK); diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/HttpTransactionParent.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/HttpTransactionParent.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/HttpTransactionParent.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/HttpTransactionParent.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -18,6 +18,7 @@ #include "nsIThreadRetargetableStreamListener.h" #include "nsITransportSecurityInfo.h" #include "nsNetUtil.h" +#include "nsProxyRelease.h" #include "nsQueryObject.h" #include "nsSerializationHelper.h" #include "nsStreamUtils.h" @@ -36,11 +37,31 @@ NS_IMETHODIMP_(MozExternalRefCountType) HttpTransactionParent::Release(void) { MOZ_ASSERT(int32_t(mRefCnt) > 0, "dup release"); + + if (!NS_IsMainThread()) { + // Use DecrementWithLimit to atomically decrement only while count > 2. + // This ensures a background thread never drops the count to 1 or 0, + // avoiding the race where the main thread frees the object (via + // ActorDisconnected) between our decrement and the count==1 handling. + auto [success, count] = mRefCnt.DecrementWithLimit<2>(); + if (success) { + NS_LOG_RELEASE(this, count, "HttpTransactionParent"); + return count; + } + // mRefCnt <= 2: the next decrement could trigger Send__delete__ or + // deletion, both of which must happen on the main thread. Transfer + // our reference there without decrementing. + NS_ProxyRelease("HttpTransactionParent::Release", + GetMainThreadSerialEventTarget(), + dont_AddRef(static_cast(this))); + return 1; + } + nsrefcnt count = --mRefCnt; NS_LOG_RELEASE(this, count, "HttpTransactionParent"); if (count == 0) { mRefCnt = 1; /* stabilize */ - delete (this); + delete this; return 0; } @@ -48,17 +69,7 @@ // we are done with this transaction. We should send a delete message // to delete the transaction child in socket process. if (count == 1 && CanSend()) { - if (!NS_IsMainThread()) { - RefPtr self = this; - MOZ_ALWAYS_SUCCEEDS(NS_DispatchToMainThread( - NS_NewRunnableFunction("HttpTransactionParent::Release", [self]() { - mozilla::Unused << self->Send__delete__(self); - // Make sure we can not send IPC after Send__delete__(). - MOZ_ASSERT(!self->CanSend()); - }))); - } else { - mozilla::Unused << Send__delete__(this); - } + mozilla::Unused << Send__delete__(this); return 1; } return count; diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/ObliviousHttpChannel.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/ObliviousHttpChannel.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/ObliviousHttpChannel.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/ObliviousHttpChannel.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -525,6 +525,9 @@ ObliviousHttpChannel::AsyncOpen(nsIStreamListener* aListener) { LOG(("ObliviousHttpChannel::AsyncOpen [this=%p, listener=%p]", this, aListener)); + if (mStreamListener) { + return NS_ERROR_ALREADY_OPENED; + } mStreamListener = aListener; nsresult rv = mInnerChannel->SetRequestMethod("POST"_ns); if (NS_FAILED(rv)) { @@ -728,7 +731,8 @@ getter_AddRefs(mBinaryHttpResponse)); } -void ObliviousHttpChannel::EmitOnDataAvailable() { +void ObliviousHttpChannel::EmitOnDataAvailable( + nsIStreamListener* aStreamListener) { if (!mBinaryHttpResponse) { return; } @@ -749,7 +753,7 @@ if (NS_FAILED(rv)) { return; } - rv = mStreamListener->OnDataAvailable(this, contentStream, 0, contentLength); + rv = aStreamListener->OnDataAvailable(this, contentStream, 0, contentLength); Unused << rv; } @@ -759,8 +763,7 @@ LOG(("ObliviousHttpChannel::OnStopRequest [this=%p, request=%p, status=%u]", this, aRequest, (uint32_t)aStatusCode)); - auto releaseStreamListener = MakeScopeExit( - [self = RefPtr{this}]() mutable { self->mStreamListener = nullptr; }); + nsCOMPtr listener = std::move(mStreamListener); if (NS_SUCCEEDED(aStatusCode)) { bool requestSucceeded; @@ -769,11 +772,11 @@ aStatusCode = ProcessOnStopRequest(); } } - Unused << mStreamListener->OnStartRequest(this); + Unused << listener->OnStartRequest(this); if (NS_SUCCEEDED(aStatusCode)) { - EmitOnDataAvailable(); + EmitOnDataAvailable(listener); } - Unused << mStreamListener->OnStopRequest(this, aStatusCode); + Unused << listener->OnStopRequest(this, aStatusCode); return NS_OK; } diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/ObliviousHttpChannel.h firefox-esr-140.10.0esr/netwerk/protocol/http/ObliviousHttpChannel.h --- firefox-esr-140.9.1esr/netwerk/protocol/http/ObliviousHttpChannel.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/ObliviousHttpChannel.h 2026-04-15 01:59:56.000000000 +0000 @@ -47,7 +47,7 @@ ~ObliviousHttpChannel(); nsresult ProcessOnStopRequest(); - void EmitOnDataAvailable(); + void EmitOnDataAvailable(nsIStreamListener*); nsCOMPtr mTargetURI; nsTArray mEncodedConfig; diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/ReplacedHttpResponse.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/ReplacedHttpResponse.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/ReplacedHttpResponse.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/ReplacedHttpResponse.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -53,12 +53,18 @@ NS_IMETHODIMP ReplacedHttpResponse::SetResponseHeader(const nsACString& header, const nsACString& value, bool merge) { + if (mInVisitHeaders) { + return NS_ERROR_FAILURE; + } return mResponseHeaders.SetHeader(header, value, merge, nsHttpHeaderArray::eVarietyResponse); } NS_IMETHODIMP ReplacedHttpResponse::VisitResponseHeaders(nsIHttpHeaderVisitor* visitor) { - return mResponseHeaders.VisitHeaders(visitor); + mInVisitHeaders = true; + nsresult rv = mResponseHeaders.VisitHeaders(visitor); + mInVisitHeaders = false; + return rv; } } // namespace mozilla::net diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/ReplacedHttpResponse.h firefox-esr-140.10.0esr/netwerk/protocol/http/ReplacedHttpResponse.h --- firefox-esr-140.9.1esr/netwerk/protocol/http/ReplacedHttpResponse.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/ReplacedHttpResponse.h 2026-04-15 01:59:56.000000000 +0000 @@ -7,6 +7,7 @@ #include "nsString.h" #include "nsHttpHeaderArray.h" #include "nsIReplacedHttpResponse.h" +#include "mozilla/Atomics.h" namespace mozilla::net { @@ -24,6 +25,7 @@ nsCString mResponseStatusText; nsCString mResponseBody; nsHttpHeaderArray mResponseHeaders; + Atomic mInVisitHeaders{false}; }; } // namespace mozilla::net diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/TLSTransportLayer.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/TLSTransportLayer.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/TLSTransportLayer.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/TLSTransportLayer.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -508,8 +508,16 @@ NS_IMETHODIMP TLSTransportLayer::Close(nsresult aReason) { - LOG(("TLSTransportLayer::Close [this=%p reason=%" PRIx32 "]\n", this, - static_cast(aReason))); + bool onSocketThread = OnSocketThread(); + LOG(("TLSTransportLayer::Close [this=%p reason=%" PRIx32 "] sts=%d", this, + static_cast(aReason), onSocketThread)); + + if (!onSocketThread) { + gSocketTransportService->Dispatch(NS_NewRunnableFunction( + "TLSTransportLayer::Close", + [self = RefPtr{this}, aReason] { self->Close(aReason); })); + return NS_OK; + } mInputCallback = nullptr; mOutputCallback = nullptr; diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpActivityDistributor.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpActivityDistributor.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpActivityDistributor.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpActivityDistributor.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -33,6 +33,7 @@ uint64_t aExtraSizeData, const nsACString& aExtraStringData) { MOZ_ASSERT(XRE_IsParentProcess() && NS_IsMainThread()); + RefPtr self(this); for (size_t i = 0; i < mObservers.Length(); i++) { Unused << mObservers[i]->ObserveActivity(aHttpChannel, aActivityType, @@ -48,6 +49,7 @@ bool aIsHttp3, uint32_t aActivityType, uint32_t aActivitySubtype, PRTime aTimestamp, const nsACString& aExtraStringData) { MOZ_ASSERT(XRE_IsParentProcess() && NS_IsMainThread()); + RefPtr self(this); for (size_t i = 0; i < mObservers.Length(); i++) { Unused << mObservers[i]->ObserveConnectionActivity( diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpChannel.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpChannel.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpChannel.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpChannel.cpp 2026-04-15 01:59:57.000000000 +0000 @@ -354,6 +354,7 @@ } nsHttpChannel::~nsHttpChannel() { + MOZ_ASSERT(NS_IsMainThread(), "Must be released on main thread"); PROFILER_MARKER("~nsHttpChannel", NETWORK, {}, TerminatingFlowMarker, Flow::FromPointer(this)); LOG(("Destroying nsHttpChannel [this=%p, nsIChannel=%p]\n", this, @@ -373,42 +374,11 @@ MOZ_ASSERT(NS_SUCCEEDED(rv)); } - ReleaseMainThreadOnlyReferences(); if (gHttpHandler) { gHttpHandler->RemoveHttpChannel(mChannelId); } } -void nsHttpChannel::ReleaseMainThreadOnlyReferences() { - if (NS_IsMainThread()) { - // Already on main thread, let dtor to - // take care of releasing references - return; - } - - nsTArray> arrayToRelease; - arrayToRelease.AppendElement(mAuthProvider.forget()); - arrayToRelease.AppendElement(mRedirectChannel.forget()); - arrayToRelease.AppendElement(mPreflightChannel.forget()); - arrayToRelease.AppendElement(mDNSPrefetch.forget()); - - MOZ_DIAGNOSTIC_ASSERT( - !mEarlyHintObserver, - "Early hint observer should have been released in ReleaseListeners()"); - arrayToRelease.AppendElement(mEarlyHintObserver.forget()); - MOZ_DIAGNOSTIC_ASSERT( - !mChannelClassifier, - "Channel classifier should have been released in ReleaseListeners()"); - arrayToRelease.AppendElement( - mChannelClassifier.forget().downcast()); - MOZ_DIAGNOSTIC_ASSERT( - !mWarningReporter, - "Warning reporter should have been released in ReleaseListeners()"); - arrayToRelease.AppendElement(mWarningReporter.forget()); - - NS_DispatchToMainThread(new ProxyReleaseRunnable(std::move(arrayToRelease))); -} - nsresult nsHttpChannel::Init(nsIURI* uri, uint32_t caps, nsProxyInfo* proxyInfo, uint32_t proxyResolveFlags, nsIURI* proxyURI, uint64_t channelId, @@ -6229,7 +6199,29 @@ //----------------------------------------------------------------------------- NS_IMPL_ADDREF_INHERITED(nsHttpChannel, HttpBaseChannel) -NS_IMPL_RELEASE_INHERITED(nsHttpChannel, HttpBaseChannel) +bool nsHttpChannel::DispatchRelease() { + if (NS_IsMainThread()) { + return false; + } + + NS_DispatchToMainThread( + NewNonOwningRunnableMethod("net::nsHttpChannel::Release", this, + &nsHttpChannel::Release), + NS_DISPATCH_NORMAL); + + return true; +} + +NS_IMETHODIMP_(MozExternalRefCountType) +nsHttpChannel::Release() { + nsrefcnt count = mRefCnt - 1; + if (DispatchRelease()) { + // Redispatched to the main thread. + return count; + } + + NS_IMPL_RELEASE_INHERITED_GUTS(nsHttpChannel, HttpBaseChannel); +} NS_INTERFACE_MAP_BEGIN(nsHttpChannel) NS_INTERFACE_MAP_ENTRY(nsIRequest) @@ -6661,6 +6653,10 @@ // any error. NS_IMETHODIMP nsHttpChannel::AsyncOpen(nsIStreamListener* aListener) { + // doContentSecurityCheck and OnOpeningRequest fire observers that may + // spin nested event loops; hold a strong ref to this. + RefPtr self(this); + AUTO_PROFILER_FLOW_MARKER("nsHttpChannel::AsyncOpen", NETWORK, Flow::FromPointer(this)); nsCOMPtr listener = aListener; @@ -11322,9 +11318,11 @@ const nsACString& aCspHeader) { LOG(("nsHttpChannel::EarlyHint.\n")); - if (mEarlyHintObserver && nsContentUtils::ComputeIsSecureContext(this)) { - LOG(("nsHttpChannel::EarlyHint propagated.\n")); - mEarlyHintObserver->EarlyHint(aLinkHeader, aReferrerPolicy, aCspHeader); + if (nsCOMPtr obs = mEarlyHintObserver) { + if (nsContentUtils::ComputeIsSecureContext(this)) { + LOG(("nsHttpChannel::EarlyHint propagated.\n")); + obs->EarlyHint(aLinkHeader, aReferrerPolicy, aCspHeader); + } } return NS_OK; } diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpChannel.h firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpChannel.h --- firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpChannel.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpChannel.h 2026-04-15 01:59:57.000000000 +0000 @@ -306,6 +306,7 @@ // Based on the proxy configuration determine the strategy for resolving the // end server host name. ProxyDNSStrategy GetProxyDNSStrategy(); + bool DispatchRelease(); // We might synchronously or asynchronously call BeginConnect, // which includes DNS prefetch and speculative connection, according to @@ -521,8 +522,9 @@ void SetCachedContentType(); private: - // this section is for main-thread-only object - // all the references need to be proxy released on main thread. + // --- MAIN THREAD ONLY OBJECTS --- + // this section is for main-thread-only objects + // all the references need to be released on main thread. // auth specific data nsCOMPtr mAuthProvider; nsCOMPtr mRedirectURI; @@ -537,8 +539,7 @@ // state of whether tracking protection is enabled or not. RefPtr mChannelClassifier; - // Proxy release all members above on main thread. - void ReleaseMainThreadOnlyReferences(); + // --- END OF MAIN THREAD ONLY OBJECTS SECTION --- // Called after the channel is made aware of its tracking status in order // to readjust the referrer if needed according to the referrer default @@ -851,7 +852,7 @@ private: // cache telemetry bool mDidReval{false}; - RefPtr mEarlyHintObserver; + nsCOMPtr mEarlyHintObserver; Maybe mOpenerCallingScriptLocation; RefPtr mWebTransportSessionEventListener; nsMainThreadPtrHandle mOverrideResponse; diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpConnection.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpConnection.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpConnection.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpConnection.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -616,7 +616,8 @@ rv = OnOutputStreamReady(mSocketOut); if (NS_SUCCEEDED(rv) && mContinueHandshakeDone) { - mContinueHandshakeDone(); + auto continuation = std::move(mContinueHandshakeDone); + continuation(); } mContinueHandshakeDone = nullptr; diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpHandler.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpHandler.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpHandler.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpHandler.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -2688,13 +2688,13 @@ MOZ_ASSERT_IF(!nsIOService::UseSocketProcess(), OnSocketThread()); if (ci->IsHttp3()) { - if (!mExcludedHttp3Origins.Contains(ci->GetRoutedHost())) { + { MutexAutoLock lock(mHttpExclusionLock); mExcludedHttp3Origins.Insert(ci->GetRoutedHost()); } mConnMgr->ExcludeHttp3(ci); } else { - if (!mExcludedHttp2Origins.Contains(ci->GetOrigin())) { + { MutexAutoLock lock(mHttpExclusionLock); mExcludedHttp2Origins.Insert(ci->GetOrigin()); } diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpHandler.h firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpHandler.h --- firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpHandler.h 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpHandler.h 2026-04-15 01:59:56.000000000 +0000 @@ -803,7 +803,7 @@ "nsHttpConnectionMgr::LastActiveTabLoadOptimization"}; TimeStamp mLastActiveTabLoadOptimizationHit; - Mutex mHttpExclusionLock MOZ_UNANNOTATED{"nsHttpHandler::HttpExclusion"}; + Mutex mHttpExclusionLock{"nsHttpHandler::HttpExclusion"}; public: [[nodiscard]] nsresult NewChannelId(uint64_t& channelId); @@ -826,8 +826,10 @@ #endif private: - nsTHashSet mExcludedHttp2Origins; - nsTHashSet mExcludedHttp3Origins; + nsTHashSet mExcludedHttp2Origins + MOZ_GUARDED_BY(mHttpExclusionLock); + nsTHashSet mExcludedHttp3Origins + MOZ_GUARDED_BY(mHttpExclusionLock); nsTHashSet mExcluded0RttTcpOrigins; // A set of hosts that we should not upgrade to HTTPS with HTTPS RR. nsTHashSet mExcludedHostsForHTTPSRRUpgrade; diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpTransaction.cpp firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpTransaction.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/http/nsHttpTransaction.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/http/nsHttpTransaction.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -208,8 +208,8 @@ if (NS_FAILED(rv)) return rv; - mConnInfo = cinfo; - mFinalizedConnInfo = cinfo; + mConnInfo = cinfo->Clone(); + mFinalizedConnInfo = mConnInfo; mCallbacks = callbacks; mConsumerTarget = target; mCaps = caps; diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/moz.build firefox-esr-140.10.0esr/netwerk/protocol/moz.build --- firefox-esr-140.9.1esr/netwerk/protocol/moz.build 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/moz.build 2026-04-15 01:59:56.000000000 +0000 @@ -4,7 +4,13 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -DIRS += ["about", "data", "file"] -if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - DIRS += ["gio"] -DIRS += ["http", "res", "viewsource", "websocket", "webtransport"] +DIRS += [ + "about", + "data", + "file", + "http", + "res", + "viewsource", + "websocket", + "webtransport", +] diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/res/ExtensionProtocolHandler.cpp firefox-esr-140.10.0esr/netwerk/protocol/res/ExtensionProtocolHandler.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/res/ExtensionProtocolHandler.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/res/ExtensionProtocolHandler.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -9,6 +9,8 @@ #include "mozilla/BinarySearch.h" #include "mozilla/Components.h" #include "mozilla/ClearOnShutdown.h" +#include "mozilla/StaticMutex.h" +#include "nsThreadUtils.h" #include "mozilla/dom/Promise.h" #include "mozilla/dom/Promise-inl.h" #include "mozilla/ExtensionPolicyService.h" @@ -20,6 +22,7 @@ #include "mozilla/Omnijar.h" #include "mozilla/RefPtr.h" #include "mozilla/ResultExtensions.h" +#include "mozilla/SyncRunnable.h" #include "mozilla/Try.h" #include "FileDescriptorFile.h" @@ -385,9 +388,24 @@ already_AddRefed ExtensionProtocolHandler::GetSingleton() { + static StaticMutex sMutex; + StaticMutexAutoLock lock(sMutex); if (!sSingleton) { - sSingleton = new ExtensionProtocolHandler(); - ClearOnShutdown(&sSingleton); + if (NS_IsMainThread()) { + sSingleton = new ExtensionProtocolHandler(); + ClearOnShutdown(&sSingleton); + } else { + StaticMutexAutoUnlock unlock(sMutex); + RefPtr r = NS_NewRunnableFunction( + "ExtensionProtocolHandler::GetSingleton", []() { + StaticMutexAutoLock lock(sMutex); + if (!sSingleton) { + sSingleton = new ExtensionProtocolHandler(); + ClearOnShutdown(&sSingleton); + } + }); + SyncRunnable::DispatchToThread(GetMainThreadSerialEventTarget(), r); + } } return do_AddRef(sSingleton); } diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/websocket/WebSocketChannelChild.cpp firefox-esr-140.10.0esr/netwerk/protocol/websocket/WebSocketChannelChild.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/websocket/WebSocketChannelChild.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/websocket/WebSocketChannelChild.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -29,20 +29,20 @@ NS_IMETHODIMP_(MozExternalRefCountType) WebSocketChannelChild::Release() { MOZ_ASSERT(0 != mRefCnt, "dup release"); - --mRefCnt; + nsrefcnt count = --mRefCnt; NS_LOG_RELEASE(this, mRefCnt, "WebSocketChannelChild"); - if (mRefCnt == 1) { + if (count == 1) { MaybeReleaseIPCObject(); return mRefCnt; } - if (mRefCnt == 0) { + if (count == 0) { mRefCnt = 1; /* stabilize */ delete this; return 0; } - return mRefCnt; + return count; } NS_INTERFACE_MAP_BEGIN(WebSocketChannelChild) @@ -95,15 +95,6 @@ } void WebSocketChannelChild::MaybeReleaseIPCObject() { - { - MutexAutoLock lock(mMutex); - if (mIPCState != Opened) { - return; - } - - mIPCState = Closing; - } - if (!NS_IsMainThread()) { nsCOMPtr target = GetNeckoTarget(); MOZ_ALWAYS_SUCCEEDS(target->Dispatch( @@ -113,6 +104,15 @@ return; } + { + MutexAutoLock lock(mMutex); + if (mIPCState != Opened) { + return; + } + + mIPCState = Closing; + } + SendDeleteSelf(); } diff -Nru firefox-esr-140.9.1esr/netwerk/protocol/webtransport/WebTransportSessionProxy.cpp firefox-esr-140.10.0esr/netwerk/protocol/webtransport/WebTransportSessionProxy.cpp --- firefox-esr-140.9.1esr/netwerk/protocol/webtransport/WebTransportSessionProxy.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/protocol/webtransport/WebTransportSessionProxy.cpp 2026-04-15 01:59:55.000000000 +0000 @@ -220,17 +220,29 @@ case WebTransportSessionProxyState::INIT: case WebTransportSessionProxyState::DONE: return NS_ERROR_NOT_INITIALIZED; - case WebTransportSessionProxyState::NEGOTIATING: - mChannel->Cancel(NS_ERROR_ABORT); + case WebTransportSessionProxyState::NEGOTIATING: { + nsCOMPtr channel = mChannel; mChannel = nullptr; ChangeState(WebTransportSessionProxyState::DONE); + NS_DispatchToMainThread(NS_NewRunnableFunction( + "WebTransportSessionProxy::CancelChannel", + [channel = std::move(channel)]() { + channel->Cancel(NS_ERROR_ABORT); + })); break; - case WebTransportSessionProxyState::NEGOTIATING_SUCCEEDED: - mChannel->Cancel(NS_ERROR_ABORT); + } + case WebTransportSessionProxyState::NEGOTIATING_SUCCEEDED: { + nsCOMPtr channel = mChannel; mChannel = nullptr; ChangeState(WebTransportSessionProxyState::SESSION_CLOSE_PENDING); + NS_DispatchToMainThread(NS_NewRunnableFunction( + "WebTransportSessionProxy::CancelChannel", + [channel = std::move(channel)]() { + channel->Cancel(NS_ERROR_ABORT); + })); CloseSessionInternal(); break; + } case WebTransportSessionProxyState::ACTIVE: ChangeState(WebTransportSessionProxyState::SESSION_CLOSE_PENDING); CloseSessionInternal(); diff -Nru firefox-esr-140.9.1esr/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp firefox-esr-140.10.0esr/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp --- firefox-esr-140.9.1esr/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -567,10 +567,13 @@ } int32_t afterIndex = aRepLen + ignoreLen; - uint32_t textAfterPos = aInString[afterIndex]; - if (aInLength > afterIndex + 1 && - NS_IS_SURROGATE_PAIR(textAfterPos, aInString[afterIndex + 1])) { - textAfterPos = SURROGATE_TO_UCS4(textAfterPos, aInString[afterIndex + 1]); + uint32_t textAfterPos = 0; + if (afterIndex < aInLength) { + textAfterPos = aInString[afterIndex]; + if (aInLength > afterIndex + 1 && + NS_IS_SURROGATE_PAIR(textAfterPos, aInString[afterIndex + 1])) { + textAfterPos = SURROGATE_TO_UCS4(textAfterPos, aInString[afterIndex + 1]); + } } return !((before == LT_ALPHA && !IsAlpha(text0)) || diff -Nru firefox-esr-140.9.1esr/netwerk/system/mac/nsNetworkLinkService.mm firefox-esr-140.10.0esr/netwerk/system/mac/nsNetworkLinkService.mm --- firefox-esr-140.9.1esr/netwerk/system/mac/nsNetworkLinkService.mm 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/system/mac/nsNetworkLinkService.mm 2026-04-15 01:59:56.000000000 +0000 @@ -711,9 +711,26 @@ bool ipConfigChanged = false; bool dnsConfigChanged = false; + bool skipOnIPConfigChanged = false; for (CFIndex i = 0; i < CFArrayGetCount(aChangedKeys); ++i) { CFStringRef key = static_cast(CFArrayGetValueAtIndex(aChangedKeys, i)); + // Don't call OnIPConfigChanged() if aChangedKeys contains any EAPOL + // notifications. This works around a crash bug deep in macOS system + // code. Our observers should still get reachability notifications, so + // this shouldn't interfere with network functionality. + if (CFStringHasSuffix(key, CFSTR("EAPOL"))) { + CFIndex keyMaxLength = + CFStringGetMaximumSizeForEncoding(CFStringGetLength(key), + kCFStringEncodingUTF8) + + 1; + char* keyBuffer = static_cast(moz_xmalloc(keyMaxLength)); + keyBuffer[0] = 0; + CFStringGetCString(key, keyBuffer, keyMaxLength, kCFStringEncodingUTF8); + LOG(("Skipping OnIPConfigChanged() on changed key %s", keyBuffer)); + free(keyBuffer); + skipOnIPConfigChanged = true; + } if (CFStringHasSuffix(key, kSCEntNetIPv4) || CFStringHasSuffix(key, kSCEntNetIPv6)) { ipConfigChanged = true; @@ -724,7 +741,7 @@ } nsNetworkLinkService* service = static_cast(aInfo); - if (ipConfigChanged) { + if (ipConfigChanged && !skipOnIPConfigChanged) { service->OnIPConfigChanged(); } @@ -803,7 +820,8 @@ ::SCDynamicStoreCreate(nullptr, CFSTR("IPAndDNSChangeCallbackSCF"), NetworkConfigChanged, &storeContext); - CFStringRef patterns[4] = {nullptr, nullptr, nullptr, nullptr}; + CFStringRef patterns[6] = {nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr}; OSStatus err = getErrorCodePtr(mStoreRef); if (err == noErr) { // This pattern is "State:/Network/Service/[^/]+/IPv4". @@ -818,7 +836,16 @@ // This pattern is "Setup:/Network/Service/[^/]+/DNS". patterns[3] = ::SCDynamicStoreKeyCreateNetworkServiceEntity( nullptr, kSCDynamicStoreDomainSetup, kSCCompAnyRegex, kSCEntNetDNS); - if (!patterns[0] || !patterns[1] || !patterns[2] || !patterns[3]) { + // We want to be able to ignore some groups of notifications that contain + // "EAPOL" keys. This works around a crash bug deep in macOS system code. + // This pattern is "State:/Network/Service/[^/]+/EAPOL". + patterns[4] = ::SCDynamicStoreKeyCreateNetworkServiceEntity( + nullptr, kSCDynamicStoreDomainState, kSCCompAnyRegex, CFSTR("EAPOL")); + // This pattern is "State:/Network/Interface/[^/]+/EAPOL". + patterns[5] = ::SCDynamicStoreKeyCreateNetworkInterfaceEntity( + nullptr, kSCDynamicStoreDomainState, kSCCompAnyRegex, CFSTR("EAPOL")); + if (!patterns[0] || !patterns[1] || !patterns[2] || !patterns[3] || + !patterns[4] || !patterns[5]) { err = -1; } } @@ -829,7 +856,7 @@ // that match that pattern list, then create our run loop // source. if (err == noErr) { - patternList = ::CFArrayCreate(nullptr, (const void**)patterns, 4, + patternList = ::CFArrayCreate(nullptr, (const void**)patterns, 6, &kCFTypeArrayCallBacks); if (!patternList) { err = -1; @@ -849,6 +876,8 @@ CFReleaseSafe(patterns[1]); CFReleaseSafe(patterns[2]); CFReleaseSafe(patterns[3]); + CFReleaseSafe(patterns[4]); + CFReleaseSafe(patterns[5]); CFReleaseSafe(patternList); if (err != noErr) { diff -Nru firefox-esr-140.9.1esr/netwerk/test/unit/test_gio_protocol.js firefox-esr-140.10.0esr/netwerk/test/unit/test_gio_protocol.js --- firefox-esr-140.9.1esr/netwerk/test/unit/test_gio_protocol.js 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/test/unit/test_gio_protocol.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ -/* run some tests on the gvfs/gio protocol handler */ - -"use strict"; - -function inChildProcess() { - return Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT; -} - -const PR_RDONLY = 0x1; // see prio.h - -[ - do_test_read_data_dir, - do_test_read_recent, - test_read_file, - do_test_finished, -].forEach(f => add_test(f)); - -function setup() { - // Allowing some protocols to get a channel - if (!inChildProcess()) { - Services.prefs.setCharPref( - "network.gio.supported-protocols", - "localtest:,recent:" - ); - } else { - do_send_remote_message("gio-allow-test-protocols"); - do_await_remote_message("gio-allow-test-protocols-done"); - } -} - -setup(); - -registerCleanupFunction(() => { - // Resetting the protocols to None - if (!inChildProcess()) { - Services.prefs.clearUserPref("network.gio.supported-protocols"); - } -}); - -function new_file_input_stream(file, buffered) { - var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance( - Ci.nsIFileInputStream - ); - stream.init(file, PR_RDONLY, 0, 0); - if (!buffered) { - return stream; - } - - var buffer = Cc[ - "@mozilla.org/network/buffered-input-stream;1" - ].createInstance(Ci.nsIBufferedInputStream); - buffer.init(stream, 4096); - return buffer; -} - -function new_file_channel(file) { - var chan = NetUtil.newChannel({ - uri: file, - loadUsingSystemPrincipal: true, - }); - - return chan; -} - -/* - * stream listener - * this listener has some additional file-specific tests, so we can't just use - * ChannelListener here. - */ -function FileStreamListener(closure) { - this._closure = closure; -} -FileStreamListener.prototype = { - _closure: null, - _buffer: "", - _got_onstartrequest: false, - _got_onstoprequest: false, - _contentLen: -1, - - QueryInterface: ChromeUtils.generateQI([ - "nsIStreamListener", - "nsIRequestObserver", - ]), - - onStartRequest() { - if (this._got_onstartrequest) { - do_throw("Got second onStartRequest event!"); - } - this._got_onstartrequest = true; - }, - - onDataAvailable(request, stream, offset, count) { - if (!this._got_onstartrequest) { - do_throw("onDataAvailable without onStartRequest event!"); - } - if (this._got_onstoprequest) { - do_throw("onDataAvailable after onStopRequest event!"); - } - if (!request.isPending()) { - do_throw("request reports itself as not pending from onStartRequest!"); - } - - this._buffer = this._buffer.concat(read_stream(stream, count)); - }, - - onStopRequest(request, status) { - if (!this._got_onstartrequest) { - do_throw("onStopRequest without onStartRequest event!"); - } - if (this._got_onstoprequest) { - do_throw("Got second onStopRequest event!"); - } - this._got_onstoprequest = true; - if (!Components.isSuccessCode(status)) { - do_throw("Failed to load file: " + status.toString(16)); - } - if (status != request.status) { - do_throw("request.status does not match status arg to onStopRequest!"); - } - if (request.isPending()) { - do_throw("request reports itself as pending from onStopRequest!"); - } - if (this._contentLen != -1 && this._buffer.length != this._contentLen) { - do_throw("did not read nsIChannel.contentLength number of bytes!"); - } - - this._closure(this._buffer); - }, -}; - -function test_read_file() { - dump("*** test_read_file\n"); - // Going via parent path, because this is opended from test/unit/ and test/unit_ipc/ - var file = do_get_file("../unit/data/test_readline4.txt"); - var chan = new_file_channel("localtest://" + file.path); - - function on_read_complete(data) { - dump("*** test_read_file.on_read_complete()\n"); - /* read completed successfully. now read data directly from file, - and compare the result. */ - var stream = new_file_input_stream(file, false); - var result = read_stream(stream, stream.available()); - if (result != data) { - do_throw("Stream contents do not match with direct read!"); - } - run_next_test(); - } - - chan.asyncOpen(new FileStreamListener(on_read_complete)); -} - -function do_test_read_data_dir() { - dump('*** test_read_data_dir("../data/")\n'); - - var dir = do_get_file("../unit/data/"); - var chan = new_file_channel("localtest://" + dir.path); - - function on_read_complete(data) { - dump("*** test_read_data_dir.on_read_complete()\n"); - - // The data-directory should be listed, containing a header-line and the files therein - if ( - !( - data.includes("200: filename content-length last-modified file-type") && - data.includes("201: test_readline1.txt") && - data.includes("201: test_readline2.txt") - ) - ) { - do_throw( - "test_read_data_dir() - Bad data! Does not contain needles! Is <" + - data + - ">" - ); - } - run_next_test(); - } - chan.asyncOpen(new FileStreamListener(on_read_complete)); -} - -function do_test_read_recent() { - dump('*** test_read_recent("recent://")\n'); - - var chan = new_file_channel("recent:///"); - - function on_read_complete(data) { - dump("*** test_read_recent.on_read_complete()\n"); - - // The data-directory should be listed, containing a header-line and the files therein - if ( - !data.includes("200: filename content-length last-modified file-type") - ) { - do_throw( - "do_test_read_recent() - Bad data! Does not contain header! Is <" + - data + - ">" - ); - } - run_next_test(); - } - chan.asyncOpen(new FileStreamListener(on_read_complete)); -} diff -Nru firefox-esr-140.9.1esr/netwerk/test/unit/xpcshell.toml firefox-esr-140.10.0esr/netwerk/test/unit/xpcshell.toml --- firefox-esr-140.9.1esr/netwerk/test/unit/xpcshell.toml 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/test/unit/xpcshell.toml 2026-04-15 01:59:56.000000000 +0000 @@ -623,9 +623,6 @@ ["test_getHost.js"] -["test_gio_protocol.js"] -run-if = ["os == 'linux'"] - ["test_gre_resources.js"] ["test_h2proxy_connection_limit.js"] diff -Nru firefox-esr-140.9.1esr/netwerk/test/unit_ipc/test_gio_protocol_wrap.js firefox-esr-140.10.0esr/netwerk/test/unit_ipc/test_gio_protocol_wrap.js --- firefox-esr-140.9.1esr/netwerk/test/unit_ipc/test_gio_protocol_wrap.js 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/test/unit_ipc/test_gio_protocol_wrap.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -// -// Run test script in content process instead of chrome (xpcshell's default) -// -// - -function run_test() { - Services.prefs.setCharPref( - "network.gio.supported-protocols", - "localtest:,recent:" - ); - - do_await_remote_message("gio-allow-test-protocols").then(() => { - do_send_remote_message("gio-allow-test-protocols-done"); - }); - - run_test_in_child("../unit/test_gio_protocol.js"); -} - -registerCleanupFunction(() => { - Services.prefs.clearUserPref("network.gio.supported-protocols"); -}); diff -Nru firefox-esr-140.9.1esr/netwerk/test/unit_ipc/xpcshell.toml firefox-esr-140.10.0esr/netwerk/test/unit_ipc/xpcshell.toml --- firefox-esr-140.9.1esr/netwerk/test/unit_ipc/xpcshell.toml 2026-04-03 15:52:26.000000000 +0000 +++ firefox-esr-140.10.0esr/netwerk/test/unit_ipc/xpcshell.toml 2026-04-15 01:59:56.000000000 +0000 @@ -17,7 +17,6 @@ "!/netwerk/test/unit/test_duplicate_headers.js", "!/netwerk/test/unit/test_event_sink.js", "!/netwerk/test/unit/test_getHost.js", - "!/netwerk/test/unit/test_gio_protocol.js", "!/netwerk/test/unit/test_head.js", "!/netwerk/test/unit/test_headers.js", "!/netwerk/test/unit/test_httpsuspend.js", @@ -136,9 +135,6 @@ ["test_getHost_wrap.js"] prefs = ["network.allow_raw_sockets_in_content_processes=true"] -["test_gio_protocol_wrap.js"] -run-if = ["os == 'linux'"] - ["test_head_wrap.js"] prefs = ["network.allow_raw_sockets_in_content_processes=true"] diff -Nru firefox-esr-140.9.1esr/parser/html/nsHtml5TreeOperation.cpp firefox-esr-140.10.0esr/parser/html/nsHtml5TreeOperation.cpp --- firefox-esr-140.9.1esr/parser/html/nsHtml5TreeOperation.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/parser/html/nsHtml5TreeOperation.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -970,13 +970,22 @@ return NS_OK; } + nsIContent* node = *aOperation.mTemplateNode; + nsIContent* host = *aOperation.mHost; + + if (MOZ_UNLIKELY(node->GetParentNode())) { + Detach(node, mBuilder); + if (MOZ_UNLIKELY(node->GetParentNode())) { + // Can this happen? If it can, give up. + return NS_OK; + } + } + // We failed to attach a new shadow root, so instead attach a template // element and return its content. - nsHtml5TreeOperation::Append(*aOperation.mTemplateNode, *aOperation.mHost, - mBuilder); + nsHtml5TreeOperation::Append(node, host, mBuilder); *aOperation.mFragHandle = - static_cast(*aOperation.mTemplateNode) - ->Content(); + static_cast(node)->Content(); nsContentUtils::LogSimpleConsoleError( u"Failed to attach Declarative Shadow DOM."_ns, "DOM"_ns, mBuilder->GetDocument()->IsInPrivateBrowsing(), @@ -988,6 +997,9 @@ nsIContent* table = *(aOperation.mTable); nsIContent* stackParent = *(aOperation.mStackParent); nsIContent* fosterParent = GetFosterParent(table, stackParent); + if (fosterParent) { + mBuilder->HoldElement(do_AddRef(fosterParent)); + } *aOperation.mParentHandle = fosterParent; return NS_OK; } diff -Nru firefox-esr-140.9.1esr/security/ct/CTKnownLogs.h firefox-esr-140.10.0esr/security/ct/CTKnownLogs.h --- firefox-esr-140.9.1esr/security/ct/CTKnownLogs.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/ct/CTKnownLogs.h 2026-04-15 01:59:57.000000000 +0000 @@ -14,7 +14,7 @@ #include -static const PRTime kCTExpirationTime = INT64_C(1779695596000000); +static const PRTime kCTExpirationTime = INT64_C(1782114585000000); namespace mozilla::ct { diff -Nru firefox-esr-140.9.1esr/security/manager/ssl/PSMRunnable.cpp firefox-esr-140.10.0esr/security/manager/ssl/PSMRunnable.cpp --- firefox-esr-140.9.1esr/security/manager/ssl/PSMRunnable.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/manager/ssl/PSMRunnable.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "PSMRunnable.h" - -namespace mozilla { -namespace psm { - -SyncRunnableBase::SyncRunnableBase() - : Runnable("psm::SyncRunnableBase"), monitor("SyncRunnableBase::monitor") {} - -nsresult SyncRunnableBase::DispatchToMainThreadAndWait() { - nsresult rv; - if (NS_IsMainThread()) { - RunOnTargetThread(); - rv = NS_OK; - } else { - mozilla::MonitorAutoLock lock(monitor); - rv = NS_DispatchToMainThread(this); - if (NS_SUCCEEDED(rv)) { - lock.Wait(); - } - } - - return rv; -} - -NS_IMETHODIMP -SyncRunnableBase::Run() { - RunOnTargetThread(); - mozilla::MonitorAutoLock(monitor).Notify(); - return NS_OK; -} - -nsresult NotifyObserverRunnable::Run() { - mObserver->Observe(nullptr, mTopic, nullptr); - return NS_OK; -} - -} // namespace psm -} // namespace mozilla diff -Nru firefox-esr-140.9.1esr/security/manager/ssl/PSMRunnable.h firefox-esr-140.10.0esr/security/manager/ssl/PSMRunnable.h --- firefox-esr-140.9.1esr/security/manager/ssl/PSMRunnable.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/manager/ssl/PSMRunnable.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef PSMRunnable_h -#define PSMRunnable_h - -#include "mozilla/Monitor.h" -#include "nsThreadUtils.h" -#include "nsIObserver.h" -#include "nsProxyRelease.h" - -namespace mozilla { -namespace psm { - -// Wait for the event to run on the target thread without spinning the event -// loop on the calling thread. (Dispatching events to a thread using -// NS_DispatchAndSpinEventLoopUntilComplete would cause the event loop on the -// calling thread to spin.) -class SyncRunnableBase : public Runnable { - public: - NS_DECL_NSIRUNNABLE - nsresult DispatchToMainThreadAndWait(); - - protected: - SyncRunnableBase(); - virtual void RunOnTargetThread() = 0; - - private: - mozilla::Monitor monitor MOZ_UNANNOTATED; -}; - -class NotifyObserverRunnable : public Runnable { - public: - NotifyObserverRunnable(nsIObserver* observer, const char* topicStringLiteral) - : Runnable("psm::NotifyObserverRunnable"), - mObserver(new nsMainThreadPtrHolder( - "psm::NotifyObserverRunnable::mObserver", observer)), - mTopic(topicStringLiteral) {} - NS_DECL_NSIRUNNABLE - private: - nsMainThreadPtrHandle mObserver; - const char* const mTopic; -}; - -} // namespace psm -} // namespace mozilla - -#endif diff -Nru firefox-esr-140.9.1esr/security/manager/ssl/SSLServerCertVerification.cpp firefox-esr-140.10.0esr/security/manager/ssl/SSLServerCertVerification.cpp --- firefox-esr-140.9.1esr/security/manager/ssl/SSLServerCertVerification.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/manager/ssl/SSLServerCertVerification.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -99,7 +99,6 @@ #include "ExtendedValidation.h" #include "NSSCertDBTrustDomain.h" #include "NSSSocketControl.h" -#include "PSMRunnable.h" #include "RootCertificateTelemetryUtils.h" #include "ScopedNSSTypes.h" #include "SharedCertVerifier.h" diff -Nru firefox-esr-140.9.1esr/security/manager/ssl/StaticHPKPins.h firefox-esr-140.10.0esr/security/manager/ssl/StaticHPKPins.h --- firefox-esr-140.9.1esr/security/manager/ssl/StaticHPKPins.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/manager/ssl/StaticHPKPins.h 2026-04-15 01:59:57.000000000 +0000 @@ -726,4 +726,4 @@ static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1782114773318000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1784533762555000); diff -Nru firefox-esr-140.9.1esr/security/manager/ssl/moz.build firefox-esr-140.10.0esr/security/manager/ssl/moz.build --- firefox-esr-140.9.1esr/security/manager/ssl/moz.build 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/manager/ssl/moz.build 2026-04-15 01:59:56.000000000 +0000 @@ -127,7 +127,6 @@ "nsTLSSocketProvider.cpp", "OSKeyStore.cpp", "PKCS11ModuleDB.cpp", - "PSMRunnable.cpp", "PublicKeyPinningService.cpp", "RootCertificateTelemetryUtils.cpp", "SecretDecoderRing.cpp", @@ -192,7 +191,11 @@ "ntdll", ] - UNIFIED_SOURCES += [ + # CredentialManagerSecret.cpp includes without WIN32_LEAN_AND_MEAN, + # which pulls in and conflicts with included by other + # files in the same unified translation unit. Compile independently to prevent + # that interference. + SOURCES += [ "CredentialManagerSecret.cpp", ] # Version string comparison is generally wrong, but by the time it would diff -Nru firefox-esr-140.9.1esr/security/manager/ssl/nsNSSCallbacks.cpp firefox-esr-140.10.0esr/security/manager/ssl/nsNSSCallbacks.cpp --- firefox-esr-140.9.1esr/security/manager/ssl/nsNSSCallbacks.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/manager/ssl/nsNSSCallbacks.cpp 2026-04-15 01:59:57.000000000 +0000 @@ -7,7 +7,6 @@ #include "nsNSSCallbacks.h" #include "NSSSocketControl.h" -#include "PSMRunnable.h" #include "ScopedNSSTypes.h" #include "SharedCertVerifier.h" #include "mozilla/ArrayUtils.h" @@ -20,6 +19,7 @@ #include "mozilla/SpinEventLoopUntil.h" #include "mozilla/StaticPrefs_security.h" #include "mozilla/Unused.h" +#include "mozilla/SyncRunnable.h" #include "mozilla/glean/SecurityManagerSslMetrics.h" #include "mozilla/intl/Localization.h" #include "nsContentUtils.h" @@ -40,6 +40,7 @@ #include "nsNetUtil.h" #include "nsProxyRelease.h" #include "nsStringStream.h" +#include "nsThreadUtils.h" #include "mozpkix/pkixtypes.h" #include "ssl.h" #include "sslproto.h" @@ -546,28 +547,36 @@ } } -class PK11PasswordPromptRunnable : public SyncRunnableBase { +class PK11PasswordPromptRunnable final : public nsIRunnable { public: PK11PasswordPromptRunnable(PK11SlotInfo* slot, nsIInterfaceRequestor* ir) : mResult(nullptr), mSlot(slot), mIR(ir) {} - virtual ~PK11PasswordPromptRunnable() = default; + + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_NSIRUNNABLE char* mResult; // out - virtual void RunOnTargetThread() override; private: + ~PK11PasswordPromptRunnable() = default; + + // Accessed only on the main thread. True if any instance of + // PK11PasswordPromptRunnable is already running. static bool mRunning; PK11SlotInfo* mSlot; nsIInterfaceRequestor* mIR; }; +NS_IMPL_ISUPPORTS(PK11PasswordPromptRunnable, nsIRunnable) + bool PK11PasswordPromptRunnable::mRunning = false; -void PK11PasswordPromptRunnable::RunOnTargetThread() { +NS_IMETHODIMP +PK11PasswordPromptRunnable::Run() { MOZ_ASSERT(NS_IsMainThread()); if (!NS_IsMainThread()) { - return; + return NS_ERROR_NOT_SAME_THREAD; } // If we've reentered due to the nested event loop implicit in using @@ -577,7 +586,7 @@ // to fail, but this is better than littering the screen with a bunch of // password prompts that the user will probably just cancel anyway. if (mRunning) { - return; + return NS_OK; } mRunning = true; auto setRunningToFalseOnExit = MakeScopeExit([&]() { mRunning = false; }); @@ -587,7 +596,7 @@ if (!mIR) { rv = nsNSSComponent::GetNewPrompter(getter_AddRefs(prompt)); if (NS_FAILED(rv)) { - return; + return rv; } } else { prompt = do_GetInterface(mIR); @@ -595,12 +604,12 @@ } if (!prompt) { - return; + return NS_ERROR_FAILURE; } if (PK11_ProtectedAuthenticationPath(mSlot)) { mResult = ShowProtectedAuthPrompt(mSlot, prompt); - return; + return NS_OK; } nsAutoString promptString; @@ -613,7 +622,7 @@ promptString); } if (NS_FAILED(rv)) { - return; + return rv; } nsString password; @@ -621,10 +630,11 @@ rv = prompt->PromptPassword(nullptr, promptString.get(), getter_Copies(password), &userClickedOK); if (NS_FAILED(rv) || !userClickedOK) { - return; + return rv; } mResult = ToNewUTF8String(password); + return NS_OK; } char* PK11PasswordPrompt(PK11SlotInfo* slot, PRBool /*retry*/, void* arg) { @@ -633,7 +643,8 @@ } RefPtr runnable(new PK11PasswordPromptRunnable( slot, static_cast(arg))); - runnable->DispatchToMainThreadAndWait(); + MOZ_ALWAYS_SUCCEEDS(SyncRunnable::DispatchToThread( + GetMainThreadSerialEventTarget(), runnable)); return runnable->mResult; } diff -Nru firefox-esr-140.9.1esr/security/manager/ssl/nsNSSIOLayer.cpp firefox-esr-140.10.0esr/security/manager/ssl/nsNSSIOLayer.cpp --- firefox-esr-140.9.1esr/security/manager/ssl/nsNSSIOLayer.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/manager/ssl/nsNSSIOLayer.cpp 2026-04-15 01:59:56.000000000 +0000 @@ -13,7 +13,6 @@ #include "NSSCertDBTrustDomain.h" #include "NSSErrorsService.h" #include "NSSSocketControl.h" -#include "PSMRunnable.h" #include "SSLServerCertVerification.h" #include "ScopedNSSTypes.h" #include "TLSClientAuthCertSelection.h" diff -Nru firefox-esr-140.9.1esr/security/manager/ssl/nsSTSPreloadList.inc firefox-esr-140.10.0esr/security/manager/ssl/nsSTSPreloadList.inc --- firefox-esr-140.9.1esr/security/manager/ssl/nsSTSPreloadList.inc 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/manager/ssl/nsSTSPreloadList.inc 2026-04-15 01:59:57.000000000 +0000 @@ -8,7 +8,7 @@ /*****************************************************************************/ #include -const PRTime gPreloadListExpirationTime = INT64_C(1784533969259000); +const PRTime gPreloadListExpirationTime = INT64_C(1786952959163000); %% 0--1.de, 1 0-0.io, 1 @@ -16,7 +16,6 @@ 0-1.party, 1 0-24.com, 1 0-24.net, 1 -0-9.com, 1 0-nuisibles.fr, 1 0.com.ms, 1 0.sb, 1 @@ -54,7 +53,6 @@ 00321365.com, 1 00365t.com, 1 0037552.com, 1 -003d88.com, 1 003dyw.com, 1 0047552.com, 1 00484.com, 1 @@ -109,7 +107,6 @@ 02327.net, 1 02349898.xyz, 1 02365t.com, 1 -023sec.com, 1 025500.xyz, 1 02638.net, 1 02n.cn, 1 @@ -187,6 +184,7 @@ 07d88.com, 1 07d88.net, 1 07f.de, 1 +0800-horoscope.com, 1 08000113.nl, 1 0800829988.com, 1 081115.com, 0 @@ -319,7 +317,7 @@ 1-800-mattress.com, 1 1-800-payment.com, 1 1-inv.com, 1 -1-news.net, 1 +1-news.net, 0 1-pujcky-uvery.tk, 1 1-x-bet.com, 1 1-x-bet.ke, 1 @@ -329,6 +327,7 @@ 1-xbet13.com, 1 1-xbet20.com, 1 100-downloads.com, 1 +100000037.xyz, 1 10000hits.tk, 1 10000lab.net, 1 10000rub.gq, 1 @@ -361,6 +360,7 @@ 100beauty.com, 1 100bib.ru, 1 100car.pl, 1 +100cgi.com, 1 100kraz.ga, 1 100nome.com, 1 100pay.com, 1 @@ -459,16 +459,12 @@ 10ve.live, 1 10web.io, 1 10wtac.tk, 1 -10x.to, 1 -10xnation.com, 1 +10xerp.com, 1 11-11.sale, 1 1100.so, 1 -110111011.xyz, 1 11018vip.com, 1 11018xpj.com, 1 110838.com, 1 -110cl.com, 1 -110na.com, 1 1110a24.com, 1 1111365t.com, 1 1111systems.com, 1 @@ -727,6 +723,7 @@ 125c.cn, 1 125colours.tk, 1 125m125.de, 1 +126northmarketing.com, 1 127011.ch, 1 127661.com, 1 1288366.com, 1 @@ -917,8 +914,6 @@ 1620350.com, 1 162263.com, 0 162361.com, 0 -162cr.com, 1 -162ea.com, 1 162jonesrd.ca, 1 163.gd, 1 16321.tk, 1 @@ -1050,7 +1045,6 @@ 1800matress.net, 1 1800mattress.co, 1 1800mattress.net, 1 -1800nopests.com.my, 1 182wh.com, 1 1831365.com, 1 1832365.com, 1 @@ -1261,8 +1255,7 @@ 1q2w.nl, 1 1q365a.com, 1 1r.is, 1 -1rail.com.au, 0 -1roadsquadtransport.com, 1 +1rail.com.au, 1 1rs.nl, 1 1rust.net, 1 1salland.nl, 1 @@ -1285,6 +1278,7 @@ 1strecipes.com, 1 1ststop.co.uk, 1 1ticks.com, 1 +1time.io, 1 1tomplumber.com, 1 1up.it, 1 1v9.im, 1 @@ -1531,7 +1525,6 @@ 2033010.com, 1 2033011.com, 1 2033a.com, 1 -2033c.com, 1 2033z.com, 1 203700.com, 1 204504byse.info, 1 @@ -1612,27 +1605,15 @@ 22delta.com, 1 22emesiecle.com, 0 22lc8.com, 0 -22momo.com, 1 22nd.com, 0 22ndcircuitil.gov, 1 22pagespdx.com, 1 22ssbb.com, 1 -22ssjj.com, 1 -22sskk.com, 1 -22sstt.com, 1 -22tete.com, 1 22times.com, 0 -22ttgg.com, 1 22vetter.st, 1 -22xxjj.com, 1 -22xxyy.com, 1 -22yybb.com, 1 22yydd.com, 1 22yyii.com, 1 22yyjj.com, 1 -22yykk.com, 1 -22yypp.com, 1 -22yyqq.com, 1 22yyss.com, 1 22zt.com, 1 230100.xyz, 1 @@ -1748,7 +1729,6 @@ 253007.com, 1 2531111.ru, 1 254vc.ml, 1 -256br.com, 1 256k.me, 1 258027.xyz, 1 258management.cf, 1 @@ -1759,7 +1739,6 @@ 25friday.com, 1 25genomes.org.uk, 1 25genomes.uk, 1 -25lotto.co.ke, 1 25lotto.com, 1 25may.tk, 1 25percent.me, 1 @@ -1774,8 +1753,6 @@ 263mail.com, 1 269196.com, 1 2698pacificave.com, 1 -26uuu.mobi, 1 -26uuu.us, 1 27.gay, 1 27000.best, 1 2718282.net, 1 @@ -1885,7 +1862,6 @@ 2rsc.net, 1 2sendai.net, 1 2serious.com, 1 -2silosbrewing.com, 1 2target.com, 1 2tausend19.de, 1 2th.me, 1 @@ -1925,7 +1901,6 @@ 30deagosto.tk, 1 30for30podcasts.com, 1 30hb.cn, 1 -30minut.com, 1 30nama1.tk, 1 30parkplace.co.uk, 1 30region.tk, 1 @@ -1934,6 +1909,7 @@ 3100.cf, 1 313xpj.com, 0 314553.com, 1 +315101.xyz, 1 315422.com, 1 315xpj.com, 0 317811111.com, 0 @@ -2017,6 +1993,7 @@ 350pdx.org, 1 3527trail.com, 1 3539783.com, 1 +353digital.ie, 1 3555500.com, 1 3559365.com, 1 356338.com, 1 @@ -2054,7 +2031,7 @@ 360hosting.com.au, 1 360islam.com, 1 360kuvia.fi, 1 -360mediaworks.com, 0 +360mediaworks.com, 1 360organic.com, 1 360primeview.ie, 1 360prokuvat.fi, 1 @@ -2159,24 +2136,15 @@ 369369.xyz, 1 3699.cc, 1 369bin.com, 1 -369dp.com, 1 -369eq.com, 1 -369ex.com, 1 -369ra.com, 1 -369rr.com, 1 36thdistrictcourtmi.gov, 1 372bbb.com, 1 -375337.com, 1 375realty.com, 1 376064.com, 0 377625.com, 1 -377837.com, 1 377854.com, 1 377ks.com, 1 377zzz.com, 1 37889658.com, 0 -379437.com, 1 -379637.com, 1 379700.com, 1 3798.com, 0 37987.com, 1 @@ -2196,6 +2164,7 @@ 3880p.com, 1 38888msc.com, 1 38irkutsk.tk, 1 +390trains.com, 1 392365.com, 0 393335.ml, 0 394553.com, 1 @@ -2254,7 +2223,6 @@ 39sihu.com, 0 39w66.com, 1 3aa365.com, 1 -3abnstore.com, 1 3accounts.ml, 1 3adao.org, 1 3aexpert.com.ua, 1 @@ -2342,7 +2310,6 @@ 3gg365.com, 1 3gokushi.com, 1 3haeuserprojekt.org, 1 -3hh365.com, 1 3i-infotech.com, 1 3ieimpact.org, 1 3ii365.com, 1 @@ -2521,6 +2488,7 @@ 43klive.com, 1 43rddems.org, 1 44-k.com, 1 +44.in.ua, 1 44168365.com, 1 443.one, 0 443.org, 1 @@ -2567,7 +2535,6 @@ 486662.xyz, 1 486773.com, 0 487511.com, 1 -487552.com, 1 48coin.cf, 1 48d88.com, 0 48lipetsk.tk, 1 @@ -2603,6 +2570,7 @@ 4digitiq.nl, 1 4dillusion.tk, 1 4dimension.net, 1 +4dplay.com, 1 4dsoft.com, 1 4dstyle.com, 1 4e8.net, 1 @@ -2652,6 +2620,7 @@ 4o.pw, 0 4ourbest.tk, 1 4paws.co.uk, 1 +4pay.online, 1 4peace.gent, 1 4played.de, 1 4played.vip, 1 @@ -2694,6 +2663,7 @@ 4yuz.net, 1 5.st, 1 50-ottenkov.tk, 1 +500.gov.tw, 1 5000.cx, 1 5000164.com, 1 5000164.jp, 1 @@ -2746,7 +2716,6 @@ 514-media.co.uk, 1 514-media.com, 1 514-media.de, 1 -514-media.fr, 1 514622.com, 1 515188.xyz, 1 517vpn.cn, 1 @@ -2812,7 +2781,6 @@ 51senluo.com, 1 51space.com, 1 51talk.ph, 1 -51tiaojiu.com, 1 51xiongmao.cn, 1 52002a.com, 1 52002b.com, 1 @@ -2857,7 +2825,6 @@ 52chatai.com, 1 52danji.cc, 1 52dashboard.com, 1 -52evar.com, 1 52evar1.com, 1 52hentai.ml, 1 52iv.one, 1 @@ -2886,7 +2853,6 @@ 5533445.com, 1 55365t.com, 1 5557552.com, 1 -555w.org, 1 555zlong.com, 1 556185.com, 1 557.pm, 1 @@ -2896,8 +2862,6 @@ 56011s.com, 0 5611.cf, 1 5611bet.com, 1 -562656.com, 1 -562956.com, 1 5633bet.com, 1 56365t.com, 1 5663.cc, 1 @@ -2907,7 +2871,6 @@ 5676321.com, 1 567666365.com, 1 5677.cf, 1 -568756.com, 1 572223.com, 0 572kb.com, 1 573sss.com, 1 @@ -3026,7 +2989,6 @@ 5tart.tk, 1 5thchichesterscouts.org.uk, 1 5theasthall.com, 0 -5thfloormedia.com, 1 5thgenrams.com, 1 5tiptop.com, 1 5top.nl, 1 @@ -3073,7 +3035,6 @@ 635-888.com, 1 635-988.com, 1 636051.com, 1 -638566.com, 1 6396000.com, 1 63960000.com, 1 639611111.com, 0 @@ -3103,7 +3064,6 @@ 6396vvv.com, 0 6396yyy.com, 1 6396zzz.com, 0 -63fg.com, 1 63gaming.com, 1 64.place, 1 644.ro, 1 @@ -3142,8 +3102,6 @@ 6548877.com, 1 654pk.cn, 0 655ks.com, 1 -658565.com, 1 -659265.com, 1 6601.cf, 1 6602.cf, 1 6602p.com, 1 @@ -3369,6 +3327,7 @@ 69kzvm3f.com, 1 69level.com, 1 69mentor.com, 1 +69wasted.net, 1 6a.nz, 1 6b.com.au, 1 6b.nz, 1 @@ -3397,7 +3356,6 @@ 702341.win, 1 704533.com, 0 705994.com, 1 -708090.ru, 1 70mpg.org, 1 7100.cf, 1 712kb.com, 1 @@ -3521,7 +3479,7 @@ 7graus.pt, 1 7h12.com, 1 7heavencr.com, 1 -7hills-consulting.de, 0 +7hills-consulting.de, 1 7hills.us, 1 7hq.ru, 1 7inci.com, 1 @@ -3537,6 +3495,7 @@ 7ovz.ru, 1 7pixel.ro, 1 7plus.com.au, 1 +7press.com, 1 7proxies.com, 1 7qly.com, 1 7sdre.am, 1 @@ -3559,6 +3518,7 @@ 800999.xyz, 1 800email.com, 1 800ink.com, 1 +800live.com, 1 800mattress.com, 1 800perkins.com, 1 800sports.com, 1 @@ -3688,7 +3648,6 @@ 8349822.com, 1 83ir2k8b.duckdns.org, 1 83kb88.com, 1 -84000.com, 1 84036.ml, 1 842844.com, 1 8444.cf, 1 @@ -3705,7 +3664,6 @@ 84cl.com, 1 84cx.com, 1 84dp.com, 1 -84dt.com, 1 84ek.com, 1 84et.com, 1 84ew.com, 1 @@ -3881,7 +3839,6 @@ 894324.com, 1 8989k3.com, 1 899ks.com, 1 -8a.pw, 1 8ack.de, 1 8ag8.org, 1 8ballbombom.uk, 1 @@ -3914,8 +3871,8 @@ 8time.com, 1 8tuffbeers.com, 1 8ung.online, 1 +8weekchallenge.com.au, 1 8xxxxxxx.com, 1 -8y.network, 0 8yun.cf, 1 8yun.ga, 0 9-11commission.gov, 1 @@ -4016,6 +3973,7 @@ 9098.cf, 1 90daydiet.org, 1 90daysales.com, 1 +90minut.com, 1 90r.jp, 1 90splease.com, 1 91-av.com, 1 @@ -4037,7 +3995,6 @@ 9108.cf, 1 9109.cf, 1 911.gov, 1 -9111s.ru, 0 911216.xyz, 1 9113.cf, 1 9114.cf, 1 @@ -4131,7 +4088,7 @@ 918bbm.co, 1 918bcf.co, 1 918bcw.co, 1 -918bio.co, 1 +918bio.co, 0 918bip.co, 1 918bis.co, 1 918dc04.com, 1 @@ -4205,10 +4162,7 @@ 9245.cf, 1 9246.cf, 1 9247.cf, 1 -924992.com, 1 925silverjewelry.com, 1 -926792.com, 1 -927092.com, 1 9297.co, 1 9297a.co, 1 9297aa.co, 1 @@ -4347,7 +4301,6 @@ 9378.cf, 1 9379.cf, 1 9381.cf, 1 -938193.com, 1 9382.cf, 1 9383.cf, 1 9384.cf, 1 @@ -4480,7 +4433,6 @@ 9578.cf, 1 9579.cf, 1 9580.cf, 1 -95808.com, 1 9581.cf, 1 9582.cf, 1 9584.cf, 1 @@ -4521,9 +4473,9 @@ 9618.cf, 1 9619.cf, 1 9620.cf, 1 +96200.com, 1 9621.cf, 1 9622.cf, 1 -96220.com, 1 96229.com, 1 9623.cf, 1 9624.cf, 1 @@ -4533,7 +4485,6 @@ 9629.cf, 1 9630.cf, 1 9631.cf, 1 -96316.com, 1 9632.cf, 1 9633.cf, 1 96448.com, 1 @@ -4802,7 +4753,6 @@ 999family.com, 0 999salon.co, 1 999zlong.com, 1 -99bt.com, 1 99buffets.com, 1 99dog.com, 1 99furnitureideasandtips.gq, 1 @@ -4822,10 +4772,10 @@ 9ccn.top, 1 9elements.com, 0 9face.com, 1 +9fruit.com, 1 9fvip.net, 1 9gag.com, 1 9hosts.net, 1 -9i0.com, 1 9iwan.net, 1 9jajuice.com, 1 9k262.com, 1 @@ -4908,10 +4858,11 @@ 9mp.ro, 1 9ostech.com, 1 9pkfz.com, 1 -9point6.com, 1 +9point6.com, 0 9ranks.com, 1 9rx.cz, 1 9tailedkitsune.com, 1 +9tnine.net, 1 9to5linux.com, 1 9uelle.jp, 0 9ungnir.xyz, 1 @@ -4940,6 +4891,7 @@ a-raven.corsica, 1 a-rwx.org, 1 a-s-motors.ru, 1 +a-scientificpestcontrol.com, 1 a-shirouto.com, 1 a-starbouncycastles.co.uk, 1 a-stocker.com, 1 @@ -4950,6 +4902,7 @@ a01sa01to.com, 1 a04gameapp.com, 1 a04webapp.com, 1 +a05777.uk, 1 a05webapp.com, 1 a06.ch, 1 a06.me, 0 @@ -4962,6 +4915,7 @@ a11ywatch.com, 1 a13x.uk, 1 a16z.com, 1 +a1billgibsonseptictankservice.com, 1 a1bouncycastlehire.com, 1 a1cashforcar.com.au, 1 a1cdrinks.com, 1 @@ -4975,7 +4929,6 @@ a1scrapmetalrecyclers.com.au, 1 a1scuba.com, 1 a1seowebdirectory.com, 0 -a1speedyrooter.com, 1 a210.online, 1 a24dmng.de, 1 a24help.ru, 1 @@ -5018,6 +4971,7 @@ a9-9.top, 0 a9297.co, 1 a9728.co, 1 +aa-charging.nl, 1 aa-security.be, 1 aa.cx, 1 aa43d.cn, 1 @@ -5079,6 +5033,7 @@ aandachtsmeditatie.nl, 1 aandeautobody.com, 1 aandkevents.co.uk, 1 +aandrpestsolutions.com, 1 aanhpiheritage.gov, 1 aanhuisgebakken.tk, 1 aanlynskool.co.za, 1 @@ -5087,7 +5042,6 @@ aaogaragedoorrepairaustin.com, 1 aaomidi.com, 1 aaoth.xyz, 1 -aap.org, 1 aapa.info, 0 aapant.org.au, 0 aapifund.org, 1 @@ -5179,12 +5133,12 @@ abakan-news.net, 1 abalsa.tk, 1 abambo.tk, 1 +abancommercials.com, 1 abandoned-zone.tk, 1 abandoned.tk, 1 abandonedmines.gov, 1 abanico.tk, 1 abanilla.tk, 1 -abantoclub.com, 1 abantos.tk, 1 abaranov.cf, 1 abaranov.gq, 1 @@ -5261,6 +5215,7 @@ abdelaliezzyn.tk, 1 abdelsater.net, 1 abdened.tk, 1 +abdenterprises.com, 1 abdesign.tk, 1 abdijmale.tk, 1 abditransportinc.com, 1 @@ -5277,10 +5232,10 @@ abdullahavci.org, 1 abdullahavci.org.tr, 1 abdullahavci.tr, 1 -abdullahki.com, 1 abdullahkoyuncu.de, 1 abdullahzubayerofficial.ml, 1 abdulraheem.org, 1 +abdulraheemalick.com, 1 abdulrahman.eu, 1 abdulwahaab.ca, 1 abduramshad.ml, 1 @@ -5319,6 +5274,7 @@ abfluss.com, 1 abg.com.sa, 1 abg.ninja, 1 +abgal.com.au, 1 abgeo.ga, 1 abhaldus.ee, 1 abhandshake.com, 1 @@ -5407,6 +5363,7 @@ abnradiofm.tk, 1 aboat.cc, 1 aboces.org, 1 +abodepestsolutions.com, 1 abogadoperu.com, 1 abogadophd.com, 1 abogadoscav.com, 1 @@ -5637,6 +5594,7 @@ acacia-gardens.co.uk, 1 academiacivilbalonmano.tk, 1 academiacomercialalpina.com, 1 +academiadasaude.net.br, 1 academiadelmolino.com.uy, 1 academiaeureka.tk, 1 academiaofimage.com, 1 @@ -5651,6 +5609,7 @@ academika.tk, 1 academkin.com, 1 academy-awards.ml, 1 +academyb1.ru, 1 academyonlinetoyou.tk, 1 acadeven.com, 1 acadiate.com, 1 @@ -5716,7 +5675,6 @@ access-board.gov, 1 access-nl.org, 1 access-not-allowed.gq, 1 -access-odata.com, 1 access-techniques.com, 1 access-token.tk, 1 access2employment.com, 1 @@ -5729,6 +5687,7 @@ accessibility.gov, 1 accessibilityguidelines.com, 1 accessibledigitallearning.org, 1 +accessibleimpact.org, 1 accessibletravelclub.com, 1 accessibleweb.com, 1 accessingram.com, 1 @@ -5774,8 +5733,7 @@ accpl.co, 1 accreditamento.net, 1 accreditedbuildingservices.com, 1 -accretech.vn, 1 -accsaber.com, 1 +accrue401k.com, 1 accslot.com, 1 accstrading.com, 1 acct-affiliate.com, 1 @@ -5823,7 +5781,6 @@ aceinflatables.com, 1 aceinstituteonline.com, 1 aceitesencantados.com, 1 -acejunkpros.com, 1 acekit-create.com, 1 aceleracaodigital.com, 1 aceleraguria.com.br, 1 @@ -5844,7 +5801,7 @@ acercapartners.com, 1 acereporting.ca, 1 acesaware.org, 1 -acesdenver.com, 1 +acesdenver.com, 0 aceshop702.com, 1 acetaiavaleri.it, 1 acetudy.com, 1 @@ -5902,7 +5859,6 @@ achtpfade.de, 1 achtzehn.de, 1 achtzehn.eu, 1 -achtzig20.de, 0 aci-asiapac.aero, 1 acic-cbit.in, 1 aciclovir.ga, 1 @@ -5913,6 +5869,7 @@ acidtool.com, 1 acierto.com, 1 aciku.com, 1 +acilasevic.com.au, 1 acilicraft.cn, 1 acina.fr, 1 acingov.pt, 1 @@ -5974,6 +5931,7 @@ acousticbuy.com.ua, 1 acoustics.network, 0 acoustics.tech, 1 +acousticshield.tech, 1 acousticsoundrecords.com, 1 acoustictabs.tk, 1 acoustique-tardy.com, 0 @@ -6028,6 +5986,7 @@ acsd-az.gov, 1 acse.net, 1 acsemb.org, 1 +acsense.com, 1 acsiresearch.com, 0 acslogco.com, 1 acsmuhendislik.com.tr, 1 @@ -6094,7 +6053,7 @@ activeclearweb.com, 1 activeexcavator.com, 0 activegateball.tk, 1 -activehealth.com, 1 +activehealth.com, 0 activehire.co.uk, 1 activeleisure.ie, 1 activelife.travel, 1 @@ -6163,7 +6122,7 @@ acuarismo-iquique.tk, 1 acuarius.tk, 1 acuica.co.uk, 1 -acuityfinishing.com, 1 +acuityhcm.com, 1 acuitykp.com, 1 acul.me, 1 aculocity.com, 1 @@ -6173,6 +6132,7 @@ acupuncture.ml, 1 acupuncturecornwall.co.uk, 1 acupuncturefoundation.com, 1 +acupuncturefoundation.org, 1 acupuntura.coach, 1 acupuntura.doctor, 1 acupuntura.institute, 1 @@ -6181,6 +6141,7 @@ acupunturameler.com, 1 acupunturameler.es, 1 acupunturavalencia.xyz, 1 +acura.com.br, 1 acurapartswarehouse.com, 1 acus.gov, 1 acuscribe.com, 1 @@ -6206,13 +6167,7 @@ ad-disruptio.fr, 0 ad-education.com, 1 ad-notam.asia, 1 -ad-notam.co.uk, 1 -ad-notam.com, 1 -ad-notam.de, 1 -ad-notam.it, 1 ad-notam.pt, 1 -ad-notam.uk, 1 -ad-notam.us, 1 ad-s.cn, 1 ad-visions.pl, 1 ad-web.tk, 1 @@ -6244,7 +6199,6 @@ adam.com, 1 adam.id.au, 1 adam.pt, 1 -adamabernathy.com, 1 adamandeva.shop, 1 adamant.ua, 1 adamas-magicus.ru, 1 @@ -6294,7 +6248,6 @@ adappt.ai, 0 adappt.co.uk, 0 adapt-elektronik.com, 1 -adapt-iq.co.nz, 1 adaptationclearinghouse.org, 1 adaptations.uk.com, 1 adaptationtools.com, 1 @@ -6322,7 +6275,6 @@ adassist.nl, 1 adasworks.com, 1 adasystems.uk, 1 -adata-c.kz, 1 adatitleiii.com, 1 adativos.com.br, 1 adats.com, 1 @@ -6412,6 +6364,7 @@ adeldz-foot.cf, 1 adelebeals.com, 1 adelgace.top, 1 +adelhomeservices.com, 1 adeliae.jp, 1 adelicious.co, 1 adelie.org.uk, 1 @@ -6438,10 +6391,10 @@ adex.network, 1 adextremadurafs.tk, 1 adf-safetytools.com, 1 -adf.africa, 1 adf.gov, 1 adfc-nrw.de, 1 adfconsumer.gov.au, 1 +adfirehealth.com, 1 adfisicateca.org, 1 adflegal.org, 0 adfs.pro, 1 @@ -6449,7 +6402,6 @@ adfyl.tk, 1 adg-devochtspecialist.be, 1 adg.is, 1 -adg.vn, 1 adgh.ml, 1 adgift.ro, 1 adgreetz.com, 1 @@ -6491,6 +6443,7 @@ adiraku.co.id, 1 adit.com, 1 aditumconsulting.com, 1 +aditushealth.com.br, 1 adityadees.com, 1 adityaes.eu.org, 1 adityainfotechindia.com, 1 @@ -6520,6 +6473,7 @@ admantium.com, 1 admdr.com, 1 admeco.com, 1 +admeusa.org, 1 admeweb.com, 1 admglass.co.uk, 1 admicos.cf, 1 @@ -6575,10 +6529,10 @@ adnexa.it, 1 adney.land, 1 adnolesh.com, 1 -adnotam.ch, 1 adnscript.tk, 1 adnseguros.es, 1 adolesce.com, 1 +adolfocanto.xyz, 1 adoll.ml, 1 adomani-italia.com, 1 adomicilio.gt, 1 @@ -6614,12 +6568,12 @@ adorkable.social, 1 adorned.ga, 1 adoropets.com.br, 1 +adotta.me, 1 adoucishop.fr, 1 adownloader.org, 1 adp.fr, 1 adphotography.pl, 1 adpot.xyz, 0 -adquest.ro, 1 adr-stock.com, 1 adr.gov, 1 adrafinil.wiki, 1 @@ -6628,6 +6582,7 @@ adreana.com, 1 adregain.com, 1 adregain.ru, 1 +adremtek.com, 1 adrenajump.com.br, 1 adrenalin.is, 1 adrenalin.od.ua, 0 @@ -6643,7 +6598,6 @@ adrianadelrossi.com, 1 adrianagonzalez.tk, 1 adrianajewelry.my, 1 -adrianasantos.me, 0 adrianbechtold.de, 1 adrianbrad.com, 1 adriancitu.com, 1 @@ -6685,12 +6639,13 @@ adsense-arbitrage.com, 1 adseye.tk, 1 adsforcash.ga, 1 +adshooter.com, 1 adsintl.net, 1 adsl2meg.fr, 1 adslink.org, 1 adsmarketing.tk, 1 adsmobilefor.win, 1 -adsmodels.com, 1 +adsmodels.com, 0 adson.at, 0 adson.cz, 0 adson.de, 0 @@ -6712,8 +6667,10 @@ adspu.org, 1 adst.dk, 1 adstasin.com, 1 +adstesting.online, 1 adstop.ga, 1 adstop.ml, 1 +adstriq.com, 1 adstune.com, 1 adsviews.gq, 1 adswoo.com, 1 @@ -6847,7 +6804,6 @@ advertizer.com, 1 adverts.ie, 1 advery.tk, 1 -advgrow.com, 1 advi.no, 1 advice24.tk, 1 advicepay.com, 0 @@ -6913,8 +6869,10 @@ adwork.net, 1 adworldglobal.com, 1 adxperience.com, 1 +adyatanalangit.com, 1 adygeya.cf, 1 adygheya-news.net, 1 +adyton.com, 1 adytonpbc.com, 1 adzie.xyz, 1 adzuna.at, 1 @@ -6967,11 +6925,12 @@ aegee-utrecht.nl, 1 aegee.eu, 1 aegee.org, 1 +aeginity.de, 1 aegis-bot.eu, 1 aegisaccounting.co.uk, 1 aegisalarm.co.uk, 1 aegisalarm.com, 1 -aegisys.com, 1 +aegiscbc.com, 1 aegon.hu, 0 aegrel.ee, 1 aegrel.eu, 1 @@ -6981,9 +6940,11 @@ aeht.eu, 1 aei.ie, 1 aeicommercial.ie, 1 +aeipms.com.au, 1 aeis-api-stg.azurewebsites.net, 1 aeis-api.azurewebsites.net, 1 aejaca.com, 1 +aekb.de, 1 aeksantcugat.tk, 1 aeksistem.com, 1 aekwien.at, 1 @@ -7011,7 +6972,6 @@ aeraulika.it, 1 aere.com, 1 aerelon.de, 1 -aergia.eu, 1 aerialawesome.com, 1 aerialreports.com, 1 aerialworks.ddns.net, 1 @@ -7021,7 +6981,6 @@ aerlux.md, 1 aern.org, 1 aeroalbrook.com, 1 -aerobasegroup.com, 1 aerobiconline.tk, 1 aerobiomasa.com, 1 aerobotz.com, 0 @@ -7042,6 +7001,7 @@ aerojet.com, 1 aeroklub.tk, 1 aerolog.co, 0 +aerometrix.co, 1 aeronautix.com, 1 aeropetz.com.br, 1 aeroplan.tk, 1 @@ -7065,6 +7025,7 @@ aerowillys.tk, 1 aerozone.tk, 1 aertel.ie, 1 +aerztekammer-berlin.de, 1 aerztezentrum.io, 1 aes.org.pt, 1 aesencryption.org, 1 @@ -7127,6 +7088,7 @@ afas-apps.nl, 1 afasim.tk, 1 afasstatus.nl, 1 +afbouw-gevelsupport.nl, 1 afbrunswick.com, 1 afcea.de, 1 afcmrstest.org, 0 @@ -7160,11 +7122,9 @@ aff.gov, 1 aff1xstavka.com, 1 affaire.com, 1 -affairemateriaux.fr, 1 affairs.com, 1 affarsnatverk.nu, 0 affclick.io, 1 -affcreations.com, 1 affect3d.com, 1 affect3dstore.com, 1 affectionate.tk, 1 @@ -7211,7 +7171,7 @@ affordableconnectivity.gov, 1 affordableelectronics.tk, 1 affordablehealthquotesforyou.com, 1 -affordablemedicalusa.com, 0 +affordablemedicalusa.com, 1 affordablepapers.com, 1 affordablevaccinesest.ga, 1 affordacode.com, 1 @@ -7296,14 +7256,13 @@ afrodita.tk, 1 afroditafirm.tk, 1 afroditehotel.tk, 1 -afroenergy.org, 1 afrogospel.tk, 1 afroludi.tk, 1 afroto.com, 0 +afrotv.org.pe, 1 afs-ag.com, 1 afse.fr, 1 afslankstudiovelserbroek.nl, 0 -afsys.com.br, 1 aftamurae.com, 1 after-whoru.tk, 1 afterblokrock.tk, 1 @@ -7388,7 +7347,6 @@ against.tk, 1 againstgynexams.tk, 1 againsttheneighbour.tk, 1 -againsttheodds.es, 1 agalloch.tk, 1 agambition.eu, 1 agamogcloud.com, 1 @@ -7396,6 +7354,7 @@ agapelove.tk, 1 agar-tw.com, 1 agar.kr, 1 +agara-sofvix.com, 1 agarcat.com, 1 agargiulo.com, 1 agari-mj.com, 1 @@ -7452,6 +7411,7 @@ agencetourismemali.ml, 1 agenciaalafia.com.br, 1 agenciacanina.tk, 1 +agenciacoder.com, 1 agenciacorujadesign.com.br, 1 agenciacrown.es, 1 agenciadeperformanceembh.com, 1 @@ -7498,6 +7458,7 @@ agentpak.com, 1 agentpatrolest.ga, 1 agentpoint.website, 1 +agentpress.org, 1 agentprovocateur.com, 1 agentsmith.tk, 1 agentum.ga, 1 @@ -7513,6 +7474,7 @@ ages-its.de, 1 ages-service.de, 1 agesofarda.net, 1 +agesupply.com, 1 ageverif.com, 1 agews.com, 0 agfmedia.com, 0 @@ -7526,7 +7488,6 @@ aggression.tk, 1 aggressivecarwraps.com, 1 aggtechconcrete.com, 1 -aghasahadkhan.com, 1 aghayeva-edler.de, 1 aghdirfood.com, 1 agiairini.cz, 1 @@ -7539,6 +7500,7 @@ agilecraft.com, 1 agilee.io, 1 agilepeopleopsframework.com, 1 +agileviz.com, 1 agilewalls.com, 1 agilextra.com.au, 1 agilicus.ca, 1 @@ -7579,7 +7541,6 @@ agks70.com, 1 agks71.com, 1 agks79.com, 0 -agks8.com, 1 agks83.com, 1 agks87.com, 1 agks888.com, 0 @@ -7628,7 +7589,6 @@ agostiniguyana.com, 1 agostinilimited.com, 1 agostonegro.tk, 1 -agourahillselectric.com, 1 agowa338.de, 1 agpandit.in, 1 agph.org, 1 @@ -7652,6 +7612,7 @@ agricultural-technology.tk, 1 agriculture-schools.com, 1 agriculturejournals.cz, 1 +agridata-ia.com, 1 agrifoodtoday.it, 1 agrifutures.com.au, 1 agrigentonotizie.it, 1 @@ -7675,6 +7636,7 @@ agro.gov.br, 1 agrobank.uz, 0 agrobaza.com.ua, 1 +agrobi.com.ar, 1 agrocabildo.org, 1 agrocare.tk, 1 agroclan.tk, 1 @@ -7757,14 +7719,17 @@ agzy.tw, 1 agzy.vip, 1 aha.io, 1 +ahaber.com.tr, 1 ahanet.tk, 1 ahansen.is, 0 +aharoj.io, 1 ahbap.org, 1 ahccmadison.com, 0 ahccorleone.tk, 1 ahcfacilities.com, 1 ahcpr.gov, 1 ahd.com, 0 +ahdcyber.in, 1 ahealthyjourney.ca, 1 ahegaoroulette.com, 1 ahelos.tk, 1 @@ -7804,7 +7769,6 @@ ahmed-alasadi.tk, 1 ahmed.ovh, 1 ahmed.tk, 1 -ahmedalneaimy.com, 1 ahmedcorp.tk, 1 ahmedelgamalanimations.tk, 1 ahmedkagan.com, 1 @@ -7824,8 +7788,8 @@ ahorrocoop.cl, 1 ahorroenergeticoenhogares.es, 1 ahosamuel.com, 1 +ahosting.net, 1 ahouansou.cz, 1 -ahqf.com, 1 ahrefs.com, 1 ahroproject.org, 1 ahrq.gov, 1 @@ -7847,6 +7811,7 @@ ai-articlehumanizer.cloud, 1 ai-crafters.io, 1 ai-cs.top, 1 +ai-defensesolutions.com, 1 ai-genit.com, 1 ai-kyousei.com, 1 ai-pacs.com, 1 @@ -7861,7 +7826,6 @@ ai00.vip, 1 ai1989.com, 1 ai2-jp.com, 1 -ai47.us, 1 aiabs.co, 1 aiaccinu.eu.org, 1 aiag.org, 1 @@ -7871,7 +7835,6 @@ aiasesoriainmobiliaria.com, 1 aiasnet.it, 1 aiat.net, 1 -aiatsis.gov.au, 1 aiavt-stg-01.com, 1 aib.gov.uk, 1 aibes.org, 1 @@ -7894,13 +7857,13 @@ aicial.co.uk, 1 aickelin.eu, 1 aicpastore.com, 1 +aicreatorvibes.com, 1 aicredit.ro, 1 aicta.ro, 1 aida.org.au, 1 aidablanco.tk, 1 aidaccess.org, 1 aidanamavi.com, 1 -aidanmitchell.uk, 0 aidanmontare.net, 1 aidanpr.com, 1 aidansonlinebooks.com, 1 @@ -7919,10 +7882,12 @@ aidliveers.ga, 1 aido.gq, 1 aidoc.com, 1 +aidong.com, 1 aidoru.net, 1 aidoru.top, 1 aids-dissidents.tk, 1 aids.gov, 1 +aids.org.hk, 1 aie.de, 1 aiesecarad.ro, 1 aievaluare.ro, 1 @@ -8136,6 +8101,7 @@ aircraftnoisemodel.org, 1 aircraftspruce.ca, 1 aircraftspruce.com, 1 +aircrew24.com, 1 aircrewdepot.com, 1 aircrewportpages.com, 1 aircrewtrac.com, 1 @@ -8155,9 +8121,12 @@ airfarecheapeurope.com, 1 airfarecompareprices.com, 1 airfaredealstoindia.com, 1 +airfarefrom.com, 1 +airfarehoteldeals.com, 1 airfaremexicocity.com, 1 airfaresdomestic.com, 1 airfareseconomy.com, 1 +airfaresfrom.com, 1 airfareshotels.com, 1 airfarestoamerica.com, 1 airfarestogermany.com, 1 @@ -8165,6 +8134,7 @@ airfaretousa.com, 1 airfield.gq, 1 airfix.com, 1 +airflightsdeals.com, 1 airflowterravista.com, 1 airflux.fr, 1 airforce-technology.com, 1 @@ -8186,37 +8156,24 @@ airknowledge.gov, 1 airlapse.net, 0 airline-rabota.tk, 1 -airlineairlines.com, 1 -airlineairplane.com, 1 -airlineairports.com, 1 -airlineairways.com, 1 -airlineandhotels.com, 1 -airlineandtickets.com, 1 -airlinebe.com, 1 -airlineblue.com, 1 airlinebookingtickets.com, 1 -airlineby.com, 1 +airlinebuyticket.com, 1 airlinec.com, 1 airlinecheapflightinternationalticket.com, 1 airlinecheapflightticket.com, 1 airlinecheapprices.com, 1 airlinecheaptravel.com, 1 -airlinechicago.com, 1 -airlinedallas.com, 1 airlinedenmark.com, 1 -airlinedomestic.com, 1 airlinefarecheap.com, 1 airlinefarediscount.com, 1 airlinefarelow.com, 1 airlinefareprices.com, 1 airlinefaresdiscount.com, 1 -airlinefee.com, 1 -airlinefirstclass.com, 1 airlineflightcheap.com, 1 +airlineflights.biz, 1 airlineflightsdeals.com, 1 airlineflightsdiscount.com, 1 airlineflightsfares.com, 1 -airlineflightsinternational.com, 1 airlineflightsprices.com, 1 airlineflightsreservations.com, 1 airlineflyingclub.tk, 1 @@ -8225,94 +8182,53 @@ airlinegermany.com, 1 airlinehawaii.com, 1 airlinekorea.com, 1 -airlinelondon.com, 1 airlinenationwide.com, 1 airlinenews.tk, 1 airlinenewzealand.com, 1 airlineoil.com, 1 +airlinep.com, 1 airlineplanetickets.com, 1 -airlinesair.com, 1 airlinesamsterdam.com, 1 -airlinesandhotel.com, 1 -airlinesandtickets.com, 1 -airlinesandtravel.com, 1 airlinesau.com, 1 airlinesaustralia.com, 1 -airlinesboston.com, 1 airlinesbritish.com, 1 -airlinesbrussels.com, 1 -airlinesby.com, 1 -airlinesca.com, 1 airlinescheapfare.com, 1 -airlinescheapflights.com, 1 airlinescheapticket.com, 1 -airlineschicago.com, 1 -airlinesdallas.com, 1 -airlinesdc.com, 1 -airlinesdetroit.com, 1 -airlinesdomestic.com, 1 -airlineseast.com, 1 -airlineseconomy.com, 1 -airlinesfirstclass.com, 1 airlinesfleet.com, 1 airlinesfrom.com, 1 -airlineshouston.com, 1 airlinesingapore.com, 1 -airlinesit.com, 1 airlinesjordan.com, 1 airlineslasvegas.com, 1 -airlineslosangeles.com, 1 airlineslowfare.com, 1 airlinesmiddleeast.com, 1 airlinesname.com, 1 -airlinesnashville.com, 1 -airlinesnewyork.com, 1 airlinesnorthamerica.com, 1 airlinesnyc.com, 1 airlinesofdubai.com, 1 airlinesofmexico.com, 1 -airlinespackages.com, 1 -airlinesparis.com, 1 airlinesphonenumber.com, 1 airlinespolicyhub.com, 1 -airlinessanfrancisco.com, 1 -airlinessingapore.com, 1 +airlinesseating.com, 1 airlinestexas.com, 1 airlinesto.com, 1 -airlinestoalaska.com, 1 -airlinestoamerica.com, 1 airlinestoatlanta.com, 1 -airlinestocanada.com, 1 airlinestochicago.com, 1 -airlinestoeurope.com, 1 -airlinestoflorida.com, 1 -airlinestofrance.com, 1 airlinestogermany.com, 1 airlinestoitaly.com, 1 -airlinestojapan.com, 1 airlinestolasvegas.com, 1 -airlinestolosangeles.com, 1 airlinestomiami.com, 1 -airlinestophoenix.com, 1 -airlinestosingapore.com, 1 +airlinestoorlando.com, 1 airlinestoturkey.com, 1 -airlinestousa.com, 1 -airlinestovegas.com, 1 airlinesturkey.com, 1 -airlinesunitedstates.com, 1 -airlinesvegas.com, 1 -airlinesvietnam.com, 1 airlineti.com, 1 +airlinetic.com, 1 airlineticketscheapflights.com, 1 airlineticketsfrom.com, 1 airlineto.com, 1 airlinetocanada.com, 1 airlinetohawaii.com, 1 -airlinetolasvegas.com, 1 airlinetomiami.com, 1 -airlinetovegas.com, 1 airlinetravelinternational.com, 1 -airlinevegas.com, 1 airlitegroup.com.au, 1 airlok.com.au, 1 airm.aero, 1 @@ -8355,27 +8271,20 @@ airportcyprus.com, 1 airportdc.com, 1 airportfrankfurtgermany.com, 1 -airportgatwick.com, 1 airportgrandhotel.com, 1 airportguam.com, 1 airportholiday.com, 1 airporthotelsgatwick.com, 1 -airportinrome.com, 1 airportknoxville.com, 1 -airportlas.com, 1 airportnz.com, 1 airportofdubai.com, 1 airportpadova.com, 1 airportperth.com, 1 airportsbarcelona.com, 1 -airportsflights.com, 1 -airportsflorida.com, 1 -airportsfo.com, 1 airportstickets.com, 1 airporttaxibudapest.com, 1 airporttransferbudapest.co.uk, 1 airporttransferbudapest.com, 1 -airportturkey.com, 1 airportzo.net.in, 1 airpurifierproductsonline.com, 1 airquestion.org, 1 @@ -8390,8 +8299,8 @@ airship.com, 1 airship.eu, 1 airsidemobile.com, 1 -airslate.com, 1 airsoft.fr, 1 +airsoftgrandeabc.com.br, 1 airsofthub.fr, 1 airsoftpark.cz, 1 airsoftpinoso.tk, 1 @@ -8403,7 +8312,6 @@ airteam.com.au, 1 airtec-france.fr, 1 airterms.cf, 1 -airticketstravel.com, 1 airtimerewards.co.uk, 0 airtrain.gq, 1 airtrolinc.com, 1 @@ -8432,6 +8340,7 @@ aisi316l.net, 1 aising.jp, 1 aisolutions-hammer.at, 1 +aisongchecker.pro, 1 aisp.sg, 1 aispirit.tk, 1 aisrvs.net, 1 @@ -8440,7 +8349,6 @@ aistockcharts.com, 1 aistsist.ga, 1 aistsist.tk, 1 -ait.com.ar, 1 aita.global, 1 aitanaedu.org, 1 aitf-rousai.org, 1 @@ -8542,7 +8450,6 @@ ajsmm.de, 1 ajtmh.org, 1 ajto.pro, 1 -ajukapalme.net, 1 ajvco.com.hk, 1 ajvco.net, 1 ajvocab.com, 1 @@ -8584,7 +8491,7 @@ akaphonelink.com, 0 akaratasker.com, 1 akari.net, 1 -akariforge.com, 1 +akariforge.com, 0 akarisoftware.com, 1 akarisoftware.eu, 1 akaritakai.net, 1 @@ -8623,8 +8530,8 @@ akemineko.tk, 1 akemisp.com.br, 1 akerberri.tk, 1 -akerboom.family, 1 -akerboom.me, 1 +akerboom.family, 0 +akerboom.me, 0 akerboom.org, 1 akerl.com, 1 akerl.org, 1 @@ -8633,7 +8540,6 @@ akesinti.tk, 1 aketzasantacoloma.tk, 1 akf.de, 1 -akfoundationindia.com, 0 akhabar.tk, 1 akhbaralam.cf, 1 akhbareldesh.tk, 1 @@ -8653,6 +8559,7 @@ akimbocore.com, 1 akimeder.tk, 1 akimitsu.co.jp, 1 +akinachan.com, 1 aking.com.my, 0 akinoiro.ru, 1 akinokae.de, 1 @@ -8665,7 +8572,6 @@ akj.io, 1 akkerwinde.tk, 1 akko.wtf, 1 -akkoniq.com, 1 akkordeon-livemusik.de, 1 akkordy-skachat.ga, 1 akkumulator-kereso.hu, 1 @@ -8682,7 +8588,6 @@ akordeoiak.tk, 1 akormatik.com, 1 akostecki.de, 1 -akosuasankofa.com, 1 akouryy.net, 1 akoya.fi, 1 akoyabio.com, 1 @@ -8730,7 +8635,6 @@ aktivace.eu, 1 aktivierungscenter.de, 1 aktivitetatil.com, 1 -aktivpark-lumdatal.de, 1 aktmedurna.com, 1 aktmedurna.se, 1 aktransmission.com, 1 @@ -8830,7 +8734,6 @@ alamitosbaytraders.com, 1 alamoranchhandyman.com, 1 alamotownshipmi.gov, 1 -alana.com.ua, 1 alanalarana.com, 1 alanberger.me.uk, 1 alanbleiweiss.com, 1 @@ -8839,6 +8742,7 @@ alancat.ml, 1 alancolephotography.com, 1 aland.co.uk, 1 +alandeffenderfer.com, 1 alandoyle.com, 1 alandoyle.link, 1 alanforutah.com, 1 @@ -8867,7 +8771,6 @@ alarmnewengland.com, 1 alarmport-security.net, 1 alarmport.cz, 1 -alarmreceiver.com, 1 alarmreceiver.net, 1 alarna.de, 1 alaroche.be, 1 @@ -8988,7 +8891,6 @@ albuterol.ga, 1 albuterolonline.ga, 1 albuterolwithoutprescription.gq, 1 -albuthi.com, 1 albylane.com.au, 1 alca31.com, 0 alcalainos.tk, 1 @@ -9049,6 +8951,7 @@ alderimages.com, 1 aldervets.co.uk, 1 aldevadigital.com, 1 +aldiacademy.com.au, 1 aldien.com.br, 1 aldino-redagno.com, 1 aldipresscentre.co.uk, 1 @@ -9070,6 +8973,7 @@ alector.com, 1 aledoil.gov, 1 aledotx.gov, 1 +aleefgreen.com, 1 aleftinka.tk, 1 alegriafm.tk, 1 alegromania.tk, 1 @@ -9098,6 +9002,7 @@ alelectricista.es, 1 alelin.ml, 1 alemagia.pl, 1 +aleman-auto.com, 1 alemangranada.tk, 1 alen.nl, 1 alena.ga, 1 @@ -9109,7 +9014,7 @@ alendronato.com, 1 alentaja.com, 1 alentaja.fi, 1 -alenvlahovljak.com, 1 +alenvlahovljak.com, 0 alenwich.com, 1 aleph.land, 1 alephsecurity.com, 1 @@ -9120,7 +9025,6 @@ alerrt.org, 1 alert-software.com, 1 alertaenlinea.gov, 1 -alertaspopup.com, 1 alertlogic.com, 1 alertmedia.com, 1 alertoc.gov, 1 @@ -9131,23 +9035,25 @@ alesagglo.net, 1 alescan.it, 1 alesha.tk, 1 -alesizu.net, 1 alesraa-academy.com, 1 alesryjacek.cz, 1 aless.io, 1 alessalopez.exposed, 1 alessandraoliva.tk, 1 alessandrobasi.it, 1 +alessandrokuz.com, 1 alessandrolapiana.com, 1 +alessandrorumi.it, 1 alessandrotravel.com, 1 alessandroz.ddns.net, 1 alessiacornici.com, 1 +alessioligabue.it, 1 alessiomesiano.com, 1 alesto-mail.eu, 1 alesto.at, 1 aleszejdl.cz, 1 aletm.it, 0 -alevel.tech, 0 +alevel.tech, 1 alevi-forum.tk, 1 alevi.tk, 1 alex-klaus.com, 1 @@ -9196,7 +9102,6 @@ alexandre-acaries.fr, 1 alexandre-barret.fr, 1 alexandrebassi.com, 1 -alexandreguarita.com.br, 1 alexandremottier.tk, 1 alexandreshimura.com.br, 1 alexandrevicente.net, 1 @@ -9347,7 +9252,6 @@ algarmatic-automatismos.pt, 1 algarve-1.com, 1 algarve-carhire.net, 1 -algbee.com, 1 algbra.com, 1 alge.xyz, 1 algebra-quiz.com, 1 @@ -9363,7 +9267,6 @@ algoentremanos.com, 1 algoesolutions.com, 1 algoexplorer.io, 1 -algofactory.de, 1 algolia.com, 1 algomadistrictlawassociation.com, 1 algomotion.me, 1 @@ -9399,6 +9302,7 @@ alianet.org, 1 aliansinews.id, 1 aliantsoft.pl, 1 +alianzalabs.com, 1 aliasbox.org, 1 aliasbox.ovh, 1 aliasinfoforums.tk, 1 @@ -9406,7 +9310,6 @@ aliaswp.com, 1 alibabau.tk, 1 alibamu.com, 1 -alibamu.org, 1 alibi-ua.com.ua, 1 alibip.de, 1 alicante-spain.tk, 1 @@ -9429,7 +9332,6 @@ alida.com, 1 aliel.fr, 1 alien-life.tk, 1 -alien.com.co, 1 alien.net.au, 1 alienantfarm.tk, 1 alienclicker.ml, 1 @@ -9469,9 +9371,7 @@ alimanaka-rabesata.tk, 1 aliment-covid19.com, 1 alimentosmcf.com, 1 -alimentsduquebecaumenu.com, 1 alimenty.tk, 1 -alimeta.it, 1 alimtyaz.estate, 1 alimwilliams.tk, 1 alinalamour.com, 1 @@ -9483,6 +9383,7 @@ alinemello.com.br, 1 alineonline.tk, 1 alingroove.com, 1 +alinkbetweennets.de, 1 alinneata.com, 1 alio.lt, 1 aliorange.com, 1 @@ -9500,7 +9401,6 @@ alisoft.gq, 1 alisondavenport.ga, 1 alisonmatter.tk, 1 -alisonswindles.com, 0 alissa-group.com, 1 alissanoir.net, 1 alisstyle.tk, 1 @@ -9576,6 +9476,8 @@ all-mountains.fr, 1 all-music.ml, 1 all-music.tk, 1 +all-payroll-solutions.com, 1 +all-payroll-solutions.de, 1 all-pics.tk, 1 all-rating.tk, 1 all-seo.tk, 1 @@ -9603,7 +9505,6 @@ allaboutnothing.ga, 1 allaboutnothing.gq, 1 allaboutreligions.tk, 1 -allaboutswing.co.uk, 1 allabouttechh.tk, 1 allaboutthekink.org, 1 allaboutyouspa.co.uk, 1 @@ -9621,6 +9522,7 @@ allangirvan.net, 1 allanik.art, 1 allanlopez.tk, 1 +allanspiers.com, 1 allanta.be, 1 allapresenter.com, 1 allarmi.roma.it, 1 @@ -9647,6 +9549,27 @@ allbridges.tk, 1 allbs.pt, 1 allbut.ai, 1 +allbutai.0am.jp, 1 +allbutai.0g0.jp, 1 +allbutai.0j0.jp, 1 +allbutai.0t0.jp, 1 +allbutai.club, 1 +allbutai.daemon.asia, 1 +allbutai.duckdns.org, 1 +allbutai.f5.si, 1 +allbutai.info, 1 +allbutai.keyword-on.net, 1 +allbutai.mydns.bz, 1 +allbutai.mydns.jp, 1 +allbutai.mydns.vc, 1 +allbutai.net, 1 +allbutai.online, 1 +allbutai.org, 1 +allbutai.pgw.jp, 1 +allbutai.server-on.net, 1 +allbutai.shop, 1 +allbutai.wjg.jp, 1 +allbutai.xyz, 1 allbuttpics.com, 1 allcarepharmacy.com, 1 allcelebs.tk, 1 @@ -9656,6 +9579,7 @@ allcloud.com, 1 allcooking.tk, 1 allcookingclub.com, 1 +allcouponat.com, 1 allcourts.tk, 1 allcoveredbyac.com, 1 allcrimea.tk, 1 @@ -9666,7 +9590,6 @@ alldm.ru, 1 alldogs.tk, 1 alldrives.tk, 1 -alldrugs.com, 1 alle-immobilien.ch, 1 alle-zonvakanties.nl, 1 alle.bg, 1 @@ -9702,7 +9625,6 @@ allencrouch.com, 1 allencrouchcfo.com, 1 allendalecounty.gov, 1 -allenhouse.ac.in, 1 allenivory.com, 1 allenkreger.com, 1 allenpcservices.co.uk, 1 @@ -9712,12 +9634,12 @@ allentertainment.de, 1 allenturley.com, 1 allenwillis.ga, 1 -allerbestefreunde.de, 1 allergento.shop, 1 allergento.store, 0 allergictoidiots.tk, 1 allergyweb.cf, 1 allergyweb.ga, 1 +allerhand.design, 1 allerlei-havelte.nl, 1 allerzeiten.com, 1 allerzieleninhetvondelpark.nl, 1 @@ -9775,6 +9697,7 @@ alliancefireandsafety.com, 1 allianceforafreesociety.com, 1 allianceforafreesociety.net, 1 +alliancemannin.com, 1 alliances-globalsolutions.com, 0 alliancesolutionsgrp.com, 1 allianskyrkan.se, 1 @@ -9874,6 +9797,7 @@ allinform.ga, 1 allinformaura.com, 1 allinoutfits.com, 1 +allinparts.ro, 1 allinpdf.com, 1 allinsuranceinformation.com, 1 allintovote.org, 1 @@ -9935,6 +9859,7 @@ allporncomic.com, 1 allpornvids.com, 1 allpost.co, 1 +allprimenumbers.com, 1 allprints.tk, 1 allproptonline.com, 1 allrad-buck.de, 1 @@ -10020,9 +9945,9 @@ allyachts.cf, 1 allyachts.gq, 1 allyfile.com, 1 +allywebsite.com, 1 allyweds.com, 1 almaarkansas.gov, 1 -almaascosmetics.com, 1 almaatlantica.com, 0 almablanca.tk, 1 almabruk.com.ng, 1 @@ -10053,6 +9978,7 @@ almasoft.ga, 1 almastabriz.com, 0 almatinki.com, 1 +almatirecompanies.com, 1 almatytips.com, 1 almawsoa.com, 1 almayadeen.education, 1 @@ -10061,7 +9987,6 @@ almaz-host.tk, 1 almaz-sait-rp.ml, 1 almazroueigroup.ae, 1 -almeera.online, 1 almeerajtour.com, 1 almeeraloyalty.com, 1 almeidaesilvaseguros.com.br, 1 @@ -10073,7 +9998,6 @@ almeva.swiss, 1 almirahomes.com, 1 almirall.com, 1 -almiriatechstore.co.ke, 1 almirvuk.com, 1 almlab.tk, 1 almlc.gov, 1 @@ -10090,7 +10014,6 @@ almufawd.ma, 1 almusbahperfume.com, 0 almut-zielonka.de, 1 -almutawapharmacies.com.kw, 1 almworks.com, 0 almx.net, 1 alnaharnews.net, 1 @@ -10128,7 +10051,6 @@ alonuocsuoi.com, 1 aloo.ga, 1 aloomic.com.au, 1 -aloplay.io, 1 alorimusic.es, 1 aloris-controle.fr, 1 aloro.io, 1 @@ -10136,7 +10058,6 @@ alotso.com, 1 alottajava.com, 1 alov.blog, 1 -alovesinh.com, 1 alp-eastlink-portal-model.azurewebsites.net, 1 alp-samsungca-portal-model.azurewebsites.net, 1 alp-spectrum-portal-model.azurewebsites.net, 1 @@ -10266,6 +10187,7 @@ alrioart.com, 1 alroniks.com, 0 alrowadexchange.com, 1 +alrud.ru, 1 alsaagency.tk, 1 alsabil.tk, 1 alsace-informatique.shop, 1 @@ -10279,7 +10201,6 @@ alsops.cf, 1 alsteadnh.gov, 1 alstertouch.de, 1 -alt-met.ru, 1 alt-pannekow.de, 1 alt-three.com, 0 alt-til-windows.dk, 1 @@ -10287,7 +10208,6 @@ alt.org, 1 alta-densidad.tk, 1 alta-ict.nl, 1 -alta-ritual.com, 1 altabadia.com, 1 altabadia.it, 1 altabash.tk, 1 @@ -10296,6 +10216,7 @@ altabib.me, 1 altabooks.ga, 1 altacomunicazione.tk, 1 +altadenadairy.com, 1 altaef-group.com, 1 altahrim.net, 1 altai-info.ga, 1 @@ -10317,6 +10238,7 @@ altametrics.com, 1 altana.com, 1 altana.de, 1 +altansilver.de, 1 altaplana.be, 1 altarriba.fr, 1 altasierra.co.uk, 1 @@ -10390,7 +10312,6 @@ altieresgomes.com.br, 1 altijdleroy.nl, 1 altijdleroy.online, 1 -altimetrik.com, 1 altimetrique.ca, 1 altimetry.com, 1 altinaypipes.com, 1 @@ -10428,6 +10349,7 @@ altovoltaggio.tk, 1 altoweb.tk, 1 altphotos.com, 1 +altrabio.com, 1 altralamezia.tk, 1 altramarsala.tk, 1 altransport.ca, 1 @@ -10509,6 +10431,7 @@ alwayshowher.tk, 1 alwayslookingyourbest.com, 1 alwaysmine.fi, 1 +alwaysonchat.com, 1 alwayspoweryoga.com, 1 alwin.io, 1 alwistra.eu, 1 @@ -10564,12 +10487,10 @@ amadoraslindas.com, 1 amadorcoe.org, 1 amadorcounty.gov, 1 -amaeruinc.com, 1 amaforro.com, 1 amagdic.com, 1 amagical.net, 0 amagraduates.tk, 1 -amagzine.com, 1 amaiharajuku.com, 1 amaisd.org, 1 amaiz.com, 0 @@ -10645,7 +10566,6 @@ amazarashi.com, 1 amazetimberfurniture.com.au, 1 amazfoods.com.ng, 1 -amazhot.com, 1 amazinations.com, 1 amazing-cars98.tk, 1 amazing-castles.co.uk, 1 @@ -10728,7 +10648,6 @@ ambulanzapediatrica.it, 1 ambulanzaprivata.lombardia.it, 1 ambulanzaprivata.roma.it, 1 -ambulanzeprivate.milano.it, 1 ambulari.cz, 1 ambulatori.it, 1 amcanalense.tk, 1 @@ -10766,6 +10685,7 @@ amelanchiers.tk, 1 amelia-wedding.pl, 1 ameliagb.com, 1 +ameliastudio.co.uk, 1 ameliatillbryssel.se, 1 amelielei.net, 1 amello.de, 1 @@ -10794,7 +10714,6 @@ american-automotive.tk, 1 american-school-search.com, 1 americanaatbrand.com, 1 -americanartwarehouse.com, 1 americanbooks.cf, 1 americanbuzz.tk, 1 americancanyon.gov, 1 @@ -10865,7 +10784,7 @@ amethystcards.co.uk, 1 amethystdevelopment.co.uk, 1 amethystwebsitedesign.com, 1 -ametinsurance.com, 1 +ametinsurance.com, 0 ametrin.biz, 1 amexemp.com, 1 amf.rocks, 1 @@ -10924,6 +10843,7 @@ amimi.tk, 1 amimore.ru, 1 aminafrance.com, 1 +aminatakondeh.me, 1 amineptine.com, 1 aminfarhoodi.tk, 1 aminformatica.ml, 1 @@ -11099,6 +11019,7 @@ amsel305nc.ddnss.de, 1 amsev.de, 1 amsmart.hu, 1 +amsochile.cl, 1 amstelradio.tk, 1 amstelveentje.nl, 1 amsterdam.nl, 1 @@ -11332,13 +11253,16 @@ anciennes-automobiles.fr, 1 anciens.org, 1 ancient-gates.de, 1 +ancient-pain-tattoo.de, 1 ancientlorevillage.com, 1 ancientnorth.com, 1 ancientnorth.nl, 1 +ancitus.com, 1 anclarma.fr, 1 anco.ly, 1 ancolies-andre.com, 0 anconatoday.it, 1 +ancourage.academy, 1 ancuong.com, 1 and-stuff.nl, 1 and-tax.jp, 1 @@ -11445,7 +11369,7 @@ andreiluca.com, 1 andrejbenz.com, 1 andremaciel.pt, 1 -andremalraux.com, 1 +andremalraux.com, 0 andrematosband.tk, 1 andrenguyenvanchau.com, 1 andreoliveira.io, 1 @@ -11514,7 +11438,6 @@ andriekus.tk, 1 andrienko.tk, 1 andrija-gradecak.from.hr, 1 -andro4all.com, 1 android, 1 android-10-inch-tablets.tk, 1 android-center.tk, 1 @@ -11530,8 +11453,8 @@ android-tv.ml, 1 android.com.pl, 1 android.re, 1 +androidapkdata.org, 1 androidcrunch.com, 1 -androidfactory.io, 1 androidfinal.com, 1 androidgaming.tk, 1 androidhack.tk, 1 @@ -11912,6 +11835,7 @@ aniwhen.com, 1 aniya.moe, 1 anja-vastgoed.nl, 1 +anjajoerger.life, 1 anjansundaram.com, 1 anjara.eu, 1 anjocerdena.com, 1 @@ -12085,7 +12009,6 @@ anonase.com, 1 anoncrypto.org, 1 anoneko.com, 1 -anonhq.com, 1 anonicloud.ch, 1 anoniem-domein.nl, 1 anonimizers.tk, 1 @@ -12109,6 +12032,8 @@ anorbank.uz, 1 anordinaryhousewife.com, 1 anorexia-nervosa.tk, 1 +anoria.com, 0 +anosh.se, 1 another.ch, 1 anotherchatsworthfarm.org.uk, 1 anotherfatgeek.net, 1 @@ -12124,13 +12049,14 @@ anova.com, 1 anoxinon.media, 1 anpaju.gq, 1 +anqr.link, 1 anquankongjian.com, 1 anquanssl.com, 1 ans-ge.ch, 0 ans-solutions.com, 1 -ansacaribbeanawards.com, 1 +ansacaribbeanawards.com, 0 ansacoatings.com, 1 -ansamcalfoundation.org, 1 +ansamcalfoundation.org, 0 ansas.net, 0 ansdell.net, 1 anseldam.com, 1 @@ -12243,7 +12169,7 @@ anthrocon.com, 1 anthrocon.net, 1 anthrocon.org, 1 -anthroper.com, 1 +anthroper.com, 0 anthropoid.ca, 1 anti-akw-ac.de, 1 anti-civilisation.tk, 1 @@ -12293,6 +12219,7 @@ antifaschistischeaktioncelle.tk, 1 antifilter.network, 1 antiformiche.it, 1 +antifragilepower.com, 1 antifraud.cf, 1 antifraudcentre-centreantifraude.ca, 1 antifurti.roma.it, 1 @@ -12362,6 +12289,7 @@ antoine-data.tk, 1 antoined.fr, 0 antoinedeschenes.com, 1 +antoineleboyer.com, 1 antoinelounis.com, 1 antoinelounis.xyz, 1 antoineschaller.ch, 0 @@ -12381,7 +12309,6 @@ antoniojr.adv.br, 1 antoniolatimore.com, 1 antoniomarques.eu, 1 -antoniorodriguesadv.com.br, 1 antonios.ch, 1 antonioso.ng, 1 antonioucabinets.com.au, 1 @@ -12504,6 +12431,7 @@ anzing.de, 1 anzio.ca, 1 anztb.org, 1 +ao-gp.org, 1 ao2.it, 1 ao27.net, 1 ao6.works, 1 @@ -12511,6 +12439,7 @@ aoa2.ch, 1 aoadatacommunity.us, 1 aoaprograms.net, 1 +aobaetmo.com, 1 aobogo.com, 1 aod-tech.com, 1 aodisco.co.uk, 1 @@ -12526,10 +12455,8 @@ aok.network, 1 aokae.com, 1 aoken-cf.jp, 1 -aolcollege.com, 1 aomar-mohammedi.tk, 1 aomeikey.org, 0 -aonedatasolution.com, 1 aonhewitt.com.cy, 1 aonhewitt.gr, 1 aonk.bg, 1 @@ -12548,7 +12475,6 @@ aosoracafe.com, 1 aostacarnavals.it, 1 aosus.org, 1 -aotearoa.maori.nz, 1 aotearoafreepress.com, 1 aotearoaleaks.org, 0 aotech.tw, 1 @@ -12604,7 +12530,6 @@ apdtalents.org.tw, 1 apea.com, 1 apec.fr, 1 -apecsustain.com, 1 apedreira.com, 1 apef.ch, 0 apefrog.tk, 1 @@ -12660,7 +12585,6 @@ apfelrat.de, 1 apfhaiti.org, 1 apfm.fr, 1 -apfulfilment.com, 1 apgen.org, 1 apgw.jp, 1 aphantasiac.com, 1 @@ -12668,8 +12592,10 @@ aphelis.net, 1 aphorismen-archiv.de, 1 api-agri.ga, 1 +api-bitrefill.com, 1 api-hany.cf, 1 api.biz.tr, 1 +api.loan, 1 api.lookout.com, 1 api.org.tr, 1 api.recurly.com, 1 @@ -12689,6 +12615,7 @@ apiculture.net, 1 apienergisahomol.com, 1 apifiregroup.com, 1 +apifreaks.com, 1 apigb.com, 1 apigee.com, 1 apigroupinc.com, 1 @@ -12776,7 +12703,7 @@ apokalipsis.tk, 1 apola.best, 1 apolitical.co, 1 -apolloautopecas.com.br, 1 +apollo.dog, 1 apollodiet.com, 1 apollogames.cz, 1 apolloheatingandair.com, 0 @@ -12791,6 +12718,7 @@ apollyon.work, 1 apologrouptv.net, 1 apoly.de, 1 +aponkral.com, 1 aponkral.com.tr, 1 aponkral.dev, 1 aponkral.net, 1 @@ -12799,7 +12727,6 @@ aponkral.org.tr, 1 aponkral.tr, 1 aponow.de, 0 -aponte-systems.com, 1 apophisen.fr, 1 apopka.gov, 1 apoportal.de, 1 @@ -12879,12 +12806,14 @@ appen.com, 1 appen.com.cn, 1 appengine.google.com, 1 +appetiser.com.au, 1 appetto.co, 1 appfollow.io, 1 appgeek.com.br, 1 appgrowing.cn, 1 appgrowing.net, 1 appgurus.com.au, 1 +apphandoff.com, 1 appian-cdn-gov.com, 1 appian-cdn.com, 1 appiancloud-dynamic.com, 1 @@ -12978,7 +12907,6 @@ appo.nl, 1 appodeal.com, 1 appoggiature.fr, 1 -appointible.com, 1 appointment.ga, 1 apponic.com, 1 apponline.com, 1 @@ -13052,6 +12980,7 @@ aprendealvuelo.com, 1 aprendejainternet.tk, 1 aprendele.com, 1 +aprenderalemanonline.com.ar, 1 aprenderjuntos.cl, 1 aprendiendoforexhoy.com, 1 aprendo.com.py, 1 @@ -13133,7 +13062,7 @@ aqenglish.pk, 1 aqihub.info, 1 aqlivia.com, 1 -aqmetrics.com, 0 +aqmetrics.com, 1 aqqrate.com, 1 aqss.rs, 1 aqu.com, 1 @@ -13198,6 +13127,7 @@ aquarestaurantobx.com, 1 aquarillon.fr, 1 aquarium-supplement.net, 1 +aquariumassist.com, 1 aquariumhobby.tk, 1 aquariumhome.tk, 1 aquariymist.tk, 1 @@ -13307,6 +13237,7 @@ ararrl.com, 1 ararrl.net, 1 ararrl.org, 1 +arasdigital.co, 1 arasikackm.com, 1 arasozgun.net, 1 aratum.com, 1 @@ -13353,6 +13284,7 @@ arc.int, 0 arc.net, 1 arc.run, 1 +arca.fst.br, 1 arca.info.ro, 1 arca.live, 1 arcada-company.com, 1 @@ -13364,16 +13296,18 @@ arcadiaeng.com, 1 arcadiaquill.com, 1 arcaik.net, 1 +arcaleus.com, 1 arcana-noctis.tk, 1 +arcanavana.com, 1 arcandadults.org, 1 arcane.no, 1 arcanecoast.ru, 1 arcanefrost.de, 1 arcanehardware.com, 1 +arcanemotorsport.com.au, 1 arcanetides.com, 1 arcarwegrow.pl, 1 arcbouncycastles.co.uk, 1 -arcchildren.org, 1 arcenotas.com, 1 arcese.com, 1 arcgpw.org, 1 @@ -13395,7 +13329,6 @@ archframe.net, 1 archi.ve.it, 1 archicgi.com, 1 -archijobbtp.com, 1 archimede.ovh, 1 archined.nl, 1 archinext.io, 1 @@ -13449,6 +13382,7 @@ arcogb.co, 1 arcoidaho.gov, 1 arcoiriscastellon.tk, 1 +arcolaai.com, 1 arcolapdtx.gov, 1 arcolasecurities.com, 1 arcolatexas.gov, 1 @@ -13492,6 +13426,7 @@ ardeche-guide.com, 1 ardennes.com, 1 ardens.co.uk, 1 +ardent-peche.com, 1 ardentinsure.com.au, 1 ardentsia.com, 1 ardenwolfsky.com, 1 @@ -13553,6 +13488,7 @@ arenlor.com, 1 arenlor.info, 1 arenns.com, 1 +arensinnrettingar.is, 1 arentuna.se, 1 arenzanaphotography.com, 1 areproduktioqn.tk, 1 @@ -13575,7 +13511,6 @@ arezzoportugal.com, 1 arfulus.com, 1 arfycat.com, 1 -arg.zone, 1 argama-nature.com, 1 arganaderm.ch, 0 arganwinkel.nl, 1 @@ -13594,7 +13529,6 @@ argo-vision.com, 1 argo-vision.it, 1 argo.vision, 1 -argolacosmetique.ca, 1 argolacosmetique.com, 1 argon18.com, 1 argon2.online, 1 @@ -13603,7 +13537,7 @@ argos.co.uk, 1 argosasist.co.uk, 1 argosrisk.com, 1 -argoswimvideo.com, 0 +argoswimvideo.com, 1 argotplan.com, 1 argovpay.com, 1 argovpn.com, 1 @@ -13614,7 +13548,6 @@ argyrouminas.digital, 1 argyrouminas.eu, 1 arhan.sh, 1 -arheh.com, 1 arhgrille.com, 1 arhipka.tk, 1 arhitectura.ru, 1 @@ -13735,6 +13668,7 @@ arkaitzmolinuevo.com, 1 arkanpath.com, 1 arkansastitlesearch.com, 1 +arkazys.com, 1 arkcapitaltrading.com, 1 arkdev.fr, 0 arkenstone.ml, 1 @@ -13783,7 +13717,6 @@ armageddonclan.tk, 1 armahackers.tk, 1 armakuni.com, 1 -armamentevolved.com, 1 armancodes.com, 0 armand-colin.com, 1 armanddesign.nl, 1 @@ -13827,12 +13760,12 @@ armorsoft.fr, 1 armorynode.net, 1 armourfloorsnd.com, 1 -armourroofcolorado.com, 1 armourroofinc.com, 1 armsco.fr, 1 armsdr.com, 1 armsteadproject.org, 0 armstrong.com.mx, 1 +armstrongheatingandcooling.com, 1 armstrongremovals.com.au, 0 armtopnews.tk, 1 army-technology.com, 1 @@ -13844,7 +13777,6 @@ armymuseumlahore.pk, 1 armyofflyingmonkeys.com, 1 armyrtf.com.au, 1 -armyuniversity.edu, 1 armywear.ga, 1 arn.com, 1 arn0.cc, 1 @@ -13963,7 +13895,6 @@ arroapp.com.ar, 1 arroba.digital, 1 arrotatore.roma.it, 1 -arrow-api.nl, 1 arrowduty.ml, 1 arrowfastener.com, 1 arrowgrove.com, 0 @@ -14001,6 +13932,7 @@ arsmedica.ch, 1 arsmedika.ru, 1 arsmundi.de, 1 +arssalva.fr, 1 arstechni.ca, 1 arstudentloanhelp.com, 1 art-athens.com, 1 @@ -14017,6 +13949,7 @@ art-khotyn.tk, 1 art-kuchni.tk, 1 art-news.tk, 1 +art-okno.com, 1 art-okon.ru, 1 art-online.tk, 1 art-pix.de, 1 @@ -14109,7 +14042,6 @@ artevos.com, 1 artevos.de, 1 artexhibition.jp, 1 -artextasia.com, 1 artfabrics.com, 1 artfarms.ca, 1 artformcollective.com.au, 1 @@ -14191,7 +14123,6 @@ artistree.io, 1 artistreplugged.com, 1 artistrunwebsite.com, 1 -artium.agency, 1 artivo-gallery.com, 1 artizlibranza.com, 1 artj.jp, 1 @@ -14199,6 +14130,7 @@ artlab.tk, 1 artlantis.nl, 1 artleading.ru, 1 +artless.at, 1 artlifeisgood.com, 0 artlinestix.com.au, 1 artlogo.biz, 1 @@ -14228,7 +14160,6 @@ artolaros.nl, 1 artomalu.tk, 1 artomili.com, 1 -artouch.com, 1 artozoul.fr, 1 artphototravel.net, 1 artplaneta-leto.by, 1 @@ -14249,8 +14180,6 @@ artscanvas.org, 1 artshouse.com.au, 1 artsinbushwick.org, 1 -artslife.com, 1 -artsmagazine.com, 1 artsongcolorado.org, 1 artspac.es, 0 artspark.tk, 1 @@ -14305,9 +14234,9 @@ arviksa.co.uk, 1 arvin.com.co, 1 arvindhariharan.me, 1 +arvindsharma.co.in, 1 arvostettu.fi, 1 arvutiladu.ee, 1 -arvyncerezo.com, 1 arw.me, 1 arwensiberian.tk, 1 arweth.com, 1 @@ -14355,6 +14284,7 @@ as207618.net, 1 as207960.net, 1 as209245.net, 1 +as212024.net, 1 as216318.net, 1 as29.net, 1 as41073.net, 1 @@ -14380,7 +14310,6 @@ asancharge.tk, 1 asandu.eu, 1 asankomara.tk, 1 -asanprop.com, 1 asansol.tk, 1 asantosdev.com, 1 asanuma-clinic.jp, 1 @@ -14414,7 +14343,6 @@ ascamo.tk, 1 ascannes-non-officiel.tk, 1 ascar.us, 1 -ascavia.cz, 1 ascenderhcm.com, 1 ascendi.no, 1 ascendix.com, 0 @@ -14435,6 +14363,7 @@ ascirno.com, 1 ascl.org.uk, 1 asco.com.mx, 1 +ascofiltri.com, 1 ascolibasi.tk, 1 ascom.vi.it, 1 ascopeshipping.co.uk, 1 @@ -14447,7 +14376,6 @@ asdf.one, 1 asdfqwerty.duckdns.org, 1 asdwfwqd.com, 1 -aseannow.com, 1 asecla.com, 1 asecus.ch, 1 aseelanimalhealth.com, 1 @@ -14483,6 +14411,7 @@ asgeirolafs.com, 1 asgfinancialadvisors.com, 1 asgnqpc.com, 1 +ashantiperu.org, 1 ashargrosirparfum.com, 1 asharq.com, 1 ashastalent.com, 0 @@ -14513,7 +14442,6 @@ ashesheriff.gov, 1 ashevillemenshealth.com, 1 ashfak.tk, 1 -ashfordcastle.com, 1 ashgroveclinic.com.au, 1 ashgw.me, 0 ashiba-kagu.com, 1 @@ -14579,7 +14507,6 @@ asiansnus.com, 1 asiansolequeen.com, 1 asiansongs.tk, 1 -asianspa.co.uk, 1 asiantube.tv, 1 asianwebcams.webcam, 1 asiaoptom.com, 1 @@ -14630,6 +14557,7 @@ asker-massasje.no, 1 askerweb.cf, 1 askeverythingonline.com, 1 +askeygeek.com, 1 askfoto.com, 1 askfront.com, 1 askgamblers.com, 1 @@ -14719,7 +14647,7 @@ asphyxia.su, 1 aspi.cz, 1 aspietechygamer.tk, 1 -aspiracloud.com, 1 +aspiracloud.com, 0 aspirantum.com, 1 aspirateur-anti-pollution.fr, 1 aspirateur-univers.com, 1 @@ -14737,7 +14665,9 @@ aspisdata.com, 1 aspjvm.com, 1 aspontes.org, 1 +aspor.com.tr, 1 asportnoy.com, 1 +aspph.org, 1 aspr.gov, 1 aspr.group, 1 asprion.org, 1 @@ -14777,6 +14707,7 @@ assemblee-copropriete.fr, 1 assemblee-nationale.ga, 1 assemblyai.com, 0 +assemblyservice.co.uk, 1 assemblytoolbox.com, 1 assemblywithoutthewalls.org, 1 assens.dk, 0 @@ -14827,7 +14758,6 @@ assistere-in-famiglia.it, 1 assistivebathing.co.uk, 1 assistmedica.com, 1 -assistouest.fr, 1 assistouest.net, 1 assistouest.shop, 1 assmb.ly, 1 @@ -14882,7 +14812,7 @@ astengox.com, 1 astenretail.com, 1 astera-led.com, 1 -astera.com, 1 +astera.com, 0 asterhu.com, 1 asterinu.xyz, 1 asterisk.lol, 1 @@ -14916,6 +14846,7 @@ astqx.com, 1 astraai.com, 1 astraalivankila.net, 0 +astraelle.space, 1 astrakhan-gorod.ga, 1 astrakhan-news.net, 1 astrakhan.cf, 1 @@ -14957,7 +14888,6 @@ astrojunkies.com, 1 astrolab.tk, 1 astroloeches.tk, 1 -astrologeminesolakoglu.com, 1 astrologerumesh.com, 1 astrologic.cf, 1 astrologics.in, 1 @@ -14987,7 +14917,6 @@ astrostart.tk, 1 astroteam.tk, 1 astrovandalistas.cc, 1 -astrox.casino, 1 astroxe.com, 1 astroze.it, 1 astrumadvies.nl, 1 @@ -15027,7 +14956,6 @@ asws.nl, 1 asyadexpress.com, 1 asyaport.com, 1 -asyaturk.org, 1 asyikbelanja.com, 1 asylbarn.no, 1 asylinfo.no, 1 @@ -15100,13 +15028,12 @@ ateitis.net, 1 atelier-aleph.fr, 1 atelier-eddie.nl, 1 -atelier-lebreton.fr, 1 atelier-naruby.cz, 1 atelier-rk.com, 1 atelier-viennois-cannes.fr, 1 atelierbeautebk.com, 1 atelierbw.com, 1 -ateliercommerce.com, 1 +ateliercommerce.com, 0 atelierdelachaine.fr, 0 atelierdelacreation.com, 1 atelierferro.be, 1 @@ -15250,7 +15177,6 @@ atlantischild.hu, 1 atlantisdx.de, 1 atlantisgold.bg, 1 -atlantismd.com, 1 atlantistowingservice.com, 1 atlantiswaterproofing.com, 0 atlantium.tk, 1 @@ -15380,9 +15306,11 @@ atrogi.com, 1 atropos.co, 1 ats.net, 1 +atsfleetservice.com, 1 atsol.com, 1 atspeeds.com, 1 attadigital.com, 1 +attainableresultsgroup.com, 1 attanasioluigi.tk, 1 attatroll.de, 1 attawauganfirect.gov, 1 @@ -15392,6 +15320,7 @@ attendanceondemand.com, 1 attendanceradar.com, 1 attendhealth.com, 1 +attendthesabbath.com, 1 attendu.cz, 0 attengo.ga, 1 attentioninsight.com, 1 @@ -15402,7 +15331,6 @@ atticinsulationexpertshouston.com, 1 atticlightstudio.net, 1 atticode.io, 1 -atticusblog.com, 1 attilavandervelde.nl, 1 attiliospagnolo.it, 1 attinderdhillon.com, 1 @@ -15432,6 +15360,7 @@ atulhost.com, 1 atumfire.ru, 1 atunel.tk, 1 +atvirtual.at, 1 atvlifesaver.net, 1 atvsafety.gov, 1 atwatermn.gov, 1 @@ -15497,7 +15426,6 @@ audifs.com, 0 audilio.it, 1 audio-arte.pt, 1 -audio-detector.com, 1 audio-extractor.net, 1 audio-joiner.com, 1 audio.servemp3.com, 1 @@ -15638,9 +15566,11 @@ aura7chakr.com, 1 aurabasketball.com, 1 aurabasketball.fr, 1 +aurabestari.com, 1 aurac.org.nz, 1 auraedu.me, 1 aurahiemis.tk, 1 +aurahome.studio, 1 aurainfosec.com, 0 aurainfosec.com.au, 0 aurakink.com, 1 @@ -15749,7 +15679,7 @@ austcm.com.au, 1 austenplumbing.com, 1 austercita.tk, 1 -austickcarremoval.com.au, 0 +austickcarremoval.com.au, 1 austillconstruction.com, 1 austin-security-cameras.com, 1 austinbestdjs.com, 1 @@ -15775,7 +15705,6 @@ australianattractions.com.au, 1 australiancattle.dog, 1 australiancurriculum.edu.au, 0 -australiangeographictravel.com, 1 australiangold.net, 1 australianhimalayanfoundation.org.au, 0 australianimmigrationadvisors.com.au, 1 @@ -15987,6 +15916,8 @@ automaatic.com, 1 automagischeberegening.nl, 1 automastercastlerock.com, 1 +automateanything.pro, 1 +automatedcloud.africa, 1 automaticagarage.it, 1 automationlab.it.com, 1 automationpro.me, 1 @@ -16170,7 +16101,6 @@ autoofficina.it, 1 autopadconnect.com, 1 autopapo.com.br, 1 -autopark-ost-fichtner.de, 1 autoparts-for-foreigncars.tk, 1 autoparts-russia.ru, 1 autoparts.im, 1 @@ -16187,6 +16117,7 @@ autopocket.co, 1 autopopaccidentrepair.co.uk, 1 autoportal.tk, 1 +autopot.nl, 1 autopril.com, 1 autoprogconsortium.ga, 1 autops.ma, 1 @@ -16280,7 +16211,6 @@ autozaz.ml, 1 autozuki.com, 1 autres-talents.fr, 1 -auts.fi, 0 autumnhungary.tk, 1 autumnplantfair.nz, 1 autya.ga, 1 @@ -16324,6 +16254,7 @@ avaibooksports.com, 1 avail-sw.io, 1 available.direct, 1 +available.is, 1 availablecastles.com, 1 availablefonts.com, 1 availablereportsest.ga, 1 @@ -16377,7 +16308,6 @@ avanteinversiones.es, 1 avantnr.com, 1 avantumrx.com, 1 -avanwyk.com, 1 avanzbanc.com, 1 avanzza.net, 1 avaralar.tk, 1 @@ -16403,7 +16333,6 @@ avedesk.org, 0 avedisrecovery.com, 1 aveenstra.com, 1 -avegaedge.com, 1 avelengo.org, 1 avellinotoday.it, 1 aveloair.com, 1 @@ -16434,6 +16363,7 @@ avepol.eu, 1 averageinspired.com, 1 averbuch.net, 1 +averbuch.org, 1 averen.co.uk, 1 averge.co.za, 1 averin.pro, 1 @@ -16510,7 +16440,6 @@ aviprime.by, 1 avirahost.com.br, 1 aviruptribedi.com, 1 -avisbabes.com, 1 avishanx.com, 1 avishwebsoft.com, 1 avisodeprivacidad.info, 0 @@ -16582,8 +16511,8 @@ avs.be, 1 avsd01.com, 1 avstack.io, 1 -avstekla.ru, 1 avt-ukraine.com, 1 +avtechno.ru, 1 avtecmedia.com, 0 avto-bazar.tk, 1 avto-signal.cf, 1 @@ -16688,7 +16617,6 @@ awo-sh.de, 1 awoau.com.au, 1 awqaf.gov.ae, 1 -awqaf.gov.ly, 1 awrcourtreporter.com, 1 awrcourtreporters.com, 1 awrcourtreporting.com, 1 @@ -16756,6 +16684,7 @@ axiniteguitars.com, 1 axioinvest.com, 1 axiom4.net, 1 +axioma-ai.ru, 1 axiomametering.com, 1 axiome.cpa, 1 axiomecomptables.ca, 1 @@ -16863,6 +16792,7 @@ aymerick-dupouey.fr, 1 aymhome.top, 0 ayon-games.tk, 1 +ayosante.com, 1 ayothemes.com, 1 ayotteshackelford.com, 1 ayresalpine.com, 1 @@ -17019,6 +16949,7 @@ azimut.fr, 1 azimuth-ast.ru, 1 azimuthint.com, 1 +azimutmedical.com, 1 azinfoolad.com, 1 azingostar.tk, 1 azithromycin.ga, 1 @@ -17101,6 +17032,7 @@ azzorti.com, 1 azzorti.pe, 1 azzurrapelletterie.it, 1 +b-12.ai, 1 b-angel.info, 1 b-b-law.com, 1 b-coal.com, 0 @@ -17116,6 +17048,7 @@ b-lenos.com, 1 b-m-druck.de, 1 b-root-force.de, 1 +b-secure.co, 1 b-services.net, 0 b-swiss.com, 1 b-ticket.ch, 1 @@ -17134,6 +17067,8 @@ b1.work, 1 b1031.com, 1 b11p.com, 1 +b12-labs.com, 1 +b12labs.ai, 1 b131000.com, 0 b1c1l1.com, 1 b1drivers.com, 1 @@ -17168,7 +17103,6 @@ b4r7.de, 1 b4z.eu, 1 b5197.co, 1 -b5dev.com, 1 b5i.net, 1 b61688.com, 1 b62aa.com, 1 @@ -17369,7 +17303,7 @@ babyinthehouse.com.br, 1 babykappy.com, 1 babylonclub.cf, 1 -babymall.hk, 0 +babymall.hk, 1 babymasaze.cz, 1 babymozg.ga, 1 babynamen.nl, 1 @@ -17411,6 +17345,7 @@ bacgroupinc.com, 1 bacgrouppublishing.com, 1 bach-frederiksen.dk, 1 +bacharach.law, 1 bachata.berlin, 1 bachata.info, 1 bache-barre.fr, 1 @@ -17488,7 +17423,6 @@ backwpup.com, 1 backy2.com, 1 backyardaddict.com, 1 -backyardbella.com, 1 backyardchickens.com, 1 backyardtaco.com, 1 backzoneterapi.dk, 1 @@ -17544,6 +17478,8 @@ badf00d.de, 1 badge.rs, 1 badgeboundprep.com, 1 +badgerherald.com, 1 +badgeron.io, 1 badges.fedoraproject.org, 1 badges.stg.fedoraproject.org, 1 badgetree.com, 1 @@ -17576,7 +17512,6 @@ badnjar.rs, 1 badodds.ga, 1 badoinkvr.com, 1 -badoo.com, 1 badoo.com.ar, 1 badoo.de, 1 badoo.eu, 1 @@ -17612,6 +17547,7 @@ baer-concepts.de, 1 baer-holger.de, 0 baer.space, 1 +baerlin-umzuege.de, 1 baesystems-she.com, 1 baeverdock.com, 1 baevserver.ddns.net, 1 @@ -17681,7 +17617,7 @@ bailbondsdirect.com, 1 baildonhottubs.co.uk, 1 baileebee.com, 1 -baileyladders.com.au, 1 +baileyladders.com.au, 0 baileysharborwi.gov, 1 baileystrailsystem.org, 1 baileyventuresllc.com, 1 @@ -17753,7 +17689,6 @@ bakercountysheriffor.gov, 1 bakersafari.co, 1 bakersfieldhomeoffer.com, 1 -bakerviewdentalcentre.com, 1 bakerymazowsze.co.uk, 1 bakesy.shop, 0 bakeup.be, 1 @@ -17795,6 +17730,7 @@ balance.education, 1 balance.equipment, 1 balance.technology, 1 +balanceandtest.com, 1 balancecreamers.ga, 1 balancecreamest.ga, 1 balancedbrawl.net, 1 @@ -17886,6 +17822,7 @@ balluncar.tk, 1 ballweg-tech.de, 1 balneariodearchena.com, 1 +balo2.com, 1 baloch-intelligence.tk, 1 balochism.tk, 1 baloncestoarqueros.tk, 1 @@ -17936,7 +17873,6 @@ bamily.rocks, 1 baming.com, 1 bammatta.ch, 1 -bamoza.com, 1 bampers.tk, 1 ban-list.gq, 1 banabarka.tk, 1 @@ -18019,7 +17955,6 @@ banes.ch, 1 banfieldentertowin.com, 0 banfieldtravel.it, 1 -banfun.org, 1 bangabandhu.tk, 1 bangbangboys.tk, 1 bangberlin.tk, 1 @@ -18039,6 +17974,7 @@ banglargolpo.tk, 1 banglatec.tk, 1 banglets.com, 1 +bangogolufsen.is, 1 bangphai.com, 1 bangsparks.com, 1 bangujero.tk, 1 @@ -18063,12 +17999,14 @@ bankasubeleri.tk, 1 bankbranchlocator.com, 1 bankcib.com, 1 +bankconverter.co.uk, 1 bankcustomer.gov, 1 bankcustomerassistance.gov, 1 bankee.us, 1 bankenconfigurator.nl, 1 banker.vn, 1 bankera.com, 1 +bankers-ins.com, 1 banket-furshet-spb.ru, 1 banketbesteld.nl, 1 bankffin.kz, 0 @@ -18187,13 +18125,14 @@ baravalle.com, 1 baraxolka.ga, 1 baraxolka.ml, 1 +barbar.codes, 1 +barbara-bertagnolli.co.uk, 1 barbara-fuchs-gruene-fuerth.de, 1 barbarabryce.com, 1 barbaraedanielsantos.ga, 1 barbarafabbri.com, 1 barbaramoorman.tk, 1 barbarareynoldsphotography.com, 1 -barbarianbear.art, 1 barbarians.com, 0 barbas.com, 1 barbate.fr, 1 @@ -18207,7 +18146,7 @@ barbiecollectorjapan.gq, 1 barbieforteza.tk, 1 barbinlaw.com, 1 -barbnow.com, 1 +barbnow.com, 0 barbonnetje.nl, 1 barbosha.ru, 1 barbourcountyal.gov, 1 @@ -18241,6 +18180,7 @@ bardiharborow.com, 1 bardoferry.com, 1 bardtech.com, 1 +bardtini.com, 1 barduschinamusic.org, 1 barefoodinrome.it, 1 barelias.tk, 1 @@ -18315,6 +18255,7 @@ barnvets.co.uk, 1 barnwellcountysc.gov, 1 barobax.tk, 1 +barobirlik.org.tr, 1 barobot.net, 1 barocco.by, 1 baroclean.fr, 1 @@ -18347,7 +18288,7 @@ barraqueirotransportes.pt, 1 barrasaccess.com, 1 barratennis.com.br, 1 -barrebody.com.au, 1 +barrebody.com.au, 0 barreiroappraisals.com, 1 barrelfish.org, 1 barrencountyky.gov, 1 @@ -18357,7 +18298,7 @@ barristerconnect.com, 0 barro.ga, 1 barruntos.tk, 1 -barrybulakites.co, 0 +barrybutcher.com, 1 barrycountye911.gov, 1 barrydenicola.com, 0 barrymarkus.tk, 1 @@ -18408,6 +18349,7 @@ bas.sh, 1 bas.surf, 1 bas.work, 1 +basakkayabeauty.com, 1 basalticfarms.com, 1 basauristudios.com, 1 basaveshwaraborewells.tk, 1 @@ -18432,8 +18374,8 @@ basecore.co, 1 based.gr, 1 based.win, 1 +basedoll.cn, 1 basedonline.nl, 1 -basedriver.com, 1 baseerapp.com, 1 baseerat-academy.com, 1 basel-gynaecology.com, 1 @@ -18548,6 +18490,7 @@ bastion-scan.eu, 1 bastionadvokat.ml, 1 bastionentifo.tk, 1 +bastionthermalworks.com, 1 bastisgroup.com, 1 bastolino.de, 1 bastotrekking.pt, 1 @@ -18596,6 +18539,7 @@ batemanbuilds.com, 1 bateriaprofesional.es, 1 baterias.com, 1 +bateriasencasa.com, 1 baterioverolety.cz, 1 batescountymo.gov, 1 batesvillearkansas.gov, 1 @@ -18620,7 +18564,7 @@ batipiscine.com, 1 batipresta.ch, 0 batista.g12.br, 1 -batistasbakery.com, 1 +batistasbakery.com, 0 batitrakya.org, 1 batiweb.tv, 1 batiwebgroup.com, 0 @@ -18648,6 +18592,7 @@ batteryreconditioning.ml, 1 battl-victory-records.com, 1 battle-arena.tk, 1 +battle-scars.org.uk, 1 battlecruiser.ch, 1 battlefield1942.tk, 1 battleforkhashuri.tk, 1 @@ -18658,6 +18603,8 @@ battlemedialab.com, 1 battlerealms.cc, 1 battlerite.tk, 1 +battlescars.org.uk, 1 +battlescarsselfharm.org.uk, 1 battletech.tk, 1 battletrades.net, 1 battreil.tk, 1 @@ -18698,7 +18645,6 @@ baufiexpress.info, 1 baufiexpress.net, 1 baufiexpress.org, 1 -baugelitt.eu, 1 baugemeinschaftbernstein.de, 1 baugeshite.de, 1 bauhaus.cz, 1 @@ -18706,7 +18652,9 @@ bauhoftoo.ee, 1 baukebies.nl, 1 baukelek.tk, 1 +baulio.de, 1 baum-gruenpflege.de, 1 +baumaniswildfire.ca, 1 baumannfabrice.com, 1 baumansound.com, 1 baumbet.ro, 1 @@ -18715,7 +18663,6 @@ baumkletterschule.de, 1 baumkuchen-aus-dresden.de, 0 baummer.com.br, 1 -bauplanmanager.com, 1 baurs.com, 1 bausep.de, 1 bausparkassen.tk, 1 @@ -18727,6 +18674,7 @@ bavaria-feuerloeschershop.de, 1 bavarovillage.com, 1 bavartec.de, 1 +baverdock.com, 1 bavi.tk, 1 bavoogi.com, 1 bawag.at, 1 @@ -18753,7 +18701,6 @@ bayareamustangs.tk, 1 bayareaplasticsurgery.com, 1 bayashi.net, 1 -bayati.me, 1 baycialis.net, 1 baycitymi.gov, 1 baycountyfltax.gov, 1 @@ -18803,7 +18750,6 @@ bazaart.com, 1 bazaart.me, 1 bazaclub.ru, 0 -bazafashion.com, 1 bazahub.club, 1 bazait.com, 1 bazaleev.ru, 1 @@ -18847,6 +18793,7 @@ bbb4all.de, 1 bbbb.loan, 1 bbbbb.men, 1 +bbbexpo.com, 1 bbbff.net, 1 bbbswcmd.org, 1 bbc.co.uk, 0 @@ -19006,6 +18953,7 @@ bdpn.ru, 1 bdrmedia.rs, 1 bdrops.de, 1 +bdsd.pl, 1 bdsm-erotik.com, 1 bdsmbibliothek.net, 1 bdsmcontrol.com, 1 @@ -19180,9 +19128,7 @@ beauty-blog.gq, 1 beauty-form.ir, 1 beauty-haircare.tk, 1 -beauty-salon-lino.com, 1 beauty-schools.com, 1 -beauty-secrets.ir, 1 beauty-stories.tk, 1 beauty-style.ml, 1 beauty-town.tk, 1 @@ -19224,7 +19170,9 @@ beaver-creek.ga, 1 beavercityut.gov, 1 beaverdamautos.com, 1 +beaverdck.com, 1 beaverdoc.com, 1 +beaverdocj.com, 1 beaverdock.ai, 1 beaverdock.co, 1 beaverdock.com, 1 @@ -19233,9 +19181,14 @@ beaverdock.org, 1 beaverdock.us, 1 beaverdock.xyz, 1 +beaverdocl.com, 1 beaverdok.com, 1 beaverdokc.com, 1 +beaverdovk.com, 1 +beaverdoxk.com, 1 beaverdpck.com, 1 +beaverdsck.com, 1 +beaverfock.com, 1 beaverheadcountymt.gov, 1 beaverock.com, 1 beaversock.com, 1 @@ -19258,7 +19211,6 @@ bebefofuxo.com.br, 1 bebemamae.com, 1 bebes.uno, 1 -bebesreborns.com, 1 bebest.gov, 1 bebetrotteur.com, 1 bebidasrd.com, 1 @@ -19305,10 +19257,10 @@ beccaanne.photography, 1 beccajoshwedding.com, 1 bech32.net, 1 -beck.id, 1 beck.pl, 1 beckdesign.tk, 1 becker-annika.de, 1 +becker-maschinen.com, 1 becker.wales, 1 becker8.de, 1 beckermn.gov, 1 @@ -19362,6 +19314,7 @@ bedrijfsfeesten.tk, 1 bedrijfsfotoreportages.nl, 1 bedrijfswasmachine.nl, 1 +bedrijvenparktreurenburg.nl, 1 bedroc.com, 0 bedrockcommunity.ml, 1 bedrockdata.com, 1 @@ -19409,7 +19362,6 @@ beekeepingfiji.com, 1 beeksnetwork.nl, 1 beeliarspirit.org, 1 -beelikeus.pl, 1 beeline.am, 1 beelit.com, 0 beelitz.de, 1 @@ -19424,6 +19376,8 @@ beenox.com, 1 beeone.nl, 1 beep.vip, 1 +beepan.com, 1 +beepanwang.com, 1 beepassvpn.com, 1 beepcar.ru, 1 beeportfolio.com, 1 @@ -19475,6 +19429,7 @@ befaster.fit, 1 beffeet.com, 1 befoodsafe.gov, 1 +before.click, 1 beforeafter.gq, 1 beforethedawn.tk, 1 beforeyoueatoc.com, 1 @@ -19521,6 +19476,7 @@ behealthandrehab.com, 1 behealthoncologia.com, 1 behealthpr.com, 1 +behealthyeveryday.eu, 1 behealthyoga.com, 1 beheeronline.nl, 1 behemoth.cf, 1 @@ -19567,6 +19523,7 @@ bekam.my, 1 bekeltetes.hu, 1 bekendeartiestboeken.nl, 1 +bekey.io, 1 bekmekci.tk, 1 beko.co.uk, 1 beko.ie, 1 @@ -19603,6 +19560,7 @@ belebey.city, 1 beleefheemstede.nl, 1 belegstelle-glashuette.de, 1 +belegvandenbosch.nl, 1 beleidtransitiemodel.nl, 1 beleiu.com, 1 beleiu.de, 1 @@ -19739,6 +19697,7 @@ belrybalka.cf, 1 bels-lijntje.nl, 1 belsilos.com, 1 +belstoneproducts.com, 1 beltanelabrosse.tk, 1 beltar.nl, 1 beltbuckle.pw, 1 @@ -19762,6 +19721,7 @@ bemani.nl, 1 bemawi.com, 1 bembee.tk, 1 +bembem.de, 1 bemergroup.com, 1 bemestarevendasonline.online, 1 bemindful.life, 1 @@ -19799,6 +19759,7 @@ benchling.com, 1 benchmark-dental.com, 0 benchmark-ip.com, 1 +benchmark.ge, 1 benchmarkmonument.com, 1 benchmarkstudio.net, 1 benclarkphotography.com.au, 1 @@ -19881,7 +19842,6 @@ beniajan.tk, 1 benicee.com, 1 benidormcd.tk, 1 -benify.com, 1 benihbaik.com, 1 benimsetin.com, 1 benimsetin.org, 1 @@ -19960,6 +19920,7 @@ bentley.link, 1 bentleyks.gov, 1 bento-kurumaya.co.jp, 1 +bentomesh.com, 1 bentoml.com, 1 bentoncountyia.gov, 1 bentoncountyor.gov, 1 @@ -19969,9 +19930,7 @@ bentonwi.gov, 1 bentpunk.tk, 1 bentrask.com, 1 -benu.cz, 1 benu.rs, 1 -benulekaren.sk, 1 benunapredpis.cz, 1 benward.physio, 1 benwoo.org, 1 @@ -19997,6 +19956,7 @@ bepzi.com, 1 bequ1ck.com, 1 bequiia.com, 1 +bequiz.be, 1 bera.com.au, 1 beran.tk, 1 berandalcorp.tk, 1 @@ -20018,6 +19978,7 @@ bereginya-lada.ru, 1 beregite-zdorovje.ru, 1 beregusha.com, 1 +bereikdenbosch.nl, 1 berekenen.nl, 1 berekenhet.nl, 1 berend.tk, 1 @@ -20067,8 +20028,10 @@ berkhills.com, 1 berksbulls.com, 1 berkshire.com, 1 +berkshiredairy.com, 1 berkshireesupply.com, 0 berksholocaustmuseum.org, 1 +berksmilitaryhistorymuseum.org, 1 berkspa.gov, 1 berkspetcare.com, 1 berkswatertech.com, 1 @@ -20184,6 +20147,7 @@ bert.org, 1 bertaudarthur.fr, 1 bertbrockham.org.uk, 1 +berten.hu, 1 berthaphil.com, 1 berthaundcarlbenzpreis.de, 1 berthawoonsurgery.com.sg, 1 @@ -20225,6 +20189,7 @@ besnard.me, 1 besnik.de, 0 besnik.tk, 1 +besola.de, 1 besole.ch, 1 besolov.tk, 1 besox.be, 1 @@ -20306,7 +20271,7 @@ bestcanvaswallart.com, 1 bestcarscyprus.com, 1 bestcavapoos.com, 1 -bestchoicehomeinspections.com, 1 +bestchoicehomeinspections.com, 0 bestclix.ml, 1 bestcms.tk, 1 bestcockalierpups.com, 1 @@ -20340,6 +20305,7 @@ bestevakantieparken.com, 1 bestevakantieparken.nl, 1 bestfcu.org, 1 +bestfewo.de, 0 bestfidgettoysforadhd.com, 1 bestfinancialcu.org, 1 bestfitnesswatchreview.info, 1 @@ -20350,7 +20316,6 @@ bestgolftrips.ca, 1 besthemes.tk, 1 besthomeandgardenstuff.com, 1 -besthomegenerator.com, 1 besthost.cz, 1 besthouse.co.il, 1 besthumorsite.tk, 1 @@ -20551,7 +20516,7 @@ bestpracticesleidraad.nl, 1 bestpressurewashingchicago.com, 1 bestpricelovers.com, 1 -bestprofessionalchainsaw.com, 1 +bestprofessionalchainsaw.com, 0 bestpromoving.com, 1 bestratedremovals.co.uk, 1 bestratedtransport.com.au, 1 @@ -20562,7 +20527,6 @@ bestroofinginkansascity.com, 1 bestroutes.net, 1 bestsatoshifaucet.ga, 1 -bestsavingscoupon.com, 1 bestsextoys.com, 1 bestsheepadoodles.com, 1 bestshopping.ga, 1 @@ -20710,6 +20674,7 @@ betaa8.com, 1 betaa9.com, 1 betaal.my, 1 +betaaldeseksdates.nl, 1 betaams.net, 1 betabar.dk, 1 betabeat.com, 1 @@ -20717,7 +20682,6 @@ betacs.pro, 1 betadelivery.co.uk, 1 betadwarf.com, 1 -betagro.com, 1 betahyp.de, 1 betandslots.com, 1 betandyou.com, 1 @@ -20741,7 +20705,6 @@ betel.tk, 1 betelgeus.com, 1 betemyja.tk, 1 -betenemy.com, 1 beterewereldbanen.nl, 1 beteroud.nl, 1 betexperts.tk, 1 @@ -20769,6 +20732,7 @@ betmobilenigeria.com, 1 betobaccofree.gov, 1 betolerant.fr, 1 +beton-vloer.nl, 1 beton.ie, 1 betonbewerkingsmachines.be, 1 betongereedschap.be, 1 @@ -20777,11 +20741,13 @@ betonmarkets.info, 1 betonperkasa.com, 1 betonsport.ga, 1 +betonvloerpolijsten.com, 1 betop-lab.com, 1 betor.cz, 1 betor.sk, 1 betordertr.com, 1 betoskip.tk, 1 +betowa.co, 1 betransfer.eu, 1 betreut.at, 1 betreut.de, 1 @@ -20806,7 +20772,6 @@ bettashoerepairs.com.au, 1 bettendorf.gov, 1 bettenhaus-schlafoase.de, 1 -better.ad, 1 better.com, 1 better.fyi, 1 betterbaseball.com, 1 @@ -20814,7 +20779,6 @@ betterboards.net, 1 betterbuiltbasements.com, 1 betterbuiltkitchensandbathrooms.com, 1 -bettercastings.com, 1 bettercleaningcompany.co.uk, 1 bettercommunication.org.uk, 1 bettercrypto.org, 1 @@ -20834,6 +20798,7 @@ betterna.me, 1 betternews.eu, 1 betteroffed.com, 1 +betterprojects.de, 1 betterscience.org, 1 betterscore.net, 1 bettersecurity.co, 1 @@ -20841,6 +20806,7 @@ betterstack.com, 1 bettertax.gov.au, 1 betterteam.com, 1 +betterteamslabs.com, 1 bettertech.pt, 1 bettertechsoftware.com, 1 bettertime.jetzt, 1 @@ -20903,11 +20869,13 @@ bevallarta.com, 1 bevcrushesit.ca, 1 bevedo.com, 1 +bevedo.cz, 1 bevedo.sk, 1 beveiligingscamerawestland.nl, 1 bevelbeer.com, 1 beveragemobileest.ga, 1 beverb.org, 1 +beverdock.com, 1 beverhof.nl, 1 beverley.tk, 1 beverleycounselling.co.uk, 1 @@ -20928,6 +20896,7 @@ bevrijdingsmuseum.nl, 1 bewaredevapi.azurewebsites.net, 1 bewegigsruum.ch, 1 +bewegte-kirche.de, 1 bewegtes-lagern.at, 1 bewegtes-lagern.ch, 1 bewegtes-lagern.com, 1 @@ -20958,7 +20927,7 @@ beyer-on-it.com, 1 beyer-on-it.de, 1 beyer.cloud, 1 -beyer.consulting, 1 +beyer.consulting, 0 beyer.media, 1 beyerautomation.com, 1 beyerm.de, 1 @@ -20995,7 +20964,6 @@ beyondweb.net, 1 beyondzeroacademy-reservations.fr, 1 beyoung.in, 1 -beyoutiful-studio.ro, 1 bezagentstva.cf, 1 bezbarier.org.pl, 1 bezbednostnaradu.com, 1 @@ -21060,6 +21028,7 @@ bgemi.net, 1 bget.org.uk, 1 bgetfuel.co.uk, 1 +bgfalconmedia.com, 1 bgfashion.net, 1 bgfr.net, 1 bggcapital.com, 1 @@ -21122,6 +21091,7 @@ bhuntr.com, 1 bhuttae.com, 1 bhuvanreddy.space, 1 +bhvrl.com.au, 1 bhwfx.com, 1 bhxch.moe, 1 bi-in-beeld.nl, 1 @@ -21168,6 +21138,7 @@ bibi-xxx.com, 1 bibica.net, 1 bibicarrington.com, 1 +bibisaintifik.com, 1 bibit.id, 1 bibitbunga.com, 1 bibitec.de, 1 @@ -21247,7 +21218,6 @@ bidenstopdeportations.com, 1 bidenwhitehouse.gov, 1 bidindustry.com, 1 -bidlab.org, 1 bidman.cz, 1 bidoluindirim.com, 1 bidonline.tk, 1 @@ -21334,12 +21304,15 @@ bigalba.ga, 1 bigambitions.co.za, 1 bigart.tk, 1 +bigassex.com, 1 bigassmonster.com, 1 bigasstubes.com, 1 +bigbadwolf.gay, 1 bigbag.chat, 1 bigbagmanagement.com, 1 bigbagventures.com, 1 bigband.tk, 1 +bigbayou.at, 1 bigbearlakecoins.com, 1 bigbeats.tk, 1 bigbeautysecrets.tk, 1 @@ -21424,7 +21397,6 @@ bigpage.tk, 1 bigpanparties.co.uk, 1 bigphilsrubbishremoval.com, 1 -bigpicturerecords.com, 1 bigpurse.tk, 1 bigrapidstownshipmi.gov, 1 bigrender.tk, 1 @@ -21470,6 +21442,7 @@ bigtexasyardsale.com, 1 bigthree.ga, 1 bigthunder.ca, 1 +bigtime.agency, 1 bigtime.gg, 1 bigtimeiq.com, 1 bigtitsmilf.com, 1 @@ -21480,6 +21453,7 @@ bigudi.eu, 1 biguz.net, 1 bigwaterut.gov, 1 +bigwes.com, 1 bigwest.org, 1 bigwicks.co.uk, 1 bigzoo.com.br, 1 @@ -21631,12 +21605,9 @@ billsteinberg.ca, 1 billusherwood.com, 1 billview.com.au, 1 -billwebb.com.au, 1 billy.pictures, 1 -billybluerecords.com, 1 billybob.tk, 1 billycroan.com, 1 -billyjamrecords.com, 1 billykwok.me, 1 billywig.stream, 1 billywr.com, 1 @@ -21646,6 +21617,7 @@ bimacitizen.com, 1 bimber.nl, 1 bimbingan.tk, 1 +bimbpress.com, 1 bimedis.com, 1 bimilogo.it, 1 bimmerguide.de, 1 @@ -21685,6 +21657,7 @@ binbo.cz, 1 binbo.sk, 1 bind.ch, 1 +binday.ie, 1 bindb.com, 1 binderbud.com, 1 binding-problem.com, 1 @@ -21701,6 +21674,7 @@ bingcheung.com, 1 bingchunmoli.com, 1 bingebooks.com, 1 +bingebracket.com, 1 binghamcountyid.gov, 1 binghamid.gov, 1 bingo-wear.com, 1 @@ -21742,7 +21716,6 @@ bintube.com, 1 bio-disinfestazione.it, 1 bio-dolt-aveyron.fr, 1 -bio-farma.net, 1 bio-feed.org, 1 bio-kertem.hu, 1 bio-medical.com, 1 @@ -21829,6 +21802,7 @@ biokal.nl, 1 biokemonline.com, 1 bioknowme.com, 1 +bioknowme.health, 1 biokoxomodding.tk, 1 biolack.cf, 1 biolact.tk, 1 @@ -21870,7 +21844,6 @@ bionicman.name, 1 bionovanaturalpools.com, 1 biontech24.pl, 1 -biontechworld.com, 1 bioplac.es, 1 bioplaces.at, 1 bioplaces.ch, 1 @@ -21890,7 +21863,6 @@ biosearch.tk, 1 bioseguridad.gob.pa, 1 bioselect.com.cy, 1 -biosency.com, 1 bioshine.com.sg, 1 bioshome.de, 1 biosignalanalytics.com, 1 @@ -21942,7 +21914,6 @@ birdbox.party, 1 birdbutt.com, 1 birdgifs.nz, 1 -birdiehosting.nl, 1 birdist.com, 1 birdrave.com, 1 birdsite.ga, 1 @@ -21971,7 +21942,7 @@ birobidjan.tk, 1 birobidzhan-news.net, 1 birone.tk, 1 -bironthemes.com, 0 +bironthemes.com, 1 birosuli.hu, 1 birouldeimagine.ro, 1 birow.com, 1 @@ -22107,10 +22078,10 @@ bitcoinforthe.world, 1 bitcoingambling.pro, 1 bitcoingroup.ga, 1 +bitcoinguru.cz, 1 bitcoinheaders.net, 1 bitcoinheaders.org, 1 bitcoinindy.com, 1 -bitcoinissafe.com, 1 bitcoinkaufen.news, 1 bitcoinkurs.news, 1 bitcoinkurs.world, 1 @@ -22119,6 +22090,7 @@ bitcoinnews.world, 1 bitcoinnotbombs.com, 1 bitcoinprice.news, 1 +bitcoinsapi.com, 1 bitcoinseed.net, 1 bitcoinsinireland.com, 1 bitcoinskoers.nl, 1 @@ -22199,12 +22171,11 @@ bitrate.tk, 1 bitredirixe.top, 1 bitref.com, 1 -bitrefill.com, 0 +bitrefill.com, 1 bitrefill.info, 1 bitrefill.me, 1 bitronixcode.com, 1 bitsafe.com.my, 1 -bitsalt.com, 1 bitsellx.com, 1 bitseo.ga, 1 bitseo.tk, 1 @@ -22219,7 +22190,6 @@ bitspaceonline.ml, 1 bitstack.nz, 1 bitstage.uk, 1 -bitstorm.org, 1 bitsync.nl, 1 bitten.pw, 1 bittersweetcandybowl.com, 1 @@ -22230,6 +22200,7 @@ bitton.com.au, 1 bittounsi.com, 1 bittrend.ga, 1 +bittube.net, 1 bittylicious.com, 1 bitufa.com.tr, 1 bitumenburundi.com, 1 @@ -22323,6 +22294,7 @@ bizzvisor.site, 0 bj-caffe.tk, 1 bja.gov, 1 +bjargendurhaefing.is, 1 bjarnerest.de, 0 bjarno.xyz, 1 bjbybbs.com, 1 @@ -22330,7 +22302,7 @@ bjcw.com, 1 bjecard.buzz, 1 bjerregaard.me, 1 -bjfconsulting.fr, 0 +bjfconsulting.fr, 1 bjfuli.com, 1 bjjmississauga.com, 1 bjksportscentre.com, 1 @@ -22672,7 +22644,7 @@ blackswancompany.com, 1 blackswirl.com, 1 blacktemplars.tk, 1 -blacktownbuildingsupplies.com.au, 0 +blacktownbuildingsupplies.com.au, 1 blacktube.tv, 1 blacktubes.cf, 1 blacktubes.ga, 1 @@ -22763,6 +22735,7 @@ blastoffdirt.com, 1 blastofftherapy.com, 1 blastoise186.co.uk, 1 +blastover.eu, 1 blasunafotocadadia.com, 1 blathinwheatens.tk, 1 blatnic.eu, 1 @@ -22781,6 +22754,7 @@ blaugelb-frankfurt.de, 1 blauglockenbaum.de, 1 blaumedia.com, 1 +blautube.com, 1 blauwegeit.nl, 1 blauwereigercoaching.nl, 1 blauwgras.nl, 1 @@ -22792,7 +22766,7 @@ blaze-in.com, 1 blazebit.com, 1 blazefire.tk, 1 -blazejmrozinski.com, 1 +blazejmrozinski.com, 0 blazelock.com, 1 blazeweb.ml, 1 blazing.cz, 1 @@ -22897,7 +22871,6 @@ blissplan.com, 1 blissque.com, 1 blissway.tk, 1 -blisterreview.com, 1 blistertrackandtrace.com, 1 blitshift.com, 1 blitz-idee24.de, 1 @@ -22964,7 +22937,6 @@ blockvideo.live, 1 blockwatch.cc, 0 blockxit.de, 1 -blocxx.org, 1 blodeuyn.com, 1 bloeij.nl, 1 bloemendaalsamen.nl, 0 @@ -23046,6 +23018,7 @@ blogtheque.com, 1 bloguerrilla.it, 1 blogvadim.ga, 1 +blogverdict.com, 1 blogworm.eu, 1 blokada.org, 1 blokmap.be, 1 @@ -23161,7 +23134,6 @@ bluegoat.jp, 1 bluegolf.com, 1 bluegrasshospitality.com, 1 -bluegrassprizes.com, 1 bluehaven.ai, 1 bluehavenkinsale.com, 1 bluehawks.in, 1 @@ -23185,10 +23157,10 @@ bluemango-studios.com, 1 bluemat.org, 1 bluemax49ers.com, 1 -bluemodus.com, 1 bluemoonrescue.org, 1 bluemoundtexas.gov, 1 bluemountain-ms.gov, 1 +bluenet.nz, 1 bluenetworks.xyz, 1 blueneuron.tk, 1 blueoakart.com, 0 @@ -23321,12 +23293,11 @@ bmdonline.eu, 1 bme.com, 1 bmelecevolution.com, 1 -bmgc.edu.bd, 1 bmhglobal.com.au, 1 bmicos.com, 1 -bmitelecom.com.br, 1 bmjphotography.tk, 1 bmk-kramsach.at, 1 +bmlogistik.sk, 1 bmm.com.co, 1 bmoattachments.org, 1 bmoe.eu.org, 1 @@ -23370,7 +23341,6 @@ bngsecure.com, 1 bnhhospital.com, 1 bnjpro.dk, 1 -bnkconsulting.info, 1 bnlegalmedia.com, 1 bnnuy.com, 1 bnpl.kz, 1 @@ -23421,7 +23391,6 @@ boat-systems.pl, 0 boatandsailboat.com, 1 boats.com, 0 -boatsandoats.com, 1 boatseller.org, 1 boatsforveterans.org, 1 boattrader.com.au, 1 @@ -23445,6 +23414,7 @@ bobbyoriginal.tk, 1 bobbyrobinson.tk, 1 bobbysdancewear.com, 1 +bobcat-lead.com, 1 bobcat.com, 1 bobcoffee.com.br, 1 bobconnolly.com, 1 @@ -23501,7 +23471,6 @@ bodil.bg, 1 bodin.cz, 1 bodivo.vn, 1 -bodixite.com, 1 bodkov.com, 1 bodlsc.com, 1 bodrumescmagazin.tk, 1 @@ -23537,7 +23506,7 @@ boelsen.net, 1 boem.gov, 1 boemeldonck.nl, 1 -boenderoutdoor.nl, 1 +boenderoutdoor.nl, 0 boengefissaofnoh.nl, 1 boensite.tk, 1 boenyc.gov, 1 @@ -23592,17 +23561,17 @@ bojoproductions.tk, 1 bokaldo.com, 1 bokatas.tk, 1 -bokehandbows.ca, 1 bokf.com, 1 bokhaldari.is, 1 bokhylle.eu, 1 bokkun.jp, 1 bokmassan.se, 1 bokni.ng, 1 +bokorev.ru, 1 bokov.gq, 1 boksburgplumbing.co.za, 1 boksburgsolarsystems.co.za, 1 -bokutake.com, 1 +bokumo.nl, 1 bol.io, 1 bolalocobrews.co.uk, 1 bolaodarico.com.br, 1 @@ -23671,7 +23640,7 @@ boltmobile.ca, 1 bolton-consulting.org, 1 boltonct.gov, 1 -boltup.ai, 1 +boltup.ai, 0 boltz.exchange, 1 boluhaberleri.tk, 1 bolur.is, 1 @@ -23851,6 +23820,7 @@ bookameeting.se, 1 bookbazar.co.in, 1 bookcabaurangabad.com, 1 +bookcheapairline.com, 1 bookcreator.com, 1 bookdubaihome.com, 1 bookergroupjobs.co.uk, 1 @@ -23912,7 +23882,7 @@ bookvuz.tk, 1 bookworld.gr, 1 bookwormstory.social, 1 -bookyourdata.com, 1 +bookyourdata.com, 0 bookyoursmog.com, 1 bool.be, 1 boom2.network, 1 @@ -23933,7 +23903,6 @@ boomtownevents.com, 1 boomtowntrail.com, 1 boomvm.pw, 1 -boon-beauty.com, 1 boonecountyar.com, 1 boonecountyfpdmo.gov, 1 boonecountyil.gov, 1 @@ -23946,7 +23915,6 @@ booox.biz, 1 booox.cc, 1 booox.net, 1 -booox.org, 1 booox.pw, 1 boop.gq, 1 boop.icu, 1 @@ -23968,6 +23936,7 @@ boot-berlin.de, 1 bootcampkatwijk.nl, 1 boothillcasino.com, 1 +booths.cyou, 1 boothukathalu.in, 1 bootlabs.net, 1 bootrading.com, 1 @@ -24016,6 +23985,9 @@ borealcapital.com.br, 1 borealis.gg, 1 borealis.su, 1 +borealisacademy.com, 1 +borealisprotocol.ai, 1 +borealisterminal.com, 1 boreally.org, 1 bored.gr, 1 boredhackers.com, 1 @@ -24118,10 +24090,12 @@ bosquedelasimagenes.tk, 1 bosquedepalabras.com, 0 boss.az, 1 +bosschespoorzone.nl, 1 +bosschestadsdelta.com, 1 +bosschestadsdelta.nl, 1 bossefors.tk, 1 bosseo.id, 1 bosslady.one, 1 -bossmarketing.ca, 1 bossurl.tk, 1 boston-medical-supply.com, 1 boston-molly.tk, 1 @@ -24141,6 +24115,7 @@ bot-manager.pl, 1 bot.country, 1 botabota.ca, 1 +botanical.house, 1 botanicalinstitute.org, 1 botanicoved.com, 1 botaniqlandscapeconsultants.com, 1 @@ -24170,9 +24145,11 @@ botpago.cl, 1 botschaft.digital, 1 botschaften-an-das-volk-gottes.de, 0 +botseller.ai, 1 botsfed.com, 1 botsindiscord.me, 1 botstack.host, 1 +botsuite.pro, 1 botticelli.tk, 1 bottinquebec.com, 1 bottke.berlin, 1 @@ -24190,7 +24167,6 @@ bouchonville-knifemaker.com, 1 bouckaert-usedcars.be, 0 bouckaert.co, 1 -boudah.pl, 1 boudasedesatka.cz, 1 bouffartigue.fr, 1 boufs.be, 1 @@ -24203,6 +24179,7 @@ boulayauventcamping.ca, 1 boulayauventcamping.com, 1 boulayauventscamping.com, 1 +boulderbit.com, 1 boulderbrook.com, 1 bouldercounty.gov, 1 bouldercountyassessor.gov, 1 @@ -24336,7 +24313,9 @@ bouwbedrijfdesmet.be, 1 bouwbedrijfjstam.nl, 1 bouwbedrijfkorstanje.nl, 1 +bouwenaandenbosch.com, 1 bouwenaandenbosch.nl, 1 +bouwenaanshertogenbosch.nl, 1 bouwklikshop.nl, 1 bouwklikweb.nl, 1 bouwma.nl, 1 @@ -24353,6 +24332,7 @@ bowenrealty.com, 1 bowhill.me, 1 bowhunter-ahorn.de, 0 +bowiecroftonendo.com, 1 bowlcake.fr, 1 bowldirectoryest.ga, 1 bowlidex.com, 1 @@ -24361,6 +24341,7 @@ bowmanwilliams.com, 0 bowmar.gov, 1 bownhpd.gov, 1 +bowserbuddy.com.au, 1 bowwowinsurance.com.au, 1 box-it-up.nl, 1 box.bz, 1 @@ -24377,6 +24358,7 @@ boxeldercountyut.gov, 1 boxeomexicano.tk, 1 boxerdogsaspets.com, 1 +boxhive.io, 1 boxhostserver.com, 1 boxing-kangaroo.ga, 1 boxing-videos.com, 1 @@ -24461,10 +24443,9 @@ bpvr.ddns.net, 1 bpvr.nl, 1 bpx.exchange, 1 -bpx.global, 1 bq1.me, 1 bq8.me, 1 -bqgw.info, 1 +bqgw.info, 0 bqgw8.com, 0 bqool.com, 1 bqp.io, 0 @@ -24656,6 +24637,7 @@ brandsafe.io, 1 brandsclub.tk, 1 brandsource.com, 1 +brandsseekers.com, 1 brandstof-prijzen.nl, 1 brandsynergy.pl, 1 brandtechdesign.co.uk, 1 @@ -24810,6 +24792,7 @@ breakinoutpr.com, 1 breakofdawn.tk, 1 breaksome.tech, 1 +breakstonesbutter.com, 1 breakthroughapparel.com, 1 breakthrought1d.org.il, 1 breakwall.ml, 1 @@ -24841,6 +24824,7 @@ breederpodcast.com, 1 breen.com.br, 1 breentwp.gov, 1 +breet.io, 1 breethe.com, 1 breezisaas.com, 1 breezitech.io, 1 @@ -24851,9 +24835,7 @@ brefy.com, 1 brege.org, 1 breger.fr, 1 -bregmanfance.com, 1 bregnedal.dk, 1 -bregner.com, 1 bregroup.com, 1 brehoni.cz, 0 brei.nz, 1 @@ -24899,7 +24881,6 @@ brestnews.tk, 1 brestradio.tk, 1 brestshop.tk, 1 -bretagne-reisen.de, 1 bretania.bzh, 1 bretcarmichael.com, 1 breteuilcommerceartisanat.com, 1 @@ -24921,6 +24902,7 @@ brewcentralny.com, 1 brewerybarbotley.com, 1 brewin.ml, 1 +brewrest.com, 1 brewsouth.com, 1 brex.pw, 1 brexit.tk, 1 @@ -24964,7 +24946,6 @@ brianroadifer.com, 1 briansemrau.com, 1 briansmith.org, 1 -brianterealtygroup.com, 1 brianum.de, 1 brianum.net, 1 brianvalente.tk, 1 @@ -25025,7 +25006,7 @@ bridgesem.com, 1 bridgesofcolorado.gov, 1 bridgestudios.com, 1 -bridgesync.io, 1 +bridgesync.io, 0 bridgethailand28chidlom.com, 1 bridgetmcauliffe.ie, 1 bridgetonmo.gov, 1 @@ -25147,6 +25128,7 @@ britannia.no, 1 britanniapandi.com, 1 british-assessment.co.uk, 1 +britishairlinesflights.com, 1 britishantiquefurniture.co.uk, 1 britishbee.org.uk, 1 britishbee.uk, 1 @@ -25202,6 +25184,7 @@ brn.is, 0 brnchost.com, 1 brndn.io, 1 +brngal.sk, 1 brnogame.com, 1 brnogame.cz, 1 brnogame.online, 1 @@ -25269,6 +25252,7 @@ brokenbowokpd.gov, 1 brokencityllc.ga, 1 brokendollsmuseum.com, 1 +brokenelectronics.com, 1 brokenhands.io, 1 brokenlinkchecker.live, 1 brokenminds.tk, 1 @@ -25424,6 +25408,7 @@ bruidstaarten.tk, 1 bruinmail.nl, 1 bruitparif.fr, 1 +brujobros.com, 1 bruk2fa.no, 1 brukalai.lt, 1 brulewi.gov, 1 @@ -25497,7 +25482,6 @@ bryandrakedrivingschool.co.nz, 1 bryandunnewald.com, 0 bryanfalchuk.com, 1 -bryankaplan.com, 1 bryanlachica.com, 1 bryanley.com, 1 bryanquigley.com, 1 @@ -25506,6 +25490,7 @@ bryanski.tk, 1 bryanstoncc.co.za, 1 bryantluk.com, 1 +bryceboldenscott.com, 1 bryceml.us, 1 bryggebladet.dk, 1 brysoncitync.gov, 1 @@ -25569,7 +25554,6 @@ bslinguistics.co.uk, 1 bslnow.co.uk, 1 bslnowsigns.co.uk, 1 -bsmart.it, 1 bsmsl.com, 1 bsn.cloud, 0 bsnb.com, 1 @@ -25596,7 +25580,6 @@ bst-gmbh.de, 1 bsteele.tk, 1 bstger.ch, 1 -bstoked.net, 1 bsuess.de, 1 bsure.io, 0 bsurfcr.com, 1 @@ -25611,7 +25594,6 @@ bt-kc.de, 1 bt121.com, 0 bt24.ro, 1 -bt780.com, 1 bt85.cn, 0 bt9.cc, 0 btbb.net, 1 @@ -25644,8 +25626,6 @@ btool.eu.org, 1 btorrent.xyz, 1 btp.net, 1 -btpexpert.com, 1 -btpinterim.com, 1 btpritikin.com, 1 btrade.io, 1 btrans.by, 1 @@ -25673,9 +25653,8 @@ btwsa.tk, 1 btwschool.it, 1 btwservice.it, 1 -btwstore.it, 1 btynews.com, 1 -btyr.net, 0 +btyr.net, 1 bu-e.com, 1 buai.cf, 1 buai.gq, 1 @@ -25694,8 +25673,8 @@ bubblelist.tk, 1 bubblesco.tk, 1 bubblespetspa.com, 0 -bubblin.io, 1 bubblyliving.com, 1 +bubcs.com, 1 bublup.com, 1 bubnovsky.org, 1 bubok.com, 1 @@ -25775,7 +25754,6 @@ buddy-development-rabodirectconnect-api.azurewebsites.net, 1 buddy-locator.com, 1 buddy.net, 1 -buddyboss.com, 1 buddyme.me, 1 budeanu.com, 1 budejce.cz, 1 @@ -25792,6 +25770,7 @@ budget.ovh, 1 budget4cast.com, 1 budgetapp.me, 1 +budgetfitter.uk, 1 budgetglasscranbourne.com, 1 budgetheatingorders.com, 1 budgetimize.com, 1 @@ -25833,7 +25812,7 @@ bueroplus.de, 1 buerstaedter-zeitung.de, 1 buesiforquo.cf, 1 -bueteeearchives.net, 1 +buettgens.net, 1 bufete.tk, 1 buff-buff.tk, 1 buffalo-ny-gay-chat.com, 1 @@ -25877,7 +25856,6 @@ bugrayildiz.av.tr, 1 bugreader.com, 1 bugs.chromium.org, 1 -bugwie.com, 1 bugzilla.mozilla.org, 1 buharkeyf1.com, 1 buharlikoltukyikama.com.tr, 1 @@ -25894,6 +25872,7 @@ buildbytes.com, 1 buildconcierge.ga, 1 builddesygner.xyz, 1 +builderhouseplans.com, 1 buildersbroker.com.au, 1 buildersdiscount.net, 1 buildersofthesilentcities.tk, 1 @@ -25926,7 +25905,6 @@ buildsimple.co.uk, 1 buildtestsolutions.com, 1 buildux.com, 1 -buildwealth.uk, 1 buileo.com, 1 builtbyworkhorse.com, 1 builterra2.azurewebsites.net, 1 @@ -25941,6 +25919,7 @@ builtinseattle.com, 1 builtinsf.com, 1 builtinvacuum.com, 1 +builtmaven.com, 1 builtory.my, 1 builtvisible.com, 1 buirey.com, 1 @@ -26038,7 +26017,6 @@ bulutimza.com.tr, 1 bulutkey.com, 1 bulvar.tk, 1 -bumastemra.nl, 1 bumblebee.cf, 1 bumblebeebeekeeping.com, 1 bumblebeekids.uk, 1 @@ -26050,6 +26028,7 @@ bummelwelt.ch, 1 bummelwelt.com, 1 bummelwelt.de, 1 +bumpi.games, 1 bumpi.gq, 1 bumsbesuch.com, 1 bumsbuero.com, 1 @@ -26087,7 +26066,6 @@ bunnybloythost.com, 1 bunnycarenotes.com, 1 bunnydiamond.de, 1 -bunnymaxim.com, 1 bunnymud.com, 1 bunnyvishal.com, 1 bunova.com, 1 @@ -26108,7 +26086,6 @@ buquesdeguerra.tk, 1 buraksercanercin.co, 1 burakuckun.com, 1 -burakurer.com, 1 buralteria.tk, 1 burasicanakkale.com, 0 buratino.tk, 1 @@ -26150,6 +26127,7 @@ burghtstam.tk, 1 burgos.tech, 1 burgoslacrosse.tk, 1 +burgstaller-immobilien.de, 1 burgstetten.de, 1 burhan-autosattlerei.de, 1 buricloud.fr, 1 @@ -26234,11 +26212,13 @@ buryat-mongol.cf, 1 buryatia.tk, 1 burybox.co.uk, 1 +burz.agency, 1 burz.ai, 1 burz.net, 1 burz.one, 1 burz.ro, 1 burza-techniky.cz, 1 +burzagency.com, 1 burzcast.com, 1 burzcast.ro, 1 burzgroup.com, 1 @@ -26283,6 +26263,7 @@ business-secreti.gq, 1 business-secreti.tk, 1 business-swiss.ch, 1 +business-trade.pro, 1 business.facebook.com, 0 business.gov, 0 business.medbank.com.mt, 1 @@ -26370,7 +26351,6 @@ businessgroove.ga, 1 businessgrowth.ga, 1 businessgrowthleaders.com, 1 -businessguide.co.ke, 1 businessgun.ga, 1 businesshandsome.ga, 1 businesshome.ml, 1 @@ -26792,7 +26772,6 @@ buzztrending.tk, 1 buzzword24.de, 1 buzzworld.tk, 1 -buzzybites.com, 1 bv-driver.tk, 1 bv-ferreiradozezere.pt, 1 bvblaboratory.hu, 1 @@ -26810,6 +26789,7 @@ bvisionsmedia.com, 1 bvlos.com.pl, 1 bvlp.com, 1 +bvmary.com, 1 bvng.nl, 1 bvop.org, 1 bvr-nsn.gov, 1 @@ -26819,6 +26799,7 @@ bvrpd-pa.gov, 1 bvusd.org, 1 bvv-europe.eu, 1 +bvwnews.com, 1 bvwphotography.com, 1 bw.codes, 1 bw1970s.com, 1 @@ -26962,6 +26943,7 @@ bytemethod.ca, 1 bytenest.ca, 1 byteofdev.com, 1 +byteorbit.com, 1 bytepen.com, 1 bytepoint-software.nl, 1 bytes.fyi, 1 @@ -27018,7 +27000,6 @@ c-rpg.eu, 1 c-rtx.com, 1 c-sagaseru.com, 1 -c-shock.org, 1 c-solarcity.com, 1 c-tec.nl, 1 c-three.jp, 1 @@ -27098,7 +27079,6 @@ ca-els.com, 1 ca-immobilier.fr, 1 ca-key.de, 1 -ca-saintdie.fr, 1 ca.gparent.org, 1 ca.search.yahoo.com, 0 ca.sk, 1 @@ -27186,6 +27166,7 @@ cache22.nl, 1 cachecounty.gov, 1 cachecrawler.com, 1 +cachedragon.net, 1 cachemosquito.gov, 1 cachepreload.com, 1 cachesheriff.gov, 1 @@ -27275,6 +27256,7 @@ caetanoflotas.es, 1 caetanoretail.pt, 0 caetanotec.pt, 1 +caeusa.net, 1 caf.milano.it, 1 cafe-bg.com, 1 cafe-cliche.tk, 1 @@ -27293,7 +27275,7 @@ cafechesscourt.com, 1 cafechroma.tk, 1 cafecobus.tk, 1 -cafedari.ir, 1 +cafecomcyber.com.br, 1 cafedelcielo.co, 1 cafedesignbooks.com, 1 cafedospescadores.tk, 1 @@ -27314,7 +27296,6 @@ cafesangtao.com, 1 cafeterya.tk, 1 cafethevibes.com, 1 -cafethrive.co.uk, 1 cafevelo.org, 1 cafevs.com, 0 cafexpro.com, 1 @@ -27359,6 +27340,7 @@ cainhoyathletic.com, 1 cainiao.moe, 1 caio.moe, 1 +caiodorosario.com, 1 caipai.fm, 1 caiqueparrot.com, 1 cairnterrier.com.br, 1 @@ -27369,7 +27351,7 @@ cais.de, 1 caise.tk, 1 caissefrancaisedefinancementlocal.fr, 0 -caiteecooper.com, 1 +caithness-business.co.uk, 1 caivps.com, 1 caiwenjian.xyz, 1 caixideal-serralharia.pt, 1 @@ -27422,6 +27404,7 @@ caladan.tk, 1 calaficirecords.cf, 1 calaix.click, 1 +calamai.nl, 1 calamidad.tk, 1 calamp.com, 1 calandrahosting.tk, 1 @@ -27444,7 +27427,6 @@ calcioweb.eu, 1 calcoolator.pl, 1 calcsoft.tk, 1 -calcstructcost.com, 1 calcsub.net, 1 calculadora-de-derivadas.com, 1 calculadora-de-integrales.com, 1 @@ -27464,6 +27446,7 @@ calculatortvers.ga, 1 calculatortvest.ga, 1 calculon.fr, 1 +calculstructure.fr, 1 calcworkshop.com, 1 caldaia.roma.it, 1 caldare.be, 1 @@ -27575,6 +27558,7 @@ calliari.org, 1 calliesalls.com, 1 calligraph.gq, 1 +callinangroup.net, 1 callinsdecor.com.br, 1 callipeg.com, 1 callmewatkins.com, 1 @@ -27768,6 +27752,7 @@ campguaikinima.com, 1 camping-aupigeonnier.fr, 1 camping-dulac-dordogne.com, 1 +camping-fleur-oleron.com, 1 camping-seilershof.de, 1 camping-trentino.it, 1 camping.it, 1 @@ -27780,7 +27765,6 @@ campinghuntingshooting.com, 1 campingpolidor.com, 1 campingprofessionalsest.ga, 1 -campingshop.pl, 1 campingwatchest.ga, 1 campistry.net, 1 camplaza.tk, 1 @@ -27820,6 +27804,7 @@ camslurp.com, 1 camslurp.net, 1 camslurp.org, 1 +camsparty.com, 1 camsupplier.ml, 1 camsupplierers.ga, 1 camtor.ml, 1 @@ -27833,7 +27818,6 @@ can-amchains.com, 1 can-fleet.com, 1 can-tran.com, 1 -canabeinternacional.com, 1 canacreative.asia, 1 canact.com.au, 1 canada-tourisme.ch, 0 @@ -27945,7 +27929,6 @@ candlelightchallenge.tk, 1 candlemakingexplained.com, 1 candlepro.cf, 1 -cando.eu, 1 candogiveguide.org, 1 candt.gr, 1 candy-pop.tk, 1 @@ -28006,6 +27989,7 @@ canlitelefonhatti.ga, 1 canlom.tk, 1 canmipai.com, 1 +cannabiocreuse.fr, 1 cannabis-marijuana.com, 1 cannabis.cafe, 1 cannabisdiscounter.ca, 1 @@ -28014,6 +27998,7 @@ cannabishouseyeg.com, 1 cannabislegality.info, 1 cannabistraininguniversity.com, 1 +cannabivo.com, 1 cannabiz.tk, 1 cannabytes.net, 1 cannacards.ca, 1 @@ -28071,7 +28056,7 @@ canterburynh.gov, 1 canters.tk, 1 cantillons.com, 1 -cantongroup.com, 1 +cantongroup.com, 0 cantonmi.gov, 1 cantonmopolice.gov, 1 cantonms.gov, 1 @@ -28109,9 +28094,7 @@ cap50.be, 1 cap73.fr, 1 cap75.com, 1 -capari.co, 1 caparua.com, 1 -capathsuccess.com, 1 capcut.cn, 1 cape.blue, 1 capeannvacations.com, 1 @@ -28244,10 +28227,11 @@ captainsunshine.tk, 1 captavio.com, 1 captchafox.com, 1 +captech.pe, 1 +captello.com, 1 captify.ca, 1 captivationscience.com, 1 captivationtheory.com, 1 -captmacks.com, 1 captreelegal.nl, 1 capturebilling.com, 1 captured-symphonies.com, 1 @@ -28259,7 +28243,6 @@ car-diagnose.com, 1 car-dismantling.tk, 1 car-expresso.com, 1 -car-hire-lisbon.com, 1 car-keys.tk, 1 car-market.tk, 1 car-seats-store.ga, 1 @@ -28349,6 +28332,7 @@ cardano.eco, 1 cardano.org, 1 cardanoupdates.com, 1 +cardboard.inc, 1 cardbouns.tk, 1 cardcaptorsakura.jp, 1 cardcenter.cc, 1 @@ -28389,21 +28373,12 @@ cardozovargas.cloud, 1 cardozovargas.co, 1 cardozovargas.com, 1 -cardozovargas.com.br, 1 -cardozovargas.email, 1 -cardozovargas.gay, 1 cardozovargas.me, 1 -cardozovargas.men, 1 -cardozovargas.my, 1 cardozovargas.net, 1 cardozovargas.one, 1 -cardozovargas.online, 1 cardozovargas.org, 1 cardozovargas.pro, 1 -cardozovargas.space, 1 -cardozovargas.top, 1 cardozovargas.vip, 1 -cardozovargas.work, 1 cardpresso.com, 1 cardprinter.co.il, 1 cardpyramiders.ga, 1 @@ -28426,6 +28401,7 @@ careapp.com.au, 1 careapptest.dk, 1 carear.com, 1 +careclaimsadjusting.com, 0 carecloud.com, 1 carecm.de, 1 carecode.ai, 0 @@ -28433,6 +28409,7 @@ career-log.jp, 1 career.how, 1 careerandjobsearch.tk, 1 +careerbound.ai, 1 careercapital.co.za, 1 careergigo.com, 1 careerminds.com, 1 @@ -28441,7 +28418,6 @@ careersimulator.com, 0 careersingulf.com, 1 careersinpsychology.org, 1 -careerslevel.com, 1 careersolutionsbymichelle.com, 1 careerstart.co.jp, 1 careertransformed.com, 1 @@ -28461,7 +28437,6 @@ caremore.pt, 1 carenepal.org, 1 carepan.ga, 1 -carepassport.com, 1 carepathinnovations.com, 1 caresco.nl, 1 careshields.sg, 1 @@ -28722,6 +28697,7 @@ carrinhocheiooanointeiro.com.br, 1 carrion.tk, 1 carrnorthamerica.com, 1 +carro.wiki, 1 carroattrezzi.it, 1 carroattrezzi.lazio.it, 1 carroattrezzimilanodaluiso.it, 1 @@ -28833,13 +28809,12 @@ carvalhofer.lu, 1 carver.tk, 1 carvercountymn.gov, 1 -carvoeiro-car-hire.com, 1 carvykti.com, 1 carw.sh, 1 carwashlogin.com, 1 carwashon5th.com, 1 carwind.com, 1 -carwrapinfo.com, 1 +carwrapinfo.com, 0 carwreckcowboy.com, 1 caryl.fr, 1 carymedicalgroup.com, 1 @@ -28930,7 +28905,6 @@ cascavelle.fr, 1 cascavelle.nl, 1 casden.fr, 1 -case-jucu.ro, 1 case-la-rosu.ro, 1 case-vacanza-salento.com, 1 case-ware.info, 1 @@ -29008,6 +28982,7 @@ cash.app, 1 cash.me, 1 cash.nyc, 1 +cash1loans.com, 1 cashamerican.tk, 1 cashati.com, 1 cashbackcow.us, 1 @@ -29025,6 +29000,7 @@ cashdo.co.il, 1 cashdrop.ga, 1 cashewmanufacturers.com, 1 +cashflowdiary.com, 0 cashflowstrategist.com, 0 cashforcarremovalsipswich.com.au, 1 cashfortulsahouses.com, 1 @@ -29220,6 +29196,7 @@ caspe.co, 1 caspeco.dk, 1 caspeco.no, 1 +casper.moi, 1 casperpanel.com, 1 caspi.org.il, 1 caspianlegal.com, 1 @@ -29228,6 +29205,7 @@ caspicards.com, 1 caspiconstruction.com, 1 caspiliving.com, 1 +cassclay.com, 1 casscoroadmi.gov, 1 casscountyia.gov, 1 casscountyil.gov, 1 @@ -29267,7 +29245,6 @@ castible.de, 1 castiel.cf, 1 castilla-comunera.tk, 1 -castillo.club, 1 castillosohail.es, 1 casting-vote.tk, 1 castingallaitaliana.com, 1 @@ -29285,6 +29262,7 @@ castlecapers.com.au, 1 castledurrow.com, 1 castleflame.fr, 1 +castlefordboxingacademy.com, 1 castlehack.ga, 1 castlekingdomstockport.co.uk, 1 castlekingkent.co.uk, 1 @@ -29313,6 +29291,7 @@ casualtime.ga, 1 casusgrillcaribbean.com, 1 cat-encyclopedia.ml, 1 +cat-litter-box.co.uk, 1 cat-problems.ml, 1 cat.casa, 1 cat.fo, 1 @@ -29334,6 +29313,7 @@ catalogobiblioteca.net, 1 catalogodoamor.com, 1 catalogosdemujer.com, 1 +catalogosvirtualesonline.com, 1 catalogueau.com, 0 catalojic.tk, 1 catalonia.tk, 1 @@ -29374,6 +29354,7 @@ catchteamca.gov, 1 catchthestars.org, 1 catchup-enschede.tk, 1 +catchyz.com, 1 catclouds.net, 1 catcontent.cloud, 1 catcoxx.com, 1 @@ -29512,6 +29493,7 @@ cave-browne-cave.com, 1 cave-reynard.ch, 1 cave-vet-specialists.co.uk, 1 +caveat-capital.com, 1 cavecreekaz.gov, 1 cavediverharry.com, 1 cavemax.com, 1 @@ -29535,6 +29517,7 @@ cba.ca, 1 cba.gov.pl, 1 cbaamaga.com, 1 +cbag.net, 1 cbbio.fr, 1 cbc-hire.co.uk, 1 cbc-network.org, 1 @@ -29626,7 +29609,6 @@ ccaptioning.com, 1 ccatpracticetest.com, 1 ccattestprep.com, 1 -ccautomobil.de, 1 ccb.gov, 1 ccbaltics.com, 1 ccbank.bg, 1 @@ -29665,7 +29647,6 @@ cchsthevoice.org, 1 cci.org.co, 1 cciiblog.tk, 1 -cciofficial.com, 1 ccis.rs, 1 cck-law.com, 1 cckguava.com, 1 @@ -29712,7 +29693,6 @@ cctv-supraveghere.ro, 1 cctv-systems.tk, 1 cctvlaw.ga, 1 -cctvonline.cz, 1 cctvsecurityjohannesburg.co.za, 1 cctvview.info, 1 ccu.plus, 1 @@ -29753,7 +29733,6 @@ cdgitalia.org, 1 cdhome.ga, 1 cdhqt.com, 1 -cdibtpjob.com, 1 cdigitale.com, 1 cdirectory.tk, 1 cdkeyprices.com, 1 @@ -29762,7 +29741,6 @@ cdlandb1.com, 1 cdlaserena.tk, 1 cdlinares.tk, 1 -cdlnaturals.com, 1 cdm.guru, 1 cdmcalsace.com, 1 cdmdisinfestazioni.it, 1 @@ -29823,7 +29801,7 @@ ceannard.net, 1 ceatheneum.com, 1 ceba-cuec.ca, 0 -cebek.co.uk, 0 +cebek.co.uk, 1 cebolinha-imaginaria.com, 1 cebrita.tk, 1 cec.com.es, 1 @@ -29912,6 +29890,7 @@ celebraze.tk, 1 celebrex.ga, 1 celebrex100mg.cf, 1 +celebrim.com, 1 celebritiesblog.tk, 1 celebritydailynews.ml, 1 celebrityfakes.tk, 1 @@ -29927,8 +29906,8 @@ celendo.ga, 1 celeraindustries.tk, 1 celesco.eu, 1 -celeste-energie.fr, 1 celestia.tk, 1 +celestial.ug, 1 celestialdental.com, 1 celestialenergies.com.au, 1 celestialmusic.tk, 1 @@ -29969,6 +29948,7 @@ celmedia.cl, 1 celseven.com, 1 celsoazevedo.com, 1 +celta.cl, 1 celtacad.tk, 1 celti.ie.eu.org, 1 celti.name, 1 @@ -30031,6 +30011,7 @@ centexlegal.com, 1 centextlegal.com, 1 centextlitigationservices.com, 1 +centigen.ai, 1 centillionss.com, 1 centimark.com, 1 centio.bg, 1 @@ -30043,6 +30024,7 @@ centralbank.ae, 1 centralbetsers.ga, 1 centralbetsest.ga, 1 +centralcityjuniorkindergarten.com, 1 centralcoasthomeloans.com.au, 1 centralcoaststadium.com.au, 1 centralconvergence.com, 1 @@ -30057,7 +30039,7 @@ centralhaat.com, 1 centralhome.com, 1 centralhq.tk, 1 -centralimpressos.com.br, 0 +centralhub.tech, 1 centralisgroup.com, 0 centralitasbaratas.es, 1 centralkladno.cz, 1 @@ -30074,7 +30056,6 @@ centralstor.ga, 1 centralvalleyharness.org, 1 centralvoice.org, 1 -centrationgame.com, 1 centre-commercial.fr, 1 centre-equestre.net, 1 centre-maiakovski.fr, 1 @@ -30103,7 +30084,6 @@ centroestetico.it, 1 centrofotostudija.lt, 1 centrofugi-pipeti-elta90.com, 1 -centrogaiamexico.com, 1 centrokiri.cl, 1 centrolavoro.org, 1 centromedico.tk, 1 @@ -30148,6 +30128,7 @@ centurytiling.com.au, 1 ceomanipur.nic.in, 1 ceomonthlyest.ga, 1 +cepalabs.cl, 1 cephalexin.ga, 1 cephalexincapsules.ml, 1 cephalexincapsules.tk, 1 @@ -30181,7 +30162,6 @@ cerebrito.com, 1 cerebrito.net, 1 cerebrosano.gov, 1 -cerebrum.com, 1 cerecup.com, 0 ceredowv.gov, 1 ceremonial-magic.com, 1 @@ -30192,6 +30172,7 @@ ceres-corp.org, 0 cerezacomunicacion.com, 1 cerfid.com.pe, 1 +cerinrosario.com.ar, 1 ceris.com, 1 cernac.cz, 1 cernakova.eu, 1 @@ -30206,6 +30187,7 @@ cerrad.com.ua, 1 cerrajeriaamericadelquindio.com, 1 cerrajeriaenvillavicencio.com, 1 +cerratolimo.com, 1 cerritosca.gov, 1 cerrogordo.gov, 1 cerstve-korenie.sk, 1 @@ -30253,6 +30235,7 @@ certnazionale.it, 1 certo-escrow.com, 1 certos.com, 1 +certowl.io, 1 certp.fr, 1 certprep.fr, 0 certpro.uk, 1 @@ -30269,7 +30252,6 @@ cerveny.ch, 1 cervenyjezek.eu, 1 cervera.cat, 1 -cervera.com.br, 1 ces-ltd.co.uk, 0 ces-ltd.com, 1 cesame.ca, 1 @@ -30300,6 +30282,7 @@ cestasdepresente.com.br, 1 cestasedelicias.com.br, 1 cestaswmonline.com.br, 1 +cestgada.com, 1 cestinavass.lol, 1 cestpasviolent.com, 1 cestujnamiru.cz, 1 @@ -30311,12 +30294,14 @@ cetak.com.my, 1 cetamol.com, 1 cetangyuk.com, 1 +cetayadigital.com, 1 cetelem.pt, 1 cetelon.tk, 1 ceti.ga, 1 cetin.cz, 1 cetong.se, 1 cetorebe.tk, 1 +ceu.bg, 1 ceu.edu.ph, 1 ceuniverse.com, 0 ceva-dsp.com, 1 @@ -30411,7 +30396,6 @@ cgconsulting.digital, 1 cgdct.moe, 1 cgelves.com, 1 -cgestiona.com, 0 cgeventoseturismo.com.br, 1 cggs.vic.edu.au, 1 cggsaquatic.com.au, 1 @@ -30420,7 +30404,6 @@ cgknieuwpoort.nl, 1 cglib.xyz, 1 cgmllc.net, 1 -cgo-it.de, 1 cgo.pw, 1 cgp.moe, 1 cgpa-de.org, 1 @@ -30430,7 +30413,6 @@ cgplumbingservice.com, 0 cgps.ch, 1 cgsmart.com, 1 -cgsmotors.com, 1 cgstprayagraj.gov.in, 1 cgt-univ-nantes.fr, 1 cgtburgos.org, 1 @@ -30467,7 +30449,6 @@ chadi.io, 1 chadis.com, 1 chadlenz.ca, 1 -chadstoneapartments.com.au, 1 chadtaljaardt.com, 1 chaghi.tk, 1 chaghionline.tk, 1 @@ -30609,7 +30590,6 @@ chantage.tk, 1 chantalflores.co.uk, 1 chantellbeauty.co.uk, 1 -chantierjob.com, 1 chantuong.org, 1 chanty.com, 1 chanz.com, 1 @@ -30771,6 +30751,7 @@ chasebenefits.com, 1 chasecountyne.gov, 1 chasetrails.co.uk, 1 +chaseyoursky.com, 1 chaskafire.gov, 1 chaskamn.gov, 1 chaskapolice.gov, 1 @@ -30788,7 +30769,6 @@ chat4me.tk, 1 chataberan.cz, 1 chatacademies.org.uk, 1 -chatalmuluk.com, 1 chatarpaullaw.com, 1 chataynazz.ga, 1 chatbarran.tk, 1 @@ -30914,16 +30894,18 @@ cheapervacations.com, 1 cheapessay.net, 1 cheapestdirectdebit.co.uk, 1 -cheapestgamecards.com, 1 +cheapestwaytofly.com, 1 cheapestwebcamsites.com, 1 cheapexpenseers.ga, 1 cheapexpenseest.ga, 1 +cheapfareto.com, 1 cheapflightatlanta.com, 1 cheapflightla.com, 1 cheapflightmexico.com, 1 cheapflightsengland.com, 1 cheapflightsticketstoindia.com, 1 cheapiesystems.com, 1 +cheapinternationalair.com, 1 cheaplasix.tk, 1 cheaplookers.ga, 1 cheaplookest.ga, 1 @@ -30977,6 +30959,7 @@ checka.co.nz, 1 checkandreportlive.com, 1 checkaninvoice.com, 1 +checkbarriere.de, 1 checkblau.de, 1 checkbooknyc.com, 1 checkbot.io, 1 @@ -30991,6 +30974,7 @@ checkfresh.com, 1 checkiday.com, 1 checkingfinder.com, 1 +checkingwork.io, 1 checkjelinkje.nl, 1 checklistbuilder.herokuapp.com, 1 checkmack.cf, 1 @@ -31003,10 +30987,12 @@ checkmin.cf, 1 checkmk.com, 1 checkmyhttps.net, 1 +checkmypageseo.com, 1 checkmypsoriasis.com, 1 checknetworks.com.au, 1 checkngo.com, 1 checkout.google.com, 1 +checkoutexpert.com, 1 checkprograms.com, 1 checkprograms.net, 1 checkr.com, 0 @@ -31015,13 +31001,12 @@ checkrente.nl, 1 checkreview.in, 1 checkrz.com, 1 -checksandbalancesproject.org, 1 checksoft.net, 1 checkspf.net, 1 +checktheworth.com, 1 checktls.nl, 1 checktype.com, 1 checkui.com, 1 -checkurinsurance.com, 1 checkwebsites.net, 1 checkyourmath.com, 1 checkyourprivilege.org, 1 @@ -31044,6 +31029,7 @@ chefaa.com, 1 chefcentral.co.uk, 1 chefcuisto.com, 1 +chefdeck.ai, 1 chefdehome.com, 1 chefforaday.it, 1 chefkentrathbun.com, 1 @@ -31080,8 +31066,8 @@ chelyabinsk-news.net, 1 chema.ga, 1 chemapool.bg, 1 -chemaxon.com, 1 chemengzone.com, 1 +chemeroid.com, 1 chemgenes.com, 1 chemica-us.com, 1 chemical-shark.de, 1 @@ -31130,6 +31116,7 @@ chenyin.work, 1 chequeado.com, 1 chequeo.de, 1 +chequer.software, 1 chequeraccounting.com.au, 1 cheratocono.tk, 1 cherbourg.website, 1 @@ -31176,7 +31163,6 @@ chesolar.cz, 1 chess.katowice.pl, 1 chesspoint.ch, 1 -chesstempo.com, 1 chessustron.pl, 1 chessveterinary.co.uk, 1 chesswiki.org, 1 @@ -31273,7 +31259,6 @@ chietech.com.br, 1 chietitoday.it, 1 chifeng.com.tw, 1 -chiffrer.info, 1 chigwelltreeservices.co.uk, 1 chijb.cc, 1 chikahaku1001vr.jp, 1 @@ -31343,10 +31328,10 @@ chimcanhcut.tk, 1 chime.com, 1 chimebank.com, 1 -chimera.sh, 1 chimerity.com, 1 chimesmusic.com, 1 chimesnewspaper.com, 1 +chimichat.com, 1 chimm.cc, 1 chimpanzee.cf, 1 chimpanzee.net, 1 @@ -31373,7 +31358,6 @@ chinalosers.com, 1 chinamemo.com, 1 chinaoptionsfund.cn, 1 -chinaoptionsfund.com, 1 chinaql.com, 1 chinasearch.tk, 1 chinaseminar.com, 1 @@ -31387,7 +31371,6 @@ chinefrancophonie.fr, 1 chinen-hs41.com, 1 chinese-fuhui.com, 1 -chinese.sc, 1 chinesebrides.ml, 1 chinesedishes.tk, 1 chinesepen.org, 1 @@ -31424,7 +31407,6 @@ chips-scheduler.de, 1 chips.gov, 1 chipset.no, 1 -chipsfuck.fish, 1 chiquian.tk, 1 chirache.com, 1 chirache.fr, 1 @@ -31562,7 +31544,6 @@ chopradionet.tk, 1 choptheknife.com, 1 chordiant.com, 1 -chordify.net, 1 chordmag.com, 1 chordpage.com, 1 chordu.com, 1 @@ -31816,6 +31797,7 @@ chronocarpe.com, 1 chronocolis.ml, 1 chronodelivery.com, 1 +chronology.no, 1 chronometre-en-ligne.com, 1 chronoshop.cz, 0 chronotech.fr, 1 @@ -31899,7 +31881,6 @@ churchillcountynv.gov, 1 churchilldowns.com, 1 churchillhealthcentre.com, 1 -churchlinkpro.com, 1 churchlw.tk, 1 churchmetrics.com, 1 churchofchrist.tk, 1 @@ -32044,7 +32025,6 @@ cimerek.hu, 1 cimetierenotredamedesneiges.ca, 1 cimfax.com, 1 -cimice.it, 1 cimsp.com, 1 cimsp.net, 1 cimtools.net, 1 @@ -32095,7 +32075,6 @@ cinerariosgruporosete.com, 1 cinet.jp, 1 cineterror.tk, 1 -cinevia.org, 1 cinexilio.tk, 1 cinicloud.com, 1 cinicsystems.tk, 1 @@ -32266,6 +32245,7 @@ citiledger.ga, 1 citiswich.com.au, 1 citius.gal, 1 +citizen-shield.com, 1 citizen428.net, 1 citizenewatch.tk, 1 citizenkevin.com, 0 @@ -32308,7 +32288,6 @@ citycreek.studio, 1 citycreekdental.net, 1 citycricket.tk, 1 -cityfacialplastics.com, 1 cityfinances.lv, 1 cityhide.tk, 1 cityhotel.tk, 1 @@ -32524,13 +32503,13 @@ civictheatrenewcastle.com.au, 1 civicunicorn.com, 1 civicunicorn.us, 1 -civil-works-sri.com, 1 civilbikes.com, 1 civilconcretellc.com, 1 civilengineeringhandbook.tk, 1 civilhost.tk, 1 civiliansnews.com, 1 civillines.nl, 1 +civilsimple.com, 1 civiltoday.com, 1 civilvirus.tk, 1 civmob.com, 1 @@ -32602,6 +32581,7 @@ cktennis.com, 1 ckwebsitedesign.ie, 1 ckyalliancefinland.tk, 1 +ckycindia.in, 1 cl-1xbet.com, 1 cl-cloud.spdns.org, 1 cl.search.yahoo.com, 0 @@ -32623,14 +32603,13 @@ claimittexas.gov, 1 claimmosaic.com, 1 claimnote.com, 1 -claimpilot.com, 1 +claimpilot.com, 0 claimsadj.com, 1 claimspharmacy.services, 1 clairebabai.nl, 1 clairegold.com, 1 clairelefort-architectes.com, 1 clairescastles.co.uk, 1 -clairesvall.com, 1 clairette-de-die-lantheaume.fr, 1 clairevoyance.tk, 1 claitec.com, 1 @@ -32800,6 +32779,7 @@ claude.me, 1 claude.photo, 1 claude.site, 1 +claudeapi.com, 0 claudearpi.in, 1 claudearpi.net, 1 claudeleveille.com, 0 @@ -32820,6 +32800,7 @@ claustrofobia.tk, 1 clautopieces.fr, 1 clave2000.com.co, 1 +claveframework.org, 1 clavit4.zone, 1 clawedfrogs.tk, 1 clawington.com, 0 @@ -32838,7 +32819,6 @@ clazzor.eu, 1 clcakes.au, 1 clcakes.com.au, 1 -clclawncare.com, 1 clco.fr, 1 clcv-brest.fr, 1 cldejessey.com, 1 @@ -32849,7 +32829,6 @@ clean-mailbox.com, 1 clean-water-and-sanitation.tk, 1 cleanairdallaspro.com, 1 -cleanandcleaner.net, 1 cleanclearwater.co.uk, 1 cleandetroit.org, 1 cleandrains.com.au, 1 @@ -32870,7 +32849,6 @@ cleanmycurtains.ie, 1 cleanmyfloor.ie, 1 cleanmymattress.ie, 1 -cleanmyupholstery.ie, 1 cleanpeakmascot.com.au, 1 cleanpouches.com, 1 cleanpowerbg.com, 1 @@ -32883,7 +32861,6 @@ cleanslate.sh, 1 cleanspeak.com, 1 cleansquad.in, 1 -cleansweepaa.com, 1 cleantec.show, 1 cleanuri.com, 1 cleanway.dk, 1 @@ -32919,7 +32896,6 @@ clearpicturelegalvideo.com, 1 clearpoint.org, 1 clearpointcreditcounselingsolutions.org, 1 -clearsafetalk.com, 1 clearsailingproperties.com, 1 clearsoftcomputacion.com, 1 clearstone.au, 1 @@ -32960,6 +32936,7 @@ clementsfamily.co, 1 clemta.com, 1 clendeninwv.gov, 1 +cleo-energy.com, 1 cleo.com, 1 cleocinonline.gq, 1 cleopatraescorts.co.uk, 1 @@ -32987,6 +32964,7 @@ clevermo.gov, 1 cleveroad.com, 1 cleveronmobility.com, 1 +clevertp.com, 1 cleververmarkten.com, 1 cleververmarkten.de, 1 clevisto.com, 1 @@ -33030,7 +33008,6 @@ clica.net, 1 click-7979.com, 1 click-cat.tk, 1 -click-generator.com, 1 click2affiliate.xyz, 1 click4click.ga, 1 clickandclaim.me, 1 @@ -33058,7 +33035,6 @@ clickipo.com, 1 clickkon.ml, 1 clicknbook.de, 1 -clickotine.com, 1 clickpeak.digital, 1 clickpharmacy.co.uk, 1 clickphobia.ga, 1 @@ -33160,7 +33136,6 @@ clinicalresearch.my, 1 clinicalsolutions.se, 1 clinicalstats.ga, 1 -clinicaltrialpodcast.com, 1 clinicaltrials.gov, 1 clinicaltrialsarena.com, 1 clinicamagdalena.com.co, 1 @@ -33210,8 +33185,10 @@ clipfor.ge, 1 clipperai.com, 1 clips.ga, 1 +clipverse.studio, 1 cliqit.com.au, 1 cliquetis.ddns.net, 1 +clirnet.com, 1 clive.io, 1 cliveptr.cc, 1 clkbw.com, 1 @@ -33223,7 +33200,7 @@ clnlboard.co.uk, 1 clnnet.ch, 1 clnshrk.club, 0 -cloaker.ru, 0 +cloaker.ru, 1 clochix.net, 1 clock3.com, 1 clockcaster.com, 1 @@ -33232,10 +33209,10 @@ clockka.it, 1 clocklab.design, 1 clocklink.com, 1 +clockworkcrm.com, 1 clodo.it, 1 clodoteam.ga, 1 clog.rocks, 1 -clojurefactory.io, 1 clokdways.com, 1 clomid100mg.ga, 1 clomid50mg.cf, 1 @@ -33317,6 +33294,7 @@ cloudbreaker.net, 1 cloudbrothers.info, 0 cloudbytesconnect.com, 1 +cloudcampuspro.com, 1 cloudcaprice.net, 1 cloudcastles.xyz, 1 cloudcert.org, 1 @@ -33426,6 +33404,7 @@ cloudturing.com, 1 cloudu.de, 1 cloudup.com, 1 +cloudvante.com, 1 cloudvante.com.au, 1 cloudvoor.eu, 1 cloudvoor.net, 1 @@ -33434,6 +33413,7 @@ cloudwave.fr, 1 cloudwayc.com, 1 cloudwayq.com, 1 +cloudwebschool.com, 1 cloudwellmarketing.com, 1 cloudwithlightning.net, 1 cloudykingdom.com, 1 @@ -33487,7 +33467,6 @@ club-soul.tk, 1 club.zj.cn, 1 club1.fr, 1 -club10x.com, 1 clubanimal.cl, 1 clubapk.com, 0 clubatleticonacionalpotosi.tk, 1 @@ -33510,7 +33489,6 @@ clubedegeografia.tk, 1 clubedoberloque.com.br, 1 clubedogis.com.br, 1 -clubedohardware.com.br, 1 clubedojornalismo.com.br, 1 clubedores.com.br, 1 clubeflor.com.br, 1 @@ -33574,7 +33552,7 @@ clubvwgolf.com, 1 clubyachats.com, 1 clubzap.org, 1 -clubzero.co, 1 +clubzero.co, 0 clubzul.com, 1 cluecho.com, 1 cluedosenvivo.com, 1 @@ -33586,7 +33564,6 @@ cluin.org, 1 cluj.help, 1 cluj24.ro, 1 -clun.top, 0 clurinternational.com, 1 clush.pw, 1 cluster.biz.tr, 1 @@ -33600,7 +33577,6 @@ clycat.ru, 1 clyde-tx.gov, 1 clydewi.gov, 1 -cm-agueda.pt, 1 cm-funchal.pt, 1 cm-lagos.pt, 1 cm-law.eu, 1 @@ -33638,6 +33614,7 @@ cmlcpa.ca, 1 cmlex.com, 1 cmlignon.ch, 1 +cmmcinfo.org, 1 cmn-group.com, 0 cmn-groupe.com, 0 cmngroup.com, 0 @@ -33686,7 +33663,6 @@ cn.search.yahoo.com, 0 cn2euportugal.com, 1 cn8522.com, 1 -cna-ecuador.com, 1 cnabogota.tk, 1 cnais.com, 1 cnam-idf.fr, 1 @@ -33702,7 +33678,6 @@ cncn3.cn, 1 cncollege.tk, 1 cncr.ga, 1 -cncs.gov.pt, 1 cnet.com, 1 cnetion.com, 1 cnetw.xyz, 1 @@ -33728,9 +33703,11 @@ cnsbordercellatlas.org, 1 cnslub.ru, 1 cnss.gob.do, 1 +cntl.kz, 1 cntr.fr, 1 +cntras.com, 1 cntraveller.com, 1 -cnv-academy.com, 1 +cnv-academy.com, 0 cnvt.fr, 1 cnxiangxian.com, 1 cnzhengmai.com, 1 @@ -33762,7 +33739,6 @@ coachment.dk, 1 coachnow.io, 1 coachparts.com, 1 -coachspiritual.ro, 1 coactive.ai, 0 coag.gov.au, 1 coalcountyok.gov, 1 @@ -33810,6 +33786,7 @@ cobracastles.co.uk, 1 cobralelie.nl, 1 cobranzasimg.com, 1 +cobs.si, 1 coc.de, 1 coca-colasip.com, 1 cocaine.ninja, 1 @@ -33880,12 +33857,14 @@ codabix.de, 1 codandn.com, 1 codastory.com, 1 +codatey.top, 1 codcourier.org, 1 code-35.com, 0 code-ch.com, 1 code-gen.ca, 1 code-in-plate.tk, 1 code-judge.tk, 1 +code-maze.com, 1 code-poets.co.uk, 1 code-server.host, 1 code-styling.de, 1 @@ -33896,12 +33875,14 @@ code.golf, 1 code.google.com, 1 code.gov, 1 +code0.ai, 1 code4rena.com, 1 code972.com, 1 codeable.dk, 1 codeactive.fr, 1 codeactive.net, 1 codeaegis.com, 1 +codeally.dk, 1 codeandpeace.com, 1 codeandsupply.co, 1 codeberg.org, 1 @@ -33961,9 +33942,9 @@ codenlife.kr, 1 codenlife.xyz, 1 codenode.io, 1 +codeon.ch, 1 codeops.com.tr, 1 codeparva.com, 1 -codepathstudio.com, 1 codepen.com, 1 codepen.io, 1 codephusion.com, 1 @@ -33990,6 +33971,7 @@ codersatlas.co, 1 codersatlas.xyz, 1 coderus.com, 1 +codes-team.com, 1 codes.pk, 1 codesal.solutions, 1 codesandbolts.com, 1 @@ -34033,7 +34015,6 @@ codex.rocks, 1 codexdigital.com, 1 codexio.in, 1 -codexlog.com, 1 codezenith.com, 1 codezeno.com.au, 1 codice-rosso.net, 1 @@ -34060,7 +34041,7 @@ codinghomeworkhelp.net, 1 codinginfinity.me, 1 codingnbb.com, 1 -codingpark.io, 1 +codingpark.io, 0 codingpedia.org, 1 codingrobots.com, 1 codingwithvera.com, 1 @@ -34111,7 +34092,9 @@ coffeewithsvein.com, 1 coffeist.com, 1 coffer.fi, 1 +coffeyagencies.com, 1 coffstotalroofing.com.au, 1 +cofidis-business.it, 1 cofidisperte.it, 1 cofinco.nl, 1 coforge.com, 1 @@ -34188,30 +34171,31 @@ coinpaprika.com, 1 coinpedia.org, 1 coinplay.com, 1 +coinport.com.au, 1 coinrule.com, 1 coins2001.ru, 1 coinscatalog.net, 1 coinsconnect.co.uk, 1 -coinsmat.com, 1 coinsuggest.com, 1 cointosh.jp, 1 cointotaal.com, 1 coinwind.vip, 1 coinx.pro, 1 coiracom.net, 1 -coisapet.com.br, 1 cojam.ru, 1 cojo.eu, 1 cokebar.info, 0 coker.com.au, 1 cokestudiosongs.tk, 1 cokoli.cz, 1 +col-reg.online, 1 col.la, 0 cola-host.tk, 1 colaba.online, 1 colaborame.tk, 1 colaboratorija.lt, 1 colabug.com, 1 +colace.me, 1 colafoodcritic.com, 1 colah.com.au, 1 colapsys.net, 1 @@ -34224,7 +34208,6 @@ colazxk.xyz, 1 colbert.ml, 1 colburnadamswi.gov, 1 -colchesterglobal.com.au, 1 colcomm.com, 1 cold.world, 1 coldcard.com, 1 @@ -34258,7 +34241,6 @@ coleg.gov, 1 colegiocuauhtzin.com.mx, 1 colegiojaimebalmes.es, 1 -colegios.net, 1 colegiotalenti.com, 1 colegiotavera.tk, 1 colemak.com, 1 @@ -34339,7 +34321,6 @@ collector.cf, 1 collectorknives.net, 1 collectorscorner.com, 1 -collectorsystems.com, 1 college-chagall.tk, 1 college-ic.ca, 1 college-sewing.co.uk, 1 @@ -34405,6 +34386,7 @@ collioure.com, 1 colloque-tv.com, 1 colloquio.tk, 1 +collorossodermatology.com, 1 colmcille.org, 1 colnevalleyvets.co.uk, 1 colo-tech.com, 1 @@ -34446,7 +34428,6 @@ colorblindprogramming.com, 1 colorbond.vn, 1 colorbrightongreen.org, 1 -colorcodedlyrics.com, 1 colordetector.click, 1 colorectalpractice.com, 1 colorfularchive.eu.org, 1 @@ -34466,6 +34447,7 @@ colorline.com.br, 1 colorpalette.org, 1 colorpicker.fr, 1 +colorpop.ai, 1 colors.top, 1 colorsbycarin.com, 1 colortronic.tk, 1 @@ -34538,6 +34520,7 @@ comanchecountyks.gov, 1 comanchenationpolice.gov, 1 comanchetexas.gov, 1 +comanda.plus, 1 comanis.fr, 1 comaporter.com, 1 comarcadelaranda.tk, 1 @@ -34567,7 +34550,6 @@ come.ga, 1 come2cook.com, 1 comealong.org, 1 -comeals.com, 1 comeback.no, 1 comebookmark.cf, 1 comebookmark.ga, 1 @@ -34594,6 +34576,7 @@ comet-xray.com, 1 comet.eu.org, 1 comet.tech, 1 +cometa.ro, 1 cometbot.cf, 1 comete-electricite.fr, 1 cometer.co, 1 @@ -34605,7 +34588,6 @@ comex.biz, 1 comfandivirtual.com.co, 1 comff.net, 1 -comfinagro.com.co, 1 comfintouch.com, 0 comfis.nl, 1 comfitsweets.co.uk, 1 @@ -34675,7 +34657,6 @@ commercia.srl, 1 commercial.lviv.ua, 1 commercialbankms.com, 1 -commercialbtp.com, 1 commercialfundinggroupllc.us, 1 commercialkitchensusa.com, 1 commerciallendingusa.com, 1 @@ -34777,13 +34758,11 @@ comp4u.de, 1 compab.it, 1 compactador-vendetta.tk, 1 -compactloan.com, 1 compagnidimerenda.tk, 1 compagniecoupable.fr, 1 compagniedesateliers.com, 0 compagniedesvoyageurs.com, 1 compagniemartin.com, 0 -compagnonsbtp.com, 1 companion-web.net, 1 company-bike.com, 1 company-info-plugins.nl, 1 @@ -34795,12 +34774,12 @@ comparamejor.com, 1 comparatif-moto.fr, 1 comparativadetarifasenergeticas.es, 1 -comparazionequote.net, 1 compare-energie.fr, 1 compareairfaredeals.com, 1 compareer.com, 1 compareleasedlines.co.uk, 1 comparemymobile.com, 1 +compareo.au, 1 compareshow.com, 1 comparesoft.com, 1 comparetaxsoftware.com, 1 @@ -34821,6 +34800,7 @@ compattatori.it, 1 compdermcenter.com, 1 compensadosbello.com.br, 1 +compete4ever.com, 1 competencyassessment.ca, 1 competis.cf, 1 competitiontree.com, 1 @@ -34849,7 +34829,6 @@ complex-organization.com, 1 complexart.ro, 1 complexcoral.ro, 1 -complexorganization.com, 1 complexsystems.fail, 1 compliance-risk.com, 1 compliance-systeme.de, 1 @@ -34858,9 +34837,9 @@ compliancefox.io, 1 compliancehome.com, 1 complianceinsight.ca, 1 -compliancequest.com, 1 compliancerisksoftware.co.uk, 0 compliancessentials.com, 1 +compliantclaw.com, 1 complianz.io, 1 complicescreatifs.com, 1 complifast.com.au, 1 @@ -34871,6 +34850,7 @@ complycheck.co, 1 complyfast.com.au, 1 complyfast.net.au, 1 +complyzero.com, 1 componentcore.com, 1 composite-isfahan.ir, 1 compositedevtec.tk, 1 @@ -34939,7 +34919,7 @@ computerforum.tk, 1 computerforums.net, 1 computerhilfe-feucht.de, 1 -computerinfobits.com, 1 +computerinfobits.com, 0 computerjet.ru, 1 computermaus.com, 1 computernetwerkwestland.nl, 1 @@ -35163,7 +35143,6 @@ congmc.com, 1 congnghe.so, 1 congoproject.tk, 1 -congregacionmitacol.org, 0 congresistas-ap.tk, 1 congresodelospueblos.org, 1 congressmankirk.com, 1 @@ -35232,7 +35211,6 @@ connexio.digital, 1 connext.de, 1 connextglobal.com, 1 -connictro.de, 1 connieetterphotography.com, 1 conning.com, 1 connock.co.uk, 1 @@ -35248,6 +35226,7 @@ conoha.vip, 1 conorbyrd.com, 1 conorjwryan.com, 1 +conorte.mx, 1 conory.com, 1 conova.com, 1 conpins.nl, 1 @@ -35282,7 +35261,6 @@ consegne.it, 1 conseildesarts.ca, 1 conseilgouz.com, 1 -conseiller-juridique.ca, 1 conseils-immo.fr, 1 conseilsmarketing.com, 1 consejoescolar.org, 1 @@ -35326,7 +35304,6 @@ constancescharff.com, 1 constant-rough.de, 1 constant.ga, 1 -constanta2035.ro, 1 constantinocontabilidade.com, 1 constantinschreiber.me, 1 constcorrect.com, 1 @@ -35371,7 +35348,7 @@ consultar.io, 1 consultation.ai, 1 consultation.biz.tr, 1 -consultaveiculopelaplaca.com.br, 1 +consultcolin.eu, 1 consultg.ltd, 1 consultimator.com, 1 consulting-brokerage.tk, 1 @@ -35409,12 +35386,15 @@ consumershempmd.com, 1 consumertesting.com, 1 consumidor.gov, 1 +consumoempauta.com.br, 1 consumptionjunction.com, 1 +consumr.ai, 1 consuwijzer.nl, 1 consyltec.de, 1 contabilidadebhpampulha.com.br, 1 contabilidadebrooklin.com.br, 1 contabilidademassarelli.com.br, 1 +contabooks.md, 1 contact-checker.tk, 1 contact.inc, 1 contact.xyz, 1 @@ -35430,6 +35410,7 @@ contato.vip, 1 contecgmbh.com, 1 contempfleury.com, 1 +contemplativeeducation.org, 1 contemptevoke.com, 1 contenedoresdereciclaje.online, 1 contentcaching.com, 1 @@ -35438,6 +35419,7 @@ contents.ga, 1 contermis.com, 1 contestreviewest.ga, 1 +contextcapture.ai, 1 contextolog.cf, 1 conti-profitlink.co.uk, 1 contiinex.com, 1 @@ -35461,6 +35443,7 @@ contractdirectory.gov, 1 contractorhoustontx.com, 1 contractormountain.com, 1 +contractorsiq.ca, 1 contractorswestga.com, 1 contractwriters.com, 1 contrafactos.tk, 1 @@ -35478,6 +35461,7 @@ contratti.it, 1 contrattipubblici.org, 1 contrel.be, 1 +contribution-margin.com, 1 contributopia.org, 1 contributor.google.com, 1 contro.cf, 1 @@ -35524,12 +35508,14 @@ conversationexchange.com, 1 conversatis.cf, 1 converser.tk, 1 +conversionkings.com.au, 1 conversive.nl, 1 convert-fast.photos, 1 convert.im, 1 convert.io, 1 convert2sql.com, 1 converterkits.com, 1 +convertiam.com, 1 converting.click, 1 convertire-documenti.it, 1 convertr.io, 1 @@ -35596,7 +35582,6 @@ cool110.xyz, 1 coolabaroo.com.au, 1 coolagent-dokumenty.cz, 1 -coolansplanet.com, 1 coolattractions.co.uk, 1 coolblockschool.org, 1 coolboys.ga, 1 @@ -35796,6 +35781,7 @@ corentin-et-rosalie.fr, 1 corepacks.tk, 1 corepartners.com.ua, 1 +corepersonaltrainersmelbourne.com, 1 corephysicians.org, 1 corerad.net, 1 coresecret.de, 1 @@ -35848,7 +35834,6 @@ cornercafe.tk, 1 cornercircle.co.uk, 1 cornergarage.coop, 0 -cornerperk.com, 1 cornerstone.rocks, 1 cornerstonebuildingbrands.com, 1 cornerstonenorthwest.com, 1 @@ -35884,6 +35869,7 @@ coronavirustesting.gov, 1 coronersconnect.co.uk, 1 cororocierodebelen.tk, 1 +corover.ai, 1 corp.goog, 1 corpconsulting.com, 1 corpdocs.com.au, 1 @@ -35932,7 +35918,6 @@ correo-e.mx, 1 correo.club, 1 correo.si, 1 -correotemporal.org, 1 correspond.gq, 1 correspondent.ga, 1 corretoramichelesalvino.com.br, 1 @@ -35971,6 +35956,7 @@ cortestesisat.net, 1 cortex-development.de, 1 cortex-tickets.de, 1 +cortexedi.com, 1 cortexsage.com, 1 cortezco.gov, 1 cortezsanitation.gov, 1 @@ -36051,12 +36037,10 @@ cosmoschaos.net, 1 cosmosearch-azerbaijan.tk, 1 cosmosenalerta.tk, 1 -cosmosfala.com.br, 1 cosmosmkt.com.mx, 1 cosmowords.games, 1 cosmoz.ga, 1 cosmundi.de, 1 -cosmv.org, 1 cosni.co, 1 cosos.gov, 1 cospier.com, 1 @@ -36065,16 +36049,13 @@ cospol.ch, 0 cosset.com.tw, 1 costa-ballena.tk, 1 +costa-blanca.space, 1 costalinux.tk, 1 costaneranorte.cl, 1 costaricadreamers.com, 1 costaricanvillas.com, 1 costazulinmobiliaria.com, 1 -costco.co.jp, 1 -costco.co.kr, 1 -costco.co.nz, 1 -costco.co.uk, 1 -costco.com.au, 1 +costclock.ai, 1 costcoinsider.com, 1 costel.tk, 1 costelcom.co, 1 @@ -36130,6 +36111,7 @@ couetteduvet.fr, 1 cougar-bordeaux.fr, 1 coughlan.de, 1 +coughstep.com, 1 could.jp, 1 couleur-lavande.com, 1 couleursorgue.tk, 1 @@ -36168,10 +36150,10 @@ country-muziek.nl, 1 countryandroses.com, 1 countrybrewer.com.au, 1 +countryfresh.com, 1 countryfunders.com, 1 countrygrid.com, 1 countryhearthbedandbreakfast.com, 1 -countryherald.com, 1 countrymountaininn.com, 1 countrymusicchart.net, 1 countryoutlaws.ca, 1 @@ -36193,11 +36175,15 @@ coupestanley.com, 1 couplay.org, 1 couplesapp.co, 1 +couplesroom.com, 1 coupona.co.il, 1 +couponarrow.com, 1 couponava.com, 0 couponchief.com, 0 +couponcode.co.il, 1 couponcodesme.com, 1 couponim.co.il, 1 +couponoy.com, 1 couponsale.tk, 1 couponzil.com, 0 courage-sachsen.org, 1 @@ -36265,7 +36251,7 @@ couverture-barre.fr, 1 cov.com, 1 covar.com.co, 1 -cove.chat, 1 +covenco.com, 1 coventa.cl, 1 coventry.com, 1 coventrycollege.ac.uk, 1 @@ -36289,7 +36275,7 @@ covershousing.nl, 1 covert.sh, 1 covery.ai, 1 -coveteur.com, 1 +coveteur.com, 0 covettrading.com, 0 covid-19.nhs.uk, 1 covid-19advice.com, 1 @@ -36321,7 +36307,6 @@ covisa.cl, 1 covisian.com, 0 covoiturage.fr, 1 -covybrat.cz, 1 cowbird.org, 1 cowcreek-nsn.gov, 1 coweasy.com, 1 @@ -36427,10 +36412,10 @@ cpsq.fr, 1 cpstest.live, 1 cpstest.org, 1 +cptcreative.com, 1 cptoon.com, 1 cpts-tdm16.fr, 1 cptvl.de, 1 -cpu.biz.tr, 1 cpu.wiki, 1 cpucheu.com, 1 cpufanshop.ga, 1 @@ -36517,7 +36502,6 @@ craftinghand.com, 0 craftist.de, 1 craftmachinec.com, 1 -craftmenu.ru, 1 craftmeow.com, 1 craftmeow.support, 1 craftottawa.ca, 1 @@ -36527,7 +36511,7 @@ crafttalk.tk, 1 craftwarehouse.com, 1 craftwmcp.xyz, 1 -craftychameleonbar.com, 1 +craftychameleonbar.com, 0 craftycove.store, 1 craftydev.design, 1 craftyguy.net, 1 @@ -36649,9 +36633,7 @@ crcc-center.com, 1 crcmc.com.tw, 1 crcncc.org, 1 -crcprojects.in, 1 crcr.pw, 1 -cre-pf.org.au, 0 cre8ivedeals.com, 1 crea-shops.ch, 0 crea.bg, 1 @@ -36671,6 +36653,7 @@ cream-dream.com.ua, 0 creamcastles.co.uk, 1 creamfields.com, 1 +creamlanddairy.com, 1 creamosweb.co, 1 creampiepussytube.com, 1 creamsoft.com, 1 @@ -36679,6 +36662,7 @@ creand.es, 1 creandgroup.com, 1 creandoydesarrollando.com, 1 +creaphism.com, 1 crear-webs-baratas.com, 0 creared.edu.co, 1 crearesiteweb.tk, 1 @@ -36697,8 +36681,9 @@ createcpanama.com, 1 creategyx.ga, 1 createit.com, 1 +createitwithcottage.com, 1 creately.com, 1 -createmvp.com, 1 +createstoke.com, 1 createstudios.com.au, 0 createurshub.com, 1 createwithcynthia.com, 1 @@ -36708,6 +36693,7 @@ creationfox.gq, 1 creations-edita.com, 1 creationsdharmonie.com, 1 +creatisa.cz, 1 creative-cinema.cloud, 1 creative-cinema.de, 1 creative-wave.fr, 1 @@ -36740,7 +36726,6 @@ creativemindslms.tk, 1 creativemotion.io, 1 creativenz.govt.nz, 1 -creativepatterns.io, 1 creativephs.com, 1 creativephysics.ml, 1 creativeqc.com, 1 @@ -36754,12 +36739,12 @@ creativetouchrotherham.co.uk, 1 creativeworks.com.hk, 1 creatividigitali.com, 1 -creativityalliance.com, 0 creativlabor.ch, 1 creativo.biz, 1 creatix.tk, 1 creatomatic.co.uk, 1 creatormetrics.io, 1 +creatorrm.com, 1 creators.direct, 1 creatorsgarten.org, 1 creatorswave.com, 1 @@ -36768,6 +36753,7 @@ creature.social, 1 creayes.com, 1 creaza.nl, 1 +crebi.com.co, 1 crebita.de, 1 creche-noel.com, 1 crechepequenopolegar.com.br, 1 @@ -36780,9 +36766,7 @@ credex.bg, 1 credfacilbeneficios.com.br, 1 crediblemeds.org, 1 -credify.tech, 1 credigo.io, 1 -credimax.com.bh, 1 credin.com.tr, 1 credit-10.com, 1 credit-default-swaps.tk, 1 @@ -36795,6 +36779,7 @@ creditcorponline.com, 0 creditenonstop.ro, 1 crediteurope.ru, 1 +creditfair.in, 1 creditif.tk, 1 creditkarma.ca, 1 creditkarma.com, 1 @@ -36818,7 +36803,6 @@ creditxpert.com, 1 crednox.com, 1 credo.science, 1 -credzy.com, 1 creekcountyonline.com, 1 creekie.me, 1 creeks-coworking.com, 1 @@ -36876,7 +36860,6 @@ creus.jp, 1 creusalp.ch, 0 crew.moe, 1 -crewextension.com, 1 crewnetwork.com, 1 crewplanner.com, 1 crewresourcesinternational.group, 1 @@ -36887,7 +36870,6 @@ crex24.com, 1 crfcap.org, 0 crftvideo.com, 1 -crg-pi.com, 1 crgalvin.com, 1 crgm.net, 1 cri-paris.org, 0 @@ -36908,6 +36890,7 @@ cricpa.com, 1 cricrocket.com, 1 crictechs.com, 1 +cricxline.com, 1 criena.com, 1 criena.net, 1 crigler-najjar.fr, 1 @@ -36994,6 +36977,7 @@ cristi.io, 1 cristiaen.nl, 1 cristian-alexander.tk, 1 +cristianb.cz, 1 cristiandumitru.tk, 1 cristianhares.com, 1 cristianonascimento.ml, 1 @@ -37006,7 +36990,7 @@ cristnasar.tk, 1 cristomisina.tk, 1 cristomoradocusco.tk, 1 -cristyclauserphotography.com, 1 +cristyclauserphotography.com, 0 criteriaproducciones.tk, 1 criterion.ga, 1 critfc.org, 1 @@ -37051,6 +37035,7 @@ crn.li, 1 crnajobsite.com, 1 crnalab.net, 1 +crnsecure.com, 1 croachlife.com, 1 croatia.hr, 1 crobeauty.com, 1 @@ -37097,6 +37082,7 @@ cronometer.com, 1 cronoscentral.be, 1 cronosdev.com, 1 +cronosgrocery.com, 1 crookcountyor.gov, 1 crookedcru.tk, 1 crookedlakelistings.com, 1 @@ -37134,6 +37120,8 @@ crossfitblau.com, 1 crossformer.com, 1 crossfox.red, 1 +crossjoin.com, 1 +crossjoin.pt, 1 crosslifenutrition.co.uk, 0 crosslimit.ga, 1 crossorange.jp, 1 @@ -37158,9 +37146,11 @@ crowdfiber.com, 1 crowdpress.it, 1 crowdsim3d.com, 1 +crowdstack.com, 1 crowdstack.io, 1 crowdsupply.com, 1 croweleaseaccountingexpress.com, 1 +croweserver.com, 1 crowleytxlicensedelectrician.com, 1 crown-beverage.com, 1 crown-building.com, 1 @@ -37199,6 +37189,7 @@ crt2014-2024review.gov, 1 crtevents.co.uk, 1 crtified.me, 1 +crucibl.ai, 1 crucible.io, 1 crudly.ai, 1 cruelalice.net, 1 @@ -37234,6 +37225,7 @@ crustytoothpaste.net, 1 crute.me, 1 crutic.gq, 1 +cruxa.io, 1 cruxreasoning.com, 1 cruzadamorada.tk, 1 cruzrealestatepropertiesllc.com, 1 @@ -37249,6 +37241,7 @@ cryozenic.com, 1 cryp.no, 1 crypt-app.net, 1 +crypt.is-by.us, 1 crypt0cloud.ddns.net, 0 cryptcex.com, 0 cryptcheck.fr, 1 @@ -37262,7 +37255,7 @@ crypticonseattle.com, 1 crypticstench.tk, 1 cryptifo.com, 1 -cryptii.com, 0 +cryptii.com, 1 cryptin-it.com, 1 cryptme.in, 1 crypto-ads.ga, 1 @@ -37335,7 +37328,6 @@ cryptop.ml, 1 cryptoparty.at, 1 cryptoparty.dk, 1 -cryptoparty.in, 1 cryptoparty.tv, 1 cryptopartynewcastle.org, 1 cryptopartyutah.org, 1 @@ -37346,7 +37338,6 @@ cryptorival.com, 1 cryptoscamdb.org, 1 cryptoscope.io, 1 -cryptoseed.org, 1 cryptosender.io, 1 cryptoshot.pw, 1 cryptosolicitations.com, 1 @@ -37471,16 +37462,17 @@ csgo.ac.cn, 1 csgo.net, 1 csgo.su, 1 +csgobans.com, 1 csgodb.net, 1 csgoempire.com, 1 csgoempire.gg, 1 csgofile.tk, 1 csgofinder.eu, 1 csgomtr.com, 1 +csgoskins.gg, 1 csgotwister.com, 1 csgoyournal.com, 1 csharp.love, 1 -csharpfactory.io, 1 csharpmarc.net, 1 cshe.de, 1 cshive-img.com, 1 @@ -37559,14 +37551,11 @@ csx.co.za, 1 csy.hu, 1 csyxy.fi, 1 -cszj.wang, 0 ct-static.com, 1 ct-watches.dk, 1 ct.search.yahoo.com, 0 ctafo.com, 0 ctauditors.gov, 1 -ctbirding.org, 1 -ctc-g.com.sg, 1 ctcloud.ml, 1 ctcom-peru.com, 1 ctconp.org, 1 @@ -37580,6 +37569,7 @@ ctf-albstadt.de, 1 ctf-archive.com, 0 ctf.link, 1 +ctg.com, 0 cthomas.work, 1 cthulhuden.com, 1 ctir.gov.br, 1 @@ -37604,7 +37594,9 @@ ctpe.net, 1 ctpro.net, 1 ctr-sante.eu, 1 +ctrack.org, 1 ctrackcrystal.co.za, 1 +ctrackcrystal.com, 1 ctrl-click.fr, 1 ctrl.blog, 1 ctrl.gr, 0 @@ -37637,6 +37629,7 @@ cubanchino.tk, 1 cubanda.de, 1 cubatel.com, 1 +cubavisa.uk, 1 cubazineers.ga, 1 cubazineest.ga, 1 cubbus.beauty, 1 @@ -37724,6 +37717,7 @@ cukrarnalahoda.cz, 1 cukrinelape.com, 1 cukrzyca.net, 1 +cuktech.tr, 1 cukurbag.ml, 1 culan.dk, 0 culaoxi.com, 0 @@ -37772,6 +37766,7 @@ cumberlandcountync.gov, 1 cumberlandcountynj.gov, 1 cumberlandcountypa.gov, 1 +cumberlanddairy.com, 1 cumberlandrivertales.com, 1 cumberlink.com, 1 cumbiaperuana.tk, 1 @@ -37784,6 +37779,7 @@ cumman.life, 1 cumnock.name, 1 cumnock.org, 1 +cumple21719.cl, 1 cumplegenial.com, 1 cumsext.me, 1 cumshots-video.ru, 1 @@ -37843,6 +37839,7 @@ cure53.de, 1 cureatr.com, 1 cureine.com, 1 +curewiki.health, 1 cureyou.com.tw, 1 curieux.digital, 0 curinline.com, 1 @@ -37882,10 +37879,10 @@ currencyroot.com, 1 current-ip.com, 1 current.com, 0 -currentbitcoin.news, 1 currentchaos.tk, 1 currenteurope.eu, 1 currenthaus.com, 1 +currentlystreaming.com, 1 currycountynm.gov, 1 currycountyor.gov, 1 currynissanmaparts.com, 1 @@ -38023,7 +38020,6 @@ cvalda.tk, 1 cvazquez.es, 1 cvbp.nl, 1 -cvbtp.com, 1 cvc.digital, 1 cvdeexpo.com, 1 cvdesignr.com, 1 @@ -38032,7 +38028,6 @@ cvec.org, 1 cvedetails.com, 1 cvent.com, 1 -cvetochniydom.ru, 1 cvetpodokonnik.tk, 1 cvetybaby.com, 1 cvgenius.com, 1 @@ -38040,7 +38035,6 @@ cvgt.com.au, 1 cvh.hr, 1 cvhunter.hu, 1 -cvj.me, 1 cvjd.me, 0 cvjm.rocks, 1 cvlibrary.co.uk, 1 @@ -38117,6 +38111,7 @@ cxbmystore.com, 1 cxcarepro.com, 1 cxense.com, 1 +cxliving.com, 1 cxologic.com, 1 cxologic.io, 1 cxologic.net, 1 @@ -38126,6 +38121,7 @@ cxpbrasil.com.br, 1 cy.ax, 1 cy.technology, 1 +cyabra.com, 1 cyanhexagon.com, 1 cyanogenupdatetracker.com, 1 cybaa.io, 1 @@ -38192,6 +38188,7 @@ cyberdan.co.uk, 1 cyberdean.fr, 1 cyberdefgeek.com, 1 +cyberdesk.help, 1 cyberdevelopment.es, 1 cyberdiscoverycommunity.uk, 1 cyberdog.ch, 1 @@ -38348,9 +38345,7 @@ cyboshield.com, 1 cybozu.cn, 1 cybozu.com, 1 -cybrient.com, 1 cybrix.io, 1 -cyburbia.org, 1 cycc.cloud, 1 cyclamen.tk, 1 cycleboss45.fr, 1 @@ -38397,6 +38392,7 @@ cynqx.com, 1 cynrgie.fr, 1 cynthiacherry.com, 1 +cyoa.com, 1 cyon.ch, 1 cyp.io, 1 cype.dedyn.io, 1 @@ -38413,6 +38409,7 @@ cypro.co.uk, 1 cyprus-company-for.gr, 1 cyprus-company-service.com, 1 +cyprus-companyformation.com, 1 cyprus-consult.com, 1 cyprustimes.com, 1 cyqual.com, 1 @@ -38482,6 +38479,7 @@ cztt.cz, 1 czwartybrat.pl, 0 czymamdzisimieniny.pl, 1 +czystaprzyjemnosc.eu, 1 czzs.org, 1 d-20.fr, 1 d-consultant.ru, 1 @@ -38491,7 +38489,7 @@ d-eisenbahn.com, 1 d-ku.de, 1 d-macindustries.com, 1 -d-mind.de, 0 +d-mind.de, 1 d-shed.tk, 1 d-soft.tk, 1 d-solutions.com.au, 1 @@ -38545,10 +38543,10 @@ d3ojty55ovjfr5.cloudfront.net, 1 d3rfz9qlehr7mx.cloudfront.net, 1 d3scene.org, 1 +d3un161ynmkt1z.cloudfront.net, 1 d3x.pw, 1 d3xt3r01.tk, 1 d42.no, 1 -d4fx.de, 1 d4insight.com, 1 d4wson.com, 1 d500world.tk, 1 @@ -38582,6 +38580,7 @@ d9397.com, 1 d9728.co, 1 d9and10sports.com, 1 +da-enzo-muenchen.de, 1 da-schaewel.de, 1 da-tex.com.ua, 0 da-tixe.ml, 1 @@ -38676,6 +38675,7 @@ daffodilusa.org, 1 dafont.com, 1 daft.ie, 1 +dafta.sh, 1 dafunda.com, 1 dafuq.xyz, 1 dafyddcrosby.com, 1 @@ -38723,6 +38723,7 @@ daikoz.fr, 1 daileyeducationalservices.com, 1 daili.eu, 1 +daily-mints.com, 1 daily-puzzle.tk, 1 daily-solution.pro, 0 daily-sudoku.tk, 1 @@ -38751,9 +38752,8 @@ dailyillini.com, 1 dailyjigsawpuzzles.net, 1 dailykos.com, 1 -dailykosbeta.com, 1 +dailykosbeta.com, 0 dailylime.kr, 1 -dailylviv.com, 1 dailymedicalinfo.com, 1 dailymotion.com, 1 dailynewsclubs.ga, 1 @@ -38776,12 +38776,14 @@ dailyvpn.com, 1 dailywealth.com, 1 dailywork.ga, 1 -dailyxenang.com, 1 daintonparkgolf.co.uk, 1 dairikab.go.id, 1 dairy.com.sg, 1 dairydata.ie, 1 +dairygold.ie, 1 dairygoldagri.ie, 1 +dairymaiddairy.com, 1 +dairypure.com, 1 daisidaniels.co.uk, 1 daisuki.pw, 1 daisy-peanut.com, 1 @@ -38808,6 +38810,7 @@ dakcess.net, 1 daken.hu, 1 daki-host.tk, 1 +dakiktabela.com, 1 dakin.nyc, 1 daknam.tk, 1 daknob.net, 1 @@ -38816,6 +38819,7 @@ dakota911mn.gov, 1 dakotacil.org, 1 dakotaplainscreditunion.com, 1 +dakotasanitation.com, 1 dakotavalleyrecyclingmn.gov, 1 dal-loop.xyz, 1 dal.net.sa, 1 @@ -38830,6 +38834,7 @@ daldropsbb.com, 1 daleanddollops.com, 1 dalecountyal.gov, 1 +dalelionline.com, 1 daleunavueltaalmundo.com, 1 dalevuelta.tk, 1 dalfsennet.nl, 1 @@ -38865,6 +38870,7 @@ dallmeier.net, 0 dallydushigrill.com, 0 dalmatians.tk, 1 +dals.co.uk, 1 dalsin.ir, 1 daltoncraven.com, 0 daltonmi.gov, 1 @@ -38935,6 +38941,10 @@ danalpay.com, 1 danalytics.com.pe, 1 danamica.dk, 1 +danandissy.co.uk, 1 +danandissy.com, 1 +danandissy.love, 1 +danandissy.wedding, 1 danandrum.com, 1 danangcitytours.com, 1 danarozmarin.com, 1 @@ -38949,6 +38959,7 @@ danca.com, 1 dance-colleges.com, 1 dance-school.tk, 1 +dance-showband.de, 1 dancechart.tk, 1 dancefm.tk, 1 dancenowportal.com, 1 @@ -39056,13 +39067,11 @@ danielhurley.eu, 1 danielhurley.info, 1 danielhurley.org, 1 -danielittlewood.xyz, 1 danielives.co.uk, 1 danielj.tk, 1 danieljamesscott.org, 1 danielkoster.nl, 0 danielle-picchetti.com, 1 -daniellecavazos.com, 1 daniellelazier.com, 1 danielleskosky.com, 1 daniellespringer.tk, 1 @@ -39106,11 +39115,11 @@ danielzuzevich.com, 1 danifabi.eu, 1 danilapisarev.com, 1 +daniliants.com, 1 danilov-abrosimov.org.ua, 1 danish-tool.de, 1 danish.cf, 1 danish.events, 1 -danishbytes.club, 1 danishiqbal.tk, 1 danispage.tk, 1 danituuu7.tk, 1 @@ -39197,7 +39206,6 @@ danwelty.me, 1 danwelty.net, 1 danwelty.org, 1 -danwillenberg.com, 1 danwin.de, 1 danwin1210.de, 1 danwise.online, 1 @@ -39238,7 +39246,6 @@ dare.deals, 1 dare2sell.com.au, 1 darean.ml, 1 -darebioscience.com, 1 daredefydiscover.ca, 1 daredorm.com, 1 darehousingfoundation.org, 1 @@ -39280,6 +39287,7 @@ dark.fail, 1 darkacek.cz, 1 darkag.ovh, 1 +darkainleather.com, 1 darkartstudios.tk, 1 darkbeam.com, 1 darkbit.gr, 1 @@ -39339,6 +39347,7 @@ darksair.org, 1 darkscience.tk, 1 darksecret.dk, 1 +darkseller.in, 1 darkserver.fedoraproject.org, 1 darkserver.stg.fedoraproject.org, 1 darksideprod.tk, 1 @@ -39346,7 +39355,6 @@ darksilver.nl, 1 darkskymap.com, 1 darkskymd.org, 1 -darksoilcbd.com, 1 darksonic.tk, 1 darkspacelab.com, 1 darkspike.tk, 1 @@ -39421,7 +39429,6 @@ dasabomobil.de, 1 dasads.de, 1 dasbaum.ch, 1 -dasble.com, 1 dascan.com.br, 1 dasdanny.de, 1 daseinsfreu.de, 1 @@ -39448,7 +39455,6 @@ dasinternetluegt.at, 1 daskirschhaus.com, 1 dasler.eu, 1 -dasmailarchiv.ch, 1 dasolindustrialpark.tk, 1 dastchin.live, 1 dastelefonbuch.de, 1 @@ -39498,7 +39504,6 @@ datacad.com, 1 datacalle.com, 1 datacandy.com, 0 -datacaptive.com, 1 datacave.is, 1 datacenter-online.com, 1 datacenter.news, 1 @@ -39535,7 +39540,6 @@ dataentry.top, 1 datafactory.co.za, 1 datafinland.com, 1 -datafloq.com, 1 datagir.ir, 0 datagrail.io, 1 datagrid.ga, 1 @@ -39643,6 +39647,7 @@ datenrettung360.at, 1 datenrettung360.de, 1 datenschutz-berlin.de, 1 +datenschutz-consult.de, 1 datenschutz-gruenwald.de, 1 datenschutz-individuell.de, 1 datenschutz-isny.de, 1 @@ -39662,6 +39667,7 @@ datera-solutions.de, 1 dateranker.nl, 1 datessrit.tk, 1 +datex.live, 1 dating-site-rating.co.uk, 1 dating.wedding, 1 datingadvice.gq, 1 @@ -39689,6 +39695,8 @@ datorhjalpen.link, 1 datos-quimsaitw.es, 1 datosfreak.tk, 1 +datost.ai, 1 +datost.com, 1 datovy-portal.cz, 1 datovy-portal.sk, 1 datovyaudit.cz, 1 @@ -39735,7 +39743,6 @@ davecloud.fr, 1 davedavlin.com, 1 daveedave.de, 0 -davegebler.com, 1 davelucia.com, 1 davematthias.com, 1 davemusic.tk, 1 @@ -39799,7 +39806,6 @@ davidgrudl.com, 1 davidhastingseckerd.com, 0 davidheineman.net, 1 -davidho.org, 1 davidhurl.net, 1 davidinteriors.tk, 1 davidje13.com, 1 @@ -39872,6 +39878,7 @@ davimun.org, 1 davinamccall.tk, 1 davinci.guide, 1 +davinciproject.art, 1 davinciwaldorfschool.org, 1 davisboroga.gov, 1 daviscountyelectionsutah.gov, 1 @@ -39884,6 +39891,7 @@ davisrentacar.ro, 1 davisvision.com, 1 davmany.freeboxos.fr, 1 +davodi.hu, 1 davorin.cf, 1 davosalestax.com, 1 davros.eu, 1 @@ -39896,10 +39904,12 @@ davypropper.com, 1 dawaai.pk, 1 daware.io, 1 +dawei.help, 1 dawg.eu, 1 dawgs.ga, 1 dawidpotocki.com, 1 dawidwrobel.com, 1 +dawn0.com, 1 dawnbringer.eu, 1 dawnbringer.net, 1 dawnbyte.ch, 1 @@ -40003,7 +40013,6 @@ dbeilharz.de, 1 dbeilharz.eu, 1 dbentertainment.co.uk, 1 -dbeta.co.uk, 1 dbfopraga-pn.waw.pl, 0 dbgames.info, 1 dbhome.org, 1 @@ -40059,6 +40068,7 @@ dc7342.im, 1 dcache.org, 1 dcain.me, 1 +dcalculator.net, 1 dcard.tw, 1 dcards.in.th, 1 dcareer.tk, 1 @@ -40134,6 +40144,7 @@ dda.gov.ae, 1 ddai.nl, 1 ddatsh.com, 0 +dday.io, 1 ddayantics.xyz, 1 ddays2008.org, 1 ddbservices.co.uk, 1 @@ -40243,6 +40254,7 @@ dealernet.com.br, 1 dealerselectric.com, 1 dealerwriter.com, 1 +dealerxpert.com.br, 1 dealflowpro.io, 1 dealha.com, 1 dealhabibi.com, 1 @@ -40258,7 +40270,7 @@ dealsinaz.com, 1 dealsmagnet.com, 1 dealsomart.com, 1 -dealspotr.com, 1 +dealspotr.com, 0 dealstreet.fr, 1 dealzme.com, 1 deamonmail.tk, 1 @@ -40267,6 +40279,8 @@ deanbank.com, 1 deanconsultancy.co.uk, 1 deano-s.co.uk, 1 +deanprice.com, 1 +deansdairy.com, 1 deanvending.com, 1 deanwest.com, 1 dear-children.ga, 1 @@ -40343,16 +40357,18 @@ deboo.info, 1 debora-singkreis.de, 1 deborahkaty.tk, 1 -deborahmarinelli.eu, 1 +debosschespoorzone.nl, 1 debostero.tk, 1 deboutpourlemali.ml, 1 debra-cz.org, 1 debra-sa.com, 1 debraj.in, 1 +debranddenbosch.nl, 1 debraschilling.de, 1 debrasclassiccleaning.com, 1 debraydesign.com.au, 1 debricked.com, 1 +debrid-downloader.com, 1 debridleech.com, 1 debrunet.nl, 1 debruns.ie, 1 @@ -40377,7 +40393,8 @@ decagames.com, 1 decal-times.com, 1 decalquai.ch, 0 -decamidea.it, 0 +decamidea.it, 1 +decanthouse.com, 1 decathlon.ca, 1 decathlon.co.il, 1 decathlon.com.co, 1 @@ -40490,7 +40507,6 @@ dedoles.cz, 1 dedoles.hu, 1 dedoles.pl, 1 -dedoles.sk, 1 dedurpsidioten.tk, 1 dedyk.gq, 1 dee.pe, 1 @@ -40502,7 +40518,6 @@ deejayladen.de, 1 deejayz.tk, 1 deelauto.club, 1 -deelmee.nl, 1 deelmijnreis.nl, 1 deelodge.art, 0 deeltaxi-regioshertogenbosch.nl, 1 @@ -40600,6 +40615,7 @@ defistablecoin.ai, 1 defkey.com, 1 deflumeriker.com, 1 +defmarks.com, 1 defme.eu, 1 defont.nl, 1 defreitas.no, 1 @@ -40644,10 +40660,13 @@ degreeverify.com, 1 degreeverify.net, 1 degreeverify.org, 1 +degressif.com, 1 +degroenedelta.com, 1 degroetenvanrosaline.nl, 1 degrootenslot.nl, 0 +degrootevlietdenbosch.nl, 1 degroupnews.com, 1 -degruchy.org, 0 +degruchy.org, 1 deguisements-couple.fr, 1 deguisements-gonflables.fr, 1 degustavending.es, 1 @@ -40658,7 +40677,7 @@ dehoga-reisen.de, 1 dehopre.com, 1 dehumanizer.com, 1 -dehuystandarts.nl, 1 +dehuystandarts.nl, 0 dehydrated.io, 1 dei.gov, 1 deiaprint.com, 1 @@ -40743,7 +40762,6 @@ delay-dengi.cf, 1 delaydengy.tk, 1 delaysoft.tk, 1 -delbridge.solutions, 1 delcan.ga, 1 delcan.gq, 1 delcan.ml, 1 @@ -40871,7 +40889,6 @@ deltarisk.com, 0 deltaserat.tk, 1 deltaservers.com.br, 1 -deltasigmachi.org, 1 deltasigmaxi1971.tk, 1 deltasuprimentos.com.br, 1 deltav.ml, 1 @@ -40995,7 +41012,9 @@ denarium.com, 1 denatured.tk, 1 denbar.org, 1 +denbosch-ontwikkelen.nl, 1 denboschdataweek.nl, 1 +denboschinontwikkeling.nl, 1 denboschtimemachine.eu, 1 denboschtimemachine.nl, 1 dencel.lv, 1 @@ -41051,7 +41070,6 @@ denizlicilingir.org, 1 denizlihaber.tk, 1 denizlihaberleri.tk, 1 -denizlihaliyikama.net, 1 denizlisohbet.tk, 1 denizuydur.nl, 1 denk-it.be, 0 @@ -41127,12 +41145,13 @@ dentistabarbarajaqueline.com.br, 1 dentistalagoasanta.com.br, 1 dentisteliege.be, 1 -dentistesdarveauetrioux.com, 1 +dentistnorthmelbourne.com.au, 1 dentistree.in.ua, 1 dentistsgainesvillega.com, 1 dentistslilburnga.com, 1 dentoncounty.gov, 1 dentoncountysheriffjobs.gov, 1 +dentondynamics.co.uk, 1 dentonolab.lt, 1 dentrassi.de, 1 dentrecovery.com, 1 @@ -41169,17 +41188,16 @@ deooyevaar.es, 1 deooyevaar.fr, 1 deooyevaar.nl, 1 +deoperator.nl, 1 deoremann.com, 0 deovergangendan.nl, 1 depaco.com, 1 depagecms.net, 1 -depannage-traceur.fr, 1 depapboeren.tk, 1 departamentoslosolivos.tk, 1 departmentofdefense.tk, 1 departmentofoncology.com, 1 departureboard.io, 1 -depaul-edu.org, 1 depaulmanorestate.com.au, 1 depay.com, 1 depay.fi, 1 @@ -41203,6 +41221,7 @@ dephoro.com, 1 depicus.com, 1 depijp.tk, 1 +depilacionmasculina.ch, 1 depilazione.roma.it, 1 depistage-bejune.ch, 0 depleteduranium.tk, 1 @@ -41215,6 +41234,7 @@ depoalabama.com, 1 depokcity.tk, 1 depolab.com, 1 +depolauncher.cf, 1 depone.net, 0 depoondemand.com, 1 depoone.com, 1 @@ -41281,7 +41301,6 @@ derbyshire-language-scheme.co.uk, 1 derchris.me, 1 derdevel.de, 1 -derdewereldrommelmarkt.nl, 1 derechosanimales.tk, 1 dereddingsklos.nl, 1 dereferenced.net, 1 @@ -41304,6 +41323,7 @@ derinforge.com.au, 1 derinsular.tk, 1 derivative-calculator.net, 1 +derivatives.com.au, 1 derivativeshub.pro, 1 derive.cf, 1 derkach.io, 1 @@ -41334,6 +41354,7 @@ dermu.ai, 1 deroo.org, 1 deroo.tk, 1 +derosmalenseplasdenbosch.nl, 1 derp.army, 1 derpibooru.org, 1 derpicdn.net, 1 @@ -41487,6 +41508,7 @@ desirememory.cf, 1 desirenet.ro, 1 desish.cf, 1 +desitales2.com, 1 desivideos.tk, 1 deskaservices.com, 0 deskdesign.nl, 1 @@ -41518,7 +41540,6 @@ despotika.de, 1 desriresdesjeux.com, 1 desserteagleselvenar.tk, 1 -dessinbtp.com, 1 dessinemoilademocratie.ch, 0 desstrade.com, 1 dest-gottskar-nidingen.se, 1 @@ -41577,13 +41598,12 @@ detecte-fuite.ch, 0 detecte.ch, 0 detectefuite.ch, 0 -detectify.com, 1 detection-canine-punaise-paris.com, 1 detectro.cc, 1 deteken.be, 1 detekenmuze.nl, 1 detektivskaagencija.com, 1 -detektywtd24.pl, 0 +detektywtd24.pl, 1 determapp.de, 1 determinatie.tk, 1 detexpert.ro, 1 @@ -41611,6 +41631,7 @@ detroitzoo.org, 1 detsad.ml, 1 detsad.tk, 1 +detska-boticka.cz, 1 detski.center, 1 detskie-avto-kresla.tk, 1 detuinmuze.nl, 1 @@ -41656,6 +41677,7 @@ dev-mates.com, 1 dev-ms.com, 1 dev-pmcc.net, 1 +dev-schoolnexus.se, 1 dev-sncf-habilitation-web-frc.azurewebsites.net, 1 dev-sncf-immersive.azurewebsites.net, 1 dev-sncf-server1.azurewebsites.net, 1 @@ -41666,7 +41688,6 @@ dev-testing.org, 1 dev-tricks.com, 1 dev-vip.com, 1 -dev-woenenn-node-server.herokuapp.com, 1 dev-ylinternal.com, 1 dev.inc, 1 dev.moe, 1 @@ -41703,6 +41724,7 @@ develify.co, 1 develmaster.tk, 1 develooper.com, 1 +develop.gr, 1 develope.cz, 0 developedbygayuh.my.id, 1 developer.android.com, 1 @@ -41710,6 +41732,7 @@ developer.mydigipass.com, 0 developerdan.com, 1 developerinsider.co, 1 +developers.ddns.net, 1 developers.facebook.com, 0 developmentsites.melbourne, 1 developnorthportfl.gov, 1 @@ -41842,7 +41865,7 @@ devyanijayakar.com, 1 devzero.io, 0 dewalch.net, 1 -dewalt.com, 1 +dewalt.com, 0 dewblog.ml, 1 dewereldwerktthuis.com, 1 dewereldwerktthuis.eu, 1 @@ -41882,7 +41905,6 @@ df-clan.tk, 1 df-team.tk, 1 df1nif.de, 1 -df1paw.de, 1 df3313.com, 1 df3314.com, 1 df3315.com, 1 @@ -41896,14 +41918,15 @@ df5bb.com, 1 df5cc.com, 1 df5dd.com, 1 +dfabrandguide.com, 1 dfactory.co, 1 dfafacts.gov, 1 +dfaschoolmilk.com, 1 dfc.gov, 1 dfctaiwan.org, 1 dffgpro.de, 1 dfg.re, 1 dfiik.com, 1 -dfilip.icu, 1 dfkp.de, 1 dfm.ae, 0 dfmn.berlin, 1 @@ -41983,6 +42006,7 @@ dgschell.com, 1 dgst.cloud, 1 dgt-portal.de, 1 +dgtechsrl.com, 1 dgtl.hosting, 1 dgtl.tools, 1 dgtl.work, 1 @@ -41999,7 +42023,9 @@ dhakabankltd.com, 1 dhamdhamaanchalikcollege.tk, 1 dhani.com, 1 +dhanur.me, 1 dhanushtechno.in, 1 +dharamshi.org, 1 dharmakit.com, 1 dhaus.de, 1 dhautefeuille.eu, 1 @@ -42050,7 +42076,6 @@ diacritical.net, 1 diadiemdangsong.com, 1 diadorafitness.es, 1 -diadorafitness.it, 1 diag.pl, 1 diagilev.ml, 1 diagmechanic.com, 1 @@ -42086,7 +42111,7 @@ dialybiendong.tk, 1 diamant.family, 1 diamant.nyc, 1 -diamantiques.com, 1 +diamantled.be, 1 diamantovaburza.cz, 1 diameb.ua, 1 diamond-hairstyle.dk, 1 @@ -42109,7 +42134,6 @@ dian7la.com, 1 dian7la.space, 1 diana-und-aaron.de, 1 -dianaconsultancy.com, 1 dianaconta.pt, 1 dianadeluxe.net, 1 dianadrive.com, 1 @@ -42176,6 +42200,7 @@ dicelab.co.uk, 1 dicemer.com, 1 dicesites.com, 1 +diceworld.fr, 1 dicgaming.net, 1 dichanho.com, 1 dichvudangkygiayphep.com, 1 @@ -42338,7 +42363,6 @@ dietbrand.eu, 1 dieter.one, 1 dieterglas.de, 1 -dieteticadigital.net, 1 dietfordiabetics.tk, 1 dietherapie.tirol, 1 dieti-natura.com, 1 @@ -42459,6 +42483,7 @@ digital-e-library.tk, 1 digital-eastside.de, 1 digital-echo.io, 0 +digital-forensics.fr, 1 digital-garden.us, 1 digital-home.tk, 1 digital-insurance-engine.com, 1 @@ -42477,7 +42502,6 @@ digital.govt.nz, 1 digital1st.co.uk, 1 digital4starazagora.com, 1 -digitaladl.com.au, 1 digitalagency47.com, 1 digitalagencynetwork.com, 1 digitalakatsuki.com, 1 @@ -42493,9 +42517,10 @@ digitalbox.jp, 0 digitalbridge.com, 1 digitalbridge.com.au, 1 -digitalbuero.eu, 1 +digitalbuyer.com, 1 digitalcanvas.com.br, 1 digitalcarbide.com, 1 +digitalcardmanager.com, 1 digitalcash.cf, 1 digitalcashpalace.com, 1 digitalch.ng, 1 @@ -42529,6 +42554,7 @@ digitale-bibliothek.tk, 1 digitale-gesellschaft.ch, 1 digitale-oekonomie.ch, 1 +digitale-ueberwachung.info, 1 digitaleducationarea.tk, 1 digitaleducationpro.tk, 1 digitalehandtekeningen.nl, 1 @@ -42630,6 +42656,7 @@ digitalvalue.es, 1 digitalwasteland.net, 0 digitalworkplaceforum.com.br, 1 +digitalzenworks.com, 1 digitalzylinder-shop.com, 1 digite.com, 1 digitec.ch, 1 @@ -42640,6 +42667,7 @@ digitese.pt, 1 digithex.com, 1 digithub.tk, 1 +digitizemyvideo.com, 1 digitizer.co.il, 1 digitkon.com, 1 digitoimistopipeline.fi, 1 @@ -42732,7 +42760,6 @@ dimitri-papadimitriou.com, 1 dimitri-papadimitriou.eu, 1 dimitri-papadimitriou.gr, 1 -dimitri.network, 1 dimitris.tk, 1 dimitrovgrad.bg, 1 dimitrovi.tk, 1 @@ -42856,6 +42883,7 @@ direct365.es, 1 directaccident.co.uk, 1 directadmin.com, 1 +directairlineflights.com, 1 directautoverhuur.com, 1 directb2b.ca, 1 directcouriers.com.au, 1 @@ -42877,6 +42905,7 @@ directmedica.fr, 1 directnic.com, 1 directories.cf, 1 +directoriodemedios.com, 1 directorioempresarial.com.co, 1 directoriomedico.com.co, 1 directorios.tk, 1 @@ -42907,7 +42936,6 @@ direktvermarktung-schmitzberger.at, 1 diretonoponto.gq, 1 direwolfsoftware.ca, 1 -dirigeantbtp.com, 1 dirk-dogs.tk, 1 dirk-weise.de, 1 dirkdavid.org, 1 @@ -43000,7 +43028,6 @@ discordsworld.tk, 1 discotek.club, 1 discotheque.tk, 1 -discountduuka.com, 1 discounted.tours, 1 discountforelectronics.tk, 1 discounto.de, 1 @@ -43061,6 +43088,7 @@ disgruntledcode.com, 1 disguise.cf, 1 dishanddat.com, 1 +dishcord.no, 0 dishcrawl.com, 0 dishwashermagic.tk, 1 dishwasherrepair-austin.com, 1 @@ -43157,8 +43185,10 @@ disparada.com.br, 1 dispartilaw.com, 1 dispatched.tk, 1 +displaycalibration.de, 1 displaynote.com, 1 displayrd.com, 1 +displux.de, 1 disposable.link, 1 dispur.nic.in, 1 disroot.org, 1 @@ -43183,6 +43213,7 @@ distempered.tk, 1 disti.com, 1 distilleren.tk, 1 +distillnote.com, 1 distinctdesign2009.com, 1 distinctiveremodeling.com, 1 distinguishedlegal.com, 1 @@ -43196,7 +43227,6 @@ distraction.gov, 1 distraction.tk, 1 distractors.tk, 1 -distri.com.ua, 1 distribucionmayorista.online, 1 distribucionstunel.es, 1 distribuidora-online.com, 1 @@ -43238,6 +43268,7 @@ ditissaskia.nl, 1 ditprint.dk, 1 ditra.ae, 0 +dits-balti.md, 1 ditte-destree.fr, 1 dittvertshus.no, 1 ditxse6.com, 1 @@ -43259,6 +43290,7 @@ divelement.ro, 1 divelyon.fr, 1 diveplan.org, 1 +diveprotocol.org, 1 divergences.eu.org, 1 divernet.com, 1 divernonil.gov, 1 @@ -43297,6 +43329,7 @@ divinefeminineyoga.com, 1 divinemercyparishvld.com, 1 divinemercyparishvlds.com, 1 +divinepathretreat.com, 1 divineprovidenceorphanage.org, 1 divinerooms.com, 1 divinho.com.br, 1 @@ -43324,6 +43357,7 @@ divvy.tk, 1 divyahindi.com, 1 diw-bau.cloud, 1 +diwan.ir, 1 dixa.tech, 1 dixeo.fr, 1 dixibox.com, 1 @@ -43456,7 +43490,6 @@ djhvidal.com, 1 djhypnoticstate.tk, 1 djichtus.tk, 1 -djieno.com, 1 djinstinct.tk, 1 djipanov.com, 1 djjab.com, 1 @@ -43588,7 +43621,6 @@ dksinger.tk, 1 dksoft-2130.ddns.net, 1 dksoft.online, 1 -dkstage.com, 1 dkweb.ml, 1 dkweb.tk, 1 dkwedding.gr, 1 @@ -43608,7 +43640,6 @@ dlclientportal.com, 1 dlcompare.co.uk, 1 dlcompare.com, 1 -dlcompare.de, 1 dlcompare.fr, 1 dlcompare.it, 1 dlcompare.pt, 1 @@ -43622,6 +43653,7 @@ dlf.exchange, 1 dlford.io, 1 dlfsymposium.nl, 1 +dlideas.com, 1 dlitz.net, 1 dll4free.com, 1 dlld.biz, 1 @@ -43680,7 +43712,6 @@ dm1.in, 1 dm4productions.com, 1 dm6.co, 1 -dm7ds.de, 1 dmaglobal.com, 1 dmarc-hd.org, 1 dmarc.dk, 1 @@ -43689,7 +43720,6 @@ dmarcsentry.com, 1 dmarctester.com, 1 dmarcvendors.com, 1 -dmautomek.no, 1 dmbins.com, 1 dmbvideo.com, 1 dmc-cc.de, 1 @@ -43748,11 +43778,11 @@ dmskaspr.com, 1 dmslog.com, 1 dmslog.com.br, 1 +dmsos.ai, 1 dmstechnology.com, 1 dmtcustoms.co.za, 1 dmu.ac.ae, 1 dmunoz.es, 1 -dmvape.us, 0 dmwaste.com, 0 dmwclan.tk, 1 dmxclan.tk, 1 @@ -43763,8 +43793,10 @@ dn42.us, 1 dn9b1f9o30q82.cloudfront.net, 1 dna-agency.it, 1 +dna-clan.eu, 1 dna-technology.ua, 1 dna.li, 0 +dnaclan.eu, 1 dnadk.com, 1 dnaka91.rocks, 1 dnalounge.com, 1 @@ -43891,7 +43923,6 @@ dobavki.club, 1 dobbshvac.com, 1 dobledemichaeljackson.tk, 1 -dobleseo.pro, 1 doblot.com, 1 dobookmark.ml, 1 doboszynski.com, 1 @@ -43931,6 +43962,7 @@ docebo.com, 1 docemeldoces.com, 1 docendo.es, 1 +docesinesqueciveis.com.br, 1 docesmartini.com.br, 1 docfliq.com, 1 docguide.com, 1 @@ -43938,7 +43970,6 @@ dochescu.com, 1 dochub.com, 1 dock.tech, 1 -dock23.de, 1 dockerbook.com, 0 dockerm.com, 1 dockerup.net, 1 @@ -44058,9 +44089,9 @@ dodi-alhelo.tk, 1 dodi-repacks.site, 1 dodiedods.fr, 1 +dodies.lv, 1 dodikod.tk, 1 dodolle.co.uk, 1 -dodopizza.ru, 1 dodotool.com, 1 dodotool.ru, 1 doedelzakken-jsh.tk, 1 @@ -44070,6 +44101,7 @@ doehle-mse.com, 1 doehle-romania.com, 1 doehle-seafront.com, 1 +doehlecentro.net.ph, 1 doehlers.de, 1 doelbeleggen.nl, 1 doeleman.nl, 1 @@ -44109,6 +44141,7 @@ dogespeed.ml, 1 dogfights.tk, 1 dogfriendly.co.uk, 1 +dogfriendlyplaces.eu, 1 doggingclub.tk, 1 doggo-staging.herokuapp.com, 1 doghandling.tk, 1 @@ -44215,6 +44248,7 @@ dollarprofit.tk, 1 dollarrp.pl, 1 dollarweb.cf, 1 +dollbase.cn, 1 dolle-shop.com.ua, 1 dolledout.co.ke, 1 dollestieren.tk, 1 @@ -44233,6 +44267,7 @@ dolomiasdearagon.com, 1 dolomititour.com, 1 dolonki.beauty, 1 +dolorhunter.com, 1 dolorism.com, 1 dolph.de, 1 dolphbit.de, 1 @@ -44309,6 +44344,7 @@ domaza.gq, 1 domaza.ml, 1 domcc.tel, 1 +domdrenazh.ru, 1 domealert.com, 1 domeconseil.fr, 1 domein-direct.com, 1 @@ -44454,6 +44490,7 @@ doncastermoneyman.com, 1 dondiabolo.com, 1 dondonya.com.cn, 1 +doneandbilled.com, 1 donec.tk, 1 donedeal.co.uk, 1 donedeal.ie, 1 @@ -44581,7 +44618,6 @@ doomsdaymag.tk, 1 doomsworld.com, 1 doomtech.net, 1 -doonamis.com, 1 doonvalleytrail.co.uk, 1 doooooops.com, 1 doop.im, 1 @@ -44688,6 +44724,7 @@ dosenpintar.com, 1 doserres.tk, 1 dosgame.club, 1 +dosgatos.shop, 1 dosgratus.tk, 1 dosimabag.com, 1 dosimapress.com, 1 @@ -44775,9 +44812,11 @@ dotyk.me, 1 dotzauer-stb.de, 1 douai.me, 1 -douari.info, 1 douari.jp, 1 +douari.net, 1 +douari.xxx, 1 douban.city, 1 +double-clic.eu, 1 double20.gg, 1 doublearm.in, 1 doublebass-solo.com, 1 @@ -44786,7 +44825,6 @@ doubledees.co.ke, 1 doubledranch.tk, 1 doublefun.net, 1 -doublemars.com, 1 doubleness.gq, 1 doublepotion.com, 1 doublestat.me, 1 @@ -44915,6 +44953,7 @@ dox-box.eu, 1 doxa.tk, 1 doxal.ro, 1 +doxascope.com, 1 doxepin1.gq, 1 doxepinonline.gq, 1 doxford-engine.com, 1 @@ -45012,6 +45051,7 @@ dr-tsanova.com, 1 dr-vlasak.cz, 1 dr-www.de, 1 +dr.com.tr, 1 dr.mg, 1 dr2dr.ca, 1 draabe-nyt.dk, 1 @@ -45128,9 +45168,7 @@ draperutah.gov, 1 drapetra.com.br, 1 drardiving.com, 1 -drardivingcenter.com, 1 dras.hu, 1 -drashna.net, 1 drasocalzado.com, 1 drasoclothes.com, 1 drastic-ds.com, 1 @@ -45175,6 +45213,7 @@ drclear.co.uk, 1 drclub.tk, 1 drcommodore.it, 1 +drcorderocirujanoplastico.com, 1 drcroof.com, 1 drdach.pl, 1 drdamirplasticsurgeon.com, 1 @@ -45201,6 +45240,7 @@ dream-pools.cf, 1 dreamaholic.club, 1 dreamawake.tk, 1 +dreambay.io, 1 dreambbs.tk, 1 dreambed.com, 1 dreamboxpro.com, 1 @@ -45217,11 +45257,12 @@ dreamflux.xyz, 1 dreamforcetv.pro, 1 dreamhostremixer.com, 1 -dreamimd.com, 0 +dreamimd.com, 1 dreaminds.de, 1 dreaminformatique.tk, 1 dreaming.solutions, 1 dreaminjewelz.tk, 1 +dreamithost.com.au, 1 dreamland.sh, 1 dreamlandmagic.com, 1 dreamlandsdesign.com, 1 @@ -45292,6 +45333,7 @@ dresdner-christstollen-von-reimann.de, 1 dresdner-kaffeeroesterei.de, 1 dresdner-mandelstollen.de, 0 +dresdner-wohnung.de, 1 dreso.com, 1 dress-cons.com, 1 dressabelle.tk, 1 @@ -45327,7 +45369,6 @@ drheibel.com, 1 drhildebrand.net, 1 drhiteshpatel.in, 1 -drhogarth.co.uk, 1 drhouserepairs.com, 1 drianpublishing.tk, 1 dribbble.com, 1 @@ -45365,6 +45406,7 @@ drinkieswith.me, 1 drinking.tk, 1 drinklife.tk, 1 +drinkmulu.com, 1 drinkpetrol.com, 1 drinkplanet.eu, 1 drinks.my, 1 @@ -45422,7 +45464,6 @@ drivya.be, 1 drivya.ch, 1 drivya.com, 1 -drivya.nl, 1 driwch.tk, 1 drixn.info, 1 drixn.net, 1 @@ -45441,7 +45482,7 @@ drkbri.ru, 1 drkhsh.at, 1 drks.de, 1 -drksachsen.de, 1 +drksachsen.de, 0 drlandis.com, 1 drlarakiortho.com, 1 drlc.com.au, 1 @@ -45472,7 +45513,6 @@ droid101.com, 1 droidandy.com, 1 droidapp.nl, 1 -droidchart.com, 1 droidguide.ga, 1 droidhere.com, 1 droidtrix.ga, 1 @@ -45508,7 +45548,6 @@ dronix.tk, 1 droomhuis-in-zuid-holland-kopen.nl, 1 drop-zone.tk, 1 -drop.com, 1 dropbox.com, 1 dropboxer.net, 1 dropchat.cf, 1 @@ -45566,6 +45605,7 @@ drt.org.nz, 1 drtanyaescobedo.com, 1 drthalhammer.at, 1 +drthamer.com, 1 drthiagorighetto.com.br, 1 drtimmarch.com, 1 drtimothysteel.com.au, 1 @@ -45684,7 +45724,6 @@ dsgnet.hu, 1 dsgv.de, 1 dsgvo-addon.eu, 1 -dsgvo-analyse.de, 1 dsgvo.name, 1 dsh.io, 1 dshield.org, 1 @@ -45809,7 +45848,6 @@ dubaifitnesschallenge.com, 1 dubaigrandsale.com, 1 dubailuxuryinvestors.com, 1 -dubaimonsters.com, 1 dubaipremiuminvest.com, 1 dubairun.com, 1 dubaisc.ae, 1 @@ -45940,6 +45978,7 @@ dukun.de, 1 dulas.org.uk, 1 dulce-reverie.ro, 1 +dulcebermudez.com, 1 dulcehome.ch, 1 dulceysalado.tk, 1 dulcinea.eu.org, 1 @@ -45949,7 +45988,6 @@ dulmagedentalarts.ca, 1 duloxetinbestellen.gq, 1 duloxetine.gq, 1 -dulse.fr, 1 dulurtekno.co.id, 1 dulux.co.nz, 1 dulux.com.au, 1 @@ -46090,6 +46128,7 @@ dustbox.tk, 1 dustinbrett.com, 1 dustindecker.com, 1 +dustinpurdy.com, 1 dustjacket.one, 1 dustman.tk, 1 dustpla.net, 1 @@ -46160,6 +46199,7 @@ duxi-s-feromonami.ga, 1 duxsco.de, 1 duysondang.name.vn, 1 +duythang.top, 1 duzavo.cz, 1 duzcehaberleri.tk, 1 duzcesondakika.tk, 1 @@ -46185,7 +46225,6 @@ dvgsites.com, 1 dvipadmin.com, 1 dvkg.de, 1 -dvminsight.com, 1 dvn.pt, 1 dvor.ml, 1 dvorek-karlin.cz, 1 @@ -46343,6 +46382,7 @@ dynosend.com, 1 dynsoundmax.tk, 1 dynx.pl, 1 +dyor.io, 1 dypromed.com, 1 dyrenesverden.no, 1 dyrkar.se, 1 @@ -46452,7 +46492,6 @@ dzu.fund, 1 dzus.tk, 1 dzworld.com, 1 -dzyabchenko.com, 0 dzyszla.pl, 1 e-alink.com, 1 e-almott.com, 1 @@ -46462,6 +46501,7 @@ e-balloons.tk, 1 e-bap.net, 1 e-baraxolka.ru, 1 +e-barobirlik.com.tr, 1 e-belgia.tk, 1 e-beyanname.com.tr, 1 e-beyanname.net.tr, 1 @@ -46509,6 +46549,7 @@ e-flotila.cz, 1 e-form.mn, 1 e-frontier.systems, 1 +e-fuels.com, 1 e-games-board.tk, 1 e-gc.de, 1 e-generator.tk, 1 @@ -46552,6 +46593,7 @@ e-medicines.tk, 1 e-migration.ch, 0 e-modusvivendi.com, 1 +e-monteur.nl, 1 e-mutation.com, 1 e-nail.tk, 1 e-name.tk, 1 @@ -46660,7 +46702,6 @@ e34club.com.ua, 1 e365.vip, 1 e36533.com, 1 -e3lan.net, 1 e42.org, 0 e4a.org, 0 e4mc.link, 1 @@ -46723,7 +46764,6 @@ eaglevilletn.gov, 1 eaglewreck.info, 1 eagleyecs.com, 1 -eagrants.com, 1 eahea.org, 1 eai-work-tool.com, 1 eaimty.com, 1 @@ -46780,7 +46820,6 @@ earni.fi, 1 earningsgames.tk, 1 earningthatis.tk, 1 -earnosethroat.co.za, 1 earpconsult.co.uk, 1 earth-performance-indicator.com, 1 earth-quake.tk, 1 @@ -46796,7 +46835,6 @@ earthbound.tk, 1 earthcam.com, 1 earthcam.net, 1 -earthcore.com, 1 earthcorporation.cf, 1 eartheld.tk, 1 earthjustice.org, 1 @@ -46965,6 +47003,7 @@ easynm.cn, 1 easynotary.ch, 1 easyocm.hu, 1 +easyodds.com, 1 easyonlinetest.tk, 1 easypay.bg, 1 easypayment.cf, 1 @@ -46988,7 +47027,6 @@ easyspace-storage.com, 1 easysubmit.tk, 1 easytamil.tk, 1 -easytec-info.de, 1 easytestonline.tk, 1 easytext.ga, 1 easytiles.com, 1 @@ -47031,14 +47069,12 @@ eauclairecounty.gov, 1 eaucube.com, 1 eaugenethomas.cf, 1 -eaujob.com, 1 eauto-cash.de, 1 eautocash.de, 1 eautolease.com, 1 eauxdevienne.fr, 1 eava.ga, 1 eavafm.com, 1 -eawmaas.top, 1 eazy.de, 1 eazy.gr, 1 eazycert.in, 1 @@ -47050,6 +47086,7 @@ eazzhome.com, 1 eazzy.tk, 1 eb-net.de, 1 +eb-suite.com, 1 eb7.jp, 1 eba.com.au, 1 ebac.com, 1 @@ -47163,6 +47200,7 @@ ebuha.ga, 1 ebuku.tk, 1 eburg.ml, 1 +ebury.com, 1 ec-baran.de, 1 ec-bayreuth.de, 1 ec-current.com, 1 @@ -47204,7 +47242,6 @@ ecelembrou.ovh, 1 ecemella.com, 1 ecemi-alu.com, 1 -ecency.com, 1 ecetechsol.com, 1 ecetiner.com, 1 ecfunstalls.com, 1 @@ -47230,7 +47267,6 @@ echoesin.com, 1 echoit.net, 1 echoit.net.au, 1 -echoit.services, 1 echomail.org, 1 echopaper.com, 1 echorecovery.org, 1 @@ -47246,6 +47282,7 @@ echotone.tk, 1 echovintage.com.br, 1 echowave.io, 1 +echs.top, 1 echt.ga, 1 echtcache.ga, 1 echtebbq.nl, 1 @@ -47276,6 +47313,7 @@ eclipse-foundation.eu, 1 eclipse-foundation.hk, 1 eclipse.eu, 1 +eclipse.org, 1 eclipse4academia-startups.com, 1 eclipsebank.com, 1 eclipseforum.tk, 1 @@ -47289,8 +47327,10 @@ eclixo.com, 1 ecmx.eu, 1 ecnetworker.com, 1 +eco-care.gr, 1 eco-derattizzazione.it, 1 eco-nyashky.com.ua, 1 +eco-pestoff.com, 1 eco-price.ru, 1 eco-rally.cz, 1 eco-rubber.ru, 1 @@ -47376,6 +47416,7 @@ ecommercenews.ca, 1 ecommercenews.co.nz, 1 ecommercenews.com.au, 1 +ecommercenews.ie, 1 ecommercenews.in, 1 ecommercenews.uk, 1 ecommerceuropa.eu, 1 @@ -47401,7 +47442,6 @@ economie2.alsace, 1 economiefidu.ch, 0 economipedia.com, 1 -economistebtp.com, 1 economixportal.tk, 1 economizaplay.com.br, 1 economycarrentalscyprus.com, 1 @@ -47524,6 +47564,7 @@ eddi.org.au, 1 eddie.website, 1 eddieeinbinder.com, 1 +eddiemiller.agency, 1 eddmil.es, 0 eddns.de, 1 eddns.eu, 1 @@ -47564,6 +47605,7 @@ edenredbenefits.com, 0 edenvaleplumber24-7.co.za, 1 eder-steiner.at, 1 +ederevx.us, 1 edeseschoolvereniging.nl, 1 edevletkapisi.org, 1 edfdentalcenter.tk, 1 @@ -47605,6 +47647,7 @@ ediberto.tk, 1 edicionanticipada.com, 1 edicionescrimentales.tk, 1 +edificaciongeneracional.com, 1 edik.tk, 1 edikacomptabilite.com, 1 edilane.de, 1 @@ -47612,7 +47655,6 @@ ediliovo.com, 1 edilondon.com, 1 edilservizivco.it, 1 -edilzanini.it, 1 edinbric.scot, 0 edinburghcastle.scot, 0 edirnehaber.tk, 1 @@ -47683,11 +47725,9 @@ edrosd.cf, 1 edrost.tk, 1 edsby.com, 0 -edscha.com, 1 edscolors.com, 1 edservicing.com, 1 edshogg.co.uk, 1 -edsm.net, 1 edsplain.ro, 1 edstem.org, 1 edstep.com, 1 @@ -47719,7 +47759,6 @@ educacaopocos.com.br, 1 educacionnm.ml, 1 educacionvirtual.com.ar, 1 -educaenvivo.com, 1 educandoamihijo.com, 1 educard.co.at, 1 educart.mx, 1 @@ -47740,7 +47779,6 @@ educationgov.tk, 1 educationhighquality.ml, 1 educationism.tk, 1 -educationmalaysia.co.uk, 1 educationone.ml, 1 educationperfect.com, 1 educationportal.ga, 1 @@ -47771,6 +47809,7 @@ eduhublisbon.com, 1 eduid.se, 1 eduif.nl, 0 +edukar.xyz, 1 eduki.com, 1 edukle.com, 0 edularidea.com, 1 @@ -47784,6 +47823,7 @@ edumontclasses.com, 1 edunaut.com.au, 1 edunet.gq, 1 +edunia.io, 1 edunian.com, 1 edunoor.tk, 1 eduoneschool.tk, 1 @@ -47795,7 +47835,6 @@ eduroam.uy, 1 edusanjal.com, 1 eduschool.ml, 1 -edusektor.de, 0 edusenca.nl, 1 edusercontent.com, 1 eduson.pl, 1 @@ -47859,7 +47898,6 @@ eef.com.pe, 1 eegaming.org, 1 eegaming.tk, 1 -eehitus.ee, 0 eeia.com, 1 eeiletudiant.com, 1 eekelen.net, 1 @@ -47959,6 +47997,7 @@ efiglobal.com, 1 efiledcsuperiorcourt.gov, 1 efinanceng.com, 1 +efirbet.com, 1 efirma.com, 1 eflorashop.ch, 1 eflorashop.com, 1 @@ -47991,7 +48030,6 @@ eg-secure.co.jp, 0 eg22.com, 1 eg7.co.jp, 1 -egab.co, 0 egabroaventuras.tk, 1 egais.ml, 1 egal24.de, 1 @@ -48002,7 +48040,6 @@ egbertsen.tk, 1 egc.ink, 1 egdsk.ru, 1 -egegesh.ru, 1 egehem.se, 1 egenya.cl, 0 egeozcan.com, 0 @@ -48011,7 +48048,6 @@ egfl.org.uk, 1 egg-events.com, 1 egg-ortho.ch, 1 -eggblast.com, 1 eggc.at, 1 eggel.ch, 1 eggen.dk, 1 @@ -48043,7 +48079,9 @@ eggrolls.ml, 1 egh.ir, 1 egiftcards.be, 1 +egiftified.com, 1 egilopaseryh.tk, 1 +eginfracloud.uk, 1 egins.tk, 1 egipet-tiz.tk, 1 egiptwakacje.tk, 1 @@ -48072,7 +48110,6 @@ egoscolumn.tk, 1 egotripproductions.org, 1 egoutierrpaquette.ca, 1 -egov.digital, 1 egrabby.com, 1 egrasmanipur.nic.in, 1 egreensvape.com, 1 @@ -48107,7 +48144,6 @@ egzotique.com, 1 eh-huebner-stiftung.de, 1 ehaccp.it, 1 -ehachettefle.com, 1 eharmony.ca, 1 eharmony.com, 1 ehazi.hu, 1 @@ -48172,6 +48208,7 @@ eifel-adventure.de, 1 eifel.website, 1 eifelstuebchen.de, 1 +eiffageconstruction.com, 1 eigenaardig.tk, 1 eigenbubi.de, 1 eigendeeg.eu, 1 @@ -48221,7 +48258,6 @@ eino.world, 1 einreiseanmeldung.de, 1 einsatzstiefel.info, 1 -einstein-themanandhismind.net, 1 einsteinathome.org, 1 einsteinbros.com, 1 einsteinium.fr, 1 @@ -48252,7 +48288,6 @@ eisenzelt.de, 1 eisernes-kreuz.tk, 1 eiskratzer-bedrucken.de, 0 -eisneramperadvisory.com, 1 eit-solutions.com.au, 1 eit-web.de, 0 eitbtaldea.eus, 1 @@ -48330,6 +48365,7 @@ ekloz.org, 1 ekmanager.tk, 1 ekmo.cz, 1 +eknotec.co, 1 eko69.pl, 1 ekoazyl.pl, 1 ekobudisantoso.net, 1 @@ -48390,7 +48426,6 @@ elaboratefiction.com, 1 elad.wtf, 1 eladalfassa.com, 1 -eladerezo.com, 1 elaegypt.org, 1 elahejalilvand.com, 1 elaheze.com, 0 @@ -48496,7 +48531,7 @@ eldiario.net, 1 eldiedesign.com, 1 eldin.ba, 1 -eldinturkic.com, 0 +eldinturkic.com, 1 eldisagjapi.de, 1 eldorado.aero, 1 eldoradocylinders.com, 1 @@ -48517,7 +48552,6 @@ electionpresidentiellegabon2009.ga, 1 elections-sintmaartengov.org, 1 elections.ca, 1 -electionsbycounty.com, 1 electionsdatabase.com, 1 electionsshelbytn.gov, 1 electmikewaters.com, 1 @@ -48535,14 +48569,16 @@ electricalandelectronicsengineerinformation.ga, 1 electricalengineeringapp.com, 1 electricalengineers.tk, 1 +electricalfencingedenvale.co.za, 1 +electricalfencingroodepoort.co.za, 1 electricalmalibu.com, 1 -electricaloakpark.com, 1 electricalpacificpalisades.com, 1 electricalwestlakevillage.com, 1 electricannihilation.tk, 1 electricbeast.co, 1 electriccoin.co, 1 -electricdosvientos.com, 1 +electricfencealberton.co.za, 1 +electricfencelonehill.co.za, 1 electricfencingpinetown.co.za, 1 electricfireplaces.tk, 1 electricgatemotoralberton.co.za, 1 @@ -48553,28 +48589,21 @@ electricgypsies.nl, 1 electrichome.fr, 1 electriciancenturion24hours.co.za, 1 -electriciannewburypark.com, 1 electricianpacificpalisades.com, 1 electricianpretoria24-7.co.za, 1 electricians-roodepoort.co.za, 1 electriciansportelizabeth.co.za, 1 -electricianthousandoaks.com, 1 electricienasnieres.fr, 1 electricimagination.co.uk, 1 electricity.tk, 1 electricityplans.com, 1 electrickiwi.co.uk, 1 electricmalibu.com, 1 -electricmoorpark.com, 1 electrico.tk, 1 -electricoakpark.com, 1 electricpower.tk, 1 electricpulp.com, 1 -electricsimivalley.com, 1 -electricwestlakevillage.com, 1 electricwokstore.com, 1 electriczone.tk, 1 -electrijob.com, 1 electrochef.es, 1 electrocomplect.com.ua, 1 electrodomesticos.tk, 1 @@ -48601,7 +48630,6 @@ electronic-ignition-system.com, 1 electronicafacil.net, 1 electronicaripol.es, 1 -electronicfiddling.com, 1 electronics.com.bd, 1 electronicshelpcare.net, 1 electronicssrit.tk, 1 @@ -48711,6 +48739,7 @@ elektryczka.pl, 1 elelenin.cf, 1 elemac.com.my, 1 +elemarket.pl, 1 elemenik.com, 1 elemenop.tk, 1 element-ppf.com, 1 @@ -48729,7 +48758,6 @@ elementarium.cf, 1 elementarium.ga, 1 elementarythegame.com, 1 -elementarywave.com, 0 elementblend.com, 1 elementbookings.com, 1 elementedigitale.ro, 1 @@ -48784,6 +48812,7 @@ eleplant.fi, 1 elepover.com, 1 elesconditedelola.com, 1 +elestoque.org, 1 eletem.org, 1 eletminosegert.ro, 1 eletom.pl, 1 @@ -48869,7 +48898,6 @@ eliava-gartenbau.de, 1 elibidore.ml, 1 elicdn.com, 1 -elidiaz.com, 1 elie.net, 1 elielaloum.com, 0 elifelabs.com, 1 @@ -48880,6 +48908,7 @@ eligibility.com, 1 eligible.com, 1 eligibleapi.com, 1 +eligimed.com, 1 eligrey.com, 1 eliguli.com, 1 elijahbrown.tk, 1 @@ -48939,6 +48968,7 @@ elite-porno.ru, 1 elite-tools.tk, 1 elite-units.tk, 1 +elite.cards, 1 elite.memorial, 1 elite12.de, 1 eliteaccounting.co.nz, 1 @@ -48962,7 +48992,6 @@ eliteensino.com.br, 1 elitefintechglobal.com, 1 elitegameservers.net, 1 -eliteheatgroup.co.uk, 1 eliteholidaylights.com, 1 elitehouse.tk, 1 eliteimsolutions.com, 1 @@ -48987,7 +49016,6 @@ elitmedopt.ru, 1 elixi.re, 1 elixir.bzh, 1 -elixirfactory.io, 1 elizabethcitync.gov, 1 elizabethefle.com, 1 elizabethgreenfield.com, 1 @@ -49152,11 +49180,11 @@ elsas.tk, 1 elsbouslanostraaficio.tk, 1 elsector7.tk, 1 -elselingerie.com, 1 elsemanariodesalamanca.tk, 1 elsg.co.uk, 1 elshop1eu.com, 1 elshou.com, 1 +elslab.com, 1 elsoundspeakers.com, 1 elstravato.com, 1 elsuccionador.com, 1 @@ -49199,6 +49227,7 @@ elverdaderoamor.tk, 1 elvermann.de, 1 elvikom.co.uk, 1 +elvikom.pl, 1 elviraszabo.com, 1 elvis-atouchofgold.com, 1 elvis-presley.tk, 1 @@ -49229,7 +49258,6 @@ emabot.tk, 1 emacitylife.com, 1 emad7.tk, 1 -emagazine.com, 1 emagicone.com, 1 emaging-productions.fr, 1 emaging.fr, 1 @@ -49281,11 +49309,14 @@ emarhotel.bg, 1 emarketingmatters.com, 1 emas-beja.pt, 1 +ematravelmorocco.com, 1 emavending.club, 1 emavok.eu, 1 emazrin.tk, 1 emazzanti.net, 1 emba.au, 1 +embaleo.com, 1 +embaleo.es, 1 embarcados.com.br, 0 embark.studio, 0 embarkok.com, 1 @@ -49303,7 +49334,8 @@ ember.dedyn.io, 1 emberit.com, 1 emberlife.com, 1 -embibe.com, 1 +embersolutions.uk, 1 +embibe.com, 0 emblemhealth.com, 1 embodiaacademy.com, 1 embodiaapp.com, 1 @@ -49315,9 +49347,9 @@ embracecontext.com, 1 embracethedarkness.co.uk, 1 embracezine.tk, 1 -embraco.com, 1 embrapolsul.com.br, 1 embryooptions.com, 1 +embuscadedividendo.com.br, 1 embutidoselpipi.com, 1 emby.cloud, 1 emcado.com, 1 @@ -49534,7 +49566,6 @@ employeemanual.com.au, 1 employeesupport.co.uk, 1 employer.gov, 1 -employer411.com, 1 employeradmin.com, 1 employersolutionsgroup.com, 0 employersupport.co.uk, 1 @@ -49562,6 +49593,7 @@ empower.ae, 1 empoweraces.com, 1 empowerdb.com, 1 +empowerdxlab.com, 1 empowered-decision.com.au, 1 empoweredpatientradio.com, 1 empoweren.com, 1 @@ -49651,7 +49683,6 @@ enai.eu, 1 enalean.com, 1 enam.gov.in, 1 -enamae.net, 1 enaminestore.com, 1 enamonada.com, 1 enasher.com, 1 @@ -49678,6 +49709,7 @@ encirca.com, 0 encircleapp.com, 1 enclavecairns.com.au, 1 +encloud-gs.com, 1 encode.host, 1 encontra-me.org, 1 encontracarros.pt, 1 @@ -49747,6 +49779,7 @@ endlesswebsite.tk, 1 endo-shika.info, 1 endocarditis.au, 1 +endodanli.com, 1 endofevolution.com, 1 endofinternet.goip.de, 1 endoflife.date, 1 @@ -49757,6 +49790,7 @@ endorsec.com, 1 endorsec.de, 1 endorsia.io, 1 +endosave.de, 1 endoscope.bg, 1 endpipe.com, 1 endplasticwaste.org, 0 @@ -49766,6 +49800,7 @@ endsoftwarepatents.org, 1 endspamwith.us, 1 endstation-chaos.de, 1 +endura.company, 1 enduranceseries.ca, 1 enduro-center.pt, 1 enduroxtrem.tk, 1 @@ -49902,6 +49937,7 @@ enfinnit.com, 1 enflow.nl, 1 enfluentia.com, 1 +enforcegate.com, 1 enforcement-trends-dev.azurewebsites.net, 1 enforcement-trends-test.azurewebsites.net, 1 enforcement-trends.azurewebsites.net, 1 @@ -49957,8 +49993,8 @@ enginess.io, 1 engins.fr, 1 enginsight.com, 1 -enginsjob.com, 1 enginytech.com, 1 +engitix.com, 1 engl-amps.com, 1 engl-amps.net, 1 engl-customshop.com, 1 @@ -49968,6 +50004,7 @@ engl-distribution.de, 1 engl-distribution.net, 1 engl-systems.de, 1 +englandbeach.com, 1 englandgenealogy.co.uk, 1 englandlearn.com, 0 englandschool.tk, 1 @@ -50041,7 +50078,6 @@ enkelpaamelding.no, 1 enker.tk, 1 enkolaysertifika.com, 1 -enkosi.com.au, 1 enkrypt.com, 1 enky.be, 1 enlacemedik.com, 1 @@ -50063,7 +50099,6 @@ ennori.jp, 1 ennova.com, 0 ennovationtech.eu, 1 -enoahinc.com, 1 enodais.gr, 1 enofmusic.com, 1 enoisdaturma.tk, 1 @@ -50176,6 +50211,7 @@ entheogens.com, 1 entheor.com, 1 enthrallinggumption.com, 1 +entia.systems, 1 enticingai.com, 1 entitlementtrap.com, 1 entityfiling.com, 1 @@ -50341,6 +50377,7 @@ eod.su, 1 eofster.com, 1 eogresources.com, 1 +eohm.org, 1 eol-team.tk, 1 eola.co, 1 eolasinnovation.com, 1 @@ -50367,7 +50404,7 @@ eov2.com, 1 ep-cortex.com, 1 ep-plus.jp, 1 -epa.gov, 1 +epa.gov, 0 epagos.com.ar, 1 epagos.mx, 1 epaoig.gov, 1 @@ -50433,7 +50470,6 @@ epicvistas.de, 1 epidastudio.com, 1 epidauros.be, 1 -epieos.com, 1 epigrafes-led-farmakeia.gr, 1 epikchat.com, 1 epilazione.it, 1 @@ -50458,7 +50494,6 @@ eplenet.tk, 1 epliar.com, 1 eplus.group, 1 -epluse.com, 1 eplustech.eu, 1 epm-bg.com, 1 epmcentroitalia.it, 1 @@ -50569,7 +50604,6 @@ equivid.ga, 1 equmeniakyrkanhallunda.se, 1 equt.cloud, 1 -er.tl, 1 era-edta-reg.org, 1 eradication-nuisibles-pro.fr, 1 eradoom.net, 1 @@ -50602,6 +50636,7 @@ erclaim.com, 1 erctra.com, 1 erda.gov, 1 +erdecoshop.de, 0 erdekesseg.com, 1 erdelyireceptek.ro, 1 erdethamburgeronsdag.no, 1 @@ -50626,7 +50661,6 @@ ergaomnes.cz, 1 ergaran.tk, 1 ergela-djakovo.hr, 1 -ergobaby.com, 0 ergobyte.eu, 1 ergobyte.gr, 1 ergodark.com, 1 @@ -50638,7 +50672,6 @@ ergosg.com, 1 ergostoel.nl, 1 ergotherapie-schaab.de, 1 -ergotherapie.fr, 1 erguinsaat.com, 1 erholungsrechner.de, 1 erhvervsposten.dk, 1 @@ -50710,7 +50743,6 @@ eriksson-lavotha.se, 1 erikswan.com, 1 erinaceinae.com, 1 -erinandken.net, 1 erincarmody.cf, 1 eriner.me, 1 eringmaguire.com, 1 @@ -50763,6 +50795,7 @@ erosads.com, 1 erosbeautyandwellness.com, 1 eroscomixitalia.tk, 1 +erosmowy.pl, 1 erosofia.tk, 1 erosveneziani.cz, 1 erosvet.cz, 1 @@ -50785,6 +50818,7 @@ erpid.info, 1 erpnext.com, 1 erpollo.com, 1 +erpuas.com, 1 erraen.org.ua, 1 erreguete.gal, 1 errekaweb.tk, 1 @@ -50937,6 +50971,11 @@ escortlistings.ph, 1 escortlistingsuk.co.uk, 1 escorto.cc, 1 +escortserviceleiden.nl, 1 +escortserviceschiphol.com, 1 +escortservicezaanstad.nl, 1 +escortservicezeeland.nl, 1 +escortsuper.com, 1 escortz.gq, 1 escoteiros.tk, 1 escovator-records.tk, 1 @@ -50957,8 +50996,8 @@ esd.cc, 1 esdacademy.eu, 1 esdarat.ml, 1 +esdcybersecurity.eu, 1 esdiscuss.org, 1 -esdisena.es, 1 esdrasluna.com, 1 esds.com.br, 1 eseances.ch, 1 @@ -51004,6 +51043,7 @@ esiliati.org, 1 esilva.me, 1 esilverstone.pl, 1 +esim.io, 1 esimy.net, 1 esiptvpro-max.com, 1 esitc-paris.fr, 1 @@ -51074,6 +51114,7 @@ espacioweb.tk, 1 espacoalimentoesaude.com.br, 1 espacosaudesuplementos.com.br, 1 +espaiarrela.com, 1 espaiblancandorra.ga, 1 espaiblancandorra.gq, 1 espaiblancandorra.ml, 1 @@ -51086,7 +51127,6 @@ especes.org, 1 especializasaudecursos.com.br, 1 especiallysilver.com, 1 -especificosba.com.ar, 1 espectro.tk, 1 espejo.tk, 1 espejocofrade.tk, 1 @@ -51106,7 +51146,6 @@ espivblogs.net, 1 esplendorecosmeticos.com.br, 1 esploria.com, 1 -espocada.com, 1 espoonkumi.fi, 0 esport-agency.fr, 1 esporte.casino, 1 @@ -51250,7 +51289,6 @@ estocq.fr, 1 estoense.com, 1 estomp.de, 1 -estonia.ee, 0 estoniananonymous.tk, 1 estoniantrade.ee, 1 estonoentraenelexamen.com, 1 @@ -51292,7 +51330,6 @@ esu.moe, 1 esu.wiki, 1 esu.zone, 1 -esubasta.ar, 1 esunapena.tk, 1 esunenin.tk, 1 esuretynew.azurewebsites.net, 1 @@ -51403,6 +51440,7 @@ ethernium.fun, 1 etheron.com, 1 etherpad.nl, 1 +etherphon.com, 1 ethersys.fr, 1 ethiack.com, 0 ethical-home.co.uk, 1 @@ -51460,6 +51498,7 @@ etrades.tk, 1 etre-belle.tk, 1 etre-vivant.fr, 0 +etreatify.com, 1 etrecosmeticderm.com, 1 etrialsolutions.ca, 1 etrialsolutions.com, 1 @@ -51556,25 +51595,33 @@ euleres.tk, 1 eulerhermes.be, 1 eulerhermes.bg, 1 +eulerhermes.ch, 1 eulerhermes.co.jp, 1 eulerhermes.co.nz, 1 eulerhermes.co.uk, 1 eulerhermes.co.za, 1 eulerhermes.com, 1 eulerhermes.com.hk, 1 +eulerhermes.com.sg, 1 eulerhermes.com.tr, 1 eulerhermes.cz, 1 eulerhermes.de, 1 +eulerhermes.dk, 1 +eulerhermes.ee, 1 eulerhermes.es, 1 eulerhermes.fi, 1 eulerhermes.fr, 1 eulerhermes.gr, 1 eulerhermes.hk, 1 +eulerhermes.hu, 1 +eulerhermes.ie, 1 eulerhermes.it, 1 eulerhermes.kr, 1 eulerhermes.lv, 1 eulerhermes.my, 1 eulerhermes.nl, 1 +eulerhermes.pl, 1 +eulerhermes.ro, 1 eulerhermes.se, 1 eulerhermes.sg, 1 eulerhermes.sk, 1 @@ -51583,13 +51630,13 @@ eulessplumbers.com, 1 euman.ml, 1 eumananc.ro, 1 +eumenis.com, 1 eumk6.ml, 1 eunep.com, 1 eunetworks.com, 1 eung.ga, 1 eunicetan.com, 1 eunomy.io, 1 -eupack.pl, 1 eupay.de, 1 euphoriaonline.tk, 1 euphoriareign.com, 1 @@ -51609,6 +51656,7 @@ eurekatownshipmi.gov, 1 eurekka.me, 0 euren.se, 1 +euripidis.photography, 1 euritaprinter.com, 0 eurmarketing.com, 1 euro-cdm.org, 1 @@ -51823,6 +51871,7 @@ evansville-wy.gov, 1 evansvillewi.gov, 1 evantageglobal.com, 1 +evanter.hu, 1 evantynan.com, 0 evanwang0.com, 1 evaolson.se, 1 @@ -51845,8 +51894,8 @@ eve-ua.com, 1 eve.tax, 1 eve0s.com, 1 -eveandi.health, 1 eveaz.com, 1 +evec.in, 1 eveco-mebel.ga, 1 evedanjailbreak.com, 1 evehryday.com, 1 @@ -51956,8 +52005,7 @@ everfi.com, 1 everfine.com.tw, 1 everfree.win, 1 -evergarden.cn, 0 -evergladesfarmequipment.com, 1 +evergarden.cn, 1 everglow.co.jp, 1 evergood.com.br, 1 evergreen.je, 1 @@ -51978,7 +52026,6 @@ everling.lu, 1 everlong.org, 1 everly.market, 1 -evermade.fi, 1 evermed.au, 1 evermed.com.au, 1 evernaut.com, 1 @@ -51997,7 +52044,6 @@ everwaking.com, 0 everwelloh.com, 1 everwinter.tk, 1 -every-day-life.com, 0 every-day.nl, 1 every.one, 1 everyad.co.il, 1 @@ -52019,7 +52065,6 @@ everyex.com, 1 everyeye.it, 1 everykidoutdoors.gov, 1 -everymail.me, 1 everyoneadmins.tk, 1 everysaving.ae, 1 everysaving.ca, 1 @@ -52080,6 +52125,7 @@ evin.tk, 1 evisa.us.com, 1 evisos.cl, 1 +evisos.com, 1 evisos.com.ar, 1 evisos.com.mx, 1 evisos.es, 1 @@ -52089,6 +52135,7 @@ evlconsulting.com.au, 1 evlilikilan.com, 1 evlqa1sp1tzb05zo-reoo0vhj9a1t5pousfudnkg.com, 0 +evlv.energy, 1 evmodssweden.se, 1 evo-ai.com, 1 evo-exchange.com, 1 @@ -52110,12 +52157,11 @@ evolution-x.org, 1 evolution.codes, 1 evolutionbp.es, 1 -evolutionhomecorp.com, 1 evolutioninflatables.co.uk, 1 evolutionlife.za.com, 1 evolutionmining.com, 1 evolutionmuaythai.com, 1 -evolutionosteopathy.co.uk, 1 +evolutionosteopathy.co.uk, 0 evolutive-records.tk, 1 evolutlabs.com, 1 evoluxion.co, 1 @@ -52124,6 +52170,7 @@ evolveagency.gr, 1 evolvedevlabs.de, 1 evolvemodular.ca, 1 +evolveorbit.com, 1 evolvetechnologies.co.uk, 1 evolvewithquantum.com, 1 evolvicity.org, 1 @@ -52149,7 +52196,6 @@ evropaedu.ru, 1 evscicats.com, 1 evscstudentwifi.com, 1 -evseadapters.com, 1 evsinemasistemleri.tk, 1 evstatus.com, 0 evt.com, 1 @@ -52178,6 +52224,7 @@ ewg-garching.de, 1 ewgalerie.com, 0 ewgri.gov, 1 +ewhalellc.com, 1 ewie.name, 1 ewighost.com, 1 ewigkeit.blog, 1 @@ -52232,10 +52279,12 @@ examika.ru, 1 examone.com, 1 exampaperarchive.com, 1 +example.li, 1 example.ng, 1 exampleessays.com, 1 examroll.fr, 1 examroo.nl, 0 +examroom.ai, 1 examsite.tk, 1 examsmate.in, 1 examsoft.com, 1 @@ -52312,6 +52361,7 @@ excontinuum.de, 1 excursiones.tk, 1 exe-boss.tech, 1 +exe.xyz, 1 exec.institute, 1 execbar.com, 1 execom68.tk, 1 @@ -52329,7 +52379,6 @@ exelonline.nl, 1 exelreporters.com, 1 exelreporting.com, 1 -exelya.fr, 1 exemples-de-stands.com, 1 exer.fr, 1 exercise.com, 1 @@ -52362,7 +52411,6 @@ exip.ga, 1 exira.com, 1 exist.ru, 1 -exitbydeath.com, 1 exito-e.com, 1 exitoseguro.tk, 1 exitreality.tk, 1 @@ -52419,6 +52467,7 @@ expatriate.pl, 0 expe.voyage, 1 expectful.com, 0 +expectingplus.com, 1 expediteplus-asia.com, 1 expediteplus.biz, 1 expediteplus.ca, 1 @@ -52498,7 +52547,6 @@ explode.tk, 1 explodie.org, 1 explohub.com, 1 -exploit-db.com, 1 exploit.cz, 0 exploit.party, 1 exploited.cz, 1 @@ -52620,8 +52668,6 @@ exstirpo.com, 1 ext-code.com, 1 extact.com, 1 -extendedteam.co, 1 -extendedteam.net, 1 extendet.tk, 1 extendresources.com, 0 extendwings.com, 1 @@ -52689,6 +52735,7 @@ extremelawsest.ga, 1 extremeleadprogram.com, 1 extremelycorporate.ca, 0 +extrememanual.net, 1 extrememusclepump.com, 1 extremepeptides.com, 1 extremeprojects.tk, 1 @@ -52713,7 +52760,6 @@ exxpozed.co.uk, 1 exxpozed.eu, 1 exzibit.net, 1 -eyaqueen.com, 1 eyasc.nl, 1 eye-move.nl, 1 eye-vet.co.uk, 1 @@ -52751,7 +52797,6 @@ eylog.co.uk, 1 eymon.llc, 1 eynio.com, 1 -eyodin.com, 1 eyoo.link, 1 eyps.net, 1 eytosh.net, 1 @@ -52762,11 +52807,9 @@ ezadmin.se, 1 ezakazivanje.rs, 1 ezakopane.pl, 1 -ezalba.com, 0 ezcater.com, 1 ezcesspoollongisland.com, 1 ezcourseonline.com, 1 -ezdog.press, 1 ezec.com.tw, 1 ezee-fix.co.uk, 1 ezekia.com, 1 @@ -52788,6 +52831,7 @@ eznetworks.com.br, 0 ezo.io, 1 ezochat.com, 1 +ezopus.com, 1 ezorgportaal.nl, 1 ezprints.com, 1 ezrent.tk, 1 @@ -52797,7 +52841,7 @@ ezscrapbooksest.ga, 1 ezshopper.co.uk, 1 ezsun.co, 1 -ezuz-fe.com, 1 +eztempmail.com, 1 ezvolt.com.br, 1 ezyentry.com.au, 1 ezygentechnology.com, 1 @@ -52915,7 +52959,6 @@ faberoclub.tk, 1 fabfrenchinsurance.com, 1 fabfrugalmama.com, 1 -fabian-fingerle.de, 1 fabian-ising.de, 1 fabian-klose.com, 1 fabian-klose.de, 1 @@ -52999,7 +53042,6 @@ fac.gov, 1 faca.gov, 1 facadatabase.gov, 1 -facan-godollo.hu, 1 facanabota.com, 1 facanabota.com.br, 1 facanacaveira.com, 0 @@ -53082,6 +53124,7 @@ factfocus.com, 1 factis.com, 1 factnsoftware.com, 1 +factobat.fr, 1 factor.cc, 0 factor10.com, 1 factorchave.com, 1 @@ -53224,6 +53267,7 @@ fairmountfireco.gov, 1 fairplay.im, 1 fairporthots.com, 1 +fairportliquor.com, 1 fairtprm.com, 1 fairtrade010.nl, 1 fairviewcounseling.org, 1 @@ -53252,7 +53296,6 @@ faithfulroad.org, 1 faithleaks.org, 0 faithnc.gov, 1 -faithriders.com, 0 faixaazul.com, 1 faizan.net, 1 faizanullah.com, 1 @@ -53262,6 +53305,7 @@ fajn-shop.cz, 1 fajnshop.sk, 1 fajode.net, 1 +fajxo.sk, 1 fakat.tk, 1 fake-show.ga, 1 fakeaddress.net, 1 @@ -53296,9 +53340,7 @@ falaeapp.org, 1 falastin.tk, 1 falbros.com, 1 -falcatus-dalmatians.hu, 1 falce.in, 1 -falcema.com, 1 falchion.tk, 1 falck.dk, 1 falcom.co.jp, 1 @@ -53318,6 +53360,8 @@ falegname-roma.it, 1 falegname.roma.it, 1 falegnameria.milano.it, 1 +falfurriasbutter.com, 1 +falixnodes.net, 1 falkenbergthomsen.dk, 1 falkenthal.org, 1 falkentyre.com, 1 @@ -53406,7 +53450,7 @@ familleseux.net, 1 familleshilton.com, 1 family-clinic.tk, 1 -family-intervention.com, 1 +family-intervention.com, 0 familyace.cz, 1 familyandfriends-railcard.co.uk, 1 familybusinessatlantic.ca, 1 @@ -53416,7 +53460,6 @@ familyd-c.com, 1 familydoctor.ru, 1 familyhookups.com, 1 -familyjpierre.com, 1 familylab.de, 1 familyparties.co.uk, 1 familyrecipe.co.uk, 1 @@ -53463,7 +53506,6 @@ fancygaming.dk, 1 fancypanty.cf, 1 fancywow.com, 1 -fandars.com, 1 fandeconcours.be, 1 fandeev.tk, 1 fander.it, 1 @@ -53472,6 +53514,7 @@ fanescu.ro, 1 fanfareokselaar.tk, 1 fanfiction.tk, 1 +fanfile.net, 1 fanflix.co, 1 fang-den-sommer.de, 1 fangban.net, 1 @@ -53497,11 +53540,11 @@ fansdb.cc, 1 fansdefoot.fr, 1 fansniper.com, 1 +fansop.com, 1 fanspace.io, 1 fansport.space, 1 fansta.jp, 1 fanstake.com, 1 -fanstuff.ru, 1 fantacast.it, 1 fantasiatravel.hr, 1 fantasmma.tk, 1 @@ -53547,7 +53590,6 @@ fanzhe.com, 1 fanzine-nimbus.tk, 1 faortega.org, 1 -fap.link, 1 fap.no, 1 fapcoholic.com, 1 fapiis.gov, 1 @@ -53555,6 +53597,7 @@ fapplepie.com, 1 fapplesauce.com, 1 fapzone.tk, 1 +faq-helper.com, 1 faq.ie, 1 faqbite.com, 1 faqexchangeest.ga, 1 @@ -53587,6 +53630,7 @@ fareinternational.com, 1 farenheit.net, 1 faresair.com, 1 +faresfrom.com, 1 fareto.com, 1 fareuntrasloco.it, 1 farexpress.it, 1 @@ -53630,8 +53674,10 @@ farmerbrossamples.com, 1 farmerfairness.gov, 1 farmers.gov, 1 +farmerschilemarket.com, 1 farmersfridge.com, 0 farmersgirlkitchen.co.uk, 1 +farmforte.com, 1 farmhouse.com.my, 1 farmhouse.com.sg, 1 farming.co.uk, 1 @@ -53644,6 +53690,7 @@ farmtransparency.org, 1 farmus-spb.ru, 1 farmvilleva.gov, 1 +farnboroughairport.com, 1 faro-car-hire.co.uk, 1 faro.com, 1 farodistribuidora.com.br, 1 @@ -53670,6 +53717,7 @@ fartoon.cz, 1 fartoons.cz, 1 fartypants.com, 1 +farwestlive.com, 1 faryaz.tk, 1 fasab-portcenter.se, 1 fasad.eu, 1 @@ -53688,9 +53736,6 @@ fashioncourses.tk, 1 fashioncrib.co.za, 1 fashiondaily.tk, 1 -fashiondays.bg, 1 -fashiondays.hu, 1 -fashiondays.ro, 1 fashiondesign.ml, 1 fashiondex.com, 1 fashiondistrict.org, 1 @@ -53703,7 +53748,10 @@ fashionforyou.ga, 1 fashionfreaks.tk, 1 fashionfuture.tk, 1 -fashiongonerogue.com, 1 +fashiongirl.be, 1 +fashiongirl.ch, 1 +fashiongirl.es, 1 +fashiongirl.fi, 1 fashionhome.tk, 1 fashionhometex.com, 1 fashionht.com, 1 @@ -53830,6 +53878,7 @@ fastimg.net, 1 fastknighki.ga, 1 fastknigi.ml, 1 +fastlane.express, 1 fastlaneimportautorepair.com, 1 fastme.co, 1 fastmeet.tk, 1 @@ -53840,6 +53889,8 @@ fastpaper.gq, 1 fastpeoplesearch.com, 1 fastphox.com, 1 +fastplaygames.com, 1 +fastplumbingmilwaukee.com, 1 fastpresence.com, 1 fastproxycat.ml, 1 fastproxyforfree.gq, 1 @@ -53849,7 +53900,6 @@ fastscanapp.com, 1 fastserv.pl, 1 fastshop.com.pl, 0 -faststage.ch, 1 fasturl.ml, 1 fastvanya.com, 1 fastvelocityers.ga, 1 @@ -53879,7 +53929,6 @@ fatih-catering.com, 1 fatihingemisi.com, 1 fatimamoldes.com.br, 1 -fatimaonlinepharmacy.com, 1 fatimarojo.com, 1 fatlabwebsupport.com, 1 fatnerdstock.com, 1 @@ -53890,14 +53939,12 @@ fattailcall.com, 0 fattorino.it, 1 fatturegeko.eu, 1 -fatty.io, 1 fattyink.com, 1 fatumagro.bg, 1 faturan.com.tr, 1 fatvalley.at, 1 fatzebra.com.au, 1 fau-bremen.tk, 1 -fau.re, 1 fau8.ml, 1 fauceton.cf, 1 fauceton.tk, 1 @@ -53910,6 +53957,7 @@ faunathreads.com, 1 faunatrek.com, 1 faus-moliner.com, 1 +faustodiiorio.com, 1 fautchen.eu, 1 fauteuil-bebe.fr, 1 fauv.art, 1 @@ -53988,10 +54036,10 @@ fbilab.gov, 1 fbk.moe, 1 fbo.gov, 1 -fbo.network, 1 fboerman.nl, 1 fboglich.com.ar, 1 fbowling.com, 1 +fbpred.xyz, 1 fbrief.org, 1 fbsbx.com, 1 fbscontenttest.com, 1 @@ -54000,7 +54048,6 @@ fbwat.ch, 1 fbwifi.com, 1 fc-corvinul.tk, 1 -fc-rostov.ru, 1 fc-software.it, 1 fc8882.net, 1 fca-tools.com, 1 @@ -54024,7 +54071,6 @@ fcdordrecht.tk, 1 fcforum.net, 1 fcgmd.gov, 1 -fcgundlach.de, 1 fcht.fr, 1 fcic.gov, 1 fcitasc.com, 1 @@ -54103,7 +54149,6 @@ fecskefeszekotthonom.hu, 1 fecyt.es, 1 fed-shashek.spb.ru, 1 -fed.monster, 1 fed51.com, 1 fedai.org, 1 fedbizopps.gov, 1 @@ -54198,6 +54243,7 @@ feedingonmanna.org, 1 feedkovacs.hu, 1 feedmail.org, 1 +feedon.ai, 1 feedready.eu, 1 feedstringer.com, 1 feedthefood.com, 1 @@ -54258,7 +54304,7 @@ feiertage-ferien.com, 1 feignandfolly.tk, 1 feiki.tk, 1 -feikuai.tv, 1 +feikuai.tv, 0 feildel.fr, 1 feilen.de, 1 feilestrokestown.com, 1 @@ -54266,13 +54312,13 @@ feirlane.org, 0 feiromo.com, 1 feistore.com.tw, 1 +feistyduck.com, 1 feisworld.com, 0 feitam.es, 1 feittinf.org.br, 0 feixiang.eu.org, 1 feixiang.pp.ua, 1 feiya.ng, 1 -fejasport.hu, 1 fejervar.hu, 1 fejlaw.com.au, 0 fejo.dk, 1 @@ -54331,7 +54377,6 @@ felsenheimer.tk, 1 feltencie.com, 1 feltons.me, 0 -feltresca.it, 1 feluck.de, 1 female-costumes.tk, 1 femalebeauty.my.id, 1 @@ -54339,6 +54384,7 @@ femalefoodie.com, 1 femalehumorers.ga, 1 femalehumorest.ga, 1 +femalepersonaltrainer.com.au, 1 femaleteamest.ga, 1 femboy.fan, 1 femboys.pics, 1 @@ -54401,7 +54447,6 @@ fenogent.com, 1 fenom.ga, 1 fenris.ovh, 1 -fenritec.eu, 0 fenritec.fr, 1 fense.cf, 1 fense.ml, 1 @@ -54655,8 +54700,6 @@ ffiec.gov, 1 ffis.me, 0 ffl123.com, 1 -fflone.com, 1 -ffmradio.de, 1 ffn-connect.de, 1 ffnm.org, 1 ffprofile.com, 1 @@ -54673,6 +54716,7 @@ ffzeven.de, 1 fgalegaciclismo.es, 1 fgeiger.dnshome.de, 1 +fgf-companion.com, 1 fggpay.com, 1 fgh-ma.de, 1 fgh-zertifizierung.de, 1 @@ -54704,6 +54748,7 @@ fhba.com.au, 1 fhburger.ru, 1 fhcdn.xyz, 1 +fhd.agency, 1 fhdhelp.de, 0 fhdhilft.de, 0 fhersoberanes.tk, 1 @@ -54744,7 +54789,6 @@ fhsroyalbanner.com, 1 fhsseniormens.club, 1 fhstation.com, 1 -fhstatus-chinese.com, 1 fhv-waldhausen.de, 1 fhwechat.com, 1 fhzhs.com, 1 @@ -54785,10 +54829,9 @@ fiddlestickstoys.com.au, 1 fidele-g-hd.co.jp, 1 fidelis-it.ch, 1 -fidelis-it.net, 1 +fidelis-it.net, 0 fidelity-services.com, 1 fidelity.co.jp, 1 -fidelitybank.com.gh, 1 fidelityhomestead.com, 1 fidelitysound.es, 1 fides.ch, 1 @@ -54812,6 +54855,7 @@ fieldelectriconline.com, 1 fieldgroupny.com, 1 fieldsgynroboticsurgery.com, 1 +fieldstat.com, 1 fieldworkbrewing.com, 1 fieldworks.ne.jp, 1 fiemmeimpianti.it, 1 @@ -54819,6 +54863,7 @@ fierman.eu, 0 fierman.net, 0 fierman.us, 0 +fierrettsphere.com, 1 fierscleaning.nl, 1 fieryaura.eu, 1 fiesta-mk5-limited-edition.nl, 1 @@ -54840,7 +54885,6 @@ fifaultimatemod.tk, 1 fifauteam.com, 1 fifehg.org.uk, 1 -fifemedicalgroup.co.uk, 1 fiff.de, 0 fifpro.org, 0 fifr.nl, 1 @@ -54856,7 +54900,7 @@ figandgoat.com, 1 figaroparrucchiere.it, 1 figbytes.biz, 1 -figbytes.com, 1 +figbytes.com, 0 figgy.mk, 1 figherie.it, 1 fighribali.tk, 1 @@ -54947,6 +54991,7 @@ filiotech.com, 1 filiotech.pl, 1 filip-prochazka.com, 0 +filipi.no, 1 filipinasdailynews.tk, 1 filipinochinese.tk, 1 filipinostaff.uk, 1 @@ -54970,7 +55015,6 @@ filmbest.tk, 1 filmbrain.com, 1 filmcorner.tk, 1 -filmdates.co.uk, 1 filmedonstage.com, 1 filmezzunk.hu, 1 filmfestivalflix.com, 1 @@ -55041,12 +55085,14 @@ finaktiv.tk, 1 final-expense-quotes.com, 1 final-rest.co.uk, 1 +final-spark.com, 1 final-x.com, 1 finalashes.tk, 1 finalfate.tk, 1 finalfoursteam.tk, 1 finalfourstream.tk, 1 finalgambit.band, 1 +finalizatextil.com.br, 1 finalleopard.tk, 1 finalmenteazul.pt, 1 finalonline.tk, 1 @@ -55088,7 +55134,6 @@ finansified.com, 1 finansinspektionen.se, 1 finansy.tk, 1 -finanz-planer.net, 1 finanzasydinero.com, 1 finanzen-az.com, 1 finanzen-weblog.de, 1 @@ -55110,10 +55155,12 @@ fincent.xyz, 1 finch.am, 1 finch.ga, 1 +finchleyhandyman.com, 1 finchnest.co.uk, 1 fincities.tk, 1 fincura.com, 1 find2career.com, 1 +findahelpline.com, 1 findahero.com.au, 1 findairconditioningers.ga, 1 findairconditioningest.ga, 1 @@ -55123,7 +55170,6 @@ findapinball.com, 1 findautoloan.ml, 1 findbalancedliving.com, 1 -findbestfirm.com, 1 findblockchaingames.com, 1 findbugs.net, 1 findby.co.kr, 1 @@ -55149,7 +55195,6 @@ findjeen.com, 1 findlayohio.gov, 1 findlimitsers.ga, 1 -findlocalproduce.co.uk, 1 findmacrophage.com, 1 findmail.ga, 1 findmassmoney.gov, 1 @@ -55222,8 +55267,8 @@ finilaviolence.gc.ca, 1 finishingpasteers.ga, 1 finishingpasteest.ga, 1 -finishrich.com, 1 finisron.in, 0 +finista.com.tr, 1 finitecarbon.com, 0 finity.com, 1 finkelstein.fr, 1 @@ -55242,7 +55287,6 @@ finn-thorben.me, 1 finn.io, 1 finnclass.cz, 1 -finndel.no, 1 finnema.eu, 1 finnhjelpemidler.no, 1 finnishclothing.tk, 1 @@ -55257,6 +55301,7 @@ finprison.net, 1 finqk.nl, 1 finqueslaromanica.com, 1 +finroom.io, 1 fins.money, 1 finsecurity.eu, 1 finsight.com, 1 @@ -55312,8 +55357,8 @@ firecore.cn, 1 firecore.com, 1 firecry.org, 1 +firedbyroger.com, 1 firedemons.tk, 1 -firedo.de, 1 firedup4success.com, 1 fireems.ai, 1 fireeye.tk, 1 @@ -55324,6 +55369,7 @@ fireflygatlinburg.com, 1 firehada.com, 1 firehousemouse.com, 1 +firehustle.net, 1 fireintheholevideos.tk, 1 fireleadership.gov, 1 firelinkshrine.xyz, 1 @@ -55373,6 +55419,7 @@ firmant.me, 1 firmapi.com, 1 firmatour.it, 1 +firmen.directory, 1 firmendb.com, 0 firmennie-crossovki.tk, 1 firmenwerbung-vermarktung.de, 1 @@ -55407,9 +55454,7 @@ firstbaptistchurchofchrist.org, 1 firstbaptistfargo.com, 1 firstbooks.ml, 1 -firstbridge.io, 1 firstbus.co.uk, 1 -firstcall.cloud, 1 firstcallnc.com, 1 firstcapitalfcu.com, 1 firstcentralsavings.com, 1 @@ -55423,6 +55468,7 @@ firstclassleisure.co.uk, 1 firstclassnuisance.tk, 1 firstclinic.tk, 1 +firstcoastbillinggroup.com, 1 firstcoastteaco.com, 1 firstcolonyengraving.com, 1 firstcommunity.com, 1 @@ -55448,7 +55494,6 @@ firstload.tk, 1 firstmall.de, 1 firstmarket.tech, 1 -firstmarketscanner.com, 1 firstname.tk, 1 firstnet.gov, 1 firstnetwork.cf, 1 @@ -55519,7 +55564,6 @@ fishingzone.bg, 1 fishman.idv.tw, 1 fishoftheday.tv, 1 -fishseller.shop, 1 fishserver.net, 1 fishspecies.nz, 1 fishtacos.blog, 1 @@ -55564,7 +55608,6 @@ fitcrewhn.com, 1 fite.family, 0 fitecleaningservices.com, 1 -fitequilibrio.com.br, 1 fitfactory.lv, 1 fitfingers.shop, 1 fitflaop.ga, 1 @@ -55578,7 +55621,6 @@ fitleads.nl, 1 fitlinewellnesscoach.com, 1 fitmommyinheels.com, 1 -fitmybike.eu, 0 fitness-uhr.net, 1 fitness-world.ga, 1 fitness.edu.au, 0 @@ -55599,7 +55641,6 @@ fitnutkatie.com, 1 fito.tk, 1 fitodifesa.it, 1 -fitosofia.com, 1 fitotovar.ru, 1 fitpass.co.in, 1 fitrecepty.info, 1 @@ -55620,6 +55661,7 @@ five15.net, 1 fiveboosts.xyz, 1 fiveclassauto.com, 1 +fivecrm.com, 1 fivefortheroad.com, 1 fiveminute.tk, 1 fivepb.me, 1 @@ -55627,7 +55669,6 @@ fiverr.com, 1 fiveslice.pizza, 1 fivestar.et, 1 -fivestaraussie.com, 1 fivethirtyeight.com, 1 fiveyearsahead.com, 1 fivolodigital.com, 1 @@ -55643,6 +55684,8 @@ fixabzar.com, 1 fixator10.ru, 1 fixcyprus.cy, 1 +fixedcostagents.com, 1 +fixedcostclaw.com, 1 fixedfeeplacements.co.uk, 1 fixedgear.tk, 1 fixedpricemovers.com, 0 @@ -55655,6 +55698,7 @@ fixi.dk, 1 fixiecommerce.com, 1 fixingscrews.co.uk, 1 +fixitrange.com, 1 fixm.aero, 1 fixmobile.online, 1 fixmyvisit.com, 1 @@ -55667,6 +55711,7 @@ fixplusflex.de, 1 fixpoint.co.at, 1 fixpoint.systems, 1 +fixrein-reinigung.de, 1 fixtesisat.com, 1 fixthetimeline.com, 1 fixthetimeline.org, 1 @@ -55711,7 +55756,6 @@ fjerhammer.dk, 1 fjharcu.com, 1 fjkl.uk, 1 -fjnuacm.top, 1 fjordbank.ee, 1 fjordbank.lt, 1 fjordboge.dk, 1 @@ -55737,7 +55781,6 @@ flabutelov.tk, 1 flacandmp3.ml, 1 flacon.tk, 1 -fladnag.net, 1 flaeskeklubben.dk, 1 flaeskeklubben.eu, 1 flagcdn.com, 1 @@ -55763,19 +55806,19 @@ flagpedia.asia, 1 flagpedia.net, 1 flagriculture.gov, 1 -flags.games, 1 +flags.games, 0 flagshipmerchantservices.com, 1 flagstone-magazin.ro, 0 flagstri.com, 1 flagyl-500-mg.ga, 1 flair.nl, 1 flaironline.nl, 1 +flam-bz.com, 1 flam.lu, 1 flam.studio, 1 flaman-h7a.fr, 1 flamanville.fr, 1 flamby.ovh, 1 -flameflyff.com, 1 flamehaze.tk, 1 flamellugano.com, 1 flamencoshoes.tk, 1 @@ -55801,7 +55844,6 @@ flanagan.tk, 1 flanderslaw.com, 1 flanga.io, 0 -flangespreader.eu, 1 flanigan.tk, 1 flannel.co.jp, 1 flanschspreizer.at, 1 @@ -55822,7 +55864,6 @@ flash.homes, 1 flashbackband.tk, 1 flashbeat.tk, 1 -flashcardsmobile.com, 1 flashcover.com.br, 1 flasheschile.tk, 1 flashgamedev.tk, 1 @@ -55855,7 +55896,6 @@ flathome.co.jp, 1 flaticons.net, 1 flatlandchurch.com, 0 -flatmail.net, 1 flatmail.pl, 1 flatmatehub.com.au, 1 flatpackmates.co.uk, 1 @@ -55971,6 +56011,7 @@ flexgs.net, 1 flexhyp.de, 1 flexi-dance.pl, 1 +flexi-scale.com.my, 1 flexi.org, 1 flexiblenetflow.com, 1 flexibsd.com, 1 @@ -55993,7 +56034,6 @@ flextribly.xyz, 1 flextudo.com, 1 flexundfix.de, 1 -flexve.com, 1 flexworkhero.de, 1 flfamily.org, 1 flfl.de, 1 @@ -56020,6 +56060,7 @@ flightdiary.ga, 1 flightdiary.gq, 1 flightfrankfurt.com, 1 +flighthonolulu.com, 1 flighthub-sms.com, 1 flightjackets.tk, 1 flightrights.gov, 1 @@ -56027,7 +56068,9 @@ flightschoolbooking.com, 1 flightschoolcandidates.gov, 1 flightschoolxxi.com, 1 +flightstimes.com, 1 flightti.com, 1 +flightticketsto.com, 1 flightzero.cf, 1 fliino.com, 1 fliino.eu, 1 @@ -56055,7 +56098,6 @@ flippers-leuven.be, 1 flipphotography.ga, 1 flipping.land, 0 -flipsidevr.com, 1 flipsidexr.com, 1 fliptable.org, 1 flipweb.tk, 1 @@ -56088,6 +56130,7 @@ flocktofedora.org, 1 floenergy.sg, 1 floepsie.nl, 1 +floerens.eu, 1 floersheimer-openair.de, 1 floffi.media, 1 flofr.gov, 1 @@ -56100,7 +56143,7 @@ flokylab.com, 1 floline.fr, 1 flom.fi, 1 -flomaru.com, 0 +flomaru.com, 1 flomax385.tk, 1 flomeyer.de, 1 floodboss.ml, 1 @@ -56117,6 +56160,8 @@ flooring-long-island.com, 1 flooringbidest.ga, 1 flooringsourcetx.com, 1 +floorplans.com, 1 +floorrescue.com, 1 floors4lessbay.com, 1 floosak.co, 1 flooz.trade, 0 @@ -56216,6 +56261,7 @@ floth.at, 1 flothost.com, 1 flothow.com, 1 +flothow.com.py, 1 floucloud.id, 1 flourishdx.com, 1 flourishgrazingevents.co.uk, 1 @@ -56321,7 +56367,6 @@ fluidbb.co.uk, 1 fluids.ac.uk, 1 fluidsealing.com.au, 1 -fluig.com, 1 fluitbeurt.nl, 1 flukestar.tk, 1 flukeydudes.org, 1 @@ -56339,9 +56384,9 @@ fluteandpianoteaching.co.uk, 1 flutedrinks.com, 1 flutterappdev.com, 1 -flutterfactory.io, 1 flutterwave.com, 1 fluui.com.br, 1 +fluuxly.com, 1 flux.today, 0 flux360.net, 1 fluxforge.com, 1 @@ -56401,6 +56446,7 @@ flyingspaghettimonsterdonationsfund.nl, 1 flyingtomorocco.com, 1 flyingtutorsers.ga, 1 +flylcpa.com, 1 flylcpa.gov, 1 flylvia.com, 1 flymfr.com, 1 @@ -56417,6 +56463,7 @@ flyspace.ga, 1 flyspace.ml, 1 flyssh.net, 1 +flystarflight.com, 1 flyswoop.com, 1 flyten.ir, 1 flythecopter.tk, 1 @@ -56450,7 +56497,6 @@ fmhy.net, 1 fmi.gov, 1 fminsight.net, 1 -fmjansen.com, 1 fmlife.tk, 1 fmm-creative.com, 1 fmn.nl, 1 @@ -56468,6 +56514,7 @@ fmstudio.com.ua, 1 fmt-live.de, 1 fmussatmd.com, 1 +fn.com.my, 1 fn.com.sg, 1 fn.my, 1 fn.sg, 1 @@ -56498,6 +56545,7 @@ fnlife.com.my, 1 fnn-creameries.com, 1 fnncreameries.com, 1 +fnnfoods.com, 1 fnof.ch, 1 fnordserver.eu, 1 fnpro.eu, 1 @@ -56518,6 +56566,7 @@ focanamoda.com.br, 1 focanocliente.com.br, 1 focenter.com, 1 +focomentoring.com.br, 1 focored.com, 1 focus2career.com, 0 focusbet-api.com, 1 @@ -56571,6 +56620,7 @@ folf.codes, 1 folhageral.com, 1 foliagefriend.com, 1 +foliencenter24.com, 1 folio.no, 1 foljeton.dk, 0 folk.as, 1 @@ -56616,7 +56666,6 @@ fonds-dieter.be, 1 fondsnieuws.nl, 1 fondsvermittler.com, 1 -fondy.ua, 1 fondzee.cz, 1 fonemisitme.com, 1 foneria.com.tr, 0 @@ -56891,7 +56940,7 @@ fordlibrarymuseum.gov, 1 fordpartsgiant.com, 1 fordpartsprime.com, 1 -fordsbranch.church, 1 +fordsbranch.church, 0 fordservicetraining.com, 1 fordshop.by, 0 fordtrac.com.br, 1 @@ -56941,6 +56990,8 @@ foresttownrcwi.gov, 1 forestvets.com, 1 forever.gq, 1 +foreverboxesr.us, 1 +foreverboxesrus.com, 1 foreverbreak.com, 1 foreverclean.com, 1 forevercollage.com, 1 @@ -57012,7 +57063,7 @@ formalize.com, 1 formalux.com.au, 1 formand.ru, 1 -formanov.com, 1 +formanov.com, 0 formap.co, 1 formapi.io, 1 formascan.fr, 1 @@ -57153,6 +57204,7 @@ fortknoxster.com, 1 fortmatic.com, 1 fortnanov.com, 1 +fortnet.online, 1 fortnightlyofeugene.org, 1 fortnitedb.com, 1 fortnitemagic.ga, 1 @@ -57256,7 +57308,6 @@ fossa.com, 1 fossagarrafoni.tk, 1 fossbots.org, 1 -fossboxen.com, 1 fossewayflowers.co.uk, 1 fossewayflowers.com, 1 fossiilid.info, 1 @@ -57290,7 +57341,6 @@ fotoarchiv-niederrhein.de, 1 fotoblog.nrw, 1 fotobodyart.nl, 0 -fotobrb.de, 1 fotobringer.de, 1 fotobrinke.de, 1 fotochip.tk, 1 @@ -57352,6 +57402,7 @@ foucheplumbers.com, 1 foudufafa.de, 0 fougereettralala.fr, 1 +found.com, 1 foundationalucc.com, 1 foundationassure.com, 0 foundationmaintenance.com, 1 @@ -57405,7 +57456,6 @@ fowesolutions.net, 1 fowlmanor.tk, 1 fowlsmurf.net, 1 -fowos.de, 1 fox-zulu.de, 1 fox.my, 0 fox13now.com, 1 @@ -57448,6 +57498,7 @@ foxygf.com, 1 foxytubes.com, 1 foyale.io, 1 +foyue.org, 1 fozzels.com, 1 fozzie.co.uk, 1 fozzie.space, 1 @@ -57457,18 +57508,20 @@ fpalzira.es, 1 fpasca.com, 1 fpc.gov, 1 +fpcdn.io, 1 fpcorporatefinance.eu, 1 -fpcs-anchorage.com, 1 fpcslidell.org, 1 fpds.gov, 1 fpersona.com, 1 fpf.ch, 1 fpf.org, 1 fpgamania.com, 1 +fpjscdn.net, 1 fpki.sh, 1 fpline.jp, 1 fpmafi.com, 1 fpnet.tk, 1 +fpnpmcdn.net, 1 fpoe.eu, 1 fppq.org.br, 1 fprinnovaciones.es, 1 @@ -57583,7 +57636,6 @@ framedog.tk, 1 framegame.ch, 1 framemo.org, 1 -framenails.fr, 1 framer.ai, 1 framer.com, 1 framer.live, 1 @@ -57616,7 +57668,6 @@ francelight.fr, 1 francenum.gouv.fr, 1 francepandi.fr, 0 -francerent.com, 1 francesca-and-lucas.com, 1 francescazambon.it, 0 francescocozza.it, 1 @@ -57818,7 +57869,6 @@ freak-zone.tk, 1 freakguitars.tk, 1 freaksites.dk, 0 -freaktofit.com, 1 freakyawesome.agency, 1 freakyawesome.art, 1 freakyawesome.band, 1 @@ -57894,6 +57944,7 @@ free-nation.tk, 1 free-obmen.ml, 1 free-ppp.jp, 1 +free-premium-accounts.com, 1 free-printablehq.com, 1 free-printablemap.com, 1 free-quotes.info, 1 @@ -57909,7 +57960,6 @@ free.mg, 1 free.sh, 1 free.tools, 1 -free4allsw.com, 0 free6to12yo.gq, 1 freeadhdquiz.com, 1 freeaf.gq, 1 @@ -57975,6 +58025,7 @@ freedomhkg.info, 1 freedomhouse.org, 1 freedomisslavery.tk, 1 +freedomjonkoping.se, 1 freedomkiaparts.com, 1 freedomlab.io, 1 freedomonline.bg, 1 @@ -58092,6 +58143,7 @@ freeschematest.com, 1 freeschool.cf, 1 freescorefast.com, 1 +freeseedsonline.com, 1 freesexvideo.pro, 1 freesexvidz.com, 1 freeshell.de, 1 @@ -58149,6 +58201,7 @@ freezoneplan.com, 1 freezvon.ru, 1 freform.club, 1 +fregercosmetics.co.il, 1 freibesetzt.tk, 1 freiboth.ddns.net, 1 freie-software.net, 1 @@ -58225,10 +58278,8 @@ fresh.co.il, 1 fresh4.co.uk, 1 freshbean.club, 1 -freshbooks.com, 0 freshcar.bg, 1 freshcode.nl, 1 -freshdesk-apps-by-invantive.com, 1 freshempire.gov, 1 freshersworld.ml, 1 fresherwalkins.tk, 1 @@ -58248,6 +58299,7 @@ freshrss.eu, 1 freshrss.nl, 1 freshsexpics.com, 1 +freshslots.net, 1 freshsnap.org.au, 1 freshtest.tk, 1 freshwave.gr, 1 @@ -58267,7 +58319,6 @@ freundinnen-urlaub.de, 0 freundinnenausflug.de, 0 freundlieb.ch, 1 -frexxi.com, 1 freyapearls.com.au, 1 frgal.cz, 1 fribourgviking.net, 1 @@ -58311,6 +58362,7 @@ friendlydabs.com, 1 friendlydecorator.ca, 1 friendlydesigner.ca, 1 +friendlys.com, 1 friendofthehoneybee.co.uk, 1 friendofthehoneybee.org, 1 friends-online.tk, 1 @@ -58402,6 +58454,7 @@ frogeducation.com, 1 frogeducation.com.au, 1 froger.me, 1 +frogeye.fr, 1 froggitt.com, 1 froginfra.net, 1 froglms.com, 1 @@ -58413,7 +58466,6 @@ frogsonamission.de, 1 frogstar.com, 1 frogtest.co.uk, 1 -frogtown.capital, 1 froh-s.com, 1 froh.co.jp, 1 frohsinnoberzier.de, 1 @@ -58452,7 +58504,7 @@ frontecho.top, 1 fronteers.nl, 0 fronteimoveis.com.br, 1 -fronteiralivre.com.br, 1 +fronteiralivre.com.br, 0 frontenddev.org, 1 fronterasblog.tk, 1 frontierbrasil.tk, 1 @@ -58466,24 +58518,27 @@ frontline.cloud, 1 frontline6.com, 0 frontlinepolicies.com, 1 +frontmymail.com, 1 frontofthehouse.com, 1 frontrouge.fr, 1 froogo.co.uk, 1 frosinonetoday.it, 1 frost.com, 1 frost.kiwi, 1 +frostbits.net, 1 frostbytex.ca, 1 frostexpert.ru, 1 frostfire.tk, 1 frostland.net, 1 frostland.pro, 1 +frostleap.com, 1 frostprotection.co.uk, 1 frostwarning.com, 1 frostwolf.tk, 1 frosty-gaming.xyz, 1 frosty.sk, 1 frosty.style, 1 -frostyclub.com, 1 +frostyclub.com, 0 frostymr.com, 0 frostysummers.com, 1 frothy285.com, 1 @@ -58522,6 +58577,7 @@ frugro.be, 1 fruit-chat.com, 1 fruit-farm.tk, 1 +fruit-rush.com, 1 fruit.ga, 1 fruitbouquets.com, 1 fruitdiva.com, 1 @@ -58583,7 +58639,6 @@ fseo.tk, 1 fsfi.is, 1 fsg.one, 1 -fsharpfactory.io, 1 fsicourses.net, 1 fsinf.at, 1 fsk.fo, 0 @@ -58626,7 +58681,6 @@ fstpn.shop, 1 fstpn.si, 1 fstpn.uk, 1 -fsty.uk, 1 fsub.de, 1 fsvoboda.cz, 1 ft.com, 0 @@ -58638,6 +58692,8 @@ ftcollinswindows.com, 1 ftcscout.org, 1 ftcunion.org, 1 +ftczech.com, 1 +ftczech.cz, 1 fte-automotive.com, 1 ftek.com, 1 ftfgroup.us, 1 @@ -58833,6 +58889,7 @@ fullmetalconsulting.tk, 1 fullmoondesignhouse.tk, 1 fullmoonhentai.tk, 1 +fullmouthdentalimplants.com.au, 1 fullpaisa.com, 1 fullsize.ml, 1 fullsizefordclub.tk, 1 @@ -58841,6 +58898,7 @@ fulltxt.ml, 1 fully-covered.tk, 1 fully-hair.tk, 1 +fullzest.com, 1 fultoncountyar.gov, 1 fultoncountyil.gov, 1 fultoncountyilelections.gov, 1 @@ -58855,7 +58913,6 @@ fumilink.com, 1 fumotousa.com, 1 fun-baby.ru, 1 -fun-bounce.co.uk, 1 fun-day.tk, 1 fun-life.com.tw, 0 fun-tasia.co.uk, 1 @@ -58883,6 +58940,7 @@ fundacionfranciscofiasco.org, 1 fundacionindigo.tk, 1 fundacionlaboral.org, 1 +fundacionpaideia.com.ar, 1 fundacionsiempreadelante.org, 1 fundacionsilverina.org, 1 fundacjamatkiewy.pl, 1 @@ -58898,11 +58956,12 @@ fundera.com, 1 fundex.id, 1 fundiggitydog.co.nz, 1 -funding-zone.com, 1 +funding-zone.com, 0 fundingoptions.com, 1 fundingpartner.dk, 1 fundingpartner.no, 1 fundingpartner.se, 1 +fundinvestmenttools.com, 1 fundky.com, 1 fundkyapp.com, 1 fundmatellc.com, 1 @@ -58987,6 +59046,7 @@ funinthesunboating.com, 1 funio.com, 1 funk-austria.com, 1 +funk-gruppe.ch, 1 funk-gruppe.de, 1 funk-gruppe.it, 1 funk-gruppe.li, 1 @@ -59111,7 +59171,6 @@ furniture-warehouse.co.za, 1 furnitureconcept.co.uk, 1 furniturefashion.com, 1 -furnitureforlife.com, 1 furnitureplustt.com, 1 furnitureproduction.tk, 1 furnituresolutions.tk, 1 @@ -59208,7 +59267,7 @@ fut21gen.com, 1 futa.agency, 1 futa.wiki, 1 -futabadc.jp, 1 +futacockinside.me, 1 futalis.de, 1 futarara.ga, 1 futaritomo.tk, 1 @@ -59259,6 +59318,7 @@ futuregrowthva.com, 1 futureimmigration.net, 1 futuremadein.eu, 1 +futurenode.dk, 1 futureofyoucdc.sg, 1 futureplan.de, 1 futureplanet.tk, 1 @@ -59301,12 +59361,12 @@ fuzzlemann.de, 1 fuzzy.domains, 1 fuzzylogic.tk, 1 +fv-judo-im-norden.de, 1 fvap.gov, 1 fvdm.com, 1 fveevaete.com, 1 fvg.io, 1 fvivas.com, 1 -fvledilizia.it, 1 fvr-concept.be, 1 fw-einsatz.de, 1 fwaux.de, 1 @@ -59331,6 +59391,7 @@ fx-rating.com, 1 fx-w.io, 1 fx.to, 1 +fx0817.dpdns.org, 1 fxci.com, 1 fxcm-arabic.com, 1 fxcm-chn.com, 1 @@ -59454,6 +59515,7 @@ g1313g.com, 1 g15ubezpieczenia.pl, 1 g2-inc.com, 1 +g20.org, 1 g2jp.uk, 1 g2pla.net, 1 g2risksolutions.com, 1 @@ -59482,8 +59544,8 @@ g8energysolutions.co.uk, 1 g9297.co, 1 g9728.co, 1 -g9kingnine.xyz, 1 ga-digitazion.com, 1 +ga-rew.com, 1 ga.fr, 1 ga4wp.com, 1 gaaog.com, 1 @@ -59560,7 +59622,6 @@ gadanie.cf, 1 gadanie.ml, 1 gadatel.ml, 1 -gaddiel.in, 1 gaddini.it, 1 gadget-freak.cf, 1 gadget-hat.tk, 1 @@ -59644,7 +59705,6 @@ gaku-nkc.net, 1 gala.im, 1 gala.kiev.ua, 0 -galabands.info, 1 galact.tk, 1 galaksidot.tk, 1 galaktika-znakomstv.tk, 1 @@ -59683,7 +59743,6 @@ galaxystaking.space, 1 galaxysweeper.com, 1 galaxytracker.tk, 1 -galecommercial.com, 1 galefacialplastics.com, 1 galenguyer.com, 1 galenreasoner.com, 1 @@ -59729,7 +59788,7 @@ galio.lt, 1 galiuzvejoti.org, 1 galive.ga, 1 -galix.com, 1 +galix.com, 0 galizae-sports.tk, 1 gallagher.com, 1 gallagherperformance.com, 1 @@ -59794,13 +59853,13 @@ gamblingaffiliatevoice.com, 1 gamblingconsulting.expert, 1 gamburger.tk, 1 -gamcore.com, 1 game-club.me, 1 -game-designers.net, 1 +game-designers.net, 0 game-dominion.tk, 1 game-gentle.com, 1 game-net.ml, 1 game-repack.site, 1 +game-serverhosting.de, 1 game.es, 1 game4less.com, 1 game818play.com, 1 @@ -59858,6 +59917,7 @@ gameloft.ga, 1 gamelok.ga, 1 gamemakers.tk, 1 +gamenetwork.pl, 1 gamenew.tk, 1 gameofbooks.de, 1 gameonespirit.tk, 1 @@ -59890,7 +59950,6 @@ gamereactor.pt, 1 gamereactor.se, 1 gamerepository.ga, 1 -gameres.com, 1 gamering.cf, 1 gamerkings.tk, 1 gamers-community.tk, 1 @@ -59907,7 +59966,6 @@ gamertelligence.com, 1 gamertrashers.ga, 1 gamerturk.tk, 1 -gamerwelfare.com, 1 gamerzdot.com, 1 games-rt.ru, 1 games-station.tk, 1 @@ -59977,6 +60035,7 @@ gamingmeets.com, 1 gamingo.news, 1 gamingph.com, 1 +gamingpowerpc.com, 1 gamingregulation.com, 1 gamingtech.es, 1 gamingterritory.com, 1 @@ -60011,6 +60070,7 @@ gandalfservice.com, 1 gandmfamilydental.com, 1 gandour.com, 0 +gandysdairy.com, 1 gangbangs.tk, 1 ganggalbichler.at, 1 gangnamcool.com, 1 @@ -60052,11 +60112,13 @@ gaponov.tk, 1 garage-leone.com, 0 garage.click, 1 +garage.management, 1 garage042.bg, 1 garage15.com.ua, 1 garagechief.com, 1 garagedejan.ch, 1 garagedoorflorida.com, 0 +garagedoorpartsuk.co.uk, 1 garagedoorrepaircedarhilltx.com, 1 garagedoorrepairs-sanantonio.com, 1 garagedoors4less-sanantonio.com, 1 @@ -60064,13 +60126,13 @@ garagemhermetica.org, 1 garagen-crew.de, 1 garagenet.com, 1 -garageportcenter.se, 1 garageworks.in, 1 garanteasy.com, 1 garantieabschluss.de, 1 garantikoza.org, 1 garantplus.kz, 1 garaventa.com, 1 +garaz.cz, 1 garbage-juice.com, 1 garbarinocatalogo.com, 1 garbuszus.de, 1 @@ -60105,9 +60167,9 @@ gardnerbender.com, 1 garduri-electrice-animale.ro, 1 gardurialuminiuiasi.ro, 1 +garelickfarms.com, 1 garethbowker.com, 1 garethbowker.uk, 1 -garethdesign.co.uk, 1 garethkirk.com, 1 garethkirkreviews.com, 1 garfieldairlines.net, 1 @@ -60197,7 +60259,6 @@ gasbarkenora.com, 1 gasenergy.kz, 1 gasesdelaguajira.com, 1 -gasestepiesa.ro, 1 gasfitermaipu.cl, 1 gasherde.tk, 1 gashtline.ir, 1 @@ -60316,13 +60377,11 @@ gaycammers.com, 1 gaychatrooms.tk, 1 gaycock4u.com, 0 -gayest.gay, 1 gayfeedr.com, 1 gayfish.org, 1 gayfish.party, 1 gayfr.live, 1 gayfr.online, 1 -gayfr.social, 1 gayga.gov, 1 gaygeeks.de, 1 gayhotmovies.com, 1 @@ -60339,7 +60398,6 @@ gaytor.rent, 1 gaytorrent.ru, 1 gaytravel4u.com, 1 -gaytubec.com, 1 gayukai.net, 1 gaz-connect.ru, 1 gazapos.ga, 1 @@ -60378,7 +60436,6 @@ gbfoundation.org, 1 gbhem.org, 1 gbhosts.com, 1 -gbi-etalon.ru, 1 gbinsta.com, 1 gbiotech.tk, 1 gbisigma.com, 1 @@ -60425,7 +60482,7 @@ gcode.space, 1 gcoded.de, 1 gconcept.tk, 1 -gconstruction.org, 1 +gconstruction.org, 0 gcoption.pro, 1 gcorevape.ca, 1 gcqd.fr, 1 @@ -60445,7 +60502,6 @@ gcwatx.gov, 1 gcwcid1tx.gov, 1 gcwholistic.com, 1 -gd-ots.com, 1 gda.gov.lb, 1 gdacs.org, 1 gdandb.com, 1 @@ -60494,6 +60550,7 @@ gearboxhero.com, 1 gearev.net, 1 gearfinder.nl, 1 +gearhut.lk, 1 gearnews.tk, 1 gearset.com, 1 gearsupply.com, 0 @@ -60561,7 +60618,6 @@ geeklair.net, 1 geeklan.co.uk, 1 geekmagazine.com.br, 1 -geekmiao.com, 1 geekofeminin.com, 1 geekplay.fr, 1 geekport.net, 1 @@ -60687,10 +60743,12 @@ gemailt.net, 1 gemaskeerd.nl, 1 gematik.de, 1 +gemawardian.com, 1 gemax-online.de, 1 gembet99.com, 1 gemdirt.com, 1 gemeenschapsraaddeweere.nl, 1 +gemeente-s-hertogenbosch.nl, 1 gemeentedevesting.nl, 1 gemeentegeschiedenis.nl, 1 gemeentehub.nl, 1 @@ -60732,7 +60790,6 @@ genderidentiteit.nl, 1 gendermedjournal.it, 1 gendrin.com, 1 -gendundrupa.ch, 0 gene-drive.com, 1 gene-drives.com, 1 geneacdn.net, 1 @@ -60767,6 +60824,7 @@ general-anesthesia.com, 1 general-directorate-of-administration.gov.lb, 1 general-insurance.tk, 1 +generalarcade.com, 1 generalassemb.ly, 1 generalcustomshop.com.br, 1 generali-investments-portal.cz, 1 @@ -60783,7 +60841,6 @@ generateurdesmiley.tk, 1 generation-clic.net, 1 generation247.nl, 1 -generationcloud.fr, 1 generationgoat.com, 1 generationnext.pl, 0 generationsweldom.com, 1 @@ -60871,7 +60928,7 @@ geniuswin.it, 1 geniuszone.biz, 1 genkisushi.com.hk, 1 -genlack.com, 0 +genlack.com, 1 gennaroabete.duckdns.org, 1 gennerator.com, 1 gennet.com, 1 @@ -60900,7 +60957,6 @@ genomic-surveillance.com, 1 genomic-surveillance.net, 1 genomic-surveillance.org, 1 -genomicslab.in, 1 genoog.com, 1 genoplot.com, 1 genorma.com, 1 @@ -60975,6 +61031,7 @@ geo-television.de, 1 geoapps.nl, 0 geoarchive.tk, 1 +geobattles.xyz, 1 geocaching.hu, 1 geocar.com, 1 geocell.website, 1 @@ -61078,6 +61135,7 @@ georgiaclean.com, 1 georgiacollaborative.com, 1 georgiacriminaldefense.com, 1 +georgiadreamsrealty.com, 1 georgiainfo.ga, 1 georgianews.ml, 1 georgiangames.gq, 1 @@ -61123,17 +61181,19 @@ geotrust.com.ru, 1 geotruth.net, 1 geourl.me, 1 +geovertix.com, 1 geowest.tk, 1 gepassociati.cloud, 1 gepgroup.gr, 1 gepo69.net, 1 gepps.de, 0 geppy.im, 1 -gequma.de, 1 gera-haushaltsaufloesung.de, 1 gerainano.com, 1 geraintwhite.co.uk, 1 gerald-zojer.com, 1 +geraleks.ru, 1 +geralyntaylor.com, 1 geranium.dk, 1 gerard-klooster.net, 1 gerardforcada.com, 1 @@ -61205,6 +61265,7 @@ geruestbau-grupp.de, 1 gerum.dynv6.net, 0 gerwinvanderkamp.nl, 1 +ges2l.com, 1 gesamenvat.nl, 1 gesath.co, 1 gesath.com, 1 @@ -61229,6 +61290,7 @@ gestaoboa.com.br, 1 gestaoclub.com.br, 1 gestcoelho.com, 1 +gestii.com.br, 1 gestion-optimum.com, 1 gestion-verificaciones.com.ar, 1 gestionaleamica.com, 1 @@ -61257,6 +61319,7 @@ get.how, 1 getabear.com, 1 getacrane.co.uk, 1 +getactionseptic.com, 1 getahearing.com, 0 getaldea.com, 1 getalink.ga, 1 @@ -61272,6 +61335,7 @@ getback.ch, 1 getbacktosport.com, 0 getbalitour.com, 1 +getbeaverdock.com, 1 getbellhop.co, 1 getbenepass.com, 1 getblogger.ru, 1 @@ -61293,7 +61357,7 @@ getcarina.com, 1 getcerta.com, 1 getchip.cc, 1 -getclarity.life, 1 +getclarity.life, 0 getcleanworx.co.uk, 1 getclever.marketing, 1 getcloak.com, 1 @@ -61386,6 +61450,7 @@ getnib.com, 1 getnikola.com, 1 getonwikipedia.com, 1 +getotoq.com, 1 getoxley.com, 1 getpagespeed.com, 1 getpaidclub.tk, 1 @@ -61397,6 +61462,7 @@ getpeachy.org, 1 getpet.lt, 1 getplus.com.au, 1 +getprimepicksusa.com, 1 getpro.plumbing, 1 getprohealth.com, 1 getpromo.cf, 1 @@ -61408,6 +61474,7 @@ getrealgifts.com, 1 getrelish.com, 1 getresilience.org, 1 +getrestorationexperts.com, 1 getriebeservice-gse.de, 0 getroman.com, 1 getroom.in, 1 @@ -61433,6 +61500,7 @@ getswadeshi.com, 1 getsweep.com, 1 gett-group.com, 1 +gettaxesright.com, 1 getteamninja.com, 1 gettext.tk, 1 gettheanchor.org, 1 @@ -61555,6 +61623,7 @@ gg9297.co, 1 gg9397.com, 1 gg9728.co, 1 +ggb.world, 1 ggchamber.com, 1 ggddrenthe.nl, 1 ggdrop.com, 1 @@ -61566,7 +61635,7 @@ gglks.com, 1 ggmmontascale.it, 1 ggpoker.com, 1 -ggpuketi.com, 1 +ggpuketi.com, 0 ggretrobox.com, 1 ggrks.lol, 1 ggs-marschallstrasse.de, 1 @@ -61602,7 +61671,6 @@ gheorghesarcov.ga, 1 gheorghesarcov.tk, 1 ghereben.xyz, 1 -ghettonetflix.de, 1 gheymatokharid.com, 1 ghgkhalsaschool.com, 1 ghi.gov, 1 @@ -61620,6 +61688,7 @@ ghostbustersuk.tk, 1 ghostcarve.ml, 1 ghostcir.com, 0 +ghostcms.fr, 1 ghostdesign.tk, 1 ghostdog.ga, 1 ghostdragon.tk, 1 @@ -61628,8 +61697,7 @@ ghosthost.site, 1 ghosthunting.dk, 1 ghostinbox.pl, 1 -ghostinfluence.com, 1 -ghostkeys.eu, 1 +ghostkeys.eu, 0 ghostlight.tk, 1 ghostmail.no, 1 ghostmarket.io, 1 @@ -61646,6 +61714,7 @@ ghosttrades-university.de, 1 ghostutils.tk, 1 ghostwritershigh.com, 1 +ghosty.link, 1 ghotokbaba.com, 1 ghou.me, 1 ghowell.io, 1 @@ -61727,7 +61796,6 @@ giesela.io, 1 gif-avatars.com, 1 gif.tips, 0 -gifbook.io, 1 giff.com.mx, 1 gifhelittlestars.co.uk, 1 gifsonline.tk, 1 @@ -61736,7 +61804,6 @@ giftbasketsoverseas.com, 1 giftbasketswindsor.com, 1 giftbit.com, 1 -giftedconsortium.com, 1 giftedmodels.com, 1 giftex.cz, 1 giftexperts.com, 1 @@ -61794,7 +61861,6 @@ gigatron.tk, 1 gigawa.lt, 1 gigawattz.com, 1 -gigbh.com, 1 gigent.xyz, 1 giggear.com.au, 1 gigharborsound.com, 1 @@ -61803,12 +61869,14 @@ gigiscloud.servebeer.com, 1 giglink.club, 1 gigloog.tk, 1 +gigodata.com, 1 gigs.com, 1 gigsremote.com, 1 gigtakaful.bh, 1 gigwise.com, 1 giigle.cf, 1 gijonshiro.tk, 1 +gijotech.com, 1 gikovatelojavirtual.com.br, 1 gil.gg, 1 gilandrad.tk, 1 @@ -61817,6 +61885,7 @@ gilbertosimoni.tk, 1 gilbertsvilleny.gov, 1 gildan.com, 1 +gildeddesignstudio.com, 1 gildenhost.de, 1 gileadpac.com, 1 gilescountytn.gov, 1 @@ -61907,7 +61976,6 @@ giovinco.tk, 1 gip-carif-idf.net, 1 gip-carif-idf.org, 1 -gipelpsb.fr, 1 giper.ga, 1 giperfast.tk, 1 gipernn.ru, 1 @@ -61915,7 +61983,6 @@ gippert-klein.de, 1 gipsplitka.ru, 1 gipuzkoabasket.tk, 1 -giraffe.net, 1 giraffeduck.com, 1 giraffenland.de, 1 giraffes.org, 1 @@ -61969,8 +62036,6 @@ gisbornecabs.com.au, 1 giscadlimited.com, 1 gisellapiano.tk, 1 -gisher.me, 1 -gisher.news, 1 gisher.org, 1 gisher.video, 1 gishiko.net, 1 @@ -62011,6 +62076,7 @@ gitns.net, 1 gitns.nl, 1 gitns.org, 1 +gitring.com, 1 gitschberg-sport.it, 1 gitstuff.tk, 1 gittigidiyor.com, 1 @@ -62085,7 +62151,6 @@ gjrick.tw, 1 gjung.com, 1 gk-it.ru, 1 -gkanev.com, 1 gkcmp.com.br, 1 gkconsultancy.tk, 1 gkdforum.eu.org, 1 @@ -62123,7 +62188,7 @@ gladwellentertainments.co.uk, 1 gladwork.tk, 1 gladysstrickland.com, 1 -glaeser-it.de, 1 +glaeser-it.de, 0 glaesle.cloud, 1 glahcks.com, 1 glama.ai, 1 @@ -62161,6 +62226,7 @@ glass.fish, 1 glass.google.com, 1 glass.photo, 1 +glass24.pl, 1 glassact.com, 0 glasschmuck-millefiori.de, 1 glasscometro.com.au, 1 @@ -62184,7 +62250,7 @@ glasstechnics.be, 1 glassworld.tk, 1 glaston.com, 1 -glastuershop24.de, 0 +glastuershop24.de, 1 glaswerk-mellenbach.de, 1 glaswolsite.tk, 1 glattbach.de, 1 @@ -62229,7 +62295,7 @@ glenmarieproperties.com, 0 glenmarkpharma.sk, 1 glenmorewisconsin.gov, 1 -glennfitzpatrick.com, 1 +glennfitzpatrick.com, 0 glennhamers.nl, 1 glenntrede.com, 0 glennvillega.gov, 1 @@ -62325,11 +62391,11 @@ globalentertainment.ga, 1 globalepsilon.com, 1 globalfaraday.com, 1 -globalflavorjourney.com, 1 globalformat.de, 1 globalfuhui.com, 1 globalgamingalmanac.com, 1 globalgaragesale.net, 1 +globalgassprings.com, 1 globalgate.cc, 1 globalgivingtime.com, 1 globalgovernancewatch.org, 1 @@ -62338,11 +62404,10 @@ globalhomeautomation.ca, 1 globalhomicideers.ga, 1 globalhorses.de, 1 -globalincomeexperts.com, 1 +globalhubb.ro, 1 globalind.com.au, 1 globalink.tk, 1 globalinvestorgate.com, 1 -globalios.net, 1 globalipaction.ch, 1 globalisierung-fakten.de, 1 globalitac.com, 1 @@ -62454,6 +62519,7 @@ gloning.name, 1 glont.net, 1 gloomy.tk, 1 +gloow.nl, 1 glorenza.org, 1 gloria-mundi.eu, 1 gloria.fi, 1 @@ -62529,7 +62595,6 @@ gm207.com, 0 gm5.com.br, 1 gmaetk.com, 1 -gmageorgia.com, 1 gmail, 1 gmail.com, 0 gman.bot, 1 @@ -62557,7 +62622,6 @@ gmmb.com, 1 gmo-cybersecurity.com, 1 gmoadvocacia.com.br, 1 -gmod.de, 1 gmopconsortium.org, 1 gmpark.dk, 1 gmpartsdb.com, 1 @@ -62609,7 +62673,6 @@ gnosco.net, 1 gnosis.bg, 1 gnrinfo.tk, 1 -gns.gov.pt, 1 gns3.com, 1 gnu.style, 1 gnuand.me, 1 @@ -62654,6 +62717,7 @@ go2sh.de, 1 go2ubl.nl, 1 go4games.ro, 0 +go4it.fr, 1 go4it.ro, 0 go4rest.de, 1 go5.io, 1 @@ -62678,12 +62742,14 @@ goathub.io, 0 goatlord.tk, 1 goatstore.ca, 1 +goaudits.com, 1 gobarrelroll.com, 1 gobebra.com, 1 gobeline.com, 1 gobetweenfilms.com, 1 gobi.tk, 1 gobiernousa.gov, 1 +goblacksheep.io, 1 goblintears.com, 1 gobookmart.com, 1 gobouncy.co.uk, 1 @@ -62712,7 +62778,6 @@ godalivetpalandet.tk, 1 godall.tk, 1 godan.tech, 1 -godanriver.com, 1 godark.uk, 1 godating.tk, 1 godaxen.tv, 1 @@ -62784,7 +62849,6 @@ goetheschule-giessen.de, 1 goetic.space, 1 goettinger-katzenschutz.de, 1 -goetzinger-web.de, 1 goexam.net, 0 gofabcnc.com, 1 gofelix.de, 1 @@ -62831,11 +62895,12 @@ going-dutch.tk, 1 going.com, 1 goingawesomeplaces.com, 1 +goingbeyondsunday.com, 1 +goingblack.org, 1 goinggreenshow.gq, 1 goingnz.com, 1 goingreen.com.au, 1 goirlanda.es, 1 -goiymua.com, 1 goizalde.tk, 1 gojpt.com, 1 gokaygurcan.com, 1 @@ -62868,6 +62933,7 @@ goldcoast-plumbing.com.au, 1 goldcoastasian.com, 1 goldcoastit.com.au, 1 +goldcoastpersonaltrainers.com, 1 goldcoastphotographycourses.com, 1 goldcreek.tk, 1 golddealer.com, 1 @@ -62889,6 +62955,7 @@ goldeneyesantafe.com, 1 goldenfashion.co.za, 1 goldenfawz.com, 1 +goldengatexpress.org, 1 goldenglow.fans, 1 goldenhillsoftware.com, 1 goldenhilltower.com, 1 @@ -62906,6 +62973,7 @@ goldenshiny.com, 1 goldenstatetrailers.com, 1 goldensunmfg.com, 1 +goldenswordllc.com, 1 goldentech.ca, 1 goldentechelectronics.net, 1 goldentip.cf, 1 @@ -62997,7 +63065,7 @@ golikes.ml, 1 golink.co, 0 golkowreporters.com, 1 -golnet.hu, 1 +golnet.hu, 0 goloa.fr, 1 goloaninsurance.tk, 1 goloborodko.net, 1 @@ -63009,7 +63077,6 @@ golser.info, 1 gomadisonfence.com, 1 gomagic.org, 1 -gomarket33.com, 1 gomasa.net, 1 gomasy.jp, 1 gomasy.net, 1 @@ -63027,6 +63094,7 @@ gomicrophone.ml, 1 gomine.tk, 1 gomiso.com, 1 +gommers.org, 1 gommista.roma.it, 1 gomods.link, 1 gomoon.com, 1 @@ -63082,6 +63150,7 @@ gooddatingsites.ml, 1 gooddayatwork.co.uk, 1 gooddomain.co, 1 +gooddomain.com, 1 gooddomainna.me, 1 goodearth.com.tw, 1 goodees.com, 1 @@ -63139,6 +63208,7 @@ goodwillnfp.org, 1 goodwillnne.org, 1 goodwin43.ru, 0 +goodybalt.ru, 1 goodydoggy.com, 1 goodyearsotn.co.uk, 1 goofy.gr, 1 @@ -63167,7 +63237,6 @@ goon.university, 1 goondocks.io, 1 goonersworld.co.uk, 1 -goontu.be, 1 gooodnews.ga, 1 goooo.info, 1 goorm.io, 1 @@ -63311,7 +63380,7 @@ gosq.co, 1 gosq.com, 1 gossiptimes.tk, 1 -gossweiler.com, 1 +gossweiler.com, 0 gost-energo.ru, 1 gostargazer.com, 1 gostargazing.co.uk, 1 @@ -63441,12 +63510,13 @@ govotetn.gov, 1 govquarter.gq, 1 govsales.gov, 1 +govsentinel.com.br, 1 govtjobs.blog, 1 +govtjobweb.com, 1 govtrack.us, 1 govvacationrewards.com, 1 govype.com, 1 gow220.ru, 1 -gowager.co.uk, 1 gowalk.de, 1 gowancommunications.com, 1 gowanusbooks.com, 1 @@ -63523,7 +63593,6 @@ gptunnel.ru, 1 gpu.nu, 1 gpupods.cloud, 1 -gpuserver.kz, 1 gpwatimes.org, 1 gpwih.com, 1 gpwmd-portal.org, 1 @@ -63576,7 +63645,6 @@ gradinacufluturi.ro, 1 gradinarit.com, 1 gradingcontractornc.com, 1 -gradinitasamariteanulcluj.ro, 1 gradintel.com, 1 gradle.com, 1 gradle.org, 1 @@ -63702,6 +63770,7 @@ grandmasfridge.org, 0 grandmasternetwork.com, 1 grandmusiccentral.com.au, 1 +grandoaksevent.com, 1 grandpachy.tk, 1 grandpad.biz, 1 grandpad.net, 1 @@ -63766,6 +63835,7 @@ granulate.io, 1 grape33.com, 1 grapee.jp, 1 +grapeintentions.com, 1 grapevine.is, 1 graph.org, 1 graphe.gq, 1 @@ -63867,7 +63937,6 @@ gravityresearchgroup.gq, 1 gravityresearchgroup.tk, 1 gravytrain.tk, 1 -grawe-blog.at, 1 gray.network, 1 grayarrow.com, 1 graycat.ml, 1 @@ -63993,6 +64062,7 @@ greenangels.com.ua, 1 greenartistsswiss.ch, 0 greenassembly.fr, 1 +greenband.com.au, 1 greenbat57.fr, 1 greenbaytechsupport.com, 1 greenbrickgroup.com, 1 @@ -64068,7 +64138,6 @@ greenopedia.com, 1 greenopeningsers.ga, 1 greenopeningsest.ga, 1 -greenpal.jp, 1 greenpanda.de, 1 greenparkgroup.ca, 1 greenpartyofnewmilford.org, 1 @@ -64116,6 +64185,7 @@ greenwhitearmy.tk, 1 greenwichbiosciences-influence-beta.azurewebsites.net, 1 greenwichentertainment.com, 1 +greenwichfirst.com, 1 greenwichvillage.nyc, 0 greenwiki.ca, 1 greenwithdecor.com, 1 @@ -64123,6 +64193,7 @@ greenwoodne.gov, 1 greenwoodny.gov, 1 greenwoodtwpcrawfordpa.gov, 1 +greenypitch.com, 1 greenytimes.com, 1 greenyway.com, 1 greenzved.tk, 1 @@ -64181,6 +64252,7 @@ grenti.eu, 1 grenzach.com, 1 grepable.com, 1 +grepular.com, 1 gresak.io, 0 greshamhistorical.org, 1 gresrewop.ca, 1 @@ -64208,6 +64280,7 @@ greymuzzlemanor.org, 1 greypanel.com, 1 greyrectangle.com, 1 +greyrockgroup.co.uk, 1 greyskymedia.com, 1 greysolonballroom.com, 1 greystonesmovement.com, 1 @@ -64330,7 +64403,6 @@ gromasikov.tk, 1 gromman.com, 1 gromovphotography.tk, 1 -grondius.com, 1 grondwerkencooreman.be, 1 groningerkustvaart.tk, 1 gronngronn.no, 1 @@ -64376,6 +64448,7 @@ groundball.tk, 1 groundcaresolutionsllc.com, 1 groundfm.tk, 1 +groundjerusalem.com, 1 groundmc.net, 1 groundsdirect.com, 1 groundspan.com, 1 @@ -64445,6 +64518,7 @@ growery.org, 1 growglam.com, 1 growidentity.com, 1 +growin.com, 1 growingallthings.co.uk, 1 growinghumankindness.com, 1 growinguncomfortable.com, 1 @@ -64463,7 +64537,7 @@ growthtoysers.ga, 1 growthtoysest.ga, 1 growthwheel.net, 1 -growy.ch, 0 +growy.ch, 1 grozdanov.tk, 1 grozny-news.net, 1 grozter.se, 1 @@ -64511,7 +64585,6 @@ grundlage.fi, 1 grundlagen-computer.de, 1 grundrauschen-publishing.de, 1 -grundrauschen.pub, 1 grundschulratgeber.de, 1 grundskoleboken.ga, 1 grundskoleboken.gq, 1 @@ -64525,7 +64598,6 @@ grupatvogzivota.tk, 1 grupcarles.com, 1 grupdedansa.tk, 1 -grupdigital.com, 1 gruphepsi.tk, 1 grupo-famia.tk, 1 grupo-rbd.com, 1 @@ -64545,13 +64617,13 @@ grupoentregas.com, 1 grupoeurodesign.com, 1 grupofarmavip.pt, 1 -grupoharbour.com, 1 grupoice.com, 1 grupoicp.pt, 1 grupoimb.pt, 1 grupoiwana.tk, 1 grupokls.com, 1 grupolegalsgf.com, 1 +grupolmsvisao.com.br, 1 grupomacroex.com, 1 grupomanquecura.tk, 1 grupomazzucco.com, 1 @@ -64631,6 +64703,7 @@ gslb.co, 1 gsm-info.tk, 1 gsmbrick.com, 1 +gsmface.hu, 1 gsmkungen.com, 1 gsmmedia.tk, 1 gsmsale.nl, 1 @@ -64644,7 +64717,6 @@ gsplast.com, 1 gsrank.org, 1 gsrc.io, 1 -gss.ind.br, 1 gstackrankers.com, 1 gstcalc.nz, 1 gstehlik.com, 1 @@ -64680,6 +64752,7 @@ gtdnordic.fi, 1 gtecnophone.com, 1 gtestepourvous.fr, 1 +gtettemer.com, 1 gti.cx, 1 gtk-tim.ru, 1 gtlaun.ch, 0 @@ -64687,6 +64760,7 @@ gtm-server.com, 1 gtm.com.pl, 1 gtmetrix.com, 1 +gtmops.fr, 1 gtmotive.com, 1 gtn-pravda.ru, 1 gtonline.ml, 1 @@ -64696,14 +64770,24 @@ gtrtc.com, 1 gtrwebdesign.nl, 0 gts-tradgard.se, 1 -gts-varmepumpar.se, 1 +gts-varmepumpar.se, 0 gts.org, 1 gtsb.io, 1 gtslotcars.com, 1 gtsoftware.gr, 1 gtupgrade.eu, 1 +gtw0.africa, 1 +gtw0.asia, 1 +gtw0.cl, 1 +gtw0.com, 1 +gtw0.cz, 1 +gtw0.eu, 1 +gtw0.ke, 1 gtw0.mx, 1 +gtw0.net, 1 +gtw0.nz, 1 gtw0.org, 1 +gtw0.tw, 1 gtwaction.org, 1 gtxmail.de, 1 gtxthere.tk, 1 @@ -64748,8 +64832,8 @@ guardiancodewebservices.com, 1 guardiandigital.com, 1 guardianerm.net, 1 +guardianexercise.com.au, 1 guardiansiot.ddns.net, 1 -guardiantransmissions.com, 1 guardiapretoriana.tk, 1 guarever.tk, 1 guarrato.tk, 1 @@ -64887,6 +64971,7 @@ guido-leenders.eu, 1 guidoclub.fr, 1 guidopedia.ga, 1 +guignard.me, 1 guild.xyz, 1 guilded.gg, 1 guildgearscore.cf, 1 @@ -64915,6 +65000,7 @@ guinder.com.br, 1 guineapig101.com, 1 guineapigmustach.es, 1 +guineecheck.org, 1 guinel-johnson.fr, 0 guinguetteclovis.com, 1 guise.tk, 1 @@ -65006,7 +65092,7 @@ gupy.io, 1 gura.moe, 1 guralptechnic.com, 1 -gurbetilan.com, 0 +gurbetilan.com, 1 guri.ml, 1 gurkantuna.com, 1 gurl.eu.org, 1 @@ -65020,6 +65106,7 @@ gurugamer.com, 1 gurumobile.tk, 1 gurunanakdarvar.tk, 1 +gurunpa.com, 1 gururi.com, 1 gurusewa.net, 1 guruworld.tk, 1 @@ -65162,6 +65249,7 @@ gwnmarketing.com, 1 gworkspace.lt, 1 gworld.cf, 1 +gwq5210.com, 1 gwsquickwash.com, 1 gwy15.com, 1 gxbank.my, 1 @@ -65172,6 +65260,7 @@ gxmyqy.net, 1 gyaanprasaar.tk, 1 gyannews.ga, 1 +gyapak.in, 1 gyas.nl, 1 gybagardlin.tk, 1 gycis.me, 1 @@ -65188,6 +65277,7 @@ gying.si, 1 gyjbyev.ga, 1 gyllander.tk, 1 +gyllenbuste.online, 1 gylly.net, 1 gym.com, 1 gymagine.ch, 1 @@ -65259,6 +65349,7 @@ h-node.org, 1 h-server.myfirewall.org, 1 h-var.com, 1 +h.box, 1 h.fo, 1 h.hk.cn, 1 h.lu, 1 @@ -65275,7 +65366,6 @@ h11.moe, 1 h18.nl, 1 h1ctf.com, 1 -h2.ee, 1 h2020faros.eu, 1 h24.org, 1 h2b.cz, 1 @@ -65341,7 +65431,6 @@ habboinside.tk, 1 habbolibres.tk, 1 habboon.pw, 1 -habbstars.org, 1 habbzohotel.tk, 1 habedieeh.re, 1 habeeba.tk, 1 @@ -65372,6 +65461,7 @@ habitville.com, 1 hable.kr, 1 hablemosdenutricion.com, 1 +habpar.com.br, 1 habr.ee, 1 habra-adm.ru, 1 habrastorage.org, 1 @@ -65422,6 +65512,7 @@ hackerfa.tk, 1 hackerflare.com, 1 hackerforums.tk, 1 +hackerhermanos.com, 1 hackerhotel.nl, 1 hackeriet.se, 1 hackerinfo.ml, 1 @@ -65484,6 +65575,7 @@ hacquemand.be, 1 hacquemand.co, 1 hacquemand.com, 1 +hacquemand.fr, 1 hacsapp.co.uk, 1 hadaly.fr, 1 hadan-it.com, 0 @@ -65581,8 +65673,10 @@ hair-dressing.tk, 1 hair-extension.tk, 1 hair-extensions.tk, 1 +hair-rituals.de, 1 hairathome.cz, 1 hairbrushes.tk, 1 +hairbymeagan.com, 1 haircareblog.tk, 1 haircareology.com, 1 haircode.gr, 1 @@ -65669,7 +65763,6 @@ halatik.com.ua, 1 halbbit.eu, 1 halberstadt.tk, 1 -halbich.design, 1 halco.org, 1 halcraft.tk, 1 halcyonsbastion.com, 1 @@ -65725,6 +65818,7 @@ hallofoddities.tk, 1 hallofworlds.online, 1 halloway.tk, 1 +halloween.tf, 1 halloweenmusic.org, 1 hallsonsservices.com, 1 hallspumpandwellservice.net, 0 @@ -65769,7 +65863,6 @@ hambot.fr, 1 hamburg1.de, 1 hamburgcode.com, 1 -hamburger-reinigung.de, 1 hamburger-umzuege.de, 1 hamburger-wirtschaft.de, 1 hamburgerland.tk, 1 @@ -65813,7 +65906,6 @@ hammerhead.tk, 1 hammernews.tk, 1 hammerofdamnation.tk, 1 -hammerofthor-india.com, 1 hammerstorm.ga, 1 hammertonbarbados.com, 1 hammondwi.gov, 1 @@ -65852,6 +65944,7 @@ hanakohealth.de, 1 hanakovydny.cz, 1 hanan.cz, 1 +hananiastores.com, 1 hanaringo.com, 1 hanatan.net, 1 hanazono.tokyo, 1 @@ -65881,14 +65974,12 @@ handheldsound.com, 1 handhockeyers.ga, 1 handhockeyest.ga, 1 -handicap-job.com, 1 handicappingsportsers.ga, 1 handicappingsportsest.ga, 1 handicapzero.org, 1 handicraftsman.tk, 1 handigehannie.nl, 1 handinhandhrd.eu, 1 -handler.lt, 1 handler.lv, 1 handlerparts.com, 1 handlerparts.de, 1 @@ -65909,6 +66000,7 @@ handphones.tk, 1 handpresso.com, 1 handsender-express.com, 1 +handshake.co.za, 1 handsome-samurai.jp, 1 handsomeabel.tk, 1 handsonscience.com.au, 1 @@ -66022,11 +66114,11 @@ hanwhalife.com, 1 hanxv.pw, 1 hanys.xyz, 1 +hanyuguide.com, 1 hanzcollection.online, 1 hanzi-trainer.org, 1 hanzoslot.com, 1 hao-zhang.com, 1 -haokiettoanthu.org, 1 haorenka.co, 1 haos.hopto.org, 1 haoskin.com.tw, 1 @@ -66036,6 +66128,7 @@ haoz.tk, 1 haozhexie.com, 1 haozi.me, 1 +hapekkarma.eu, 1 hapfox.de, 1 hapi.agency, 1 hapijs.cn, 1 @@ -66089,7 +66182,6 @@ happyfoolss.com, 1 happyfun.tk, 1 happyfuture.tk, 1 -happygadget.me, 1 happygardencenter.com.br, 1 happygeek.com, 1 happygiftapp.com, 1 @@ -66119,7 +66211,6 @@ happyteamlabs.com, 1 happytime.gq, 1 happytours.cf, 1 -happytoys.com.br, 1 happytugs.com, 1 happyukgo.com, 1 happywater.my, 1 @@ -66142,7 +66233,6 @@ harabar.ml, 1 harabe.ga, 1 harahanla.gov, 1 -harajiplastic.ir, 1 harakeke.net, 1 harald-pfeiffer.de, 1 harambo.cf, 1 @@ -66163,6 +66253,7 @@ harborhillsdaycamp.com, 1 harborspringslistings.com, 1 harboursport.co.nz, 1 +harboursprayfoam.com, 1 hard-drive-recovery-blog.tk, 1 hard.email, 1 hardatack.tk, 1 @@ -66255,8 +66346,8 @@ harmim.cz, 0 harmlesspeopleers.ga, 1 harmlesspeopleest.ga, 1 +harmny.ai, 1 harmonicasireland.com, 0 -harmonizely.com, 0 harmony-labradoodles.nl, 1 harmony-trader.com, 1 harmonyeg.net, 1 @@ -66436,12 +66527,12 @@ hasjob.co, 1 haskellar.gov, 1 haskellcountytx.gov, 1 +haslin.com.au, 1 hasmoralsers.ga, 1 hasmoralsest.ga, 1 hass-server.pp.ua, 1 hassan-kuordish.tk, 1 hassana.com.sa, 1 -hassanhardware.com, 1 hassans.tk, 1 hassclan.tk, 1 hasselbach-dellwig.de, 1 @@ -66451,6 +66542,8 @@ hasstopped.com, 1 hastadoktor.com, 1 hastati.tk, 1 +haste.it, 1 +hastings.com.br, 1 hastingsapplianceservice.com.au, 1 hastingsdirect.com, 1 hastingsmi.gov, 1 @@ -66538,6 +66631,7 @@ hautzentrum-innenstadt.de, 1 havaci.tk, 1 havadurumu15gunluk.org, 1 +havahaberleri.com, 1 havana-club.com, 1 havanaheritage.org, 1 havarijna-sluzba-bratislava.sk, 1 @@ -66638,7 +66732,6 @@ hazarainternational.com, 1 hazarapeople.com, 1 hazaristan.asia, 1 -hazbin.org, 1 haze-productions.com, 1 hazelhof.nl, 1 hazelkid.tk, 1 @@ -66657,7 +66750,6 @@ hazza.net, 1 hb.by, 1 hb5197.com, 0 -hb8522.com, 1 hb9397.com, 1 hb9ikn.ch, 1 hba1crechner.de, 1 @@ -66685,6 +66777,7 @@ hbsslaw.co.uk, 1 hbsslaw.com, 1 hbsvzos.nl, 1 +hbtinsaat.com, 1 hbudd.com, 0 hbussmann.com, 1 hbweb.io, 1 @@ -66765,7 +66858,7 @@ hdpornpicture.com, 1 hdrams.com, 1 hdrcomercio.com.br, 1 -hdrezka.live, 1 +hdrezka.live, 0 hdrezka2018.tk, 1 hdrtranscon.com, 0 hds-lan.de, 1 @@ -66837,6 +66930,7 @@ healmaster.net, 1 healmyhearttoday.ga, 1 healmynation.com, 1 +healtalyzer.com, 1 healtbeautyturkey.tk, 1 health-and-beauty-news.net, 1 health-ashlandcounty-oh.gov, 1 @@ -66850,6 +66944,7 @@ health-solutions.de, 1 health-toolbox.com, 1 health-tourism.com, 1 +health-union.com, 1 health.gov, 1 health.gov.ly, 1 health.graphics, 1 @@ -66859,7 +66954,6 @@ health4food.com, 1 health4life.tk, 1 healthabundant.ga, 1 -healthactive.co, 0 healthadaptive.ga, 1 healthalbuquerque.tk, 1 healthalternativemedicine.tk, 1 @@ -66878,6 +66972,7 @@ healthawareness.cf, 1 healthbanfield.tk, 1 healthbank.io, 1 +healthbeautyaftercare.nl, 1 healthbeltsville.tk, 1 healthbinghamton.tk, 1 healthbit.com.br, 1 @@ -66946,6 +67041,7 @@ healthdaily.ga, 1 healthdallas.tk, 1 healthdata.gov, 1 +healthdatalab.com, 1 healthdatavalley.nl, 1 healthdelta.ga, 1 healthdenver.tk, 1 @@ -66963,6 +67059,7 @@ healthequity.com, 1 healtherm.co.jp, 1 healthessence.ga, 1 +healthexport.info, 1 healthfalcon.ga, 1 healthfame.ga, 1 healthfiesta.ga, 1 @@ -67154,7 +67251,6 @@ healthyankee.ga, 1 healthyarizona.tk, 1 healthyarkansas.tk, 1 -healthybeauty365bn.com, 1 healthyburn.tk, 1 healthychoices.tk, 1 healthyclinic.tk, 1 @@ -67445,7 +67541,6 @@ heitepriem.de, 1 heitepriem.info, 1 heiwa-valve.co.jp, 1 -heizoil-vergleich.de, 1 hejazultra.org, 1 hejl.xyz, 1 hejlhome.cz, 1 @@ -67654,7 +67749,6 @@ help911.com, 1 helpadmin.net, 0 helpamericavote.gov, 1 -helpatmyhome.com, 1 helpc.eu, 1 helpcalculator.tk, 1 helpchange.ru, 1 @@ -67671,7 +67765,6 @@ helplisted.com, 1 helpmainstreet.com, 1 helpmij.cf, 1 -helpnet.ro, 1 helpout.us, 1 helpowl.com, 1 helppc.com.ua, 1 @@ -67762,6 +67855,7 @@ hennikernh.gov, 1 henningkerstan.de, 1 henningkerstan.org, 1 +henningsvaerfyr-privatmegleren.no, 1 hennymerkel.com, 1 henradplumbing.co.uk, 1 henri-feuillade.tk, 1 @@ -67841,11 +67935,11 @@ her123.win, 1 herald-review.com, 1 herald.ga, 1 +heraldcourier.com, 1 heraldik-wiki.de, 1 heraldmakassar.com, 1 heratnews.tk, 1 herba-belgie.be, 1 -herbacom.ro, 1 herbalhouse.tk, 1 herbalife.ru, 1 herbalifereport.tk, 1 @@ -67867,7 +67961,6 @@ herbivorization.com, 1 herblaysurseine.fr, 1 herbnal.com, 1 -herboristerie-dufayel.fr, 1 herbosia.fr, 1 herbreathonglass.tk, 1 herbsociety.org, 1 @@ -67889,6 +67982,7 @@ herenstraatvoorburg.tk, 1 herenvanholland.nl, 1 hereplus.me, 0 +heresthespace.com, 1 heretic-guild.com, 1 hereticle.com, 1 hereticmaniacs.tk, 1 @@ -67913,7 +68007,7 @@ herlimit.com, 1 hermaj.com, 1 hermanbrouwer.nl, 1 -hermandevries.com, 1 +hermandevries.com, 0 hermann-hesse-kolleg.de, 1 hermann-wagener.de, 1 hermanncomm.com, 1 @@ -67925,7 +68019,6 @@ hermesawards.com, 1 hermesoft.at, 1 hermessenger.fr, 1 -hermetas.org, 1 hermetien.tk, 1 hermietkreeft.site, 0 herminghaus24.de, 1 @@ -67961,6 +68054,7 @@ heronhallacademy.org.uk, 1 heroofkings.com, 1 heroplusgroup.com, 0 +heroxin.com, 1 herpderpderpderp.com, 1 herpes-no.com, 1 herq.top, 0 @@ -67976,7 +68070,6 @@ herrfirm.com, 1 herriman.gov, 1 herriman.net, 1 -herringadvancemachine.com, 1 herringsresidence.be, 1 herritage.ga, 1 herrkal.eu, 1 @@ -68004,7 +68097,6 @@ herzzuherz.de, 1 hes.com.cy, 1 hesabraslaw.com, 1 -hesabtube.com, 1 hesama.tk, 1 hesaplama.net, 1 hesapozeti.com.tr, 1 @@ -68042,6 +68134,7 @@ hetdebat.tk, 1 hetene.nl, 1 hetfundament.team, 1 +heth.me, 1 hethely.ch, 1 hetiservices.com, 1 hetjop.nl, 1 @@ -68076,6 +68169,7 @@ hewlettharbor.gov, 1 hex.nl, 1 hex.tech, 1 +hexa-ra.com, 1 hexagon-e.com, 1 hexagonengg.com, 1 hexalinq.com, 1 @@ -68128,6 +68222,7 @@ heydenbluth.de, 1 heydorff.duckdns.org, 1 heydudd.com, 1 +heyete.com, 1 heyfiesta.com, 1 heyfranky.com, 1 heyghost.io, 1 @@ -68136,7 +68231,6 @@ heyjoecoffee.com, 1 heyjoflyer.win, 1 heylogin.com, 1 -heynowbots.com, 1 heyomg.com, 1 heyplay.eu.org, 1 heysora.net, 1 @@ -68153,6 +68247,7 @@ hf51-domeinen.nl, 1 hf51.nl, 1 hfa3.org, 1 +hfam.chat, 1 hfh-gmbh.de, 1 hfholidays.co.uk, 1 hfikq8.cf, 1 @@ -68173,11 +68268,12 @@ hgcityca.gov, 1 hgfa.fi, 1 hghsells.com, 1 -hgmaranatha.nl, 1 +hgmaranatha.nl, 0 hgnet.com.br, 1 hgpowerglue.nl, 1 hgseo.me, 1 hgseo.net, 1 +hgsss.org, 1 hgtwa.com.au, 1 hgvnet.de, 1 hgwld.com, 1 @@ -68191,6 +68287,7 @@ hh5197.co, 1 hh6729.co, 1 hh6957.co, 1 +hh90a2962zk.sn.mynetname.net, 1 hh9297.co, 1 hh9397.com, 1 hh9728.co, 1 @@ -68228,10 +68325,8 @@ hibin.tk, 1 hibiny.ru, 1 hibiscuscoastfinancialservices.com.au, 1 -hibiscuscommunications.com, 1 hibiscusprintshop.com, 1 hiboomapp.com, 1 -hibrid-turf.com, 1 hiccupsandjuice.co.uk, 1 hicklinghacks.co.uk, 1 hickmancountytn.gov, 1 @@ -68243,6 +68338,7 @@ hicoria.com, 1 hicts.nl, 1 hiczp.com, 1 +hidalgodigital.com, 1 hidashin.co.jp, 1 hidbo.de, 1 hidden-audio.de, 1 @@ -68251,9 +68347,7 @@ hiddendragon.ml, 1 hiddenempire.tk, 1 hiddenhand.finance, 1 -hiddenhillselectric.com, 1 hiddenhillsexteriorlighting.com, 1 -hiddenhillslighting.com, 1 hiddenimage.ml, 1 hiddenmalta.net, 1 hiddenpalms.tk, 1 @@ -68377,15 +68471,14 @@ hightechtexan.com, 1 highthcahempflower.com, 1 hightop.com, 0 -hightwist.show, 1 highvibes.hu, 1 highway11north.tk, 1 +highway2as.com, 1 highway54.tk, 1 highway71autoparts.com, 1 highwaytohoell.de, 1 highwayzen.org, 1 highworldnet.ga, 1 -higilopocht.li, 1 higsegeirl.com, 1 higueras.tk, 1 hiig.edu.ee, 1 @@ -68393,6 +68486,7 @@ hiiumeretuulepark.ee, 1 hiiw.cloud, 1 hiiw.de, 1 +hijyenbelgesi.tr, 1 hik-cloud.com, 1 hikagestudios.com, 1 hikarilan.life, 1 @@ -68470,7 +68564,6 @@ himcy.ga, 1 himei.city, 1 himeji-kanbee.jp, 1 -himens.com, 0 himiku.com, 1 himj.de, 1 himnosycanticos.org, 1 @@ -68495,7 +68588,6 @@ hinesitecoding.com, 1 hingle.me, 1 hinhanhykhoa.com, 1 -hinit.no, 1 hinkel.tk, 1 hinketsujyoshi-no-torisetsu.com, 1 hinotify.io, 1 @@ -68532,6 +68624,7 @@ hippocamp.io, 1 hippogriffhaven.com, 1 hippogriffhaven.net, 1 +hippohealthcare.in, 1 hippolini-herold.de, 1 hiprax.com, 1 hiprosun.com, 1 @@ -68543,20 +68636,19 @@ hiq.se, 1 hiq.sh, 1 hiqonline.co.uk, 0 -hirake55.com, 1 +hiram.tr, 1 hiramoto-ph.com, 1 hiramvlgohio.gov, 1 hirano-shikaclinic.com, 1 +hiratadai-piano.com, 1 hireabouncycastle.net, 1 hirechrisfinazzo.com, 1 hirecities.cf, 1 hirecities.ml, 1 hirecitiesers.ga, 1 hirecitiesest.ga, 1 -hirecto.io, 1 hireinsight.io, 1 hirel.gq, 1 -hirerecruiters.io, 1 hireshield.com, 1 hirevets.gov, 1 hirevo.eu, 1 @@ -68576,7 +68668,6 @@ hirorock.tk, 1 hirosehp.jp, 1 hiroshimacalling.org, 1 -hirotaka.org, 1 hirsch-lawyer.tk, 1 hirschbergertal.de, 1 hirtz.pm, 1 @@ -68598,6 +68689,7 @@ hispatrofeo.com, 1 hisregistries.net, 1 hisregistries.org, 1 +hiss.com.sg, 1 hisscentralen.se, 1 hisscraft.se, 1 hissgruppen.com, 1 @@ -68645,6 +68737,7 @@ hitecnologia.com.br, 1 hitekcomputing.net, 1 hitekmechanical.com, 1 +hitekstore.com, 1 hitel.tk, 1 hiteshchandwani.com, 1 hitflow.fr, 1 @@ -68857,7 +68950,6 @@ hny.co, 1 hnyp.hu, 1 ho10.pl, 1 -hoaas.no, 1 hoahop.tk, 1 hoanghaiauto.vn, 1 hoangvangioi.com, 1 @@ -68888,6 +68980,7 @@ hobokenrecords.tk, 1 hobonline.tk, 1 hobroefterskole.dk, 1 +hobsonplumbing.com, 1 hoccovua.vn, 1 hochatown.gov, 1 hochhaus.us, 1 @@ -68902,6 +68995,7 @@ hochzeit-cm.at, 1 hochzeit-dana-laurens.de, 1 hochzeit-saufzeichnungen.tk, 1 +hochzeitsfotograf.photography, 1 hochzeitsplaner-rodgau.de, 1 hochzeitsregion.at, 1 hochzeitstypen.de, 1 @@ -68944,6 +69038,7 @@ hofapp.de, 1 hofbraeu-muenchen.de, 1 hoferdach.de, 1 +hoffland.org, 1 hoffmanig.com, 1 hoffmannresearch.ca, 1 hoffmanns-ballonshop.de, 1 @@ -69070,7 +69165,6 @@ hollandrailservices.com, 1 hollandrailservices.com.au, 1 hollandsewolken.nl, 1 -hollandsweb.com, 1 hollandwi.gov, 1 hollermann.eu, 1 hollistermo.gov, 1 @@ -69089,6 +69183,7 @@ hollyspringsfarmnac.com, 1 hollyspringsms.gov, 1 hollywoodbios.com, 1 +hollywooddriver.com, 1 hollywoodhelicopters.com, 1 hollywoodstars.tk, 1 hollyworks.com, 1 @@ -69141,7 +69236,7 @@ holysmart.top, 1 holyspiritpalmyra.com, 1 holyspiritweb.org, 1 -holyszko.com, 1 +holyszko.com, 0 holytransaction.com, 1 holywhite.com, 1 holywr.it, 1 @@ -69201,7 +69296,6 @@ homebuilder.tk, 1 homebutton.tk, 1 homecache.ga, 1 -homecaprice.com, 1 homecareplus.cl, 1 homecaster.ga, 1 homecatch.ga, 1 @@ -69341,6 +69435,7 @@ homeeagle.ga, 1 homeelectricalupdates.com, 1 homeer.com, 1 +homeevcharger.ie, 1 homeexperience.tk, 1 homefacialpro.com, 0 homeflag.ga, 1 @@ -69377,7 +69472,6 @@ homeinvasion.tk, 1 homeinvention.tk, 1 homejapanese.ml, 1 -homekeep.com, 1 homekiss.ga, 1 homekitdaily.de, 1 homelab.farm, 1 @@ -69523,7 +69617,6 @@ homyak.gq, 1 homygo.eu, 1 homyremedies.com, 1 -honaragah.com, 1 honatec.tech, 1 honda2wheelerparts.com, 1 honda2wheelersindia.com, 1 @@ -69608,6 +69701,7 @@ hoogsreporting.com, 1 hoogstraatseschaakclub.tk, 1 hoogveen.tk, 1 +hook-esport.fr, 1 hookah-crm.ru, 1 hookah-uae.com, 1 hookahfoil.ru, 1 @@ -69738,6 +69832,7 @@ horoscopo.ml, 1 horotoday.tk, 1 horovod.im, 1 +horozo.com, 1 horrell.ca, 1 horrendous-servers.com, 1 horror-forum.de, 1 @@ -69856,7 +69951,7 @@ hostesstrainingers.ga, 1 hostesstrainingest.ga, 1 hostfact.nl, 1 -hostfi.com.br, 1 +hostfi.com.br, 0 hostfission.com, 1 hostfree12.tk, 1 hostgreet.com, 1 @@ -69882,6 +69977,7 @@ hostinghaus.tk, 1 hostinghelp.guru, 1 hostinginnederland.nl, 1 +hostingopenclaw.com, 1 hostingorservers.com, 1 hostingphp.ch, 1 hostingsolutions.cz, 1 @@ -69978,6 +70074,7 @@ hotel3232nyc.com, 1 hotel43.com, 1 hotelandplace.com, 1 +hotelbarbutter.com, 1 hotelbiz.cf, 1 hotelbiz.ga, 1 hotelbiz.gq, 1 @@ -70159,7 +70256,6 @@ houselocal.co.uk, 1 housemart.company, 1 housemouse.tk, 1 -houseofaceonline.com, 1 houseofbrighde.co.uk, 1 houseoffilters.com, 1 houseofhipsters.com, 1 @@ -70278,6 +70374,7 @@ howto-connect.com, 1 howto-outlook.com, 0 howtobehealthy.tk, 1 +howtodesignwebsite.com, 1 howtogeek.com, 1 howtogeekpro.com, 1 howtogosolar.org, 0 @@ -70323,7 +70420,6 @@ hp-67.com, 1 hp-lexicon.org, 1 hp42.de, 1 -hpac-portal.com, 1 hpage.com, 1 hpbn.co, 1 hpc.mil, 1 @@ -70386,6 +70482,7 @@ hrcrew.com.au, 1 hrd-sec.com, 1 hrd.pl, 1 +hrdinaadcera.cz, 1 hrdns.de, 1 hreflang.info, 1 hrej.eu, 1 @@ -70399,7 +70496,6 @@ hrjob.ml, 1 hrjob.tk, 1 hrk.aero, 1 -hrkfamilylaw.com, 1 hrknuddel.de, 1 hrlab.de, 1 hrlive.ga, 1 @@ -70434,7 +70530,7 @@ hrwsba.gov, 1 hrxkauppa.fi, 1 hry.cz, 1 -hrzblt.eu, 0 +hrzblt.eu, 1 hs-flensburg.de, 1 hs-group.net, 1 hs-hire.co.uk, 1 @@ -70476,6 +70572,7 @@ hsselite.com, 1 hst.edu, 1 hst.tc, 1 +hstcompass.com, 1 hstoyanov.com, 1 hsts.eu, 1 hsts.ovh, 1 @@ -70524,6 +70621,7 @@ htljobs.at, 1 htlle.at, 1 htm-partners.com, 1 +htmag.co.il, 1 htmainternational.com, 1 htmanager.fr, 1 htmarketingsolutions.com.au, 1 @@ -70568,6 +70666,7 @@ httpmaster.net, 1 https.com.tw, 1 https.dk, 1 +https.gs, 1 https.jetzt, 1 httpsalarm.com, 1 httpsarnemergan.ml, 1 @@ -70767,7 +70866,6 @@ huitaodang.com, 0 hukkatavara.com, 1 hukuhauchi.com, 1 -hukukiayna.com, 1 hulaginswoodworking.com, 1 hulet.tech, 1 hulii.com, 0 @@ -70801,6 +70899,7 @@ humanesdemadrid.tk, 1 humanewolf.com, 1 humanhairgo.tk, 1 +humanholic.hr, 1 humanidad.tk, 1 humaninterest.com, 1 humaniora.com, 1 @@ -70954,7 +71053,6 @@ huntvac.com, 1 huny.eu.org, 1 hunzai.tk, 1 -huoduan.com, 1 huohu-sports.com, 1 huohuo.cf, 1 huohuo.ml, 1 @@ -70967,6 +71065,8 @@ hurdafiyatlari.site, 1 hurdaphysio.fi, 1 hurinkazan2020.com, 1 +hurix.ai, 1 +hurix.com, 1 hurling.net, 1 huron.tk, 1 huronsd.gov, 1 @@ -70982,13 +71082,13 @@ hurstiharrell.tk, 1 hurstvilleentertainmentcentre.com, 1 hurstvilleentertainmentcentre.com.au, 1 -hurt-orange.pl, 1 hurtigrabat.dk, 1 hurtigtinternet.dk, 1 husakbau.at, 1 huseyinemre.tech, 1 huseyinpala.com, 1 hushfile.it, 1 +hushhush.ai, 1 hushlayer.com, 1 hushpuppiesobuv.ru, 1 husic.net, 0 @@ -70999,7 +71099,7 @@ huskygifts.com, 1 huskyinc.us, 0 huskysat.org, 1 -huskytaildigital.com, 1 +huskytaildigital.com, 0 husqvarnamoped.se, 1 hustlerstate.tk, 1 hustlersuniversityapp.com, 1 @@ -71063,7 +71163,6 @@ hwchronicle.com, 1 hwe.nz, 1 hwehealthiertogether.nhs.uk, 1 -hwholdsworth.com.au, 1 hwinfo.tk, 1 hwnd.io, 1 hwr-barsinghausen.de, 1 @@ -71142,9 +71241,11 @@ hydronium.tk, 1 hydronix-bg.com, 1 hydrooneombudsman.com, 1 +hydropoolandspa.com, 1 hydroposev.com, 1 hydrosaat.ch, 1 hydroscans.com, 1 +hydroscape-group.co.uk, 1 hydrosense.click, 1 hydrosila.com, 0 hydroturbine.info, 0 @@ -71152,6 +71253,7 @@ hydrozone.fr, 1 hyec.jp, 1 hyfood.it, 1 +hygeiadairy.com, 1 hygienet.be, 1 hygraph.com, 1 hyhealth.it, 1 @@ -71180,7 +71282,6 @@ hyperalgesia.com, 1 hyperautomotive.com.au, 1 hyperblast-universe.tk, 1 -hyperblocks.tech, 1 hyperbolecomics.com, 1 hyperbolic-mayonnaise-interceptor.ovh, 1 hypercritical.co, 1 @@ -71279,6 +71380,7 @@ hysh.org, 1 hystats.net, 1 hysupchile.cl, 1 +hytale.com, 1 hytaleid.com, 1 hytaletrack.com, 1 hytravel.it, 1 @@ -71303,7 +71405,6 @@ hyzy.fr, 1 hz601.org, 1 hzbk.org, 0 -hzmpower.com, 1 hzqdl.com, 1 hztgzz.com, 1 hzuuuz.top, 1 @@ -71380,17 +71481,16 @@ i9728.co, 1 i9s.in, 1 ia-tools.com, 1 -ia.net, 1 ia1000.com, 1 iaa.ee, 1 iaabc.org, 1 iaata.info, 1 iabot.tk, 1 -iac-indooraircare.com, 1 iacee.org, 1 iacono.com.br, 0 iactor.co.jp, 1 iactu.info, 1 +iacuwise.com, 1 iadore.tk, 1 iadschool.com, 1 iadttaveras.com, 1 @@ -71414,6 +71514,7 @@ iam.soy, 1 iamafricacampaign.com, 1 iamafricacampaign.org, 1 +iamalive.store, 1 iambhatti.tk, 1 iamcloud.de, 1 iamconnected.eu, 1 @@ -71472,6 +71573,7 @@ ias-gruppe.net, 1 ias.co.jp, 1 ias.ua, 1 +iasme.co.uk, 1 iassess.eu, 1 iaswc.org, 1 iat-sia.org, 1 @@ -71481,7 +71583,6 @@ iav.com, 1 iav.de, 1 iava.ind.br, 1 -iavalley.edu, 1 iawg.gov, 1 iawx.net, 1 iaxx.eu, 1 @@ -71541,6 +71642,7 @@ ibm.iobb.net, 1 ibm3.com, 1 ibmaspera.com, 1 +ibmc.com, 1 ibmix.de, 1 ibmreturns.gov.in, 1 ibmsonline.org, 1 @@ -71565,7 +71667,6 @@ ibug.io, 1 ibuildings.com, 1 ibuildings.nl, 1 -ibuildutd.com, 1 ibuki.run, 1 ibuluxe.com, 1 ibuprofens.gq, 1 @@ -71603,6 +71704,7 @@ iccloyalty.com, 1 iccorporateinteriors.com.au, 1 iccupplatoon.tk, 1 +iccus.net, 1 iccxx.cn, 0 icd-codes.org, 1 icd360s.de, 1 @@ -71618,7 +71720,6 @@ iceberg.ddns.me, 1 icebike.org, 1 icebook.co.uk, 1 -icebound.cc, 0 icebound.win, 1 iceboxstudio.tk, 1 icecars.net, 0 @@ -71658,7 +71759,6 @@ ich-hab-die-schnauze-voll-von-der-suche-nach-ner-kurzen-domain.de, 1 ich-tanke.de, 0 icharme.fr, 1 -ichasco.com, 1 ichbinein.org, 1 ichbinhuebi.de, 1 ichbinkeinfreier.com, 1 @@ -71673,6 +71773,7 @@ ichijoh.co.jp, 1 ichisound.ml, 1 ichitaka.tk, 1 +ichitaso.com, 1 ichizenn.com, 1 ichkannmitgestalten.de, 1 ichmt.org, 1 @@ -71753,6 +71854,7 @@ icsense.com, 1 icst.tk, 1 icsti.org, 1 +ict-community.nl, 1 ict-oldehove.nl, 1 ict-radar.com, 0 ict-radar.nl, 0 @@ -71842,7 +71944,6 @@ ideahubnepal.org, 1 ideaktiv.com, 1 ideal-social.com, 1 -ideal.ee, 1 ideal.shop, 1 idealabs.tk, 1 idealadvogadosbh.com.br, 1 @@ -71889,6 +71990,7 @@ idee-lq.de, 1 idee-lq.net, 1 ideefactory.de, 1 +ideesrecettes.net, 1 idehvector.com, 1 ideiasefinancas.com.br, 1 ideice.gob.do, 1 @@ -71952,13 +72054,12 @@ idlxb.com, 1 idmanagement.gov, 1 idmaster.ml, 1 +idmc-gcfsm.org, 0 idmmovers.com, 1 idmod.org, 1 idn.gov.pt, 0 idndomain.tk, 1 -idndx.com, 1 idnic.net, 1 -idnpacific.com, 1 ido.nl.eu.org, 1 idohost.tk, 1 idol-bikes.ru, 1 @@ -71974,7 +72075,6 @@ idraetsmusik.dk, 1 idratherbequilting.com, 1 idraulico-roma.it, 1 -idraulico-roma.org, 1 idraulico.roma.it, 1 idrissi.eu, 1 idrivegroup.ie, 1 @@ -71994,7 +72094,7 @@ idute.com, 0 idvchile.cl, 1 idvl.de, 1 -idw.pt, 1 +idw.pt, 0 idwebtools.tk, 1 idxforza.com, 1 idyeslogistics.com, 1 @@ -72038,7 +72138,6 @@ iexaminer.org, 1 if-news.ru, 1 if0.ru, 1 -ifacservice.be, 0 ifactfind.com.au, 1 ifactfind.io, 1 ifadian.club, 1 @@ -72080,6 +72179,7 @@ ifminvestors.com, 1 ifminvestors.com.au, 1 ifmsa-lahore.tk, 1 +ifncredite.ro, 1 ifnet.fr, 1 ifoa.it, 1 ifohancroft.com, 1 @@ -72155,6 +72255,7 @@ igloodigitalworkplace.ca, 1 igloodigitalworkplace.com, 1 igloodigitalworkplaces.ca, 1 +igloolab.co, 1 igloopartnerportal.com, 1 igloopreview.ca, 1 iglosujemy.pl, 1 @@ -72204,7 +72305,6 @@ igramming.com, 1 igranit.md, 1 igraonicalara.tk, 1 -igrarium.com.ua, 1 igreja.digital, 1 igrek.co.jp, 1 igrinka.ua, 1 @@ -72229,9 +72329,9 @@ iha6.com, 1 ihacares.com, 1 ihakkitekin.com, 1 -ihatebackground.com, 0 ihatethissh.it, 1 ihaunt.co.uk, 1 +ihawp.com, 1 ihazurip.com, 1 ihc.im, 1 ihda.org, 1 @@ -72298,7 +72398,6 @@ iiinhoj.com, 1 iiipublishing.com, 1 iiit.pl, 1 -iiitint.online, 1 iinehp.com, 1 iinf.in, 1 iinix.com, 1 @@ -72327,7 +72426,6 @@ ijianli.cn, 1 ijji.tv, 1 ijk.nl, 1 -ijm.com, 1 ijmondlijn.nl, 1 ijmuiderstrand.tk, 1 ijnokmpl.cf, 1 @@ -72338,7 +72436,6 @@ ijsj.ie, 1 ijsselglas.nl, 1 ijubt.cf, 1 -ijunohana.jp, 1 ijustwanttomeetmyheroes.com, 1 ika.monster, 1 ikachalife.com, 1 @@ -72354,7 +72451,6 @@ ikeacareers.co.uk, 1 ikebuku.ro, 1 ikecosta.com, 1 -ikeda-ic.com, 1 ikedaquotes.org, 1 ikenmeyer.com, 1 ikenmeyer.eu, 1 @@ -72397,7 +72493,6 @@ ikuda.eu, 1 ikudo.top, 1 ikumi.us, 1 -ikutin.id, 1 ikvts.de, 1 ikwildjworden.com, 1 ikwileendomein.tk, 1 @@ -72450,6 +72545,7 @@ ilgisaglik.com, 1 ilhan.name, 1 ilhombek.ml, 1 +ilia.ae, 1 iliad78.net, 1 iliamna.media, 1 iliastsi.net, 1 @@ -72471,6 +72567,7 @@ ilin.xyz, 1 iling.me, 1 iliny.hu, 1 +ilio.com, 1 ilionsky.com, 1 iljadr.be, 1 ilkeston.cc, 1 @@ -72484,7 +72581,6 @@ illegalpornography.com, 1 illegalpornography.me, 1 illerzell.de, 1 -illiah.com, 1 illicitart.ca, 1 illicitdigital.com, 1 illimitmail.com, 1 @@ -72555,6 +72651,7 @@ ils.lt, 1 ilsalvagente.it, 1 ilsedelangeforum.tk, 1 +ilsofvilnius.lt, 1 iltec.ru, 1 iltis.live, 1 iltis.rocks, 1 @@ -72565,6 +72662,7 @@ ilug-ktm.tk, 1 iluman.tk, 1 ilumantio.tk, 1 +ilumina2photo.es, 1 iluminatia.com, 1 ilunion.tk, 1 ilusionistas.tk, 1 @@ -72614,6 +72712,7 @@ imagevillage.ir, 1 imageworkscorporation.com, 1 imageworld.tk, 1 +imaginablefutures.com, 1 imaginarium.tk, 1 imaginary.ca, 1 imaginary.stream, 1 @@ -72634,7 +72733,6 @@ imagisphe.re, 1 imajjeans.com, 1 imakash.gq, 1 -imakin.nl, 1 imamenu.com, 1 imamiyadental.jp, 1 imanageproducts.co.uk, 1 @@ -72653,7 +72751,6 @@ imarketing.pe, 1 imarotulos.com, 1 imasa.com.br, 1 -imashtech.com, 1 imask.ml, 1 imask.tk, 1 imastudent.com, 1 @@ -72816,7 +72913,7 @@ immobiliensachverstaendiger-waiblingen.de, 1 immobilienservice-website.de, 1 immobilier-realiste.fr, 1 -immobilier-swiss.ch, 0 +immobilier-swiss.ch, 1 immobilier.org.il, 1 immobilier92.net, 1 immobilierlibourne.com, 1 @@ -72874,7 +72971,6 @@ immunetolerance.org, 1 immunoboost.be, 1 immunowell-jcv-portal.com, 1 -immutable.com, 0 imnabrasive.com, 1 imnhealth.com, 1 imnot.uk, 1 @@ -72892,7 +72988,6 @@ imobiliariarealdream.com.br, 1 imobilien.tk, 1 imoe.fun, 0 -imojob.com, 1 imol.ai, 1 imola.com.ua, 1 imolights.com, 1 @@ -72970,11 +73065,11 @@ imphotep.net, 1 impianti.it, 1 impiantofotovoltaico.roma.it, 1 -impiricus.com, 1 implant418.jp, 1 implantologiadentalgt.com, 1 implanttrade.hu, 1 implementconsultinggroup.com, 1 +implementorsinsights.com, 1 implicitsuccess.com, 1 implosion.tk, 1 import-shopping.de, 1 @@ -73089,6 +73184,7 @@ in-ua.com, 1 in.search.yahoo.com, 0 in2core.com, 1 +in6.to, 1 inab.me, 1 inaji.com, 1 inakasoftware.com, 1 @@ -73110,7 +73206,6 @@ inarigal.com, 1 inarizona.tk, 1 inastia.fr, 1 -inatel.br, 1 inavegas.com, 1 inawe.life, 1 inawisdom.com, 1 @@ -73122,7 +73217,8 @@ inbox.com, 1 inbox.google.com, 1 inbox.gq, 1 -inboxen.org, 1 +inboxen.org, 0 +inboxmonster.com, 1 inboxsms.tk, 1 inboxxme.com, 1 incarceratedwombats.com, 1 @@ -73281,7 +73377,6 @@ indianbridalservices.com, 1 indianbrides.cf, 1 indiancreekvillagepdfl.gov, 1 -indianculture.gov.in, 1 indiandramasonline.tk, 1 indianengineer.tk, 1 indianet.tk, 1 @@ -73314,6 +73409,7 @@ indiaworlddigital.tk, 1 indicana.pl, 1 indicatifs.fr, 1 +indicelectronics.com, 1 indichosts.net, 1 indicia.nl, 1 indico.tk, 1 @@ -73324,7 +73420,6 @@ indiemovementest.ga, 1 indiereview.tk, 1 indieweb-endpoints.cc, 1 -indieweb.rocks, 1 indigartbeading.ca, 1 indigartbeading.com, 1 indigenous.gov.au, 1 @@ -73336,6 +73431,7 @@ indigoblack.com.au, 1 indigobooks.gq, 1 indigodergisi.com, 1 +indigojewelers.com, 1 indigosakura.com, 1 indigterms.com, 1 indihome.co.id, 1 @@ -73349,6 +73445,7 @@ indirimkuponumarketim.com, 1 indirimlim.com, 1 indironline.com, 1 +indistopia.com, 1 inditip.com, 1 indivicloud.me, 0 individualizedshirts.com, 1 @@ -73374,7 +73471,6 @@ indoidnews.ga, 1 indonesiatrip.tk, 1 indoor-kletterwald.de, 1 -indoorbattingcages.net, 1 indoorlandmarks.com, 1 indopress.tk, 1 indorepack.com, 1 @@ -73471,7 +73567,6 @@ infermiere.roma.it, 1 inferno.co.uk, 1 infertilitycure.tk, 1 -inffin-portal.de, 1 infi.ch, 1 inficom.org, 1 infidel.org, 1 @@ -73481,6 +73576,7 @@ infihow.com, 1 infinbank.com, 1 infinether.net, 1 +infinicore.co.zw, 1 infinifit.store, 1 infinipharm.com, 1 infinitblog.de, 1 @@ -73490,7 +73586,7 @@ infinitenews.cf, 1 infinitenews.ml, 1 infiniteserieslabs.com, 1 -infinitetimetoact.com, 1 +infinitetoast.com, 1 infinitewealth.com.au, 1 infinitiofallentownparts.com, 1 infinitiofaugustaparts.com, 1 @@ -73543,7 +73639,6 @@ influencetechpr.com, 1 influentsolutions.ch, 1 influnest.com, 1 -influo.com, 1 info-beamer.com, 1 info-bolivia.tk, 1 info-compusciencetech.tk, 1 @@ -73640,6 +73735,7 @@ infopreneur.blog, 1 infoprofuse.com, 1 infopulse.com, 1 +infopumpkin.com, 1 infopuntzorg.nl, 0 inforabota.tk, 1 inforata.com, 1 @@ -73738,6 +73834,7 @@ infradio.am, 1 infradive.com, 1 infraedifice.com, 1 +infraenlinea.com, 1 infrafor.us, 1 infragardnational.org, 1 infralicht.nl, 1 @@ -73782,8 +73879,8 @@ ingegnereambientale.tk, 1 ingemmologie.com, 1 ingenesis.com, 1 +ingeni.ink, 1 ingeniasas.com, 1 -ingenieurbatiment.com, 1 ingenieure-website.de, 1 ingenious-development.tk, 1 ingenium.si, 1 @@ -73824,8 +73921,8 @@ ingress.com, 1 ingridbai.me, 1 ingrijimbatraniladomiciliu.ro, 1 -ingrijireauto.ro, 1 ingticos.com, 1 +ingtt.com, 1 ingushetia.tk, 1 ingushetiya-news.net, 1 ingwaz.org, 1 @@ -73860,7 +73957,6 @@ initrandom.com, 1 injerry.com, 1 injigo.com, 0 -injuryactive.com, 1 injurylawyers.com, 1 injurylawyersphoenixaz.com, 1 injust.cf, 1 @@ -73882,13 +73978,13 @@ inkedin.com, 1 inkedindarkness.com, 1 inkflaremagazine.com, 1 -inkforall.com, 1 inkhor.se, 1 inkibra.net, 1 inkjets-inks.tk, 1 inkjin.com, 1 inkliners.tk, 1 inklingsnews.com, 1 +inko-lang.org, 1 inkognito.cf, 1 inkognito.ga, 1 inkognito.gq, 1 @@ -73919,7 +74015,6 @@ inlink.ltd, 1 inlink.one, 1 inlock.ai, 1 -inlocon.de, 1 inlumi.com, 1 inmaaa.cf, 1 inmateintake.com, 1 @@ -73961,6 +74056,7 @@ innerpeace.tk, 1 innerspace.ae, 1 innewsweekly.com, 1 +innexis.com, 1 innico.cf, 1 inniger.be, 1 innio.com, 1 @@ -73980,17 +74076,14 @@ innosec.ch, 1 innosoftfusiongo.com, 1 innosysdelft.com, 1 -innoteil.com, 1 innoteknology.com, 1 innova-online.at, 1 innova-scape.info, 1 innovacoachgroup.com, 1 innovairservices.ch, 0 -innovamarketing.com, 1 innovamedical.co.uk, 1 innovaptor.at, 1 innovaptor.com, 1 -innovareai.com, 0 innovate-indonesia.com, 1 innovateohio.gov, 1 innovateohioplatform.gov, 1 @@ -74011,6 +74104,7 @@ innovent.com, 1 innover.se, 1 innovex-inc.com, 1 +innovexus.io, 1 innoviafilms.com, 0 innoviahome.com, 1 innovinity.io, 1 @@ -74100,7 +74194,6 @@ insecure.org.je, 1 insee.com.vn, 1 insegne.roma.it, 1 -inser.com.co, 1 inserta.tk, 1 insertcoin.fr, 1 insertcredit.com, 1 @@ -74167,6 +74260,7 @@ inspired-creations.co.za, 1 inspired-lua.org, 1 inspiredbyannefrank.com, 1 +inspiredbyfrustration.com, 1 inspiredcaresolutions.com, 1 inspiredelements.co.uk, 1 inspiredentalwellness.com, 1 @@ -74238,7 +74332,6 @@ instantluxe.com, 1 instantluxe.de, 1 instantly.ai, 1 -instantmoron.com, 1 instantpage.tk, 1 instantprint.co.uk, 1 instantreplay.tk, 1 @@ -74305,7 +74398,6 @@ insurebuysest.ga, 1 insured-event.tk, 1 insuredcloud.ga, 1 -insuredcreativity.com, 1 insurekidsnow.gov, 1 insuremycar.ru, 1 insureon.com, 1 @@ -74459,12 +74551,11 @@ interallied.org, 1 interativashop.com.br, 1 interbank.pe, 1 -interbase.org, 1 interbec.com, 0 interblink.tk, 1 interbulit.com, 1 interc0der.tk, 1 -intercaribbean.com, 1 +intercaribbean.com, 0 intercariforef.org, 1 intercars.bg, 1 interchangehq.com, 1 @@ -74559,10 +74650,11 @@ internationaldesigncomp.com, 1 internationalepolitik.de, 0 internationalfashionjobs.com, 1 +internationalflightstickets.com, 1 internationalfm.tk, 1 +internationalfrom.com, 1 internationaljoustingleague.tk, 1 internationallaborlaw.com, 1 -internationalmedicaleducation.co.uk, 1 internationalschool.it, 1 internationalschoolcommunity.com, 1 internationaltalento.it, 1 @@ -74593,9 +74685,10 @@ internethosting.nl, 1 internethypothekenbank.de, 1 internetinhetbuitengebied.nl, 1 -internetional.nl, 1 +internetional.nl, 0 internetivo.com, 1 internetk.tk, 1 +internetkollen.se, 1 internetkunskap.se, 1 internetline.tk, 1 internetmagaz.tk, 1 @@ -74645,7 +74738,6 @@ intersolute.de, 1 interspar.at, 1 interspence.com, 1 -intersport.com.kw, 1 interspot.nl, 1 interssl.com, 1 interstateautomotiveinc.com, 0 @@ -74665,6 +74757,7 @@ intervention.io, 1 interview-suite.com, 0 interview-test-taker.com, 1 +interviewform.com, 1 interviewpipeline.co.uk, 1 interviewstarsers.ga, 1 interviewstarsest.ga, 1 @@ -74783,12 +74876,14 @@ invenpro.tech, 1 inventarioti.serveftp.net, 1 inventati.org, 1 +inventialifescience.com, 1 inventify.com, 1 inventionjudgeers.ga, 1 inventionjudgeest.ga, 1 inventions-home.tk, 1 inventionsteps.com.au, 1 inventivashop.com, 1 +inventivehq.com, 1 inventix.nl, 1 invento.tk, 1 inventortesters.ga, 1 @@ -74835,6 +74930,7 @@ investigazione.milano.it, 1 investigazione.roma.it, 1 investinamerica.gov, 1 +investindenbosch.com, 1 investinestonia.com, 0 investingdiary.cn, 1 investinginamerica.gov, 1 @@ -74855,7 +74951,6 @@ investisiya.az, 1 investment-adh.com, 1 investment.com, 1 -investmentanalysethat.com, 1 investmentmonitor.ai, 1 investmentpal.com, 1 investmentrankingsers.ga, 1 @@ -74869,7 +74964,6 @@ investorcom.com, 1 investoren-beteiligung.de, 1 investorforms.com, 1 -investorimpulse.com, 1 investorloanshub.com, 1 investormonkey.com, 1 investorplace.com, 1 @@ -74930,6 +75024,7 @@ inzestfreunde.de, 1 inzichtmeditatie.nl, 1 inzidenz.eu, 1 +inzite.com, 1 io-markets.com, 0 io.kg, 1 io.nl.eu.org, 1 @@ -74974,7 +75069,6 @@ ionescuvlad.eu, 1 ionescuvlad.me, 1 iongroup.com, 1 -ionhowto.com, 1 ionicframework.com, 0 ionicshop.xyz, 1 ionize.cloud, 1 @@ -74985,6 +75079,7 @@ ionstudio.pe, 1 ionutnica.ro, 1 ionx.co.uk, 1 +iop.intuit.com, 1 iopex.com, 1 iopool.us, 1 ioretreat.com, 1 @@ -75016,6 +75111,7 @@ iotstadslab.nl, 1 ioville.com, 1 iowa80.com, 1 +iowabankers.com, 1 iowacolonytx.gov, 1 iowacorncountry.com, 1 iowadol.gov, 1 @@ -75083,6 +75179,7 @@ ipdfreedom.me, 1 ipdgroup.com.au, 1 ipdistrimart.com, 1 +ipelint.com, 1 ipemcomodoro.com.ar, 1 iperconnessi.it, 1 iperon.net, 1 @@ -75108,7 +75205,6 @@ iphonekaitori.tokyo, 0 iphonemobile.ro, 1 iphoneunlock.nu, 1 -ipicolorissa.com, 1 ipid.me, 1 ipidkun.com, 1 ipigri.tk, 1 @@ -75121,6 +75217,7 @@ iplabs.com, 1 iplabs.de, 1 iplayradio.net, 0 +iplead.org, 1 ipleak.net, 1 ipledgeonline.org, 0 iplicense.org, 1 @@ -75218,6 +75315,7 @@ iq-robot.com, 1 iqbeauty.pl, 1 iqcybersolutions.com, 1 +iqmod.me, 1 iqor.com, 1 iqos.ml, 1 iqphone.cf, 1 @@ -75314,7 +75412,6 @@ irenictherapy.com, 1 irentcar.com.tw, 1 ireps.gov.in, 1 -iresearchservices.com, 1 iresineworld.tk, 1 irf2.pl, 1 irfanweb.cf, 1 @@ -75373,6 +75470,8 @@ irlprable.tk, 1 irma-gadalka.tk, 1 irmag.ru, 1 +irmcon.ca, 1 +irmcon.com, 1 irmgard-woelfle.de, 1 irmgardkoch.com, 1 irmo.hr, 1 @@ -75444,7 +75543,6 @@ iryodatumoguide.com, 1 irzumshafiq.tk, 1 is-an.org, 1 -is-and.com, 1 is-cloud.ddns.net, 1 is-coming-for-you.run, 1 is-in-hyper.space, 1 @@ -75459,7 +75557,6 @@ isaac.run, 1 isaaccomputerscience.org, 1 isaaccs.org, 1 -isaacdgoodman.com, 1 isaacgolding.com, 1 isaackabel.cf, 1 isaackabel.ga, 1 @@ -75570,7 +75667,6 @@ isitdoneyet.gov, 1 isitef.com, 1 isitnuclearwaryet.com, 1 -isitpatchtuesday.com, 1 isitrest.info, 1 isitshotime.com, 1 iska.plus, 0 @@ -75653,7 +75749,6 @@ ismekkurs.com, 1 ismena.bg, 1 ismetroburning.com, 1 -ismiledental.ro, 1 isminc.com, 1 ismmed.org, 1 ismywebsitepenalized.com, 1 @@ -75667,7 +75762,6 @@ iso27032.com, 1 isobook.ml, 1 isoc-dc.org, 1 -isofartak.com, 1 isognattori.com, 1 isoip.org, 1 isolation-exterieur-94.fr, 1 @@ -75711,6 +75805,7 @@ ispmedipv6.se, 1 ispn.edu.ar, 1 ispro-ng.com, 1 +ispro-ng.help, 1 ispsoft.pro, 1 isputinstillpresident.com, 1 ispymissions.ga, 1 @@ -75758,6 +75853,7 @@ issuerconsulting.com, 1 issues.email, 1 issuetrak.com, 1 +issundries.com, 1 issww.top, 1 ist-analys.com, 1 ist-analyse.com, 1 @@ -75862,7 +75958,6 @@ it-stek.ru, 1 it-support-schmid.ch, 1 it-tainment.de, 1 -it-tekniker.nu, 1 it-ti.me, 1 it-volgograd.tk, 1 it-wars.com, 1 @@ -75941,8 +76036,7 @@ itbrief.news, 1 itbrouwerij.be, 1 itbsinistre.com, 1 -itc-lucke.com, 0 -itc.gov.mn, 1 +itc-lucke.com, 1 itcamefromtheunderground.tk, 1 itcarolina.com, 1 itcase.pro, 1 @@ -76011,10 +76105,12 @@ ithakama.com, 1 ithakama.cz, 1 ithca.om, 1 +ithesk.com, 1 ithical.be, 1 +ithil.ai, 1 ithillel.ua, 1 ithinc.net, 1 -ithmaarbank.com, 0 +ithmaarbank.com, 1 ithriveedinburgh.org.uk, 1 ithuthuat.vn, 1 itibharari.edu.in, 1 @@ -76023,6 +76119,7 @@ itinerariummentis.org, 1 itineris.co.uk, 1 itinero.xyz, 1 +itinnovations.biz, 1 itioc10.tk, 1 itis.gov, 1 itis4u.ch, 1 @@ -76035,7 +76132,7 @@ itlife.tk, 1 itlitera.com, 1 itlog.tk, 1 -itlogic.com.au, 1 +itlogic.com.au, 0 itludens.com, 1 itma.ie, 1 itmastersupport.tk, 1 @@ -76096,7 +76193,6 @@ its-schindler.de, 1 its-taxi.nl, 1 its-v.de, 1 -its.ax, 1 its.gov, 1 its420somewhere.com, 1 its5oclock.eu, 1 @@ -76114,14 +76210,13 @@ itsbait.com, 1 itsbananas.life, 1 itsbas.nl, 1 +itsbirthday.net, 1 itsbrightly.com, 1 itsburning.nl, 1 itscalculator.com, 1 itscc.kr, 1 itsch-itsche.com, 1 itsdcdn.com, 1 -itsdho.com, 1 -itsdho.org, 1 itse.com, 1 itsec.link, 1 itsecblog.de, 1 @@ -76132,8 +76227,8 @@ itservis.org, 1 itsevann.com, 1 itsevident.com, 1 +itsfluxo.com, 1 itsforu.de, 1 -itsgreener.com, 1 itsgroup.co.nz, 1 itshamradio.com, 1 itshka.rv.ua, 1 @@ -76199,7 +76294,7 @@ itwolfcl.tk, 1 itworks.nyc, 1 itworksme.com, 1 -itwozi.com, 1 +itwozi.com, 0 itx.no, 1 itxartu.tk, 1 itxn.cn, 0 @@ -76207,6 +76302,7 @@ itxuc.com, 1 ity.moe, 0 ityco.com, 1 +itylos.com, 1 ityrecare.com, 1 ityug247.com, 1 itzahammer.tk, 1 @@ -76303,6 +76399,7 @@ ivoryandgrace.com, 1 ivoryhomes.com, 1 ivotemahdi.com, 1 +ivovrba.cz, 1 ivpark.fr, 1 ivpbot.tk, 1 ivpn.net, 1 @@ -76315,7 +76412,6 @@ ivtherapyclinic.ru, 1 ivy-league-colleges.com, 1 ivyandrose.co, 1 -ivyar.org, 1 ivybaby.bg, 1 ivygarden.az, 1 ivyhelpers.com, 1 @@ -76398,7 +76494,6 @@ iyouewo.com, 1 iyoumu.top, 1 iyspanel.com, 1 -iz4wnp.it, 1 iz8mbw.net, 1 izabava.tk, 1 izabel.tk, 1 @@ -76566,6 +76661,7 @@ jachtbouw.eu, 1 jachtypruszynski.pl, 1 jacik.cz, 1 +jacintas.site, 1 jack-daw.com, 1 jack-p2.tech, 1 jack.fr.eu.org, 1 @@ -76636,7 +76732,6 @@ jacktor.com, 1 jackvaley.com, 1 jackwarren.info, 1 -jackwell.com.au, 0 jackwu.net, 1 jackylawless.net, 1 jackyliao.me, 1 @@ -76675,6 +76770,7 @@ jadeglobal.com, 1 jadelsbach.de, 1 jademathre.com, 1 +jaderoller.com, 1 jadesong.cn, 0 jadesong.net, 1 jadid-alwadifa.com, 1 @@ -76702,8 +76798,8 @@ jags.tk, 1 jagspecialisters.ga, 1 jagspecialistest.ga, 1 -jagsttalschule.de, 1 jaguar-network.com, 1 +jaguar-print.ru, 1 jaguarkuda.com, 1 jaguarlandrover-asse.be, 1 jaguarlandrover-occasions.be, 1 @@ -76793,16 +76889,13 @@ jamaicabeachtx.gov, 1 jamally.co.za, 1 jambapp.org, 1 -jamberry.com.mx, 1 jambihackerlink.tk, 1 -jambox.ca, 1 jambox.pl, 1 jamcyberinc.com, 1 jamdro.id, 1 jame-game.duckdns.org, 1 jamelhammoud.com, 1 james-bell.co.uk, 1 -james-parker.com, 0 james.cyou, 1 james.je, 1 james.pub, 1 @@ -76842,7 +76935,7 @@ jamessmith.me.uk, 1 jamestabor.com, 1 jamestgh.com, 1 -jamestilburg.nl, 1 +jamestilburg.nl, 0 jamestmart.in, 1 jamestown.de, 0 jamestowncando-nc.gov, 1 @@ -76869,7 +76962,6 @@ jamiemagee.co.uk, 1 jamiemagee.dk, 1 jamiematthews.ml, 1 -jamiepleasants.com, 1 jamiesarner.com, 1 jamiesnape.io, 1 jamieweb.net, 1 @@ -76900,7 +76992,7 @@ jan-hill.com, 1 jan-melcher.de, 1 jan-reiss.de, 1 -jan-rieger.de, 1 +jan-rieger.de, 0 jan-roenspies.de, 1 jan-von.de, 1 jan.so, 1 @@ -76926,10 +77018,10 @@ janelle-jamer.tk, 1 janellequintana.tk, 1 janenwouter.tk, 1 -janescottceramics.com, 1 janetandjohns.tk, 1 janetedkins.com, 1 janetevansyoga.co.uk, 1 +janetweissman.com, 1 janeweeber.com, 1 janey.cf, 1 janeymac.com, 1 @@ -77050,6 +77142,7 @@ jaredstevenson.com, 1 jarett-lee.com, 1 jarigvandaag.nl, 1 +jariiivanainen.net, 1 jaris.blog, 1 jaris.com, 1 jaris.fi, 1 @@ -77157,7 +77250,6 @@ javacakegames.com, 1 javachinna.com, 1 javaexpert.tk, 1 -javafactory.io, 1 javafiles.tk, 1 javafluers.ga, 1 javafluest.ga, 1 @@ -77207,6 +77299,7 @@ jayjardine.ml, 1 jaylewis.us, 1 jaylineko.com, 1 +jaymlebois.fr, 1 jaypandit.me, 1 jaypark.gq, 1 jaypeeonline.tk, 1 @@ -77253,8 +77346,8 @@ jberlife.marketing, 1 jbeta.is, 1 jbfung.net, 1 +jbhe.com, 1 jbidigital.co.uk, 1 -jblan.ca, 1 jbmechanics.com, 1 jbmincorporated.com, 1 jboats.com, 1 @@ -77378,6 +77471,7 @@ jdscastlehire.co.uk, 1 jdsecurity.co.nz, 1 jdsecurity.com.au, 1 +jdsfarm.mt, 1 jdsoft.eu, 1 jdt.de, 1 jdtangney.com, 1 @@ -77401,7 +77495,6 @@ jeancarlos.tk, 1 jeanclaudegolvin.com, 1 jeandanielfaessler.ch, 1 -jeanettegy.com, 1 jeanettevanrookhuizen.nl, 1 jeangalea.com, 1 jeangarcia.tk, 1 @@ -77474,6 +77567,7 @@ jeffbuswell.com, 1 jeffcasavant.com, 0 jeffcom911co.gov, 1 +jeffcullenartistry.com, 1 jeffdaviscountyga.gov, 1 jeffersoncitytn.gov, 1 jeffersoncountyks.gov, 1 @@ -77505,9 +77599,11 @@ jeffsanders.com, 1 jefftron.net, 0 jeffweb.net, 1 +jeffycheco.wedding, 1 jeflix.stream, 1 jefrydco.id, 1 jefsweden.eu, 1 +jegadat.com, 1 jegkorongszovetseg.hu, 1 jegle.de, 1 jegos.tk, 1 @@ -77595,7 +77691,6 @@ jennifersauer.nl, 1 jenniferschmidt.com.au, 1 jennifertilly.tk, 1 -jenniwiltz.com, 1 jennyjones.tk, 1 jennymovies.com, 1 jennysarl.ch, 0 @@ -77621,7 +77716,6 @@ jeremiahbenes.com, 1 jeremiahlee.com, 1 jeremiebt.com, 1 -jeremy-chen.org, 1 jeremy-gautier.com, 1 jeremy.hu, 1 jeremybentham.com, 1 @@ -77644,6 +77738,8 @@ jericoacoara.com, 1 jerisandoval.tk, 1 jeriss.be, 1 +jerkmotion.com, 1 +jeroenbosch.nl, 1 jeroendeneef.com, 1 jeroened.be, 1 jeroenensanne.wedding, 1 @@ -77660,7 +77756,6 @@ jerrycanspirits.co.uk, 1 jerrygwilliams.com, 1 jerryweb.org, 1 -jerryyu.ca, 1 jersec.com, 1 jerseybikehire.co.uk, 1 jerseycounty-il.gov, 1 @@ -77728,6 +77823,7 @@ jesus-rock.tk, 1 jesuscalls.com, 1 jesuscapitan.tk, 1 +jesuschat.com, 1 jesuscnasistente.com, 1 jesusda.tk, 1 jesusdenazaret.com, 1 @@ -77751,7 +77847,6 @@ jetmusic.tk, 1 jetpack.com, 1 jetpack.com.ar, 1 -jetsadabetchoke77.com, 0 jetsetretiree.com, 1 jetsieswerda.nl, 1 jetskerijneveld.nl, 1 @@ -77763,7 +77858,6 @@ jetular.com, 1 jetular.net, 1 jetvac.cz, 1 -jetwashaustralia.com.au, 1 jetwhiz.com, 1 jetzhang.com, 1 jetzt-elektromobil.de, 1 @@ -77790,6 +77884,7 @@ jewelleryoutlook.com, 1 jewelry-directories.tk, 1 jewelrycoverers.ga, 1 +jewelryodm.com, 1 jewelryshowcasedepot.com, 1 jewishboston.com, 1 jewishjourneys.org, 1 @@ -77802,7 +77897,6 @@ jezebelsromance.com, 1 jezero.tk, 1 jezura.cz, 1 -jezykoteka.pl, 1 jezzicat.org, 1 jf-igrejanovadosobral.pt, 1 jf-madalena.tk, 1 @@ -77863,7 +77957,6 @@ jhbgroup.nl, 1 jhburton.co.uk, 1 jhcommunitysports.co.uk, 1 -jhdindustrialsolution.com, 1 jhe.li, 1 jhellings.nl, 1 jhenwei.com.tw, 1 @@ -77917,6 +78010,7 @@ jiayi.eu.org, 1 jiayi.life, 1 jiazhao.ga, 0 +jiazhao.me, 1 jibe.com, 1 jibeapply.com, 1 jibecdn.com, 1 @@ -77961,6 +78055,7 @@ jikiden.com, 1 jikken.de, 1 jilaninteraktif.tk, 1 +jilbertdairy.com, 1 jilio-ca.com, 1 jilio-ca.net, 1 jilio.com, 1 @@ -78005,6 +78100,7 @@ jimpl.com, 1 jimreedphoto.com, 1 jimslop.nl, 1 +jimthompsonfabrics.com, 1 jimvophotography.tk, 1 jimwalkerphotography.com, 1 jimwhitesell.com, 1 @@ -78068,6 +78164,7 @@ jitsipatapoe.ddns.net, 0 jittruckparts.com, 1 jiuchen.com, 1 +jivara.global, 1 jix.im, 1 jix.net, 1 jixing.one, 1 @@ -78138,6 +78235,7 @@ jlbleakley.com, 1 jld.paris, 1 jldlawyers.com, 1 +jlgsepticllc.com, 1 jlifeoc.com, 1 jliu.xyz, 1 jlmirall.es, 1 @@ -78181,7 +78279,6 @@ jmcleaning.services, 1 jmdekker.it, 1 jmedesign.tk, 1 -jmedved.com, 1 jmeno.eu, 1 jmentertainment.co.uk, 1 jmf-clan.tk, 1 @@ -78265,7 +78362,6 @@ jobapps.ch, 1 jobassadeurs.fr, 1 jobbnorge.no, 1 -jobbois.com, 1 jobbs.se, 1 jobbsafari.no, 0 jobbsafari.se, 0 @@ -78288,13 +78384,13 @@ jobindex.dk, 1 jobintourism.gr, 1 jobit.gr, 1 +jobleader.co.uk, 1 +jobleader.co.za, 1 joblife.co.za, 1 joblover.ml, 1 joblyconnect.com, 1 -jobmacon.com, 1 jobnmadu.com, 1 joboutlook.gov.au, 1 -jobpeintre.com, 1 jobphoning.com, 1 jobrs.edu.iq, 1 jobrus.ga, 1 @@ -78342,7 +78438,6 @@ jocurionline.eu, 1 jodaviesscountyil.gov, 1 joder.li, 1 -jodhpurwindfarms.com, 1 jodlajodla.si, 1 jodyboucher.com, 0 jodymackphotography.com, 1 @@ -78381,7 +78476,6 @@ joembayawaphotography.com, 1 joepitt.co.uk, 0 joerg-wellpott.de, 1 -joerger.ch, 1 joergschneider.com, 1 joerss.at, 1 joesalter.com, 1 @@ -78489,6 +78583,7 @@ johnnyofans.com, 1 johnnyrelease.de, 1 johnnysandaire.com, 1 +johnnysteak.nl, 1 johnocallaghan.tk, 1 johnopdenakker.com, 1 johnrdockendorf.com, 1 @@ -78548,6 +78643,7 @@ jointherlworld.com, 1 jointheunseen.com, 1 jointotem.com, 1 +jointrusio.com, 1 jointsache.com, 1 joinupguard.com, 1 joj.sk, 1 @@ -78618,6 +78714,7 @@ jonathanamoia.co, 0 jonathanbalsiger.com, 1 jonathancarter.org, 1 +jonathancorbin.io, 1 jonathandaleswindle.com, 1 jonathandowning.uk, 0 jonathanisaac.com, 1 @@ -78680,6 +78777,7 @@ jonoalderson.com, 1 jonohewitt.com, 1 jonola.com, 1 +jonpadgett.net, 1 jonpavelich.com, 1 jons.org, 1 jonscaife.com, 1 @@ -78690,12 +78788,13 @@ jonstar.tk, 1 jonvemo.com, 0 jony.tk, 1 +jonyandjerin.com, 1 joo.ru, 1 joodari.fi, 1 joodsmonument.nl, 1 joogle.at, 1 jooli.tk, 1 -joomag.com, 1 +joomag.com, 0 joomanji.fr, 1 joomearaweb.tk, 1 joomla-leipzig.com, 1 @@ -78734,7 +78833,6 @@ jordansmovies.tk, 1 jordansrequests.tk, 1 jordhy.com, 1 -jordi3.com, 1 jordibelgraver.email, 1 jordibelgraver.eu, 1 jordibelgraver.xyz, 1 @@ -78757,6 +78855,8 @@ jornalero.tk, 1 jornaya.com, 1 jorsev.com, 1 +jortt.nl, 1 +jortt.shop, 1 jos-verstappen-fan.tk, 1 josa.ngo, 1 josaa.nic.in, 1 @@ -78771,6 +78871,7 @@ joseetesser.nl, 1 josef-lotz.de, 1 josefernandomorilloardila.tk, 1 +josefhelie.com, 1 josefienbouwmeister.nl, 1 josefinagrau.tk, 1 josefjanosec.com, 1 @@ -78815,12 +78916,14 @@ joshparker.uk, 1 joshs.domains, 1 joshs.guide, 1 +joshs.photos, 1 joshschmelzle.com, 1 joshspage.ltd.uk, 1 +joshspage.uk, 1 joshthewanderer.com, 1 joshu.am, 1 joshua-kuepper.de, 1 -joshua.law, 1 +joshua.law, 0 joshuadiamant.com, 1 joshuagoss.com, 1 joshuamessick.com, 0 @@ -78876,6 +78979,7 @@ journaltimes.com, 1 journeedesfilles.gc.ca, 1 journey.study, 1 +journeybjjacademy.com, 1 journeyfriday.rocks, 1 journeying.ca, 1 journeyofmymothersson.com, 1 @@ -78883,6 +78987,7 @@ journeyrent.com, 1 journeytofi.com, 1 journeytomastery.net, 1 +jourt.com, 1 jousiammuntahalli.fi, 1 joustsec.com, 1 jouw-job.nl, 1 @@ -78907,6 +79012,7 @@ joyblz.com, 1 joybuggy.com, 1 joyce.tk, 1 +joycefeng.com, 1 joycejamiewedding.com, 1 joychetry.com, 1 joydivision.tk, 1 @@ -79079,7 +79185,6 @@ jss6868.cc, 1 jssantos.net, 1 jssresearch.com, 1 -jstarlab.com, 1 jsteward.moe, 1 jstnmcbrd.com, 1 jstore.ch, 1 @@ -79132,7 +79237,6 @@ juanmanuel.tk, 1 juanmapauso.tk, 1 juanmasuarez.tk, 1 -juanmazzetti.com, 1 juanmoreno.tk, 1 juanp.in, 1 juanpena.tk, 1 @@ -79170,6 +79274,7 @@ judidominokiukiu.ga, 1 judidominokiukiu.ml, 1 judithsargentini.nl, 1 +judjas.com, 1 judo2point0.com, 1 judobasicsers.ga, 1 judobasicsest.ga, 1 @@ -79197,7 +79302,6 @@ juflynt.nl, 1 jugaar.llc, 1 jugendhackt.de, 1 -jugendhackt.org, 1 jugendpresse-hessen.de, 1 jugh.de, 1 juhakoho.com, 1 @@ -79219,12 +79323,11 @@ jukebox-manuals.tk, 1 jukebox.plus, 1 jukisewingmachines.co.uk, 1 -jukkakivi.fi, 1 jukkakivimaki.fi, 1 jukovka.tk, 1 juku-wing.jp, 1 julb.de, 1 -julditec.com, 1 +julditec.com, 0 jule-spil.dk, 1 julenetxaniz.eus, 1 julenlanda.com, 0 @@ -79262,6 +79365,7 @@ julianvmodesto.com, 1 julianwallmeroth.de, 1 julianweigle.de, 1 +julianwitusch.de, 1 juliaoantiguidades.com.br, 1 julias.zone, 1 juliasugar.net, 1 @@ -79278,6 +79382,7 @@ julien-demare.com, 0 julien-noyelle.com, 1 julien.expert, 1 +julienlanglois.me, 1 julienmotheron.tk, 1 julienpaterne.com, 0 juliens.tk, 1 @@ -79322,7 +79427,6 @@ jumpandjivechildrensparties.co.uk, 1 jumparoundbouncycastles.co.uk, 1 jumparty.co.uk, 1 -jumpcloud.com, 1 jumpeasy.com.au, 1 jumperke.be, 1 jumperweb.tk, 1 @@ -79338,6 +79442,7 @@ jumpintogreenerpastures.com, 0 jumpman-iphone-design.de, 1 jumpnplay.com.au, 1 +jumponaut.com, 1 jumpseller.cl, 1 jumpseller.com, 1 jumpstartii.com, 1 @@ -79388,11 +79493,9 @@ junjie.pro, 1 junjun-web.net, 0 junkcarbin.com, 1 -junkcarboys.ca, 1 junkcarremovalbrampton.ca, 1 junkdrome.org, 0 junkersparadise.tk, 1 -junkfoodcafe.com, 1 junkguy.tk, 1 junkiedownload.tk, 1 junkotoshimadesign.com, 1 @@ -79402,10 +79505,12 @@ junkyardsl.com, 1 junkyardtuning.tk, 1 junlyu.org, 1 +juno33.com, 1 junobaker.co.uk, 1 junomessenger.cf, 1 junshinkai.ed.jp, 1 junte.tk, 1 +juntoaqui.com.br, 1 juntos.gov, 1 juntosfmc.com.br, 1 junyan.ga, 1 @@ -79432,6 +79537,7 @@ juridiq.it, 1 jurimatic.com, 1 jurisapiens.com, 0 +jurisconsulto.mx, 1 juriscoop.com.co, 1 juriskc.com, 1 jurislex.tk, 1 @@ -79478,7 +79584,6 @@ justarchi.net, 1 justasdelish.com, 1 justbe.scot, 1 -justbid.nl, 1 justbraces.com.sg, 1 justbusinessvalue.com, 1 justbydesign.com, 1 @@ -79520,7 +79625,6 @@ justifinetwork.com, 1 justin-tech.com, 1 justin3d.nl, 1 -justincoffman.com, 1 justindianporn.me, 1 justinellingwood.com, 1 justinfreid.com, 1 @@ -79635,6 +79739,7 @@ jyprj.com, 0 jysecurity.com, 1 jystewart.net, 1 +jytvu.cn, 1 jyvaskylantykkimies.fi, 1 jz.lc, 1 jzbk.org, 0 @@ -79689,7 +79794,6 @@ k507.com, 0 k51365.com, 1 k5197.co, 1 -k55655.com, 1 k583.com, 0 k60d.com, 1 k6729.co, 1 @@ -79793,7 +79897,7 @@ kabulboy.tk, 1 kabulnow.com, 1 kabulpress.org, 1 -kabushiki.jp, 1 +kabushiki.jp, 0 kabyle.com, 1 kacanews.com, 1 kacang-bali.com, 1 @@ -79817,7 +79921,6 @@ kadenlegion.com, 1 kader-platform.nl, 1 kadestate.ru, 1 -kadet.net.ru, 1 kadett-c-club-limburg.tk, 1 kadhal-kirukkan.tk, 1 kadidak.com, 0 @@ -79826,6 +79929,7 @@ kadinhayati.com, 1 kadinsaglikhaber.tk, 1 kadinvesaglik.tk, 1 +kadirari.com.tr, 1 kadizadeinsaat.com.tr, 1 kado-ya.jp, 1 kadolis.com, 1 @@ -79834,10 +79938,12 @@ kadvi.tk, 1 kadykchanskiy.ml, 1 kadymacdonalddenton.ca, 1 +kaeme.com, 1 kaeptns-sechser.de, 1 kaeru-seitai.com, 1 kaesehagen.nl, 1 kafe-cigarko.cz, 1 +kafe.ai, 1 kafecigarko.cz, 1 kafel-ufa.tk, 1 kafeline.com, 1 @@ -79864,7 +79970,6 @@ kagomesashi.tk, 1 kaguramea.fr, 1 kagurayayoi.top, 1 -kagurazaka-mc.com, 1 kaha.co.id, 1 kahane.org, 1 kahmad.in, 1 @@ -79878,6 +79983,7 @@ kaibaunderwear.com.ar, 1 kaibinyang.com, 1 kaibinyang.tk, 1 +kaido-app.com, 1 kaidoblogi.eu, 1 kaigojj.com, 1 kaihipay.jp, 1 @@ -79896,7 +80002,6 @@ kaion.vn, 1 kaipel.de, 1 kaipop.com, 1 -kairainyhappy.com, 1 kairion.de, 1 kairoscope.org, 1 kairoscyprus.com, 1 @@ -79936,7 +80041,7 @@ kak.ao, 1 kaka.farm, 0 kakabo.vn, 1 -kakacon.nz, 1 +kakacon.nz, 0 kakan.ml, 1 kakaravaara.fi, 1 kakdolgonline.cf, 1 @@ -80022,7 +80127,6 @@ kalligo.ga, 1 kalligraf.tk, 1 kallipso.pl, 1 -kallosmedicalaesthetics.com, 1 kalmarantiques.com.au, 1 kalmarbilder.se, 1 kalmbach.com, 1 @@ -80054,7 +80158,6 @@ kalyancity.in.ua, 1 kalyangupta.ml, 1 kalyazin-online.tk, 1 -kalyndachase.com.au, 1 kam-serwis.pl, 1 kamada.com, 1 kamagrajel.org, 1 @@ -80117,6 +80220,7 @@ kamlunglelystad.tk, 1 kamnob.com, 1 kamp-kisten.nl, 1 +kampanyaplus.com, 1 kampanyaradar.com, 1 kampffische.tk, 1 kampfsportschule-einherjar.de, 1 @@ -80157,6 +80261,7 @@ kanbanflowbackup.com, 1 kancelarblanik.cz, 1 kancelaria.torun.pl, 1 +kancelariatyniec.pl, 1 kancelariawlt.pl, 1 kancolle.me, 1 kancriaura.org, 1 @@ -80314,7 +80419,7 @@ karanjthakkar.com, 1 karanlyons.com, 1 karao.ke, 1 -karaodesign.fr, 1 +karaodesign.fr, 0 karaoglanis-info.tk, 1 karaoglanis.tk, 1 karaokeyboards.tk, 1 @@ -80369,7 +80474,7 @@ karin-ewald.de, 1 karinahh.net, 1 karinheinenmaassen.nl, 1 -karinov.co.id, 1 +karinov.co.id, 0 karinwerner.com, 1 kariszoey.com, 1 karit.nz, 1 @@ -80415,6 +80520,7 @@ karol.gay, 1 karolak.fr, 0 karolaschinkel.de, 1 +karollech.com, 1 karopc.pl, 1 karorally.tk, 1 karoverwaltung.de, 1 @@ -80497,7 +80603,6 @@ kaskojs.com, 1 kaskoqa.com, 1 kasowitz.com, 1 -kaspa-store.com, 1 kasparovru.ml, 1 kasparovru.tk, 1 kasper-team.tk, 1 @@ -80518,7 +80623,6 @@ kastankaoffice.cz, 1 kastas.com, 1 kastas.com.tr, 1 -kastechssg.com, 1 kasteelhoensbroek.nl, 1 kastelruth.biz, 1 kastemperaturen.ga, 1 @@ -80531,6 +80635,7 @@ kasvall.com, 1 kasyna-internetowe.com, 1 kasynoanalyzer.com, 1 +kat.ai, 1 kat.cat, 1 kat.tf, 0 kat4at.tk, 1 @@ -80577,6 +80682,7 @@ katex.org, 1 kateysagal.tk, 1 katfitness.co.uk, 1 +katha.lk, 1 kathakkachakkar.com, 1 kathardt.de, 1 katherineandkegan.love, 1 @@ -80607,6 +80713,7 @@ katka.info, 1 katnunn.co.uk, 1 kato-yane.com, 1 +katogen.com, 1 katom.com, 1 katrelleonline.tk, 1 katretter.de, 1 @@ -80623,6 +80730,7 @@ kattelans.eu, 1 kattelus.tk, 1 kattens.tk, 1 +katumms.com.au, 1 katushka.cf, 1 katushka.ga, 1 katyl.info, 0 @@ -80672,6 +80780,7 @@ kawaiicon.org, 1 kawaiiku.de, 1 kawaiilo.li, 1 +kawaitomato.com, 1 kawamipiano.com, 1 kawamura-inc.jp, 1 kawasaki.com, 1 @@ -80684,6 +80793,7 @@ kay.la, 1 kay.moe, 1 kay.nz, 1 +kayabyd.lk, 1 kayakaventura.tk, 1 kayakcastro.tk, 1 kayakpolouniversidades.tk, 1 @@ -80699,6 +80809,7 @@ kaylielaw.com, 1 kayne.com, 1 kayon.cf, 1 +kayphi.com, 1 kayseri.bel.tr, 1 kayserihaberleri.tk, 1 kaysville.gov, 1 @@ -80730,7 +80841,6 @@ kazoohr.com, 0 kaztest.tk, 1 kazu-techlab.com, 1 -kazu.click, 1 kazumi-clinic.com, 1 kazumi.ooo, 1 kazuno-jc.or.jp, 1 @@ -80782,6 +80892,7 @@ kc9.vip, 1 kca2009.com, 1 kcagsolutions.com, 1 +kcalb-ltd.com, 1 kcc8.com, 1 kcchung.com, 1 kcci.com, 1 @@ -80825,6 +80936,7 @@ kdm.pw, 1 kdn-dc.com, 1 kdo-vola.cz, 1 +kdofid.fr, 1 kdonkers.com, 1 kdoslavi.cz, 1 kdproduction.cz, 1 @@ -80904,7 +81016,6 @@ keepersecurity.us, 1 keepiteasy.eu, 1 keepitsecure24.com, 1 -keepitsimplebitcoin.com, 1 keepleft.gr, 1 keepsight.org.au, 1 keepsolid.com, 1 @@ -80921,13 +81032,13 @@ kegan.lol, 1 keganthorrez.com, 1 kegelschiene.net, 0 +kegoc.kz, 1 kehlenbach.net, 1 keian.tk, 1 keibablood.com, 1 keiebijters.nl, 1 keigakusha.co.jp, 1 keigel2001.net, 1 -keiji0501.com, 1 keiju.ee, 1 keiju.fi, 1 keijuriini.fi, 1 @@ -80953,6 +81064,7 @@ keitaro.io, 1 keith.pro, 1 keithazzopardi.tk, 1 +keithblakemorenoble.com, 1 keithmcmillen.com, 1 keiths.ml, 1 keithstaxis.co.uk, 1 @@ -80961,6 +81073,7 @@ keizeror.gov, 1 kejiben.fun, 1 kejpop.pl, 1 +kejtahir.com, 1 kekarimi.com, 1 keke-shop.ch, 1 kekoskee.gov, 1 @@ -81047,6 +81160,7 @@ kempnertx.gov, 1 kemppi.com, 0 kempportraits.com, 1 +kemps.com, 1 kemptechnologies.com, 0 kemptonparkplumbing.co.za, 1 kemptonparksolarsystems.co.za, 1 @@ -81088,6 +81202,7 @@ keniff.gq, 1 kennards.co.nz, 1 kennebec.gov, 1 +kennebunksavings.com, 1 kennedy.cf, 1 kennedy.ie, 1 kenners.org, 0 @@ -81102,7 +81217,6 @@ kennispleinzingeving.nl, 1 kenny-peck.com, 1 kenny.technology, 1 -kennychan.xyz, 1 kennynet.co.uk, 1 keno.im, 1 keno.tk, 1 @@ -81201,6 +81315,7 @@ kerrydavisguitars.tk, 1 kersmexico.com, 1 kerstpagina.tk, 1 +kerstpakkettenplaza.nl, 1 kersvers.agency, 1 kertis.tk, 1 kertweb.hu, 1 @@ -81224,7 +81339,6 @@ keskkonnaamet.ee, 0 kesko.fi, 0 keskraamatukogu.ee, 1 -kessel-runners.com, 1 kesselrun.goip.de, 1 kesslerandsons.com, 1 kesspay.io, 1 @@ -81258,6 +81372,7 @@ ketv.com, 1 ketzer.tk, 1 keukenhof.nl, 1 +keukenkraanwinkel.nl, 1 keukenstudio.tk, 1 keurigbestprice.tk, 1 keuvelaar.nl, 1 @@ -81338,6 +81453,7 @@ keydelay.tk, 1 keydifferencemedia.com, 1 keyesrobot.cn, 1 +keyfortech.com, 1 keyfoundation.xyz, 1 keygen.sh, 1 keyhani.tk, 1 @@ -81464,7 +81580,6 @@ khas.co.uk, 1 khatapana.com, 1 khatnip.net, 1 -khatwa-editions.org, 1 khayal-3d.com, 1 khda.gov.ae, 1 khdestiny.tk, 1 @@ -81506,16 +81621,17 @@ khuyenmaiviettel.vn, 1 khwezifinancialservices.co.za, 1 khwiki.com, 1 +ki-adept.eu, 1 ki-dc.com, 1 ki-management.ch, 1 ki.ki, 1 ki6rbv.com, 1 kiacatherine.sg, 1 -kiadoapartman.hu, 1 kialo-edu.com, 1 kialo-pro.com, 1 kialo.com, 1 kiamehr.tk, 1 +kian.or.jp, 1 kianho.com.sg, 1 kiano.net, 0 kiapartsnow.com, 1 @@ -81561,7 +81677,6 @@ kiddies.tk, 1 kiddieskingdom.tk, 1 kiddocom.org, 1 -kiddoscape.eu, 1 kiddyboom.ua, 1 kiddyland.co.jp, 1 kidfitseries.com.au, 1 @@ -81570,7 +81685,7 @@ kidisov.tk, 1 kidiu.com, 1 kidm4k.com, 0 -kidney.ca, 1 +kidney.ca, 0 kidonng.me, 1 kids-castles.com, 1 kids-concept.de, 1 @@ -81652,8 +81767,8 @@ kigermap.cn, 1 kigermap.com, 1 kighub.cn, 1 +kigmbh.com, 1 kigyounomori.com, 1 -kihi.news, 1 kiinanharjakoirat.tk, 1 kiind.com.au, 1 kiiteyo.net, 1 @@ -81735,7 +81850,6 @@ kimberleythomson.tk, 1 kimberlyal.gov, 1 kimberlycaprice.com, 1 -kimberlydelarosa.com, 1 kimberlytank.com, 1 kimboggusphotography.com, 1 kimbroughelectric.com, 1 @@ -81895,7 +82009,6 @@ kingofthecastlesrhyl.co.uk, 1 kingpin.pro, 1 kingpincages.com, 1 -kingroot.com, 1 kings-potong.com, 1 kings-world.net, 1 kingsaft.net, 1 @@ -81921,10 +82034,10 @@ kingsurfa.com, 0 kingsvetcentre.com, 1 kingsvilletexas.com, 1 -kingswinehaus.com, 1 kingtech8.tk, 1 kingtreasure.com, 1 kingtreasures.com, 1 +kingwaybagger.de, 1 kingyard.com, 1 kingyo-bowl.com, 1 kinherit.co.uk, 1 @@ -81989,6 +82102,7 @@ kinozone.tk, 1 kinschots.eu, 1 kinsei.jp, 1 +kinshipcareers.com, 1 kintanalodge.fr, 1 kintawifi.com, 1 kintell.com, 0 @@ -82167,6 +82281,7 @@ kitpara.shop, 1 kits-graphiques-shop.tk, 1 kits-graphiques.tk, 1 +kits.cx, 1 kitsap.gov, 1 kitscan.co.uk, 1 kitscan.com, 1 @@ -82221,11 +82336,13 @@ kiwipedia.sk, 1 kiwiplace.com, 0 kiwitastic.com, 1 +kiwox.cl, 1 kixby.com, 1 kizetroniko.tk, 1 kizkulesi.tk, 1 kizomba.info, 1 kiztarafi.net, 1 +kizuna.com.py, 1 kizunaai.eu.org, 1 kizzycode.de, 1 kj-cleaning.co.uk, 1 @@ -82390,7 +82507,6 @@ klempin.org, 1 klempin.se, 1 klempin.uk, 1 -klen.ua, 1 klenc.eu, 1 klenty.com, 1 kleor.com, 1 @@ -82471,7 +82587,6 @@ kloop.kg, 1 klop.info, 1 klos-kremperler.at, 1 -klose-besser.com, 1 klose.family, 1 klosetestumgebungnextcloud.de, 1 klosko.net, 1 @@ -82492,6 +82607,7 @@ klubfitness.pl, 1 klubgerlach.sk, 1 klubwsl.tk, 1 +kluchkin-ai.com, 1 kluck.me, 1 kludge.eu, 1 klugemedia.de, 1 @@ -82550,6 +82666,7 @@ knarred.site, 1 knashaug.com, 1 knauf.com, 1 +knauss-family.com, 1 knautiluz.net, 0 knb.nl, 1 knbbw-frnab.tk, 1 @@ -82561,6 +82678,7 @@ kneepainclinic.sg, 1 kneerux.de, 1 kneginec.hr, 1 +kneli.co.il, 1 knep.me, 0 kneppe.me, 1 knetterbak.nl, 1 @@ -82644,6 +82762,7 @@ knowunity.com, 1 knowunity.de, 1 knowyourday.ai, 1 +knowyourrunway.com, 1 knowyourteam.com, 1 knoxcountyil.gov, 1 knoxcountyne.gov, 1 @@ -82722,7 +82841,6 @@ koch-wro.pl, 1 kochadaiyaan.tk, 1 kochamkoszalin.pl, 1 -kochbar.de, 1 kochcommunity.com, 1 kochen-und-design.de, 1 kochereva.com, 1 @@ -82746,6 +82864,7 @@ kode-it.de, 1 kode.ch, 0 kodelabs.com, 1 +koderclub.com, 1 kodes.com.tr, 1 kodexplorer.ml, 1 kodi-tutorials.com, 1 @@ -82754,6 +82873,7 @@ kodineuerleben.eu, 1 kodinkuvalehti.fi, 1 kodioso.com, 1 +kodiqa.com, 1 kodkollen.com, 1 kodkollen.se, 1 kodomocorona.com, 1 @@ -82816,10 +82936,8 @@ koji-tsujitani.net, 1 kojiishikawa.com, 1 kojipkgs.fedoraproject.org, 1 -kokenmetesther.nl, 1 koketteriet.se, 0 kokk.loan, 1 -koko.news, 1 kokoiroworks.com, 1 kokomo.com.au, 1 kokomoislandfiji.com, 1 @@ -83049,7 +83167,6 @@ kontabydigital.com, 1 kontaxis.org, 1 kontent.ai, 1 -kontikifinance.com, 0 kontikiindustries.tk, 1 kontikimedia.com, 1 kontist.com, 1 @@ -83065,6 +83182,7 @@ kontur.tk, 1 konturalco.ru, 1 konus.tk, 1 +konveniat.lu, 1 konventa.net, 1 konwerter-online.pl, 1 konyadireksiyonservisi.com, 1 @@ -83084,7 +83202,6 @@ koodimasin.ee, 1 koodimasin.eu, 1 kooer.org, 1 -koof.win, 1 kooky.org, 1 kooli.ee, 1 koolisw.tk, 1 @@ -83125,7 +83242,6 @@ koplancpa.com, 1 koplax-online.com, 1 koppbilling.com, 1 -koppelvlak.net, 1 koppenexecutive.com, 1 koppenhouse.com, 1 koppop.nl, 1 @@ -83150,6 +83266,7 @@ korb.de, 1 korbel-loziska.cz, 1 korben.info, 1 +korcula-larus.com, 1 kordamed.ee, 1 kordamentha.com, 1 kordamentha.com.au, 1 @@ -83190,6 +83307,7 @@ korotonomedya.net, 1 korrekttech.hu, 1 korrelzout.nl, 1 +korsordsvar.com, 1 korst.tk, 1 korstanjebouw.nl, 1 korstanjetimmerwerken.nl, 1 @@ -83266,7 +83384,6 @@ kotisivukone.fi, 0 kotitehdas.fi, 1 kotka.ml, 1 -kotlinfactory.io, 1 kotly-marten.com.ua, 1 kotmale.com, 1 kotobox.net, 1 @@ -83335,7 +83452,6 @@ kozgi.com, 1 kozhzamenitely.tk, 1 koziknet.com, 1 -kozinetspurewal.com, 1 kozitsyn.name, 1 kozlov.cf, 1 kozmetikatrend.hu, 1 @@ -83346,12 +83462,19 @@ kp-opt.ru, 1 kp0808.cc, 1 kp0809.com, 1 +kp1111.cc, 1 +kp2222.cc, 1 +kp3333.cc, 1 +kp4444.cc, 1 kp45.ru, 1 +kp6666.cc, 1 +kp7777.cc, 1 +kp9999.cc, 1 kpfanworld.com, 1 -kpinterface.com, 1 kpinvest.eu, 1 kpirx.com, 1 kpit.com, 1 +kpk.io, 1 kpkhub.com, 1 kplante.com, 1 kplastics.in, 1 @@ -83430,6 +83553,7 @@ kramersworld.tk, 1 kramesondemand.com, 1 kramm.com, 1 +kramse.org, 1 kramsj.uk, 1 kran.ga, 1 krang.org.uk, 1 @@ -83505,7 +83629,6 @@ kreditonline.ml, 1 kreditor.gq, 1 kreditovnet.tk, 1 -kreditsystem.net, 1 kreditzirkus.de, 1 krednal.ru, 1 kredytybezprowizji24.pl, 1 @@ -83521,7 +83644,6 @@ kremenchug-news.ru, 1 kremenchugnews.ru, 1 kremer-sonnenschutzsysteme.de, 1 -kremer.shop, 1 kreno.tech, 1 krenstetter.at, 1 kresimir-blazevic.tk, 1 @@ -83545,6 +83667,7 @@ kriis.ee, 0 krik.rs, 1 kriko.io, 1 +krill-ai.com, 1 krillz.se, 1 krilotek.com, 1 krilov.tk, 1 @@ -83559,7 +83682,6 @@ kringloopwinkels.tk, 1 kripa.tk, 1 kriptodede.com, 1 -kriptokoin.com, 1 kriptopod.com, 1 kriptopodgon.tk, 1 krisboeckmans.tk, 1 @@ -83635,7 +83757,6 @@ krometis.com, 1 kromozottrud.hu, 1 krona.ddns.net, 1 -kronanshopping.se, 1 kronofogden.se, 1 kronosproject.tk, 1 kronospsi.es, 1 @@ -83645,6 +83766,7 @@ kroon.email, 1 kroonlocks.com, 1 kropkait.pl, 1 +kroschke.de, 1 krosno24.com, 1 krosovki-nike.tk, 1 kross1308.de, 1 @@ -83653,6 +83775,7 @@ krouzkyliduska.cz, 0 krovatka.tk, 1 krovlya911.ru, 1 +krowdev.com, 1 krozilla.tk, 1 krrt.io, 1 krs.cloud, 1 @@ -83728,11 +83851,11 @@ krystal-framework.ml, 1 krytykawszystkiego.com, 1 krytykawszystkiego.pl, 1 +kryx.de, 1 krzysiamrozinska.pl, 1 krzysztofzaleski.com, 1 krzyzu.ovh, 1 ks-19.com, 1 -ks-39.com, 1 ks-59.com, 1 ks-79.com, 1 ks-89.com, 1 @@ -83742,7 +83865,6 @@ ks015.com, 0 ks017.com, 1 ks058.com, 1 -ks068.com, 0 ks0886.com, 1 ks16.net, 1 ks17.net, 1 @@ -83819,7 +83941,6 @@ kshop.gr, 1 kshub.gov, 1 ksiegarniabk.pl, 1 -ksiegowosc.pro, 1 ksiga.org, 1 ksk-raduga.tk, 1 ksleg.gov, 1 @@ -83841,6 +83962,7 @@ kst-dlvr.tk, 1 kst-service.tk, 1 kstar.eu, 1 +kstatecollegian.com, 1 kstdlvr.by, 1 ksteamship.com, 1 kstech.tech, 1 @@ -83885,7 +84007,6 @@ kuai-ssl.com, 1 kuaishou.cf, 1 kuaitiyu.org, 1 -kuaiyaojing.com, 1 kualitatem.com, 1 kualo.co.uk, 1 kualo.com, 1 @@ -83899,6 +84020,7 @@ kubalok.de, 1 kubanitoscali.com, 1 kubeofficebooth.com, 1 +kubequest.online, 1 kuberkaitseliit.ee, 1 kuberm.com, 1 kubern.at, 1 @@ -83929,6 +84051,7 @@ kucukcekmececilingir.gen.tr, 1 kucukdunya.com, 1 kucukkaymakli.tk, 1 +kuda.ru, 1 kudelskisecurity.com, 1 kudinilam.tk, 1 kuditel.net, 1 @@ -83977,7 +84100,6 @@ kulinaristi.fi, 1 kulinariya.tk, 1 kulinarnykoneser.pl, 1 -kulshe.com, 1 kultham.ml, 1 kulthist.tk, 1 kultmobil.se, 1 @@ -83988,6 +84110,7 @@ kulturbanause.de, 1 kulturbiljetter.se, 1 kulturistika.tk, 1 +kulturlade.ch, 1 kulturmel.ch, 1 kulturstiftung-st.de, 1 kultus-mv.de, 1 @@ -84055,7 +84178,6 @@ kupid.com, 1 kupinska.pl, 1 kupipled.cf, 1 -kupisafe.com, 1 kupislivki.tk, 1 kupitmtz.gq, 1 kupitraktor.gq, 1 @@ -84130,6 +84252,7 @@ kurtisfranklin.com, 1 kurtki-moda.tk, 1 kurtlarvadisi-pusu-1.tk, 1 +kurtneuweiler.com, 1 kurtosys.com, 1 kurtschleinbeck.com, 1 kurungkurawal.id, 1 @@ -84157,7 +84280,6 @@ kustomcorner.com.au, 1 kustomer.com, 1 kustosija.tk, 1 -kustus.com.br, 1 kustvissen.tk, 1 kusunokitomori.com, 1 kutahyaciniyapitasarim.com.tr, 1 @@ -84169,8 +84291,10 @@ kutinsoft.com, 1 kutny.cz, 1 kutsankaplan.com, 1 +kutten.lu, 1 kuttler.eu, 1 kutvonen.net, 1 +kutyabarathelyek.hu, 1 kutyamacskashop.hu, 1 kutzer-consulting.de, 1 kuudere.moe, 1 @@ -84244,6 +84368,7 @@ kwieben.com, 1 kwikmed.eu, 0 kwikmotion.com, 0 +kwin-city.com, 1 kwjx2.ga, 1 kwl.com.au, 1 kwm.group, 1 @@ -84276,6 +84401,7 @@ kyber.club, 1 kyber.consulting, 1 kyber.network, 1 +kyberguard.de, 1 kyberhub.com, 1 kyberna.xyz, 1 kybi.sk, 1 @@ -84351,7 +84477,6 @@ kyrainvestments.com, 1 kyranis.net, 1 kyrgizion.tk, 1 -kyriakidisship.gr, 1 kyrjy.com, 1 kyrknatet.se, 1 kyrtopoulos.com, 1 @@ -84372,12 +84497,14 @@ kzwr.com, 1 l-3com.com, 1 l-a-b-a.com, 1 +l-a-b-a.pl, 1 l-a-b-a.ru, 1 l-atelier-c.com, 1 l-i-r.tk, 1 l-ink.eu.org, 1 l-lab.org, 1 l-os.com, 1 +l-plate.ie, 1 l-u-c-a.de, 1 l.nf, 1 l.td, 1 @@ -84415,7 +84542,6 @@ l9i.net, 1 la-baldosa.fr, 0 la-bonne-cuisine.fr, 1 -la-boutique-langlois.fr, 1 la-casa.tk, 1 la-dameblanche.fr, 1 la-grande-jaugue.fr, 1 @@ -84429,6 +84555,7 @@ la-tourmaline.ch, 1 la-verite.tk, 1 la-ville-aux-dames-auto-ecole.com, 1 +la.gy, 1 laa.gov.ly, 1 laac.io, 1 laakevahinko.fi, 1 @@ -84516,17 +84643,18 @@ labourparty.nz, 1 labourparty.org.nz, 1 labourpolicies.org.nz, 1 +laboutiquedeluminia.fr, 1 laboutiquemarocaineduconvoyeur.com, 1 laboutiquemarocaineduconvoyeur.ma, 1 labpartnering.org, 1 labradoodle.net, 1 labrat.mobi, 1 +labreadai.com, 1 labroma.tk, 1 labs-is.com, 1 labs.directory, 1 labs.ro, 1 labsbibliotecarios.es, 1 -labscon.io, 1 labsector.com, 1 labsitserviss.lv, 1 labtalleraudiovisual.tk, 1 @@ -84543,6 +84671,7 @@ lacahsa.gov, 1 lacalderera.tk, 1 lacallas.tk, 1 +lacanastasevilla.es, 1 lacantinadoors.com, 1 lacantine.xyz, 1 lacapsule.org, 1 @@ -84554,7 +84683,6 @@ lacasseroy.com, 1 lacavedesergio.fr, 1 lacaveducinquantenaire.com, 1 -lacaverna.net, 1 lacazadora.tk, 1 laceleste.it, 1 lacentral.com, 0 @@ -84582,7 +84710,6 @@ lacnesidlo.sk, 1 lacoast.gov, 1 lacoccinelle.net, 1 -lacochinacounselor.com, 0 lacoe.edu, 1 laconcepcion.tk, 1 laconciergeriedusoleil.fr, 1 @@ -84603,7 +84730,6 @@ lacrossetribune.com, 1 lacrossewi.gov, 1 lacroy.com.br, 1 -lactatiekundigemanouk.nl, 1 lacuartaorden.tk, 1 lacuisine.tk, 1 lacyc3.eu, 1 @@ -84654,6 +84780,7 @@ ladyboyfiles.com, 1 ladyboytube.tv, 1 ladybugjam.com, 1 +ladyescorts.com, 1 ladyestelle.org, 1 ladyisabell666.com, 1 ladykarame.org, 1 @@ -84730,7 +84857,7 @@ lafraia.com.br, 1 lafraise.pro, 1 lafrenchtech.com, 1 -lafsc.co.uk, 1 +lafsc.co.uk, 0 lafuriadelguardiancelta.tk, 1 lag-fan.tk, 1 lag-gbr.gq, 1 @@ -84756,7 +84883,6 @@ lagloriadehuampani.com, 1 lagodny.eu, 1 lagom.org.pl, 1 -lagos-car-hire.com, 1 lagoscooperativecollege.com, 1 lagotto.tk, 1 lagovistatexas.gov, 1 @@ -84809,7 +84935,6 @@ lajme-shqip.gq, 1 lajna-serial.cz, 1 lajnaserial.cz, 1 -lajornadafilipina.com, 1 lajusta.tk, 1 lakabina.tk, 1 lakashirdetes.com, 1 @@ -84822,6 +84947,7 @@ lakeandriverrestoration.com, 1 lakearthurnm.gov, 1 lakecity-obgyn.com, 1 +lakecitybank.com, 1 lakecitydepositionreporter.com, 1 lakeclerkfl.gov, 1 lakecookexteriors.com, 1 @@ -84855,6 +84981,7 @@ lakesiderealty.info, 1 lakesitetn.gov, 1 lakespropertymgt.com, 1 +lakesregionseptic.com, 1 lakestreetministorage.com, 1 lakesviewrobina.com.au, 1 laketanglewoodtx.gov, 1 @@ -84904,6 +85031,7 @@ lalucioledigitale.com, 0 lalumiere.org, 1 lalunedangkor.com, 0 +lama-corp.space, 1 lamac.ae, 1 lamafioso.com, 1 lamai-crochets.fr, 1 @@ -84962,7 +85090,6 @@ lammertbies.com, 1 lammertbies.nl, 1 lamnea.se, 1 -lamocheattitude.fr, 1 lamonasafetynotice.co.uk, 1 lamontre.ru, 1 lamorera.tk, 1 @@ -84981,6 +85108,7 @@ lamsa.tk, 1 lamscommunity.org, 1 lamudi.ga, 1 +lamuebleriavirtual.co, 1 lamuixeranga.tk, 1 lamula.com, 1 lan-der.de, 1 @@ -85009,6 +85137,7 @@ lance.com.br, 1 lance.top, 1 lancea.pl, 1 +lancefourstar.com, 1 lancejames.com, 1 lancelafontaine.com, 1 lancelucido.tk, 1 @@ -85017,6 +85146,7 @@ lancertactical.eu, 1 lanceyip.com, 1 lanchong.tk, 1 +lanconstruct.be, 1 lancyvbc.ch, 0 land.nrw, 0 landart.tk, 1 @@ -85070,6 +85200,7 @@ landscaping-montreal.com, 1 landscaping.ga, 1 landscaping.gq, 1 +landscapingdesignpro.com, 1 landscapingipswich.com, 1 landscapingrepairers.ga, 1 landsearch.com, 1 @@ -85100,7 +85231,6 @@ langenberg.tk, 1 langenburg.de, 1 langenu.tk, 1 -langenwolschendorf.de, 1 langerwehe.de, 1 langgasse-baar.ch, 1 langhun.me, 1 @@ -85134,7 +85264,6 @@ lannatefl.com, 1 lannoy-delattre.net, 1 lanny.ga, 1 -lannywolfetrio.com, 1 lanodan.eu, 1 lanomina.net, 1 lanourotteguiry.fr, 1 @@ -85150,7 +85279,6 @@ lansoftware.eu, 1 lansweeper.com, 1 lanternalauth.com, 1 -lanterndigital.com.cn, 1 lanternhealth.org, 1 lanthorn.com, 1 lantian.pub, 1 @@ -85183,7 +85311,6 @@ lap3.nl, 1 lapageamelkor.org, 1 lapaginadejuanjo.tk, 1 -lapakmaboy.com, 1 lapaksulawesi.tk, 1 lapakus.com, 1 laparcela.tk, 1 @@ -85197,7 +85324,6 @@ lapecshizuoka.com, 1 lapeercountymi.gov, 1 laperfumista.es, 1 -laperla-chemnitz.de, 1 laperlaabaya.com, 1 laperladelduero.tk, 1 laperreraflamenca.tk, 1 @@ -85394,7 +85520,6 @@ laspirale.tk, 1 lasrecetasdeguada.com, 1 lasse-boberg.tk, 1 -lasse-it.dk, 1 lasseaktiv.art, 1 lasseaktiv.com, 1 lasseaktiv.es, 1 @@ -85416,6 +85541,7 @@ lastbooks.gq, 1 lastcast.bg, 1 lastencore.org, 1 +lastenwekker.nl, 1 lastfriends.site, 1 lastingcar.com, 1 lastingmarksers.ga, 1 @@ -85430,7 +85556,7 @@ lastoriadellecose.tk, 1 lastpass.com, 0 lastpetal.ca, 1 -lastpictures.de, 1 +lastpictures.de, 0 lastrada.tk, 1 lastrik.ch, 1 lastsunset.tk, 1 @@ -85452,6 +85578,7 @@ latardeurbana.ml, 1 latardeurbana.tk, 1 latas-dev.lv, 1 +latavernageislautern.de, 1 latchplus.com, 1 late.am, 0 lateams.ml, 1 @@ -85469,12 +85596,13 @@ laten.tk, 1 latenitefilms.com, 0 latentlens.co, 1 +latentlexicon.org, 1 latentview.com, 1 +latentviewanalytics.com, 1 lateral.dog, 1 lateralsecurity.com, 0 laterna.cz, 1 laterremotodealcorcon.tk, 1 -latestbitcoinnews.io, 1 latestcoin.tk, 1 latestimmigrationnews.today, 1 latestmobiles.tk, 1 @@ -85619,6 +85747,7 @@ lavamobiles.com, 1 lavanderia.it, 1 lavanderia.roma.it, 1 +lavaquitacheese.com, 1 lavarex.co.jp, 1 lavasing.eu.org, 1 lavavetri.it, 1 @@ -85737,7 +85866,6 @@ lawyerscreenerers.ga, 1 lawyerscreenerest.ga, 1 lawyersnew.com, 1 -lawyersofmissouri.com, 1 lawzakon.tk, 1 lawzana.com, 1 lawzava.com, 1 @@ -85758,6 +85886,7 @@ layxw.com, 1 lazada.pk, 1 lazarev.agency, 1 +lazarou.gr, 1 lazarusalliance.com, 1 lazell.de, 1 lazell.uk, 1 @@ -85778,7 +85907,6 @@ lazowik.pl, 1 lazownik.pl, 1 lazuardy.tech, 0 -lazudi.com, 1 lazyempire.site, 1 lazyhelp.com, 1 lazyhomer.pl, 1 @@ -85803,6 +85931,7 @@ lbio.nl, 0 lbj.tw, 1 lbjlibrary.gov, 1 +lblaw.co.uk, 1 lblok.pl, 1 lbls.me, 0 lbo.management, 1 @@ -85832,7 +85961,7 @@ lc6656.com, 1 lc6665.com, 1 lc6686.com, 1 -lc7.fun, 1 +lc7.fun, 0 lc8005.com, 1 lc80802.com, 1 lc80805.com, 1 @@ -85896,9 +86025,7 @@ lcti.biz, 1 lcv-psi.com, 1 lcv-psi.com.br, 1 -lcv.cool, 1 lcv.email, 1 -lcv.expert, 1 lcv.lgbt, 1 lcv.net.br, 1 lcv.pro.br, 1 @@ -85920,7 +86047,6 @@ lcx.cc, 1 lcy.cat, 1 lcy.moe, 1 -lda-design.co.uk, 1 ldcraft.pw, 1 lddr.io, 1 ldfebui.org, 1 @@ -85974,8 +86100,8 @@ leadbook.ru, 1 leadbox.cz, 1 leadcalyx.com, 1 +leadcubs.com, 1 leader.co.jp, 1 -leader.net, 1 leaderbg.net, 1 leadercreative.ga, 1 leaderfox.cz, 1 @@ -86048,7 +86174,6 @@ leantinebastiaans.nl, 1 leantis.be, 1 leaodarodesia.com.br, 1 -leapandjump.co.uk, 1 leapday.us, 1 leapevent.tech, 1 leapiqacademy.com, 1 @@ -86293,7 +86418,6 @@ leetcode.net, 1 leetizia.net, 1 leetsuliangkkproduction.tk, 1 -leeuwarden.nl, 1 leevealdc.com, 1 leeyoungaeph.tk, 1 lefaivre-ferry.ca, 1 @@ -86341,7 +86465,6 @@ legal-eye.com, 1 legalagenda.ga, 1 legalanchor.ga, 1 -legalatlanta.com, 1 legalatlantic.ga, 1 legalbeagles.info, 1 legalbeast.ga, 1 @@ -86402,7 +86525,6 @@ legalphase.ga, 1 legalpicker.ga, 1 legalpickup.ga, 1 -legalplace.fr, 1 legalplatinum.ga, 1 legalpremier.ga, 1 legalprestige.ga, 1 @@ -86465,7 +86587,6 @@ legions.tk, 1 legionwood.tk, 1 legiscontabilidade.com.br, 1 -legislationupdateservice.co.uk, 1 legislativedistricts.com, 0 legit.nz, 1 legitcorp.com, 1 @@ -86495,6 +86616,7 @@ leher-gz.de, 1 lehifibernetwork.gov, 1 lehighcountypa.gov, 1 +lehighvalleydairy.com, 1 lehmanns.de, 1 lehmitz-weinstuben.de, 1 lehnc.ddns.net, 1 @@ -86571,6 +86693,7 @@ leleimports.store, 1 leleviagens.com.br, 1 leliekerk.nl, 1 +lelika.se, 1 leliveld.nl, 1 leliveld.org, 1 lellek.at, 1 @@ -86642,7 +86765,7 @@ lendinvest.com, 1 lendme.au, 1 lendme.com.au, 1 -lendme.dk, 1 +lendme.dk, 0 lendme.net.au, 1 lenemes.tk, 1 lenergietoutcompris.fr, 1 @@ -86690,6 +86813,7 @@ lenseshop.tk, 1 lensfiyat.com, 1 lensflair.studio, 1 +lensonline.in, 1 lenstore.co.uk, 1 lensual.space, 0 lenta-ru.tk, 1 @@ -86708,6 +86832,7 @@ leo-deville.fr, 1 leo-music.tk, 1 leo.gov, 1 +leoai.cloud, 1 leoandpeto.com, 1 leob.in, 0 leocollo.com, 1 @@ -86813,6 +86938,7 @@ lerku.com, 1 lerm.nl, 1 lermer.nl, 1 +lermf.org, 1 lernenamsee.ch, 1 lernerspersonalinjury.ca, 0 lernorteuropa.com, 1 @@ -86858,6 +86984,7 @@ lescommunes.com, 1 lescomptoirsdepierrot.com, 1 lesconcours.tk, 1 +lescoquetteriesdenais.fr, 1 lescrapdesfilles.fr, 1 lescrieursduweb.com, 1 lesdelicesdeloris.fr, 1 @@ -86941,10 +87068,8 @@ leticia.com.tw, 1 leticia.ml, 1 letiloulous.fr, 1 -letinsys.cz, 1 letipweb.tk, 1 letitfleet.io, 1 -letitq.com, 1 letmepost.com, 1 letnik.tk, 1 leto12.xyz, 0 @@ -86970,6 +87095,7 @@ letscahoot.net, 1 letscleanlaundry.in, 1 letsclimact.com, 1 +letscom.it, 1 letscrackit.ml, 1 letsdebug.net, 1 letsdevelop.com.br, 1 @@ -87015,7 +87141,6 @@ letturaveloce.tk, 1 letustravel.tk, 1 letvikar.dk, 1 -letweedoo.com, 1 letwithpuffin.co.uk, 1 letwork.be, 1 letwork.de, 1 @@ -87040,7 +87165,7 @@ levanscatering.com, 1 levantage.tk, 1 levaquin750.ga, 1 -levati.name, 0 +levati.name, 1 leveeroadstudio.com, 1 level-assist.com, 1 level-assist.de, 1 @@ -87049,6 +87174,7 @@ level4.parts, 1 level6.me, 1 levelaccordingly.com, 1 +levelfit.ai, 1 levelninehvac.com, 1 leveloneproject.org, 1 levelrankings.com, 1 @@ -87125,6 +87251,7 @@ lexdigital.pl, 1 lexe.club, 1 lexeri.com, 1 +lexgeneris.com, 1 lexgo.be, 1 lexgo.lu, 1 lexico.pt, 1 @@ -87132,7 +87259,6 @@ lexicore.ga, 1 lexifax.ga, 1 lexikon24.tk, 1 -lexilala.org, 1 lexington-credit-repair.com, 1 lexingtonil.gov, 1 lexingtonok.gov, 1 @@ -87144,6 +87270,7 @@ lexita.lt, 1 lexitthemovie.tk, 1 lexjunkie.xyz, 1 +lexlens.io, 1 lexmedia.ro, 1 lexmondcommunications.com, 1 lexopen.dk, 1 @@ -87168,6 +87295,7 @@ lexway.pk, 1 leyaonline.com, 1 leybelsgarden.cf, 1 +leyden.pl, 1 leyendaluzrenacer.com, 1 leyeslaboralesdecolorado.gov, 1 leyfutmex.com, 1 @@ -87185,7 +87313,6 @@ lfcnsv.de, 1 lff.club, 1 lffweb.ga, 1 -lfg.com.ph, 1 lfgss.com, 1 lfi-mv.de, 0 lfmosqueira.com.br, 1 @@ -87199,8 +87326,8 @@ lg.gz.cn, 1 lg0.site, 1 lg2.com, 1 +lgads.tv, 1 lgbt-colleges.com, 1 -lgbt.io, 1 lgbt.ventures, 1 lgbtqcolorado.org, 1 lgbtqtherapyspace.com, 1 @@ -87263,6 +87390,7 @@ liam-is-a-nig.ga, 1 liam-le-may.fr, 1 liam-w.io, 1 +liamatch.se, 1 liambaron.com, 1 liamelliott.me, 1 liamlin.me, 1 @@ -87320,13 +87448,11 @@ liberation2020.com, 1 liberationgroup.com, 1 liberationtek.com, 0 -liberatospizza.com, 1 liberatupotencial.site, 1 liberda.nl, 1 liberdademg.com.br, 1 liberecstehovani.cz, 1 libermoto.fr, 1 -liberr.com, 1 liberta-me.org, 1 libertacao.tk, 1 libertadgreen.tk, 1 @@ -87354,7 +87480,6 @@ libertyland.tk, 1 libertylondon.com, 1 libertymedia.com, 1 -libertyreversemortgage.com, 1 libertyrxpharmacy.com, 1 libertystation.com, 1 libertytereconoce.com, 1 @@ -87397,7 +87522,6 @@ librarytapes.tk, 1 librarytools.com, 1 libravatar.org, 1 -librazy.org, 1 libre-innovation.org, 1 libre.cr, 1 libre.net.au, 1 @@ -87413,7 +87537,6 @@ libreho.st, 1 librelamp.com, 1 libremail.nl, 1 -librematrix.com, 1 librends.org, 1 libreofficefromcollabora.com, 1 libreplanet.org, 1 @@ -87487,13 +87610,13 @@ lidarwindtechnolog.ga, 1 lidaumba.com, 1 lidavidm.me, 1 +lide.cz, 1 lide.eu, 1 lidel.org, 1 lidepla.com, 1 lidernaturascarlettbados.com, 1 liderok.tk, 1 liderzyprawa.pl, 1 -lidhedredovisning.se, 1 lidkoping.se, 1 lidl-gewinnspiel.de, 1 lidl-holidays.com, 1 @@ -87555,9 +87678,8 @@ lifeaz.co, 1 lifeball.org, 1 lifebymargot.co.uk, 1 -lifecare.org, 1 lifecelebrated.org, 1 -lifecheq.co.za, 1 +lifecheq.co.za, 0 lifecism.com, 1 lifecoach.tw, 1 lifecoachroel.nl, 1 @@ -87565,6 +87687,7 @@ lifecoresystems.com, 1 lifecraft.cf, 1 lifecreator.cn, 1 +lifecycle-gmbh.com, 1 lifedrops.com.au, 1 lifegoesonsojustsmile.tk, 1 lifehacker.com, 1 @@ -87602,6 +87725,7 @@ lifeofpromotion.com, 1 lifepathdoc.com, 1 lifepathpsychiatry.com, 1 +lifeproject.org, 1 liferay.com, 1 lifesaverhindi.tk, 1 lifesciencedynamics.com, 1 @@ -87636,6 +87760,7 @@ lifewithdyna.com, 1 lifexpert.tk, 1 lifexue.com, 1 +liffin.com, 1 lift-world.info, 1 lift.hr, 1 liftagacademy.com, 1 @@ -87645,12 +87770,12 @@ liftie.info, 1 liftmind.ai, 1 lig.ink, 0 -liga.am, 1 liga.ng, 1 liga99.tk, 1 ligacontrachetos.tk, 1 ligadegamers.com, 1 ligadosgames.com, 1 +ligalt.ru, 1 ligand-research.com, 1 ligare-fp.com, 1 ligaro.nl, 1 @@ -87665,10 +87790,6 @@ lighthouseglobal.com, 1 lighthouseguild.org, 0 lighthousepointfl.gov, 1 -lightingagoura.com, 1 -lightingcalabasas.com, 1 -lightinghiddenhills.com, 1 -lightingnewburypark.com, 1 lightingpacificpalisades.com, 1 lightman.cz, 1 lightme.us, 1 @@ -87795,7 +87916,6 @@ lilstarry.com, 1 lilth.moe, 1 liltv.media, 1 -lilula-web.jp, 1 liluna.nl, 0 lily-bearing.com, 1 lily-inn.com, 1 @@ -87902,7 +88022,6 @@ lincolncountysheriffok.gov, 1 lincolncountytn.gov, 1 lincolncountywy.gov, 1 -lincolnfinewines.com, 1 lincolnil.gov, 1 lincolnimps.tk, 1 lincolnmoneyman.com, 1 @@ -87915,7 +88034,6 @@ lincolnzoo.org, 1 lind-bohanon.org, 1 lindadetmayer.com, 1 -lindajahn.de, 1 lindakloenreizen.nl, 0 lindalap.fi, 1 lindalush.net, 1 @@ -87978,7 +88096,6 @@ lineto.com, 1 linext.cn, 0 linfamilygc.com, 1 -linge-ma.ro, 1 lingerie-coquine.fr, 1 lingerie.com.br, 1 lingeriebym.nl, 1 @@ -88038,6 +88155,7 @@ linkbooks.ga, 1 linkborn.com, 1 linkcat.tk, 1 +linkcodegenerator.com, 1 linkdesign.tk, 1 linkdolar.tk, 1 linkdr.uk, 1 @@ -88143,7 +88261,7 @@ linpx.com, 0 linqapp.com, 1 linqhost.nl, 1 -linserto.it, 0 +linserto.it, 1 linss.com, 1 linss.com.cn, 1 linss.name, 1 @@ -88285,7 +88403,6 @@ liqwid.finance, 1 lirelesgens.com, 1 liress.gq, 1 -liri.ie, 1 lirico.ca, 1 lirion.de, 1 lirlandais.ch, 0 @@ -88348,6 +88465,7 @@ listapp.uz, 1 listclue.com, 1 listcraft.top, 1 +liste-mtm.de, 1 listekdo.fr, 1 listelist.com, 1 listen.dk, 1 @@ -88403,7 +88521,6 @@ litebooks.gq, 1 litecache.de, 1 litecloud.ml, 1 -litecoinnews.club, 1 litehost24.tk, 1 litemind.com, 0 liteminer.cf, 1 @@ -88461,7 +88578,6 @@ littlecash.com, 1 littlecompton.gov, 1 littlecourtcottages.com, 1 -littlecreekhosting.com, 1 littledev.nl, 0 littleduck.xyz, 1 littlefairy.no, 1 @@ -88503,6 +88619,7 @@ littlesteve.es, 1 littletigerchinese.com, 1 littlewatcher.com, 1 +littlewoodcreations.com, 1 littleyokohamakennel.tk, 1 liturgical.net, 1 liturkey.tk, 1 @@ -88522,7 +88639,6 @@ liuliuya.com.tw, 1 liulo.cf, 1 liups.net, 1 -liuq.org, 1 liuqiao.best, 1 liuqiao.cf, 1 liuqiao.eu.org, 1 @@ -88597,11 +88713,13 @@ livelifewithintent.com, 1 livelifewithstyle.com, 1 livelink.tk, 1 +livelog.dk, 1 livelong.tk, 1 livelonglife.tk, 1 livelovelaughlg.com, 1 liveman.dk, 1 livemomentum.ml, 1 +livemusikband.de, 1 livenewsrussia.tk, 1 liventocoin.com, 1 livenutriwell.com, 1 @@ -88626,10 +88744,12 @@ livesimply.me, 1 liveskype.com, 1 livesportts.ml, 1 +livespot.se, 1 livestep.ai, 1 livestep.one, 1 livestone.tk, 1 livestrana.tk, 1 +livetagus.pt, 1 liveteachers.in, 1 livetec.show, 1 livetilesglobal.com, 1 @@ -88729,6 +88849,7 @@ ljskatt.no, 1 ljubescica.hr, 1 ljungabolet.se, 1 +ljusdalsnaprapatklinik.se, 1 ljusnarsberg.se, 1 ljw.me, 1 lk-hardware.cz, 0 @@ -88740,7 +88861,6 @@ lklyrics.com, 1 lkmt.us, 1 lknw.de, 1 -lkobiz.in, 1 lkp111138.me, 1 lksoft.cz, 1 lkw-faehren-buchen.de, 1 @@ -88796,7 +88916,12 @@ lmrcouncil.gov, 1 lmsal.com, 1 lmsaura.com.br, 1 +lmsvisao.com.br, 1 +lmsvisaocontabilidade.com.br, 1 lmsvisaoimoveis.com.br, 1 +lmsvisaomotos.com.br, 1 +lmsvisaoseguros.com.br, 1 +lmsvisaotecnologia.com.br, 1 lmtls.me, 1 lmtravis.com, 1 lmvsci.gov, 1 @@ -88837,7 +88962,6 @@ loadninja.com, 1 loador.com, 1 loadover.me, 1 -loadui.org, 1 loadwallet.com, 1 loafhead.me, 1 loan-lenders.co.za, 1 @@ -88893,6 +89017,7 @@ localhandyman.work, 1 localhero.biz, 1 localhorst.duckdns.org, 0 +localisedseo.uk, 1 localiza.io, 1 localized.tk, 1 localizejs.com, 1 @@ -88988,7 +89113,6 @@ locksmithforcarshoustontx.com, 1 locksmithgarland-tx.com, 1 locksmithglenvista.co.za, 1 -locksmithgrapevinetx.com, 1 locksmithhillcrest.co.za, 1 locksmithlivoniami.com, 1 locksmithmadisonheights.com, 1 @@ -89047,7 +89171,6 @@ lofimusicradio.com, 1 lofirmo.com, 1 lofisimplify.com.au, 1 -loforo.com, 1 loft.com.br, 1 lofttravel.com, 1 loftyideas.ml, 1 @@ -89076,7 +89199,6 @@ logansfuneralhome.com, 1 logart.tk, 1 logate.com, 1 -logay.com.br, 1 logbook.ch, 1 logcat.info, 0 logdoc.tk, 1 @@ -89087,6 +89209,7 @@ logfile.ch, 1 logfro.de, 1 logfurnitureplace.com, 1 +logic-puzzles.co.uk, 1 logic8.ml, 1 logical-invest.com, 1 logicalis.com, 1 @@ -89151,6 +89274,7 @@ logoenvue.fr, 1 logoesun.com, 1 logofiyati.com, 1 +logoglo.com, 1 logolabben.cf, 1 logolando.tk, 1 logomarket.jp, 1 @@ -89184,7 +89308,6 @@ loheprobado.com, 1 lohkoketju.fi, 1 lohmeyer.cc, 1 -lohnsteuerhilfe-essen.de, 1 lohnsteuerhilfe.net, 1 lohocla.org, 1 lohr.me, 1 @@ -89318,6 +89441,7 @@ lolnews.ga, 1 lolnews.tk, 1 lolo17.com, 1 +lolroms.com, 1 lols.gg, 1 lolware.net, 1 lolyoureallyscannedthisqrcodegeniusthatssketchy.de, 1 @@ -89363,7 +89487,6 @@ londonnorthwesternrailway.co.uk, 1 londonpropertymatch.com, 1 londonschool.mx, 1 -londonseedcentre.co.uk, 1 londonsoccer.tk, 1 londontrivia.gq, 1 londontwpmi.gov, 1 @@ -89384,13 +89507,7 @@ lonewolftech.ga, 1 long-journey.com, 1 long-stories-short.org, 1 -long0311.com, 1 -long0317.com, 1 long0318.com, 1 -long0355.com, 1 -long0398.com, 1 -long0536.com, 1 -long0538.com, 1 long0555.com, 1 long0556.com, 1 long0728.com, 1 @@ -89401,7 +89518,6 @@ long0898.com, 1 long0976.com, 1 long0999.com, 1 -long100.vip, 1 long266.com, 1 long68.net, 0 long688.com, 0 @@ -89444,7 +89560,6 @@ longmontnetworking.com, 1 longmontwaterheaters.com, 1 longpaddock.qld.gov.au, 1 -longportpd.org, 1 longstride.net, 1 longtermcare.gov, 1 longtermrentalsportugal.com, 1 @@ -89488,6 +89603,7 @@ loop.com, 0 loop.us, 1 loopback.kr, 1 +loopclubapp.com, 1 loopcore.de, 1 loopgolf.co, 0 loophq.com, 1 @@ -89495,13 +89611,13 @@ loopingz.com, 1 loopkey.com.br, 0 loopool.tk, 1 -loopseque.com, 1 looseleafsecurity.com, 1 lootboy.com, 1 lootboy.de, 1 lootdog.io, 1 loothole.com, 1 lootlemon.com, 1 +lootrix.live, 1 loots.eu, 1 lootstudios.com, 0 loottitan.com, 1 @@ -89527,6 +89643,7 @@ loquo.com, 1 loqyu.co, 1 lor.kharkov.ua, 1 +lora.bot, 1 loracheadle.com, 1 loraincountyohio.gov, 1 loraincountyrecorder.gov, 1 @@ -89568,6 +89685,7 @@ lorenzocampagna.myqnapcloud.com, 1 lorenzodallaga.com, 1 lorenzodeangelis.tk, 1 +lorenzomassenz.com, 1 lorenzoprinci.com, 1 loreofthenorth.com, 1 loreofthenorth.net, 1 @@ -89651,7 +89769,6 @@ lost-perdidos-hiatus.tk, 1 lost.tf, 1 lostandfound.mu, 1 -lostandfoundmember.com, 1 lostandfoundsoftware.com, 1 lostarkstats.com, 1 lostarq.com, 1 @@ -89707,13 +89824,13 @@ lotoperu.com, 1 lotos-ag.ch, 1 lotrarts.com, 1 -lotro-wiki.com, 1 lotrsketch.com, 1 lotsynergy.com, 1 lottcarey.org, 1 lotteo.com, 1 lotterycodex.com, 1 lotteryking.net, 1 +lottie.rs, 1 lotto.com, 1 lotto.gt, 1 lotto.ht, 1 @@ -89775,7 +89892,6 @@ louisvilleohio.gov, 1 louiza.tk, 1 loujaxx.net, 1 -loukas-stoltz.fr, 1 loukkos.ma, 1 loune.net, 1 loungeballin.org, 1 @@ -89966,6 +90082,7 @@ lptami.gov, 1 lpva.com.au, 1 lqa.org.uk, 1 +lqaa.co.uk, 1 lqd.plus, 1 lqd.pp.ua, 1 lqhi.cn, 1 @@ -89976,7 +90093,6 @@ lra-cloud.de, 1 lra.mt, 1 lrbm.com, 1 -lrc.cn, 1 lrcr.ch, 0 lriese.ch, 1 lrn.com, 1 @@ -90207,6 +90323,7 @@ ludum.pl, 1 ludunwayoo.com, 1 ludwig.im, 1 +ludwiggrill.de, 1 ludwigjohnson.se, 1 ludwigpro.net, 1 luedeke-bremen.eu, 1 @@ -90234,7 +90351,6 @@ luhkultour.de, 1 lui.vn, 1 luigipinedo.com, 1 -luinonotizie.it, 1 luis-portfolio.es, 1 luisa-birkner.de, 1 luisafernandapenuela.com, 1 @@ -90244,6 +90360,7 @@ luisfreire.ml, 1 luisillo.tk, 1 luisjosesaldana.com, 1 +luismandiola.com, 1 luismiguelcolombia.tk, 1 luisnavarrosl.tk, 1 luisnet.tk, 1 @@ -90324,7 +90441,6 @@ luluwoldtravel.com, 1 lumaesthetic.co.uk, 1 lumafestival.com, 1 -lumaistore.com.br, 1 lumalux.it, 1 lumapartners.com, 1 lumapr.com, 1 @@ -90351,6 +90467,7 @@ lumineled.se, 1 lumingze.eu.org, 0 luminia-informatique.fr, 1 +lumintia.fr, 1 lumitop.com, 1 lumixtar.com, 1 lummi-nsn.gov, 1 @@ -90373,6 +90490,8 @@ lunaazulestudio.com, 1 lunaburner.ml, 1 lunaclan.tk, 1 +lunaclo.eu, 1 +lunaclo.nl, 1 lunacraft.ga, 1 lunadea.tk, 1 lunagrill.com, 1 @@ -90470,7 +90589,6 @@ lupusla.org, 1 luqmanacademy.com, 1 luripump.se, 1 -lurishop.com.br, 1 lurkmirror.ml, 1 lusakatimes.com, 1 lusc.ch, 1 @@ -90536,7 +90654,6 @@ luxegram.co, 1 luxehomecompany.com, 1 luxehotels.com, 1 -luxekranen.nl, 1 luxelyhome.com, 1 luxemburgsite.tk, 1 luxereside.com, 1 @@ -90602,7 +90719,6 @@ lv.lk, 1 lv.search.yahoo.com, 0 lv0.it, 0 -lv5.top, 1 lvcservicesplus.com.au, 0 lvcshu.com, 1 lvdgroup-innov8.com, 1 @@ -90697,6 +90813,7 @@ lynwoodca.gov, 1 lynx-webservice.com, 0 lynx.com.au, 1 +lynx.swiss, 1 lynxriskmanager.com, 1 lyodiet.it, 1 lyon-explorateurs.fr, 1 @@ -90752,6 +90869,7 @@ lzzr.me, 1 m-16.ml, 1 m-22.com, 1 +m-a-m.photo, 1 m-ast.de, 1 m-bank.mn, 1 m-beshr.tk, 1 @@ -90818,6 +90936,7 @@ m42-gmbh.de, 1 m426.ch, 1 m4g.ru, 1 +m4ma.com, 1 m4rcus.de, 1 m4rkos.de, 1 m5197.co, 1 @@ -90863,6 +90982,7 @@ maarivpn.com, 1 maarja.edu.ee, 1 maartenderaedemaeker.be, 1 +maasdonk.nl, 1 maaspoortsportsenevents.nl, 1 maasstaddinerexpres.nl, 1 maat.pt, 1 @@ -90877,6 +90997,7 @@ maba.tk, 1 mabankonline.com, 1 mabasketdesecurite.fr, 1 +mabeaufort.com, 1 mabelmartinez.es, 1 mabex-cybercore.de, 1 mabexcybercore.de, 1 @@ -90885,6 +91006,7 @@ mabnn.org, 1 mabnn.ru, 1 mabnn.spb.ru, 1 +mabookhay.com, 1 mabra.com, 1 mabrav.ro, 1 mabusalah.tk, 1 @@ -90950,7 +91072,6 @@ macil.tech, 1 macinyasha.net, 1 macioszektv.eu, 1 -mack.im, 1 mack.space, 1 mackanz.tk, 1 mackenziedatastream.ca, 1 @@ -90978,6 +91099,7 @@ maconnerie-dcs.ch, 1 maconqc.com, 0 macontec.com, 1 +macosdb.com, 1 macosx86.ml, 1 macoupincountypdil.gov, 1 macoupinvotes.gov, 1 @@ -91005,9 +91127,7 @@ macsonuclari.com.tr, 1 macsonuclari.mobi, 1 macssupersonicwash.com, 1 -macstore-shop.fr, 1 macvcure.com, 1 -macvidcards.eu, 1 mad-eye.com, 0 mad.es, 1 mad4marketing.com, 1 @@ -91097,7 +91217,6 @@ madmaxstore.it, 1 madmbrasil.com.br, 1 madmoizelle.com, 1 -madnetwork.org, 1 madobe.tk, 1 madokami.net, 1 madokami.pw, 1 @@ -91217,7 +91336,6 @@ magazinedabeleza.net, 1 magazinedotreino.com.br, 1 magazinefeminina.com.br, 1 -magazinhaberajansi.com, 1 magazinhaberi.tk, 1 magazone.cf, 1 magazone.gq, 1 @@ -91249,7 +91367,7 @@ mager.org, 1 magesaigon.com, 1 magescobd.com, 1 -magesy.blog, 0 +magesy.blog, 1 magesypro.com, 1 magewell.nl, 1 maggianos.com, 1 @@ -91277,6 +91395,7 @@ magicball.ga, 1 magicbar.tk, 1 magicbeanschool.com, 1 +magicbox-cleaning.co.uk, 1 magicboxint.com, 1 magicbroccoli.de, 0 magiccardbuyer.eu, 1 @@ -91300,6 +91419,7 @@ magicpet.com, 1 magicpill.com.au, 1 magicpin.in, 1 +magicport.ai, 1 magicsms.pl, 1 magicspaceninjapirates.de, 1 magictable.com, 1 @@ -91352,6 +91472,7 @@ magnetvpn.com, 1 magniezetassocies.fr, 1 magnific.tk, 1 +magnifiscent.com, 1 magniflood.com, 1 magnisgroup.eu, 1 magnit-akciya.tk, 1 @@ -91364,12 +91485,12 @@ magnoliaglobal.com, 1 magnoliaicecream.com.sg, 1 magnoliaicecreamth.com, 1 +magnoliamilk.com.sg, 1 magnoliawi.gov, 1 magnoric.com, 1 magnosautos.ng, 1 magnumsol.ru, 1 magnunbaterias.com.br, 1 -magnusdemant.ch, 1 magnusfulton.com, 1 magnusj.net, 1 magnuspro.cz, 1 @@ -91436,7 +91557,6 @@ mahorka.tk, 1 mahou-sanmiguel.com, 1 mahtabichat.ml, 1 -mahurivaishya.co.in, 1 mahurivaishya.com, 1 mai.ru, 1 maiaimobiliare.ro, 1 @@ -91485,7 +91605,6 @@ mail4you.in, 1 mailbase.cf, 1 mailbot.sh, 1 -mailbox.mg, 1 mailbox.org, 1 mailboy.ml, 1 mailboy.tk, 1 @@ -91573,9 +91692,8 @@ mainstreetauto.com, 1 maintainyourwebsite.help, 1 maintenance-traceur-hp.fr, 1 -maintenancebtp.com, 1 mainzbiomed.com, 1 -mainzelmaennchen.net, 1 +mainzelmaennchen.net, 0 mainzer-allerlei.de, 1 maioresemelhores.com, 1 mair.best, 1 @@ -91605,6 +91723,7 @@ maison-coutin.com, 1 maison-du-mineur.com, 1 maison-eureka.fr, 1 +maison2com-event.fr, 1 maisondelafigue.com, 1 maisondepax.com, 1 maisondidon.com, 1 @@ -91615,6 +91734,7 @@ maisonstpaul.fr, 1 maisonwow.fr, 1 maisproduzida.com.br, 1 +maisterwerk.ai, 1 maitemerino.net, 1 maitheme.com, 1 maiti.info, 1 @@ -91631,7 +91751,6 @@ majahesjedal.no, 1 majahoidja.ee, 1 majalahka.com, 1 -majalahponsel.org, 1 majalmirasol.com, 1 majameer.com, 1 majavucic.com, 1 @@ -91675,7 +91794,6 @@ makeacrowd.eu, 1 makeagif.com, 1 makeaoffice.nl, 1 -makecar.com.ua, 1 makechanges.com.au, 1 makecheez.com, 1 makecity.cz, 1 @@ -91690,7 +91808,9 @@ makeitsimple.pt, 1 makejustice.work, 1 makejusticework.org.uk, 1 +makeleap.io, 1 makelindazi.com, 1 +makellos-kosmetik.de, 1 makelpunt.nl, 1 makemejob.com, 1 makemillion.tk, 1 @@ -91715,7 +91835,6 @@ makertown.jp, 1 makesenseofdata.co.uk, 1 maketheconnection.net, 1 -maketodiet.com, 1 makeupevelinua.cf, 1 makeupevelinua.ga, 1 makeupillusion.com, 1 @@ -91769,7 +91888,6 @@ malachiteauth.com, 1 maladie-autoimmune.fr, 1 malafidezoeker.nl, 1 -malagabaterias.com, 1 malagarental.com, 1 malahov.tk, 1 malakye.com, 1 @@ -91876,6 +91994,7 @@ mallgastronomico.com.ar, 1 mallhabana.com, 1 mallonline.com.br, 1 +mallorca-csc.com, 1 mallorca.tk, 1 mallorca2024.com, 1 mallpass.ga, 1 @@ -91891,6 +92010,7 @@ malsignature.com, 1 malta-firma.com, 1 maltarugs.com, 1 +maltasgarage.com, 1 maltasite.tk, 1 maltaultrastifo.tk, 1 malte.gg, 1 @@ -91925,7 +92045,6 @@ mamasday.org, 1 mamasguiderecipes.com, 1 mamasorganizedchaos.com, 1 -mamastyle.store, 0 mamaxi.org, 1 mamaznaet.ml, 1 mamazzoop.com, 1 @@ -91944,6 +92063,7 @@ mammaklader.tk, 1 mammal-taxonomy.tk, 1 mammals.net, 1 +mammam.vn, 1 mammooc.org, 1 mammothimaging.com, 1 mammothlakesmls.net, 1 @@ -91969,7 +92089,6 @@ manaenergija.lv, 1 manage.cm, 1 manage.com, 0 -managed-it.africa, 1 managed-it.co.za, 1 managed-service-provider.co.uk, 1 managededv.ch, 1 @@ -92086,7 +92205,6 @@ maniacoland.com, 1 maniadicane.com.br, 0 maniainc.com, 1 -maniaiti.nz, 1 manial4d2.ml, 1 maniazul.tk, 1 manicbouncycastles.co.uk, 1 @@ -92105,7 +92223,6 @@ manimatter.ch, 1 maniorpedi.com, 1 maniosglass.gr, 1 -manipil.ch, 0 manisahaberleri.tk, 1 manitasavila.com, 1 manitbd.com, 0 @@ -92120,13 +92237,11 @@ manitoulinglobalforwarding.com, 1 manitoulinglobalforwarding.mx, 1 manitoulingolf.com, 1 -manitoulingroup.com, 1 manitoulinheavyhaul.ca, 1 manitoulinheavyhaul.com, 1 manitoulinlogistics.ca, 1 manitoulintransport.ca, 1 manitoulintransport.co, 1 -manitoulintransport.com, 1 manitoulintransport.info, 1 manitoulintransport.net, 1 manitoulinusedequipment.ca, 1 @@ -92137,7 +92252,6 @@ manitowocwi.gov, 1 manja-und-martin.de, 1 manjalcouture.com, 1 -manju.org.uk, 1 mankato-mn.gov, 1 mankatomn.gov, 1 mankier.com, 1 @@ -92155,6 +92269,7 @@ manningtreetilesandflooring.co.uk, 1 mannnen.nl, 1 mannservrice.cf, 1 +manny.lk, 1 mano.tours, 1 manoa.ar, 1 manobankas.lt, 1 @@ -92170,10 +92285,10 @@ manorhousecapital.com, 1 manoro.de, 1 manortx.gov, 1 -manova.cz, 1 manowarus.com, 1 manporn.xxx, 1 manpro.systems, 1 +manprojects.co.uk, 1 mansage.com, 1 mansarda-life.net, 1 mansdell.net, 1 @@ -92198,7 +92313,6 @@ mantenimientodeinstalacioneselectricas.es, 1 mantenimientoimpresoras.com, 1 mantenimientosenjardineriaypiscinasveracruz.com, 1 -mantenimientoweb.io, 1 mantex.ml, 1 manti.by, 1 manticore-projects.com, 1 @@ -92303,7 +92417,7 @@ mapchange.org, 1 mapduce.com, 1 mapdump.com, 1 -mapgear.nl, 1 +mapgear.nl, 0 mapillary.com, 1 maplebgm.cc, 1 maplegrove.cf, 1 @@ -92335,9 +92449,7 @@ maqcampo.com.br, 1 maqnelson.com.br, 1 maqnelsonagricola.com.br, 1 -maqnelsondrones.com.br, 1 maqnelsonempreendimentos.com.br, 1 -maqnelsonirrigacao.com.br, 1 maqnelsonseguros.com.br, 1 maqs.tk, 1 maquena.org, 1 @@ -92445,7 +92557,6 @@ marco-hegenberg.net, 1 marco-reitmeier.de, 1 marco-s.net, 1 -marco-stankowitz.de, 1 marco-ziesing.de, 1 marcoaurelio.tk, 1 marcocerulliconsulting.com, 1 @@ -92681,6 +92792,7 @@ markant-online.de, 1 markantalyamasajsalonu-bayanmasoz-cim.cf, 1 markaps.com, 1 +markayorumlari.com, 1 markco.fi, 1 markdain.net, 1 markdixon.name, 1 @@ -92691,7 +92803,6 @@ markenzapatent.com, 1 markermatic.com, 1 market-garden.tk, 1 -market-money.ru, 1 market.android.com, 1 market.us, 1 marketbar.ie, 1 @@ -92708,6 +92819,7 @@ marketing-2.de, 1 marketing-advertising.eu, 1 marketing-boerse.de, 1 +marketing-extender.com, 1 marketing1-0-1.com, 1 marketing4trends.com, 1 marketinganalytics.africa, 1 @@ -92738,11 +92850,9 @@ marketone.com, 1 marketplace.tf, 1 marketplacetue.nl, 1 -marketresearch.biz, 1 marketsearch.ga, 1 marketsnerd.com, 1 marketsosyali.tk, 1 -markettailor.io, 0 marketvalue.gq, 1 marketvolume.com, 1 marketyourcup.com, 1 @@ -92779,6 +92889,7 @@ markoheijnen.com, 1 markopool.ru, 1 markov.com.ru, 1 +markov.money, 1 markovonline.ru, 1 markovowest.bg, 1 markpostmanrenovations.ca, 1 @@ -92806,7 +92917,6 @@ marktguru.at, 1 marktguru.de, 1 markthisforme.com, 1 -marktindex.ch, 1 markturner.net, 1 markup-ua.com, 1 markus-blog.de, 1 @@ -92876,7 +92986,6 @@ marpa-wohnen.de, 1 marqlet.com, 1 marqperso.ch, 1 -marquardtgames.com, 1 marquee.tv, 1 marquepersonnelle.ch, 1 marqueswines.co.uk, 1 @@ -92885,6 +92994,7 @@ marquisepools.com, 1 marrakechairporttransfer.com, 1 marrakechauxiliaire.com, 1 +marrakechtourexpert.com, 1 marredesefairebaladersurlenet.com, 1 marretada.org, 1 marriage-shrine.jp, 1 @@ -92937,7 +93047,6 @@ martacooks.com, 1 martagoraca.pl, 1 martcms.com, 1 -martdev.com, 1 martelange.ovh, 1 martelliyaqub.co.nz, 1 martellosecurity.com, 1 @@ -92975,7 +93084,6 @@ martinboerhof.nl, 1 martinbrandt.de, 1 martinbrower.us, 1 -martinbuildingservices.co.uk, 1 martinbykov.eu, 1 martincernac.cz, 1 martincornelissen.tk, 1 @@ -93027,6 +93135,7 @@ martinvillalba.net, 1 martinvillalba.org, 1 martinvotes.gov, 1 +martnlab.com, 1 martonvaro.com, 1 martonveronika.tk, 1 martosaranda.com, 1 @@ -93047,10 +93156,12 @@ marvelcargiveaways.co.uk, 1 marveld.nl, 1 marvellbenefits.cloudaccess.host, 1 +marvelmilk.com, 1 marvelmoviemarathon.com, 1 marvelo.cf, 1 marvelouspainting.com, 1 marvelweed.ru, 1 +marvilastudios.com, 1 marvin-elsen.com, 1 marvin.com, 0 marvin.is, 1 @@ -93114,11 +93225,11 @@ masaki1684.net, 1 masakigarden.com, 1 masalaband.tk, 1 -masaloku.com.tr, 1 masanke-travel.com, 1 masanteadelavenir.fr, 1 masanunciosimpresos.com, 1 masarik.sh, 1 +masaz-aromaspa.pl, 1 masaze-hanka.cz, 1 masazomiestas.lt, 1 mascarablond.tk, 1 @@ -93133,7 +93244,6 @@ masdr.sa, 1 masduta.co, 1 masdzub.com, 1 -masefieldvets.co.uk, 1 maservant.com, 1 maservant.net, 1 masfloss.net, 1 @@ -93157,6 +93267,7 @@ masiniunelte.store.ro, 1 masinky.tk, 1 masiorama.it, 1 +masjidalbayyinah.org, 1 masjidalnoorwairarapa.co.nz, 1 mask-skin.tk, 1 maskamuse.com, 1 @@ -93173,6 +93284,7 @@ maslow.tk, 1 masmusica.tk, 1 masmusicaradio.tk, 1 +masno3.com, 1 maso-corto.com, 1 masob.site, 1 masoftware.ddns.net, 1 @@ -93219,7 +93331,7 @@ massarbsettlement.com, 1 massauditor.gov, 1 massazh.cf, 1 -massbank.eu, 1 +massbank.eu, 0 massconsultores.com, 1 masse.org, 1 masshelpline.com, 1 @@ -93298,6 +93410,8 @@ mastersofscale.com, 1 mastersplace.tk, 1 masterstation.net, 1 +mastersteps.com, 1 +mastersthesiswriting.com, 1 masterstouch.co.za, 1 masterstruckingacademy.com, 1 mastertent.com, 1 @@ -93310,7 +93424,7 @@ mastips.cl, 1 mastodon-poradnik.pl, 1 mastodon.au, 1 -mastodon.blue, 0 +mastodon.blue, 1 mastodon.com.pl, 1 mastodon.cr, 1 mastodon.ee, 1 @@ -93320,6 +93434,7 @@ mastodon.uno, 1 mastodont.tk, 1 mastpartners.com, 1 +masturflix.com, 1 masuclub.jp, 1 masuclub.net, 1 masumitsu.jp, 1 @@ -93355,7 +93470,6 @@ matchmove.com, 0 matchmycourse.com, 1 matchory.com, 1 -matchpointusa.com, 1 matconnolley.com, 1 mate.academy, 1 mate.software, 1 @@ -93417,7 +93531,6 @@ matheo-schefczyk.de, 1 mathers.ovh, 1 mathes.berlin, 1 -mathesongas.com, 0 mathesonsteplock.ca, 1 matheusmacedo.ddns.net, 1 mathewlane.com, 1 @@ -93499,7 +93612,6 @@ matrixeditora.com.br, 1 matrixengineered.com, 1 matrixfm.tk, 1 -matrixhealthcare.ca, 1 matrixinternet.ie, 1 matrixmedia.ro, 1 matrixmold.com, 1 @@ -93550,7 +93662,6 @@ mattersource.com, 1 mattessons.co.uk, 1 mattferderer.com, 1 -mattfin.ch, 1 mattg.ca, 1 mattga.ca, 1 mattgemmell.com, 1 @@ -93642,7 +93753,6 @@ matts.systems, 1 matts.world, 1 mattshi.com, 1 -mattslack.me, 1 mattsmissionblog.com, 1 mattstanbrell.com, 1 mattsvensson.com, 1 @@ -93703,7 +93813,6 @@ mauriciosilva.tk, 1 mauriciotoussaint.tk, 1 mauriciotoussaintarte.tk, 1 -maurinet.com, 1 mauritius-luxuryestate.com, 1 mauritsverelst.com, 1 mauriziofaldi.com, 1 @@ -93771,6 +93880,7 @@ maxb.fm, 1 maxbeton.fr, 1 maxbike.tk, 1 +maxboehme.net, 1 maxboobs.com, 1 maxbruckner.de, 1 maxbruckner.org, 1 @@ -93862,6 +93972,7 @@ maxrickettsuy.com, 1 maxrider.tk, 1 maxroganov.tk, 1 +maxs.com, 1 maxschleiffer.com, 1 maxthoene.de, 1 maxtire.com, 1 @@ -93939,6 +94050,7 @@ maze.com.br, 1 maze.fr, 0 mazepa.ml, 1 +mazer.world, 1 mazet-machines-a-coudre.fr, 1 mazhab.tk, 1 mazik.tk, 1 @@ -94046,7 +94158,7 @@ mccn.pp.ua, 1 mccom.at, 1 mccommando.tk, 1 -mcconciergerie.com, 1 +mcconciergerie.com, 0 mcconecountymt.gov, 1 mccordscvs.com, 1 mccreadylaw.com, 1 @@ -94303,6 +94415,7 @@ meacsports.com, 1 meadowfen.farm, 1 meadowfenfarm.com, 1 +meadowgolddairy.com, 1 meadowmere.com, 1 meadowviewfarms.org, 1 meadvillems.gov, 1 @@ -94399,7 +94512,6 @@ mec0758.com, 1 mec0763.com, 1 mec0772.com, 1 -mec0773.com, 0 mec0774.com, 1 mec0776.com, 1 mec0778.com, 1 @@ -94500,12 +94612,14 @@ mectilde.info, 1 mecu.com, 1 med-colleges.com, 1 +med-fine.com, 1 med-flex.com, 1 med-line.cf, 1 med-metrix.com, 0 med-nagoya-neurosurgery.jp, 1 med-spravca.ml, 1 med.aid.pl, 1 +med.de, 1 meda.bg, 1 medaboutme.ru, 1 medadacademy.com, 1 @@ -94538,7 +94652,7 @@ medec.ec, 1 medecinesalternatives-developpementspirituelcreatif.com, 1 medeem.gov.ae, 1 -medefield.com, 1 +medefield.com, 0 medeinos.lt, 0 medelement.com, 1 medellinencanciones.tk, 1 @@ -94546,6 +94660,7 @@ medfind.link, 1 medfordoregon.gov, 1 medfordwi.gov, 1 +medgenome.com, 1 medgetech.com, 1 medguide-bg.com, 1 medgyd.lt, 0 @@ -94631,6 +94746,7 @@ mediastroke.com, 1 mediataput.ga, 1 mediathekview.de, 0 +mediation-mv.de, 1 mediationculturelleclp.ch, 0 mediationwithmeg.com, 1 mediatrust.org, 1 @@ -94702,14 +94818,13 @@ medicm.jp, 1 medicompany.tk, 1 medictools.de, 1 -medicus.ai, 1 +medicus.ai, 0 medidata.co.nz, 1 medidordehumedad.online, 1 mediengestalter-website.de, 1 medienhelden.de, 1 medienkern.de, 1 medienweite.de, 1 -medievalexpert.com, 1 medifit.si, 1 medifoto.tk, 1 medify.id, 1 @@ -94723,9 +94838,9 @@ medinacountyohio.gov, 1 medinaelst.nl, 1 medinc.tk, 1 +mediniti.com, 0 medino.com, 1 medinorte.es, 1 -medipaw.com, 0 mediro-ict.co.za, 1 medirota.com, 1 medisca.com, 1 @@ -94833,7 +94948,7 @@ meerdialog.de, 1 meereskunst.de, 1 meerman.nl, 0 -meerpadel.nl, 1 +meerpadel.nl, 0 meesteresmisty.nl, 1 meestgesteldevragen.com, 1 meet, 1 @@ -94847,6 +94962,8 @@ meetfriends.tk, 1 meetgeek.ai, 0 meeting-server.ml, 1 +meetingsurvivors.org, 1 +meetingvotes.com, 1 meetjeslandsetriathlon.tk, 1 meetmaps.com, 1 meetmarlo.com, 1 @@ -94896,7 +95013,6 @@ megagifs.de, 1 megaherz.tk, 1 megahobby.jp, 1 -megahost.xyz, 1 megahostingbr.tk, 1 megahouse.co.jp, 1 megahouseinvest.ru, 1 @@ -95194,7 +95310,6 @@ melinacurves.com, 1 melinamay.net, 1 melini.hu, 1 -melini.rs, 1 melino.com.ua, 1 meliowebweer.nl, 1 melisica.tk, 1 @@ -95246,7 +95361,6 @@ melsungenonline.com, 1 meltdownresearch.com, 1 melted.me, 1 -meltina-hotel.com, 1 melusine.eu, 1 melvillecity.com.au, 1 melvinsfrance.tk, 1 @@ -95274,6 +95388,7 @@ memememememememe.me, 1 memento-mori.cf, 1 memepool.space, 1 +memerushradar.xyz, 1 memes.nz, 1 memetrash.co.uk, 1 memetria.com, 1 @@ -95327,6 +95442,7 @@ menden.com, 1 mendipbouncycastles.co.uk, 1 mendix-apps.com, 1 +mendmemassage.com, 1 mendmybackprogram.com, 0 mendocinocounty.gov, 1 mendonvt.gov, 1 @@ -95404,7 +95520,6 @@ mentalhealthtimes.tk, 1 mentaliya.online, 1 mentalizes.tk, 1 -mentalpage.com, 1 mentalproblems.tk, 1 mentecuriosa.net, 1 menteofficial.com, 1 @@ -95416,10 +95531,12 @@ mentimeter.com, 1 mentionlink.com, 1 mentiq.az, 1 +mentisapp.com.br, 1 mentolo.tk, 1 mentonein.gov, 1 mentor-fit.com, 1 mentor.gov, 1 +mentorcliq.com, 1 mentoringauchan.es, 1 mentorsinchief.com, 1 mentorzografos.gr, 1 @@ -95512,9 +95629,9 @@ mercadopago.com.uy, 1 mercadopago.com.ve, 1 mercadoshops.com, 1 -mercadoshops.com.ar, 1 mercadoshops.com.ve, 1 mercanix.co.uk, 1 +mercanpos.com, 1 mercans.co, 1 mercans.com, 1 mercatino-olomouc.cz, 1 @@ -95522,8 +95639,8 @@ mercatoday.com, 1 mercatoitticosbt.it, 1 mercatotime.com, 1 +mercatus.ro, 1 mercazaragoza.es, 1 -mercdev.com, 1 merceariacentral.com, 1 mercedelectionsca.gov, 1 mercedes-anciennes.fr, 1 @@ -95540,7 +95657,6 @@ merchant-portal.co.kr, 1 merchantaccountsolutions.com, 1 merchstudio.ru, 1 -merck-animal-health.ca, 1 merco.com.au, 1 mercode.eu.org, 1 mercosuleditora.com.br, 1 @@ -95553,6 +95669,7 @@ mercurycards.com, 1 mercuryfinancial.com, 1 mercuryproject.ch, 0 +mercurysecurities.com.my, 1 mercurysquad.tk, 1 mercyseverity.tk, 1 meredithnh.gov, 1 @@ -95607,8 +95724,10 @@ merpay.com, 1 merrettsurvey.com, 1 merrickcountyne.gov, 1 +merricot.co.uk, 1 merrillanwi.gov, 1 merrimacwi.gov, 1 +merry-christmas.co.in, 1 merrychristmas.ml, 1 merryxmas2015.tk, 1 merson.tv, 1 @@ -95666,7 +95785,6 @@ mesotheliomalawfirm-worldwide.tk, 1 mespt.org, 1 mesquitegcd.gov, 1 -mesquitelandscapeservices.com, 1 message-tool.com, 1 messageclient.gq, 1 messagely.com, 1 @@ -95854,10 +95972,8 @@ meticae.com, 1 metiers.ma, 1 metin2.community, 1 -metisengineering.com, 1 metitlesearch.com, 1 metiz.site, 1 -metizsoft.com, 1 metkos.pl, 1 metkov.com.ua, 1 metkovic-news.com, 1 @@ -95868,7 +95984,7 @@ metoperashop.org, 1 metprint.hu, 1 metrahometheater.com, 1 -metreurjob.com, 1 +metriclan.com, 1 metricmutt.com, 1 metrika.ml, 1 metriks.ru, 1 @@ -95937,11 +96053,11 @@ metver.tk, 1 metyweb.ga, 0 metzlerweb.org, 1 +meu-amor.com, 1 meu.re, 0 meubairro360.com.br, 1 meubanco7.com.br, 1 meubebepa.com.br, 1 -meublesrosa.be, 1 meuemby.com, 1 meugamer.com, 1 meugibi.com, 1 @@ -95993,6 +96109,7 @@ meyner.com, 1 meyrawinkel.nl, 0 meys.io, 1 +meyster-vertrieb.de, 1 mezcal.amsterdam, 1 mezedokamomata.tk, 1 meziblog.cz, 1 @@ -96004,6 +96121,7 @@ mezzehuis.be, 1 mf-fischer.de, 1 mf.me, 1 +mfa-in-berlin.de, 1 mfa-inc.com, 1 mfactory.ca, 1 mfamonitor.com, 1 @@ -96025,6 +96143,7 @@ mfldirect.co.uk, 1 mflodin.se, 1 mfmarquesantos.pt, 1 +mfmd.pt, 1 mfoda-eg.com, 1 mforum.com.au, 1 mfrepair.com, 1 @@ -96048,7 +96167,7 @@ mgfgroup.com, 1 mgfgroup.mx, 1 mgfgroup.us, 1 -mgfpatrimoine.com, 1 +mggs.org, 1 mghiorzi.com.ar, 0 mgi.gov, 1 mgi.sh, 1 @@ -96072,6 +96191,7 @@ mgrcred.online, 1 mgriff.id.au, 1 mgroupweb.com, 1 +mgs406.com, 1 mgsdb.com, 1 mgsisk.com, 1 mgtbaas.eu, 1 @@ -96087,7 +96207,7 @@ mhastey.com, 1 mhatlaw.com, 1 mhc.ab.ca, 1 -mhcdesignstudio.com, 1 +mhcdesignstudio.com, 0 mhdit.de, 1 mhealthspot.com, 1 mheistermann.de, 1 @@ -96104,7 +96224,6 @@ mhiler.com, 1 mhilger.de, 1 mhjuma.com, 1 -mhmarket.fr, 1 mhmchauffeurs.co.uk, 1 mhmfoundationrepair.com, 1 mhonline.fr, 1 @@ -96129,6 +96248,7 @@ mi-beratung.de, 1 mi-magia.com, 1 mi-ras.ru, 1 +mi-soul.com, 1 mi.ras.ru, 1 mi1k.cn, 1 mia-manager.dk, 1 @@ -96251,6 +96371,7 @@ michaelloveys.com, 1 michaeln.net, 1 michaelolson.blog, 1 +michaelolson.io, 1 michaelpelletterie.it, 1 michaelpfrommer.de, 1 michaelpfrommer.pub, 1 @@ -96351,7 +96472,6 @@ micra.org.uk, 1 micraftspirits.com, 1 micralite.com, 1 -micrm.vn, 1 micro-credit.tk, 1 microbiologist.tk, 1 microbiologyinfo.com, 1 @@ -96363,7 +96483,6 @@ microcert.cn, 1 microcomploja.com.br, 1 microcosm.com, 1 -microdesic.com, 1 microdesk.com, 1 microdon.org, 1 microdot.fr, 1 @@ -96512,7 +96631,7 @@ migherworld.com, 1 mighit.ml, 1 mightyfive.tk, 1 -mightygadget.com, 1 +mightygadget.com, 0 mightyoakmarketing.ca, 1 mightytext-ios.tk, 1 mightytips.biz, 0 @@ -96546,7 +96665,6 @@ miguelpallardo.tk, 1 miguelquijano.com.co, 1 miguelstreeservices.com, 1 -miguia.tv, 1 mihaelacozma.ro, 0 mihaijoe.fr, 1 mihaiordean.com, 1 @@ -96563,7 +96681,6 @@ mihsislander.org, 1 mihu233.com.cn, 1 miih-kiosk.com, 1 -miikun95.net, 1 miimhort.com, 1 miisy.com, 1 miisy.eu, 1 @@ -96687,7 +96804,6 @@ mikebolynnbuilders.com, 1 mikeburns.tk, 1 mikecapson.com, 0 -mikecb.org, 1 mikechasejr.tk, 1 mikedundas.com, 1 mikefrank.ca, 1 @@ -96731,7 +96847,6 @@ mikino.ml, 1 mikizol.ru, 1 mikkei.space, 1 -mikkel.cc, 1 mikkelscheike.com, 1 mikkipastel.com, 1 mikkohuupponen.com, 0 @@ -96741,6 +96856,7 @@ miklima.pl, 1 miklus.pl, 1 mikodojo.tk, 1 +mikolajpawelsapek.eu, 1 mikonmaa.fi, 1 mikori.sk, 1 mikorrhiza-gomba.hu, 1 @@ -96854,6 +96970,7 @@ militer.id, 1 miliumnet.tk, 1 milivcounty.gov, 1 +milk.com.sg, 1 milk.games, 1 milk.xyz, 1 milk3soft.ai, 1 @@ -96865,6 +96982,7 @@ milkeclair.com, 1 milkenroar.com, 1 milkingmachine.tk, 1 +milkmakesitmerrier.com, 1 milkmoovement.io, 1 milkteacant.com, 1 milkypond.org, 1 @@ -96879,6 +96997,7 @@ millcreekut.gov, 1 millcreekwa.gov, 1 millefleurs.eu, 1 +millenn.photos, 1 millennialbella.net, 1 millennium-thisiswhoweare.net, 1 millenniumfalcon.org, 1 @@ -96980,7 +97099,7 @@ minacssas.com, 1 minademonic.org, 1 minaio.tk, 1 -minakov.pro, 1 +minakov.pro, 0 minamassimo.org, 1 minamo.io, 1 minantavla.se, 0 @@ -97020,12 +97139,13 @@ mindempowerment.org, 1 mindenitt.ga, 1 mindequityinternational.com, 1 -mindera.com, 0 +mindera.com, 1 minderrestdatkanbest.nl, 1 mindfab.de, 1 mindfactory.de, 1 mindflowmarketing.com, 0 mindfront.ai, 1 +mindfront.engineering, 1 mindfully.com, 0 mindfulnessjourney.ca, 1 mindfulslumber.com, 1 @@ -97033,6 +97153,7 @@ mindgard.co.uk, 1 mindgtc.com, 1 mindingourway.com, 1 +mindjack.xyz, 1 mindjee.tk, 1 mindmatters.social, 1 mindmax.fi, 1 @@ -97076,7 +97197,6 @@ minecraftbestroyale.gq, 1 minecraftdolarcube.gq, 1 minecrafteasy.gq, 1 -minecraften.net, 0 minecraftforever.tk, 1 minecraftforum.de, 1 minecraftforum.ovh, 1 @@ -97247,6 +97367,7 @@ minnesotalakemn.gov, 1 minnesotatitlesearch.com, 1 minng.cc, 1 +minnippi.com.au, 1 minnisites.com, 1 minnit.chat, 1 minnowmountain.com, 1 @@ -97288,7 +97409,6 @@ mintlayer.org, 1 minto.cc, 1 minton.systems, 1 -mintosherbs.com, 1 mintosoft.net, 1 mintplayer.com, 1 mintse.com, 0 @@ -97457,7 +97577,6 @@ mishrahome.com, 1 mishraweb.com, 1 misiepluszowe.com, 1 -misinforpedia.com, 1 misinstrumentos.com, 1 misite.ddns.net, 1 misiunas.eu, 1 @@ -97613,7 +97732,7 @@ mito-huutou.shop, 1 mito-meishi.shop, 1 mitokashi.ml, 1 -mitometals.lv, 1 +mitometals.lv, 0 mitotalplay.com.mx, 1 mitragacor.org, 1 mitranlogistik.com, 1 @@ -97705,6 +97824,7 @@ mixnix.tk, 1 mixnmojo.com, 1 mixon.tk, 1 +mixora.com.tr, 1 mixov.net, 1 mixpanel.com, 0 mixposure.com, 1 @@ -97720,7 +97840,6 @@ miyanaga.tech, 1 miyasyou.com, 1 miyatadc-ike.com, 1 -miyatadc-mita.com, 1 miyatakaikei.com, 1 miyavru.com, 1 miyazakian.com, 1 @@ -97749,6 +97868,7 @@ mjcstsul2022.tk, 1 mjf.cz, 1 mjhs.org, 1 +mjhsfoundation.org, 1 mjjshow.eu.org, 1 mjlwebdev.pl, 1 mjmoccasions.com, 1 @@ -97838,7 +97958,6 @@ mksdarchitects.com, 1 mkse.com, 1 mkt.com, 1 -mkt.cx, 1 mkt7.de, 1 mktcoral.com, 1 mktest.com, 1 @@ -97860,7 +97979,7 @@ mlcnfriends.com, 1 mlcrosoftonlline.cz, 1 mlcrosoftonlline.ml, 1 -mlelieveld.com, 1 +mlelieveld.com, 0 mlemay.com, 1 mlesniak.pl, 1 mleydier.fr, 1 @@ -98008,6 +98127,7 @@ mnotrioesdp.ml, 1 mnpl.ir, 1 mnprairie.gov, 1 +mnready.org, 1 mnrloroli.tk, 1 mnrtechsolutions.com, 1 mns.co.jp, 1 @@ -98056,6 +98176,7 @@ mobil11.net, 1 mobila-chisinau.md, 1 mobilab-ooe.at, 1 +mobilboyut.com, 1 mobilci.net, 1 mobildeal.id, 1 mobildingser.com, 1 @@ -98074,7 +98195,6 @@ mobilebooster.tk, 1 mobileciti.com.au, 1 mobilecraftingco.com, 1 -mobilefactory.io, 1 mobilefidelity-magazin.de, 1 mobilegameslist.com, 1 mobilegoldcoastelectrical.ga, 1 @@ -98082,10 +98202,10 @@ mobilelaby.com, 1 mobilelobbyers.ga, 1 mobilemechanicdenver.org, 1 +mobilemedicaldiagnostics.ie, 1 mobileminds.se, 1 mobileone.com.my, 1 mobilepartner.tk, 1 -mobilepricepk.com, 1 mobiler-handel.de, 1 mobileread.com, 1 mobileritelushi.com, 1 @@ -98154,7 +98274,6 @@ mocanu.pro, 1 mocap.co.th, 1 mocaro.de, 1 -mocasa.com, 1 mocdltraining.com, 1 mocent.de, 1 mochi.lol, 1 @@ -98231,6 +98350,7 @@ models-resource.com, 1 modelspoor-projecten.nl, 1 modelverse.online, 1 +modelworks.ai, 1 modem.cf, 1 modemchild.net, 1 modenatoday.it, 1 @@ -98240,8 +98360,10 @@ modern-metal-solutions.com, 1 modern-networks.co.uk, 1 modernapprenticeships.org, 1 +modernastro.com, 1 modernautorepairs.com, 1 modernbank.com, 1 +modernbuildremodel.com, 1 moderncat.com, 1 moderncommercialrealestate.com, 0 moderndayprepping.com, 1 @@ -98269,6 +98391,8 @@ modgamer.gq, 1 modgnews.com, 1 modicollege.com, 1 +modicum.studio, 1 +modified.games, 1 modineaviation.com, 1 modint.nl, 0 modintelechy.com, 1 @@ -98303,7 +98427,6 @@ modzcenter.es, 1 moe.best, 0 moe.blog, 0 -moe.ci, 1 moe.tools, 1 moe4sale.in, 1 moebeltaxi-berlin.com, 1 @@ -98358,6 +98481,7 @@ mogwailabs.de, 1 mogyuchi.com, 1 moha-swiss.com, 0 +moha.gov.gy, 1 mohaabobclan.tk, 1 mohaanation.tk, 1 mohabatein1.tk, 1 @@ -98404,7 +98528,6 @@ mojaapteka.pl, 1 mojaczarnastrona.pl, 1 mojadm.sk, 1 -mojaknjiznica.com, 0 mojakursumlija.tk, 1 mojama3dz.com, 1 mojapeticia.sk, 1 @@ -98473,12 +98596,13 @@ molenaagtekerke.tk, 1 molenaar-ricardo.tk, 1 moleremovalsandiego.com, 1 -molexces.com, 1 +molexces.com, 0 molezzo.com, 1 molinillo.tk, 1 molkerei-ammerland.com, 1 molleron.net, 1 molletjesveer.tk, 1 +mollie.com, 1 mollybears.org, 1 mollyblooms.tk, 1 mollyjayne.com, 1 @@ -98557,7 +98681,6 @@ mon-partage.fr, 1 mon-sac-italien.fr, 1 mon-trafic.com, 0 -mon.school, 1 mon22.ch, 0 mon47.com, 1 monacannation.gov, 1 @@ -98607,7 +98730,6 @@ monetag.com, 0 monetenfuchs.de, 1 monetize.ml, 1 -monetizehelper.com, 0 monetizer.co, 1 monetizer.com, 1 monetizzando.it, 1 @@ -98620,7 +98742,6 @@ money-finder.ml, 1 money-okey.tk, 1 money-quick.cf, 1 -money-spell.com, 1 money-tapuz.co.il, 1 money-transfers.tk, 1 money-trust.ru, 1 @@ -98712,7 +98833,6 @@ monjardin.tk, 1 monjo.io, 1 monjob.tk, 1 -monkaru.com, 1 monkel.lu, 1 monkey-donkey.es, 1 monkey47.com, 1 @@ -98736,6 +98856,7 @@ monodrama.tk, 1 monohost.ml, 1 monokli.tk, 1 +monolith.plus, 1 monolithapps.com, 1 monolithic.tk, 1 monolithon.net, 1 @@ -98747,7 +98868,6 @@ monorail.ga, 1 monorail.gq, 1 monorthopedagogue.ca, 1 -monosecurity.se, 1 monoseis-monotica.gr, 1 monosis.net, 1 monoskop.org, 1 @@ -98759,6 +98879,7 @@ monplay.host, 1 monrabais.fr, 1 monrasp.ddns.net, 1 +monreadshoppingcentre.ie, 1 monroecountycancersupporters.org, 1 monroecountymo.gov, 1 monroecountyny-opi.gov, 1 @@ -98773,7 +98894,6 @@ monsbah.com, 1 monscierge.com, 1 monshoppingcestcalais.fr, 1 -monsieurbureau.com, 1 monsieursavon.ch, 0 monsitemoncommerce.com, 1 monsitetest.ca, 1 @@ -98782,7 +98902,7 @@ monsterarmsest.ga, 1 monstercurves.com, 1 monstergovt.com, 1 -monsterlinkmarketing.com, 1 +monsterlinkmarketing.com, 0 monstermashentertainments.co.uk, 1 monsterminigames.de, 1 monsterminus.tk, 1 @@ -98790,7 +98910,6 @@ monsternet.pl, 1 monstersuniversity.ga, 1 monstertalesgame.com, 1 -monstertraxstudio.com, 1 monsterx.cn, 1 monstl.com, 1 monstresdesfetes.com, 1 @@ -98807,7 +98926,7 @@ montanabiack.de, 1 montanacreativitymovement.tk, 1 montanaguard.gov, 1 -montanaitservices.com, 1 +montanaitservices.com, 0 montanaonlinedivorce.com, 1 montanarenewables.org, 1 montanatitlesearch.com, 1 @@ -98887,6 +99006,7 @@ monzo.tk, 1 moo.software, 1 moocat.me, 1 +moodboardmadeit.com, 1 mooddie.pt, 1 moodfoods.com, 1 moodgym.com.au, 1 @@ -98920,7 +99040,6 @@ moondoor.tk, 1 moondrop.org, 1 moondsee.de, 1 -moonfist.eu, 1 moonflux.com, 1 moonfreak.tk, 1 moonglancecareer.com, 1 @@ -98968,9 +99087,7 @@ moorheadmn.gov, 1 mooring.social, 1 moormiles.com, 1 -moorparkelectrical.com, 1 moorparkexteriorlighting.com, 1 -moorparklighting.com, 1 moorstay.com, 1 moort.be, 1 moosic.co, 1 @@ -99028,10 +99145,8 @@ mordovia.gq, 1 mordovia.tk, 1 mordoviya.tk, 1 -more-hikkoshi.com, 1 more-terrain.de, 1 moreal.co, 1 -moreapp.co.uk, 1 morebus.co.uk, 1 morechance.de, 1 morecigarettes.tk, 1 @@ -99043,7 +99158,6 @@ moremindsbetter.com, 1 morenadacentral.tk, 1 morenci.ch, 1 -moreoptimal.com, 1 moreoptimal.world, 1 morepablo.com, 1 moreshop.pl, 1 @@ -99056,15 +99170,15 @@ moretti.camp, 1 morevesi.cf, 1 morewithcore.com, 1 +morfide.com, 1 morgan-insurance.com, 1 -morganappliancerepair.com, 1 morgancounty-al.gov, 1 morgancounty-il.gov, 1 morgancountymo.gov, 1 morgancountysheriffal.gov, 1 morgancountyutah.gov, 1 morgandesort.com, 1 -morganeb.be, 1 +morganeb.be, 0 morganlaroche.com, 1 morganton.com, 1 morganwilder.com, 1 @@ -99160,7 +99274,6 @@ mortonpoolsolutions.com, 1 morus.tk, 1 morvo.mx, 1 -mos-camin.ru, 1 mos-kanal.ru, 1 mosa.guru, 1 mosa.tk, 1 @@ -99194,7 +99307,6 @@ moshcore.tk, 1 moshegropper.com, 1 moshwire.com, 1 -mosin.org, 1 mosio.com, 1 moskas.tk, 1 moskeedieren.nl, 1 @@ -99208,7 +99320,6 @@ mosobl.tk, 1 mosostore.nl, 1 mosquito-code.com, 1 -mosquito-sklep.pl, 1 mosquitojoe.com, 1 mosr.sk, 1 mossad.gov.il, 1 @@ -99234,7 +99345,9 @@ mostlyharmless.at, 1 mostlyoverhead.com, 1 mostmost.tk, 1 +moststudios.com, 1 mosurist.tk, 1 +mota-engil.com, 1 motability.co.uk, 1 motabilitychargeshare.co.uk, 1 motabilitydealer.co.uk, 1 @@ -99255,6 +99368,7 @@ motekmedical.nl, 1 moteksystems.com, 1 moteksystems.net, 1 +motera.ie, 1 motezazer.fr, 1 moth.monster, 1 motherboard.services, 1 @@ -99312,9 +99426,9 @@ motohell.com, 1 motojato.com.br, 1 motokados.tk, 1 +motokenstudio.com, 1 motoland.ml, 1 motolife.tk, 1 -motolinesupply.com, 1 motomorgen.com, 1 motonovinky.cz, 1 motor-agro.com, 1 @@ -99337,7 +99451,6 @@ motorline.ru, 1 motorlubilgiler.com, 1 motorparts-images.nl, 1 -motorparts-online.com, 1 motorrijschool-pitbox8.nl, 1 motorring.ru, 1 motorslopers.tk, 1 @@ -99352,7 +99465,6 @@ motoselfservices.fr, 1 motospaya.com, 0 motostorie.blog, 1 -motostyle.ua, 1 mototax.ch, 0 mototeam.tk, 1 mototsi.com, 1 @@ -99487,7 +99599,6 @@ movieeveningest.ga, 1 moviefreeze.com, 1 movieglot.ml, 1 -moviego.st, 1 movieguys.org, 1 moviejack.org, 0 moviemadness.uk, 1 @@ -99547,6 +99658,7 @@ moyos.net, 1 moyu.host, 0 moyufangge.com, 1 +moyuhi.jp, 1 moyure.com, 1 moz.idv.tw, 1 mozaic.io, 1 @@ -99564,7 +99676,6 @@ mozzez.de, 1 mozzi.online, 1 mozzilla.cz, 1 -mp-bank.ru, 1 mp-bln.de, 1 mp.gov.in, 1 mp.org, 1 @@ -99639,6 +99750,7 @@ mqbeauty.com.tw, 1 mqbx.nl, 1 mqroofing.com, 1 +mqtlabs.com, 1 mr-7.ru, 1 mr-a.de, 1 mr-anderson.org, 0 @@ -99731,7 +99843,6 @@ mrjunior.ml, 1 mrkapowski.com, 0 mrknee.gr, 1 -mrkzalamana.com, 1 mrlc.gov, 1 mrliu.me, 1 mrlove.tk, 1 @@ -99818,7 +99929,6 @@ msbmb.com, 1 msc-fivem.shop, 1 mscc.mu, 1 -msd-tiergesundheit.de, 1 msda23.gov, 1 msdprojectclearmo.gov, 1 msebera.cz, 1 @@ -99909,7 +100019,6 @@ mstdn.in.th, 1 mstdn.io, 1 mstdn.party, 1 -mstechexpo.com, 1 mstever.com, 1 mstr-f-dstrctn.de, 1 mstridde.de, 1 @@ -99992,7 +100101,6 @@ mtm.tj, 1 mtmedia.org, 1 mtn-media.de, 1 -mtnc.nl, 1 mtncoi-coe.com, 1 mtnmanager.com, 1 mtnmedia.group, 1 @@ -100039,6 +100147,7 @@ muafakatmalaysia.gq, 1 muafakatmalaysia.ml, 1 muarstabyggmarknad.tk, 1 +mubarak-card.com, 1 mubase.dk, 1 muble.tk, 1 muc.space, 1 @@ -100052,6 +100161,7 @@ muchtv.com, 1 muckingabout.eu, 1 muckleshoot.gov, 1 +muckrack.com, 1 mucktopia.com, 1 muclan.tk, 1 mucmail.de, 1 @@ -100086,6 +100196,7 @@ muenchberger.com, 0 muenchen-personal.training, 1 muennich-coll.de, 1 +muenster-yarn.com, 1 muenzen.tk, 1 muenzenforum.tk, 1 mufg.ru, 1 @@ -100152,6 +100263,7 @@ mulder.social, 1 mulderfamilie.tk, 1 mulej.net, 1 +mulgravelaw.co.uk, 1 mulheres18.com, 1 muling.lu, 1 mulk.hopto.org, 1 @@ -100225,7 +100337,6 @@ multitraf.ga, 1 multiusaha.my.id, 1 multivideo.tk, 1 -multivpn.cn.com, 1 multivpn.com.de, 1 multivpn.com.ua, 1 multivpn.fr, 1 @@ -100242,7 +100353,6 @@ mumbairoleplay.tk, 1 mumble.be, 1 muminkoykiran.com, 1 -mumiytroll.com, 1 mummatters.com.au, 1 mummyandmephotography.com, 1 mumolabs.com, 1 @@ -100282,6 +100392,7 @@ mundoscrapbooking.online, 1 mundoseth.tk, 1 mundosteampunk.club, 1 +mundosuiri.info, 1 mundosuiri.ml, 1 mundowanderlust.com, 1 mundschenk.at, 1 @@ -100328,6 +100439,7 @@ muratcileli.tk, 1 muratoff.pp.ua, 1 muratore-roma.it, 1 +muratyurtoglu.com, 1 murciacobras.tk, 1 murciaprocuradores.tk, 1 murderbysound.servebeer.com, 1 @@ -100368,6 +100480,7 @@ mursu.directory, 1 murtazamustafahirani.tk, 1 murz.tv, 1 +murzallawfirm.com, 1 murzik.space, 1 mus-tech.info, 1 musacomo.com, 1 @@ -100410,6 +100523,7 @@ museum.nl, 1 museumcenter.az, 1 museumhammarlind.se, 1 +museumhetkruithuis.nl, 1 museumplantinmoretus.be, 1 museumwaalsdorp.nl, 1 mush-room.co.jp, 1 @@ -100448,7 +100562,6 @@ musicforreading.com, 1 musicfreakz.cf, 1 musicfromgod.com, 1 -musicgamegalaxy.de, 1 musicgeek.ga, 1 musicgivesmelife.com, 0 musicgivesmelife.gay, 1 @@ -100519,7 +100632,6 @@ muslimsoul.ml, 1 muslitocomics.tk, 1 musmann.io, 1 -musopen.org, 1 muspla.com.br, 1 mussalains.com, 1 musselsblog.com, 1 @@ -100528,7 +100640,6 @@ mussonstrading.com, 1 mustangapparel.ca, 1 mustangmessenger.net, 1 -mustasj.no, 1 mustdonewzealand.co.nz, 1 muster-folien.de, 1 muster-schablonen.de, 1 @@ -100581,6 +100692,7 @@ muusikoiden.net, 1 muv.ac, 1 muv.co.uk, 1 +muvy.tube, 1 muwi.tk, 1 muxidream.cn, 1 muxup.com, 1 @@ -100614,7 +100726,6 @@ mv-wohnen.de, 1 mvandek.nl, 1 mvarsamis.com, 1 -mvbstyling.nl, 1 mvbug.com, 1 mvc-sports.com, 1 mvccp.co.za, 1 @@ -100685,7 +100796,6 @@ mx-solutions.net, 1 mx.org.ua, 1 mx.search.yahoo.com, 0 -mx310.jp, 1 mx86.eu, 1 mxawei.cn, 1 mxdanggui.org, 1 @@ -100698,7 +100808,6 @@ mxlog.com.br, 1 mxradar.com, 1 mxtm.de, 1 -mxtsoluciones.com.mx, 1 my-aftershave-store.co.uk, 1 my-azov.tk, 1 my-bratsk.tk, 1 @@ -100729,10 +100838,12 @@ my-lightning.com, 1 my-meal.nl, 1 my-mediahome.ru, 1 +my-message.co, 1 my-meteo.net, 1 my-monobank-card.com.ua, 1 my-montenegro.tk, 1 my-msg.ai, 1 +my-msg.co, 1 my-nextcloud.at, 1 my-pawnshop.com.ua, 0 my-pharmacie.com, 1 @@ -100759,6 +100870,7 @@ my-web.xyz, 1 my-webcloud.at, 1 my-website.top, 1 +my-wishes.co, 1 my-woodcraft.com, 1 my.cat, 1 my.com.my, 1 @@ -100815,7 +100927,7 @@ mybamoza.com, 1 mybaran.tk, 1 mybarcelona.tk, 1 -mybasepay.com, 1 +mybasepay.com, 0 mybathroom.tk, 1 mybaticloud.com, 1 mybb.com, 1 @@ -100853,7 +100965,6 @@ mybrokenheart.tk, 1 mybsms.gr, 1 mybts.fr, 0 -mybubbleteashop.com, 1 mybuddytheplumberparkcity.com, 1 mybudgetapp.com, 1 mybuildingcertifier.com.au, 1 @@ -100869,6 +100980,7 @@ mycandylove.com, 1 mycardplace.com, 1 mycarecorner.net, 1 +mycarecost.net, 1 mycarwashers.com, 1 mycase.com, 0 mycase.com.ua, 1 @@ -100878,7 +100990,6 @@ mycats.tk, 1 mycbils.uk, 1 mycena.co, 1 -mychains.pl, 1 mychamberlain.co.nz, 0 mychamberlain.com.au, 0 mychamberlain.eu, 0 @@ -100941,8 +101052,8 @@ mycrowdstack.com, 1 mycrypnet.io, 1 mycts.org, 1 +mycuba.holiday, 1 mycues.gov, 1 -mycumortgage.com, 1 mycyberspace.tech, 1 mydarkness.cf, 1 mydarksite.tk, 1 @@ -100973,7 +101084,6 @@ mydisabilitymatters.org.au, 1 mydisco.tk, 1 mydistance.tk, 1 -mydlonline.be, 1 mydnshost.co.uk, 1 mydoc.fr, 1 mydogispolite.tk, 1 @@ -101061,7 +101171,6 @@ myfitnesscare.com, 1 myfitsociety.com, 1 myfleetistics.com, 1 -myflexina.com, 1 myflightrefund.com, 1 myfloridacfo.gov, 1 myfloridadeferredcomp.com, 1 @@ -101072,7 +101181,6 @@ myforum.community, 1 myforwardsavings.com, 1 myfpvstore.com, 1 -myfreespiritpointscard.com, 1 myfrenchtattoo.fr, 1 myfreshfamilydental.com, 1 myfruition.com, 1 @@ -101085,7 +101193,6 @@ myfuturewebsite.co.uk, 1 myfxbook.com, 1 myfxcm.com, 1 -myfyntra.com, 1 myg21.com, 1 mygadgetguardian.lookout.com, 0 mygallery.homelinux.net, 1 @@ -101171,8 +101278,6 @@ myinsitu.com, 1 myinstapy.ru, 0 myinsurancesource.com, 1 -myinternetreputation.com, 1 -myinternetreputation.org, 1 myinternist.com, 1 myinterrail.co.uk, 1 myinvestinglife.com, 1 @@ -101312,6 +101417,7 @@ myndseye.com, 1 myneighborhoodperks.com, 1 mynetblog.com, 1 +mynetiz.com, 1 mynetpay.be, 1 mynetworkingbuddy.com, 1 mynewhorizons.shop, 1 @@ -101321,6 +101427,7 @@ mynic.my, 1 mynimo.com, 1 mynissan.ml, 1 +mynixsudoservices.com, 1 mynjhelps.gov, 1 mynlight.com, 1 mynn.io, 0 @@ -101404,6 +101511,7 @@ mypskov.tk, 1 mypsychicreadings.tk, 1 mypvhc.com, 1 +myqronix.com, 1 myqrreview.com, 1 myraboats.tk, 1 myramadanmoon.com, 1 @@ -101491,6 +101599,7 @@ mysanta.co, 1 mysantanderpension.co.uk, 1 mysarnoff.com, 1 +mysatcoach.com, 1 mysavvastraining.com, 1 mysavvywallet.com, 1 mysaymk.tk, 1 @@ -101523,6 +101632,7 @@ mysignal.com, 1 mysill.gr, 1 mysimsem.com, 1 +mysinergy.eu, 1 mysisterandi.co.za, 1 myslc.gov, 1 mysmallbusinesssidekick.com, 1 @@ -101555,6 +101665,7 @@ mysteryshow.site, 1 mysterytag.com, 1 mystgames.tk, 1 +mystia.org, 1 mystic-falls.tk, 1 mystic-welten.de, 1 mysticalroseschoolofcaloocan.com, 1 @@ -101574,8 +101685,8 @@ mystream.com, 0 mystreambox.fr, 1 mystreet.ga, 1 -mystrength.com, 1 mystudentrecord.net, 1 +mystudiolook.com, 1 mystudy.me, 1 mystudycart.com, 1 mystudymap.tk, 1 @@ -101588,8 +101699,10 @@ myswabi.tk, 1 myswitchelectric.com, 1 myswooop.de, 1 +mysympleloan.com, 1 mytana.com, 1 mytaratata.com, 1 +mytaxbridge.co.uk, 1 mytaxindia.com, 1 mytc.fr, 1 mytea.life, 1 @@ -101601,6 +101714,7 @@ mythen-fonds.ch, 1 mythenfonds.ch, 1 mytherapist.com, 1 +mythic.software, 1 mythicca.org, 1 mythicdelirium.com, 1 mythreesonshvac.com, 1 @@ -101618,7 +101732,6 @@ mytreasury.gov, 1 mytrewithen.co.uk, 1 mytrialist.org, 1 -mytribus.com, 1 mytrinity.com.ua, 1 mytroc.pro, 1 mytruecare.org, 1 @@ -101675,7 +101788,6 @@ mywebserver.ml, 1 myweightlosstips.tk, 1 mywellness360.in, 1 -mywestondental.com, 0 mywikis.net, 1 mywish.co.il, 1 mywonderkitchen.com, 1 @@ -101696,11 +101808,11 @@ myzarabot.tk, 1 myzina.cz, 0 myzoetrope.com, 1 +myzr.io, 1 mz-mz.net, 1 mz.al, 1 mz2023.cc, 1 mz2024.cc, 1 -mz2025.cc, 1 mz2026.cc, 1 mz2027.cc, 1 mz2028.cc, 1 @@ -101711,6 +101823,7 @@ mz2033.cc, 1 mza.com, 1 mzademiryolu.com, 1 +mzadqatar.com, 1 mzak.pro, 1 mzakariya.com, 1 mzback.cc, 1 @@ -101751,6 +101864,7 @@ n0.be, 1 n03.top, 1 n0t404.com, 1 +n0v1.com, 1 n1.homes, 1 n15.org, 1 n1co68.freeboxos.fr, 1 @@ -101813,6 +101927,7 @@ nabibus.com, 1 nabiev.tk, 1 nabitrix.tk, 1 +nabiusa.com, 1 nablacloud.com, 1 nabokov.tk, 1 naboplastic.com, 1 @@ -101929,6 +102044,8 @@ naheulcraft.be, 1 nahfe.xyz, 1 nahman.tk, 1 +nahmii.dj, 1 +nahmii.dog, 1 nahouw.net, 1 nahrag.tk, 1 nahs-classof1972.com, 1 @@ -101938,6 +102055,7 @@ nahue.ar, 1 nahue.com.ar, 1 naidoc.org.au, 1 +naijabased.fun, 1 naijapickup.com, 1 naijaxnet.com.ng, 1 naijjobs.com, 1 @@ -102018,6 +102136,7 @@ nakukata.com, 1 nakupnabytku.sk, 1 nala.baby, 1 +nalanyinyun.work, 1 nalapadglobal.com, 1 nalapadtransport.com, 1 nalchik-news.net, 1 @@ -102040,7 +102159,7 @@ namastenaturo.fr, 1 namazon.org, 1 namazvakitleri.com.tr, 0 -namdu.uz, 0 +namdu.uz, 1 name.ax, 1 nameabusiness.com, 1 nameabusiness.pro, 1 @@ -102078,7 +102197,7 @@ namplan.pl, 1 namsbaekur.is, 1 namskra.is, 1 -namspi.uz, 0 +namspi.uz, 1 namu.la, 1 namu.live, 1 namu.moe, 1 @@ -102119,9 +102238,7 @@ nannatextiles.com, 1 nannatextiles.de, 1 nannostomus.com, 1 -nannyandhousekeeper.uk, 1 nannydream.com, 1 -nano.gov, 1 nano.voting, 1 nanobattle.com, 1 nanocard.co, 1 @@ -102180,6 +102297,7 @@ napkins-wholesale.uk, 1 naplata.mk, 1 naples.tk, 1 +naplestotalgarage.com, 1 napo.tk, 1 napoleonoutlawed.tk, 1 napolict.com, 1 @@ -102200,6 +102318,7 @@ naql.om, 1 naquebec.tk, 1 nar.cards, 1 +nar0.com, 1 nara.gov, 1 naraboty.ga, 1 narada.com.ua, 1 @@ -102270,6 +102389,7 @@ narutowicza47.pl, 1 narvizit.com, 1 nary-software.com, 1 +narzedziait.pl, 1 narzedziownia.top, 1 nas-tech.de, 1 nas.gov.ua, 1 @@ -102321,6 +102441,7 @@ nasosvdom.com.ua, 1 nasr.mobi, 1 nasrabady.tk, 1 +nasrmaswood.com, 1 nasrullaganjnews.tk, 1 nassaucountyfl.gov, 1 nassautrafficny.gov, 1 @@ -102460,7 +102581,6 @@ nationaltransvisibilitymarch.org, 1 nationalvideoproductions.com, 1 nationalvideoproductions.net, 1 -nationalwellness.org, 1 nationandfreedom.tk, 1 nationdivergente.com, 1 nationofleaders.org, 1 @@ -102529,7 +102649,6 @@ naturaprint.fr, 1 naturart.pt, 1 naturavelit.ch, 1 -naturaventyr.se, 1 nature-avenue.com, 1 nature-basedsolutions.com, 1 nature.cz, 1 @@ -102588,6 +102707,7 @@ nautadutilh.com, 1 nautholl.is, 1 nautiboat.it, 1 +nauticonline.it, 1 nautigo.org, 1 nautika.tk, 1 nautiljon.com, 1 @@ -102622,8 +102742,10 @@ navigay.me, 1 navigo-inc.com, 1 navigo.cc, 1 +navigo.global, 1 navigyurci.hu, 1 navinmolecular.com, 1 +navita.com.br, 1 naviteq.eu, 1 navkor.tk, 1 navlnachekg.cz, 1 @@ -102648,6 +102770,7 @@ naxcivan.tk, 1 nayakaaerial.com, 1 nayanaas.com, 1 +nayaone.com, 1 nayapakistan.tk, 1 naydenovlaw.com, 1 nayefalebrahim.com, 1 @@ -102737,6 +102860,7 @@ nbri.ru, 1 nbriresearch.com, 1 nbrown.us, 1 +nbwp.uk, 1 nbx.com, 1 nc-beautypro.fr, 1 nc-formation.fr, 1 @@ -102814,11 +102938,13 @@ ncrypt.at, 1 ncs-cleaning.dk, 1 ncsa.gov.qa, 1 +ncsa.md, 1 ncsbadvisors.gov, 1 ncsbe-apps.gov, 1 ncsccs.com, 1 ncshp.gov, 1 ncsis.gov, 1 +ncsl.or.kr, 1 ncsparta.gov, 1 ncswboard.gov, 1 nctm.org, 1 @@ -102875,7 +103001,6 @@ ndx.ee, 1 ndxinfo.eti.br, 1 ndy.sex, 1 -ne-games.com, 1 ne.ax, 1 nea.gov, 1 nealemorison.com, 1 @@ -102901,6 +103026,7 @@ neatous.net, 1 neauviachannel.com, 1 neave.tv, 1 +neaverdock.com, 1 neaz.tk, 1 neb.li, 1 neba.io, 1 @@ -102984,7 +103110,6 @@ neelen-gym.nl, 1 neemo.nz, 1 neenahwi.gov, 1 -neenan.com, 1 neepscambaiting.com, 1 neera.ro, 1 neero.fr, 1 @@ -103025,7 +103150,6 @@ negocios-imatore.com, 1 negociosparaoptimistas.com, 1 negociosurbanos.net, 1 -negoya-shokai.info, 1 negozimoda.it, 1 negoziointimo.com, 1 negr.gay, 1 @@ -103078,6 +103202,7 @@ neko.foundation, 1 nekoame.network, 1 nekoame.uk, 1 +nekobt.to, 1 nekochan.blog, 1 nekofoundation.com, 1 nekofoundation.org, 1 @@ -103087,10 +103212,9 @@ nekomagic.com, 1 nekomanten.de, 1 nekomata.tk, 1 -nekomimi.cafe, 1 +nekomimi.cafe, 0 nekomimi.pl, 1 nekomimirouter.com, 1 -nekomimix.net, 1 nekomiya-sama.top, 1 nekomoe.moe, 1 nekondiciya.cf, 1 @@ -103189,7 +103313,6 @@ neo4j.com, 1 neo4j.design, 1 neobits.nl, 1 -neoblindados.com.br, 1 neoblog.tk, 1 neocannbio.com, 1 neochan.net, 1 @@ -103203,6 +103326,7 @@ neoedresources.org, 1 neoeliteconsulting.com, 1 neofinancial.com, 1 +neogames.com.co, 1 neohu.com, 0 neojo.org, 1 neoko.fr, 1 @@ -103237,6 +103361,7 @@ neosdesignstudio.co.uk, 1 neosecurityteam.tk, 1 neoshomo.gov, 1 +neoskosmos.info, 1 neosnetworks.com, 1 neosoft.hu, 1 neostralis.com, 1 @@ -103259,7 +103384,6 @@ neoximo.com, 1 neoz.com.br, 1 neozeon.io, 0 -nepal-evolution.org, 0 nepal.ga, 1 nepalboxoffice.tk, 1 nepalese.tk, 1 @@ -103364,10 +103488,8 @@ nessimworks.com, 1 nesstormented.tk, 1 nest-property.com, 1 -nesta.ie, 1 nestbynature.com, 1 nestdesigndeco.com, 1 -nesterov.pw, 1 nestetic.com, 1 nestforms.com, 1 nestinarka-park.com, 1 @@ -103420,6 +103542,7 @@ netco-system.de, 1 netconnect.at, 0 netcoresmartech.com, 1 +netcosa.com, 1 netcourtreporter.com, 1 netcourtreporter.net, 1 netcracker.com, 1 @@ -103493,7 +103616,6 @@ netig.net, 0 netigen.pl, 1 netim.pl, 1 -netinsight.net, 1 netipbox.com, 1 netjet.io, 1 netjobz.tk, 1 @@ -103528,7 +103650,6 @@ netope.de, 1 netor.ga, 1 netpass.pt, 1 -netpatient.dk, 1 netpay.mx, 1 netpenge.tk, 1 netpreneur.co.za, 1 @@ -103539,10 +103660,9 @@ netradyne.com, 1 netraising.com, 1 netrecruituk.co.uk, 1 -netreputation.com, 0 netresec.com, 1 netreviews.tk, 1 -netriders.academy, 1 +netriders.academy, 0 netrift.uk, 1 netrino.be, 1 netrino.info, 1 @@ -103554,6 +103674,7 @@ nets-cloud.com, 1 nets.com.sg, 1 netschool.tk, 1 +netscribes.com, 1 netse.net.tr, 1 netsearch.ga, 1 netsec.cloud, 1 @@ -103561,7 +103682,6 @@ netsends.com, 1 netsensai.pl, 1 netsensor.com.br, 1 -netservice.co.uk, 0 netshopgarden.com.br, 1 netsite.dk, 1 netslum.tk, 1 @@ -103661,7 +103781,6 @@ networthpal.com, 0 networx-online.de, 1 netz-blog.de, 1 -netz-noe.at, 1 netz0.com, 1 netzabfragen.de, 1 netzen.tk, 1 @@ -103740,13 +103859,13 @@ neuroticosanonimos.tk, 1 neurotransconcept.com, 0 neurotransmitter.net, 1 -neurovicellc.com, 1 +neurovicellc.com, 0 neurozentrum-barsinghausen.de, 1 neurozentrum-zentralschweiz.ch, 1 neuschwanstein.de, 1 neuschwansteintickets.nl, 1 neustadt-keller.de, 1 -neustadtguides.de, 1 +neustadtguides.de, 0 neuteleers.tk, 1 neuton.ai, 1 neutra-vdl.org, 1 @@ -103787,7 +103906,6 @@ neveu.tech, 1 nevim-co-varit.cz, 1 nevivur.net, 1 -nevntech.com, 1 nevocloud.com, 1 nevolution.me, 1 nevoxo.com, 0 @@ -103809,7 +103927,6 @@ new-vip1.com, 1 new-vvip.com, 1 new-way.ml, 1 -new-web-studio.com, 1 new-zone.tk, 1 new10.com, 1 newag.org.au, 1 @@ -103845,7 +103962,6 @@ newbownerton.xyz, 1 newbraunfels.gov, 1 newbrest.tk, 1 -newbrightonresidents.org.nz, 1 newbronze.com.br, 1 newbrunswicknj.gov, 1 newbrunswickonlinedivorce.com, 1 @@ -103853,7 +103969,6 @@ newbss.co.uk, 1 newbuilding.tk, 1 newburybouncycastles.co.uk, 1 -newburyparkelectric.com, 1 newburyportma.gov, 1 newcab.de, 1 newcapitaldev.com, 1 @@ -103875,6 +103990,7 @@ newcityinfo.ch, 0 newcityinfo.info, 1 newcitystudio.ch, 0 +newcoders.org, 1 newcold.com, 1 newcoldhelsingborg.se, 1 newcombny.gov, 1 @@ -103886,7 +104002,6 @@ newday.host, 1 newdaychristian.com, 1 newdayproperties.com, 1 -newdayrecordlabel.com, 1 newdenversurvivors.tk, 1 newdietandexercises.tk, 1 newdirectionsolar.com.au, 1 @@ -103928,13 +104043,13 @@ newgrowbook.com, 0 newgrowthpress.com, 1 newguidance.ch, 0 +newhade.ddns.net, 1 newhampshiretitlesearch.com, 1 newhamyoungbloods.co.uk, 1 newharmony-in.gov, 1 newhavenshiami.gov, 1 newholland.tk, 1 newhomedesign.tk, 1 -newhomeinturkey.com, 1 newhopeplacement.com, 1 newhoperailroad.com, 1 newillusion.tk, 1 @@ -103971,7 +104086,6 @@ newmilfordnj.gov, 1 newmill.com, 1 newmusic.org, 0 -newmusicjackson.org, 1 newmuslims.tk, 1 newmuz.tk, 1 newnaturalists.com, 1 @@ -104065,6 +104179,7 @@ newschannel5.com, 1 newscheck.tk, 1 newschool.ie, 1 +newscroll.ru, 1 newscultural.tk, 1 newsdiff.eu, 1 newsdiff.nl, 1 @@ -104086,7 +104201,6 @@ newsignature.com, 1 newsinformer.ga, 1 newsinkansas.ml, 1 -newsinnovationmarket.com, 1 newsinpenn.ml, 1 newsinpolitics.ga, 1 newsireland.tk, 1 @@ -104263,6 +104377,7 @@ nextme.se, 1 nextmed.ro, 1 nextmuseum.io, 1 +nextofkinplan.com, 1 nextos.com, 1 nextpower-kepco.jp, 1 nextrasp.it, 1 @@ -104276,6 +104391,7 @@ nextstep-labs.gr, 1 nextstepstudios.ga, 1 nexttv.co.il, 1 +nextunitpro.com, 1 nextus.me, 1 nextvibration.com, 1 nextvision.pt, 1 @@ -104433,6 +104549,7 @@ nhg.nl, 1 nhheaf.org, 1 nhjvillalmanzo.tk, 1 +nhlanhlazondo.co.za, 1 nhlocalgrocer.com, 1 nhnature.org, 1 nhnieuws.nl, 1 @@ -104522,6 +104639,7 @@ nice-germany.tk, 1 nice-links.tk, 1 nice-school.com.ua, 1 +nice-sound.com, 1 niceb5y.net, 0 niceceo.com, 0 nicecockb.ro, 1 @@ -104740,6 +104858,7 @@ nigdeescort.tk, 1 nigel-aves-photography.com, 1 nigelfreake.eu, 1 +nigellasativa.info, 1 nigelpentland.co.uk, 1 nigelpentland.net, 1 nigelsnotebook.com, 1 @@ -104801,6 +104920,7 @@ nihilocomunidad.tk, 1 nihon-finance.com, 1 nihon-rosoku.com, 1 +nihonnomirai.org, 1 nihor2.com, 1 nihseniorhealth.gov, 0 nihulkav.shop, 1 @@ -104844,11 +104964,11 @@ nikhilramakrishnan.tk, 1 nikhilsd.com, 1 nikiel.fr, 1 -nikimix.com, 1 nikitacartes.xyz, 0 nikitagukov.ru, 1 nikitenko.tk, 1 nikitina.ml, 1 +nikitovka.com, 1 nikka.systems, 0 nikkasystems.com, 1 nikkasystems.se, 1 @@ -104879,6 +104999,7 @@ nikoniko-dental-nakamozu.jp, 1 nikoniko-dental-premium.jp, 1 nikoniko-dental-support.jp, 1 +nikonimgsupport.com, 1 nikonlibrary.co.uk, 1 nikonnps.co.uk, 1 nikonschool.co.uk, 1 @@ -104894,6 +105015,7 @@ niksys.net, 1 nikws.ru, 1 nikz.in, 1 +nil.as, 1 nil.com, 1 nil.mx, 1 niledevelopmentseg.com, 1 @@ -105210,6 +105332,7 @@ nmitaylor.com, 1 nmjusticedata.gov, 1 nmleatherleague.com, 1 +nmmd.co.uk, 1 nmmlp.org, 1 nmn.hu, 1 nmontag.com, 1 @@ -105218,6 +105341,7 @@ nms-thoracic-surgery.com, 1 nmshippingshield.com, 1 nmslo.gov, 1 +nmstore.com.tr, 1 nmsuroundup.com, 1 nmugroup.com, 1 nmx.de, 1 @@ -105254,6 +105378,7 @@ no-andishan.ir, 1 no-b.kiev.ua, 1 no-bet.ru, 1 +no-bull.sh, 1 no-data.tk, 1 no-dev.de, 1 no-eye-deer.tk, 1 @@ -105332,7 +105457,6 @@ nocloud.website, 1 noco.nl, 1 nocoastpunx.tk, 1 -nocodefactory.io, 1 nocoffee.tech, 1 nocoffeetech.de, 1 nocommentsallowed.com, 1 @@ -105395,6 +105519,7 @@ nogluten.com, 1 nogradhont.hu, 1 nogyogyaszat.eu, 0 +nohangouts.se, 1 nohatenj.gov, 1 nohats.ca, 1 nohttps.org, 1 @@ -105471,6 +105596,7 @@ nomadix.com, 1 nomadlist.com, 1 nomadproject.io, 0 +nomadtalk.mn, 1 nomadtech.servehttp.com, 1 nomadtechnologies.uk, 1 nomadwallets.com, 1 @@ -105510,10 +105636,10 @@ nonprofitdrupal.org, 1 nonqmloans.com, 1 nonsa.pl, 1 -nonsensebrand.es, 1 nonstopairductcleaning.com, 1 nonstopairductcleaninghoustontx.com, 1 nonstopjob.ga, 1 +nonstopkino.at, 1 nontonfilem.ml, 1 nonwww.org, 1 nonx.pro, 1 @@ -105614,7 +105740,7 @@ nordicportalen.tk, 1 nordicsemi.com, 1 nordicsrit.tk, 1 -nordictaxirvk.is, 1 +nordictaxirvk.is, 0 nordicway.dk, 1 nordinfo.fi, 1 nordisglobal.com, 1 @@ -105622,6 +105748,7 @@ nordiskhissvarmland.se, 1 nordkampen.com, 1 nordkampen.de, 1 +nordklar-reinigung.de, 1 nordlandsbanken.no, 1 nordlandverliebt.de, 1 nordlayer.com, 1 @@ -105801,7 +105928,6 @@ northwoodstudios.org, 1 northzone.ml, 1 nortvi.com, 1 -norveg.ru, 1 norvelltwp-mi.gov, 1 norwalkct.gov, 1 norwalkps.org, 0 @@ -105904,6 +106030,7 @@ notebleue.com, 1 noteboat.net, 1 notebook-alkatresz.hu, 1 +notebooklm.in, 1 notebooksbilliger.de, 1 notebooksteurer.shop, 1 notebrew.com, 1 @@ -105914,6 +106041,7 @@ notenarchiv.eu, 1 notengosuelto.com, 1 noteonline.org, 1 +notesdumontroyal.com, 1 notesforpebble.com, 1 noteshare.net, 1 noteskeeper.ru, 1 @@ -105926,7 +106054,10 @@ nothing.pink, 1 nothingbundtcakes.com, 1 noti.tg, 1 +noticeregistry.com, 1 +noticiacristiana.com, 1 noticiaelmundo.com, 1 +noticiasdearnedo.es, 1 noticiasdeautos.site, 1 noticiasdebrasiliaonline.com, 1 noticiasdeminasgerais.com, 1 @@ -106034,9 +106165,9 @@ novanta.pl, 1 novantaphotonics.com, 1 novaofcalifornia.com, 0 -novaprac.com, 1 novaquantum.com, 1 novaquark.com, 1 +novaquest.com.br, 1 novaratoday.it, 1 novarock.tk, 1 novasentinel.pt, 1 @@ -106075,7 +106206,6 @@ novema.jp, 1 novenopiso.tk, 1 noventiq.co.uk, 1 -novento.bg, 1 novezamky.tk, 1 novgorod-news.net, 1 novgorod24.tk, 1 @@ -106115,6 +106245,7 @@ novonordiskfonden.dk, 1 novoodesabibl.tk, 1 novoopus.com, 1 +novora.at, 1 novoresume.com, 1 novorossiysk.tk, 1 novorussiya.tk, 1 @@ -106226,7 +106357,6 @@ nptfisheries.org, 1 nptn.tk, 1 npws.net, 1 -nqesh.blog, 1 nqesh.ph, 1 nqhomeinsurance.gov.au, 1 nrac.or.jp, 1 @@ -106251,7 +106381,6 @@ nrsmart.com, 1 nrthcdn.me, 1 nrttv.com, 1 -nrvc.net, 1 nrvn.cc, 1 nrvweb.net, 1 nrw-stiftung-magazin.de, 1 @@ -106271,6 +106400,7 @@ nsbih.ba, 1 nsboston.org, 1 nsbufl.gov, 1 +nsc365.co.jp, 1 nscai.gov, 1 nscdegreeverify.com, 1 nscdegreeverify.org, 1 @@ -106283,10 +106413,12 @@ nscverifications.net, 1 nscverifications.org, 1 nsdcprayerforce.com, 1 +nse-ebp.com, 1 nsec.dk, 1 nsecure.nl, 1 nseicc.com, 1 nseindia.com, 1 +nsenmf.com, 1 nsep.gov, 1 nsf-journal.hr, 1 nsfw.dk, 1 @@ -106295,7 +106427,6 @@ nsfwph.org, 1 nsglamm.com, 1 nshipster.co.kr, 1 -nsic.mil, 1 nsics.co.jp, 1 nsikakimoh.com, 1 nsimobilewatersolutions.com, 1 @@ -106311,7 +106442,6 @@ nslone.com, 1 nsm.ee, 1 nsmail.cn, 1 -nsmail.com, 1 nsms.com, 1 nsncatalog.com, 1 nso.ie, 1 @@ -106332,6 +106462,7 @@ nssfchile.tk, 1 nssquad.tk, 1 nstatic.xyz, 1 +nstd.net, 1 nstnet.org, 1 nsu.pw, 1 nsv.ee, 1 @@ -106347,6 +106478,7 @@ ntcoss.org.au, 1 ntcp.ph, 1 ntcrmezon.ru, 1 +ntdf.co.uk, 1 ntdse.org, 1 nte.email, 1 nte.no, 0 @@ -106491,7 +106623,6 @@ nullxsec.net, 1 nully.xyz, 1 nulsc.biz, 1 -nulsc.net, 1 numancia.tk, 1 numarasorgulama.tel, 1 numaxion.fr, 1 @@ -106531,7 +106662,6 @@ nunesgh.com, 1 nunesgh.org, 1 nunnenmacher.net, 0 -nunnun.jp, 1 nunoarruda.com, 1 nunoefabia.tk, 1 nunogand.com, 1 @@ -106552,8 +106682,10 @@ nupaybusiness.com.br, 1 nuquery.com, 1 nur-test.de, 1 +nura.gay, 1 nuraling.com, 1 nuranagi.rocks, 1 +nurani.io, 1 nureg.club, 1 nureg.net, 1 nuria-fergo.tk, 1 @@ -106562,6 +106694,7 @@ nurkamol.com, 1 nurmio.fi, 1 nurnabi.ml, 1 +nurolyn.store, 1 nurrobin.de, 1 nurseactioners.ga, 1 nurseactionest.ga, 1 @@ -106597,7 +106730,6 @@ nutralivbio.com, 1 nutrashop.fr, 1 nutriciametabolics-shop.de, 1 -nutriflex.co.za, 1 nutrifyyourself.com, 1 nutrijets.com, 1 nutrineyfelipe.com, 1 @@ -106749,6 +106881,7 @@ nyaone-object-storage.com, 1 nyap.org, 0 nyatane.com, 1 +nyau.me, 1 nyawau.ch, 1 nyawork.com, 1 nyb.agency, 1 @@ -106790,7 +106923,6 @@ nymanelectric.com, 1 nymbus.com, 1 nymtc.org, 1 -nynadynasir.my.id, 1 nyoka-nodejs.com, 1 nyoka-react.com, 1 nyoka.io, 1 @@ -106844,7 +106976,6 @@ nzbnoob.com, 1 nzbr.de, 1 nzbs.moe, 1 -nzbstars.com, 1 nzcorp.dk, 1 nzdata.org, 1 nzelaweb.com, 1 @@ -106941,16 +107072,17 @@ oakesfam.net, 1 oakey.uk, 1 oakface.com.au, 1 +oakfarmsdairy.com, 1 oakharbor.gov, 1 oakhill.com, 0 oakhillfl.gov, 1 oakhillseniors.com, 1 oakislandnc.gov, 1 +oaklab.hu, 1 oaklandenrolls.org, 1 oaklandfire6.com, 1 oaklandnewsonline.com, 1 oaklawn.com, 1 -oakparkelectrical.com, 1 oakrealty.ca, 1 oakridgeclinic.ca, 1 oakshield.nl, 1 @@ -106987,6 +107119,7 @@ obarax.com, 1 obatjantungrematik.tk, 1 obbr.tk, 1 +obcanskeshromazdeni.cz, 1 obcfl.com, 1 obcina.com, 1 obclub.tk, 1 @@ -107022,7 +107155,6 @@ obfc.me, 1 obg-global.com, 1 obg.ceo, 1 -obgalslancaster.com, 1 obgynecologistnyc.com, 1 obgynqueensnyc.com, 1 obhg.com, 1 @@ -107037,6 +107169,7 @@ obj.moe, 1 object.earth, 1 objectcache.pro, 1 +objectif-bastille.com, 1 objectif-securite.ch, 1 objectif-vancouver-2010.fr, 1 objectifs-fitness.com, 1 @@ -107044,6 +107177,7 @@ objectivefoodie.com, 1 objectiveone.com, 1 objectivity.co.uk, 1 +objectoneworld.com, 1 objetodestaque.com.br, 1 obl.ong, 1 oblak.host, 1 @@ -107051,6 +107185,7 @@ oblat.lv, 1 oblique.security, 1 oblitsov.ru, 1 +oblivionsearch.com, 1 oblivious.ml, 1 oblojka.tk, 1 obmen-viz.tk, 1 @@ -107094,7 +107229,6 @@ obss.tech, 1 obstgarten.berlin, 1 obsuzhday.com, 1 -obsyk.ai, 1 obtainhigh.com, 1 obtima.org, 1 obuchowicz.pl, 1 @@ -107114,9 +107248,9 @@ obzor-znakomstv.tk, 1 obzory-evgeny.tk, 1 oc-minecraft.com, 1 -ocab.se, 1 ocabj.net, 1 ocacnews.net, 1 +ocadefusion.fr, 1 ocaladepositionreporter.com, 1 ocalafl.gov, 1 ocalapd.gov, 1 @@ -107235,7 +107369,6 @@ oconnoradv.com, 1 ocontocountywi.gov, 1 ocotg.com, 1 -ocpatentlawyer.com, 1 ocponj.gov, 1 ocprintgraphics.gov, 1 ocqueoctwpmi.gov, 1 @@ -107353,7 +107486,6 @@ odico.dk, 1 odifi.com, 1 odigitalmarketing.com.br, 1 -odigo.com, 0 odijmond.nl, 1 odinpl.com, 1 odinraz.ga, 1 @@ -107385,7 +107517,7 @@ oduncum.net, 1 odunpazari.bel.tr, 1 odvdigital.com, 1 -odyso.org, 1 +odxin.com, 1 odyssee-animation.tk, 1 odyssey44.com, 1 odyssy.tech, 1 @@ -107415,7 +107547,6 @@ oelsner.net, 1 oemdealsers.ga, 1 oemdrink.com, 1 -oemparcacim.com, 1 oemspace.net, 1 oen.tw, 1 oeno.link, 1 @@ -107437,7 +107568,6 @@ ofallonil.gov, 1 ofallonmo.gov, 1 ofasoft.com, 1 -ofb.uz, 1 ofbdc.org.au, 1 ofcampuslausanne.ch, 0 ofcr.co.jp, 1 @@ -107470,9 +107600,7 @@ offers.jp, 1 offgamers.com, 1 offgrid.hr, 1 -offgridauto.com, 1 office, 1 -office-addins.com, 1 office-aslabo.com, 1 office-basilique.notaires.fr, 1 office-de-tourisme.net, 0 @@ -107528,6 +107656,7 @@ offpages.gq, 1 offpages.ml, 1 offpageseopro.tk, 1 +offrex.eu, 1 offshoot.rentals, 0 offshore-technology.com, 1 offshore.hosting, 1 @@ -107572,6 +107701,7 @@ oftn.org, 1 ofuquemalitaestoy.tk, 1 oga.fit, 0 +ogamedb.com, 1 ogamerezine.tk, 1 ogar.ga, 1 ogarkovo.ml, 1 @@ -107601,7 +107731,6 @@ ogorod-money.tk, 1 ogot.org, 1 ogradylake.ca, 1 -ogrencimerkezi.org, 1 ogrenciyurtlari.tk, 1 ogretmenimsanat.com, 0 ogrod.krakow.pl, 1 @@ -107612,6 +107741,7 @@ ogyaa.jp, 0 oh14.de, 1 oh64.moe, 1 +ohackermascarado.org, 1 ohai.is, 1 ohai.social, 1 ohai.su, 1 @@ -107664,7 +107794,6 @@ ohvoice.com, 1 ohwatch.co.za, 1 ohwowlash.com, 1 -ohydne.pl, 1 ohyooo.com, 1 ohype.ga, 1 ohype.gq, 1 @@ -107688,7 +107817,6 @@ oirnoir.gq, 1 oirnoir.ml, 1 ois.dk, 1 -oisabre.com, 1 oisd.nl, 1 oiseaux-mania.com, 1 oiseauxdesjardins.tk, 1 @@ -107709,6 +107837,7 @@ ojp.gov, 1 ok-ise.com, 1 ok-travel.tk, 1 +ok.med, 1 ok.ru, 1 ok2a.org, 1 ok3on.cz, 1 @@ -107745,9 +107874,9 @@ okemahok.gov, 1 okgun.co, 1 okhanvatansever.tk, 1 +okhelp.org, 1 okib.ca, 1 okiefrog.org, 1 -okinawa-mag.net, 1 okinawa-seaside.com, 1 okinext.com, 1 okiram.net, 1 @@ -107790,7 +107919,6 @@ oksafe-t.org, 1 oksanakazakova.tk, 1 oksentiuk.pp.ua, 1 -oksichemk.com, 0 okskoleni.cz, 1 oksystem.cz, 1 oktava.tk, 1 @@ -108043,7 +108171,6 @@ olxdir.tk, 1 oly.st, 1 olyfed.com, 1 -olymp-arts.world, 1 olympe-transport.fr, 1 olympia-blerick.tk, 1 olympia-londerzeel.tk, 1 @@ -108100,6 +108227,7 @@ omb.gov.ph, 1 ombrazur.fr, 1 ombregialle.it, 1 +ombudscommissies-hertogenbosch.nl, 1 omc-copiers.com, 1 omcg.de, 1 omd.com, 1 @@ -108142,10 +108270,8 @@ omkarpathak.in, 1 omlpar.gov, 1 omm.com, 1 -ommam.com.br, 1 omn.cc, 1 omnel.ml, 1 -omnepresent.com, 1 omnergy.au, 1 omnergy.com.au, 1 omnergy.net, 1 @@ -108163,7 +108289,6 @@ omnical.ru, 1 omnicommediagroup.com, 1 omniconvert.com, 1 -omnicourt.jp, 1 omnidiecasting.com, 1 omniflex.au, 1 omniflex.cn, 1 @@ -108178,6 +108303,7 @@ omnifotoside.tk, 1 omniga.de, 1 omnilert.net, 1 +omnirealm.tech, 1 omnirecherche.nl, 1 omniscimus.net, 0 omnisiens.se, 1 @@ -108245,7 +108371,6 @@ onawaymi.com, 1 onbettertech.com, 1 onbley.com.br, 1 -onboardittech.com, 1 onboardti.com.br, 1 onboat-seminars.com, 1 onbrand.me, 1 @@ -108256,7 +108381,6 @@ oncentive.io, 1 onceuagain.tk, 1 onceuponabow.org, 1 -onceuponarainbow.co.uk, 1 onchclub.tk, 1 onclouds.tech, 1 onco-grandest.fr, 1 @@ -108271,7 +108395,9 @@ ondeck.com.au, 1 ondemandassociate.com, 1 onderka.com, 1 +onderneembaar.nl, 1 ondernemenindenbosch.nl, 1 +ondernemeninshertogenbosch.nl, 1 onderzoeksraad.nl, 1 ondevamosjantar.com, 1 ondiet.biz, 1 @@ -108296,7 +108422,6 @@ one3oneapartments.com, 1 oneaftac.gov, 1 oneandfree.org.au, 1 -oneanime.cn, 1 oneartyminute.com, 1 onebanc.ai, 1 onebelo.tk, 1 @@ -108307,6 +108432,7 @@ onebreadcrumb.com, 1 onebreadcrumb.com.au, 1 onecarsource.com, 1 +onecashye.com, 1 onecauseuk.org, 1 onecellatatime.org, 1 onecharge.biz, 1 @@ -108352,7 +108478,6 @@ onegeology.org, 1 oneggiri.com, 1 onegift.bg, 1 -onehealthbehaviors.org, 1 oneheartbali.church, 0 onehost.kz, 0 oneidacityny.gov, 1 @@ -108429,7 +108554,6 @@ onetouchreveal.it, 1 onetouchtour.com, 1 onetown.gq, 1 -onetranslations.com.br, 0 onetrust.com, 1 onetwentyseven001.com, 1 onetwo-vermietung.de, 1 @@ -108523,6 +108647,7 @@ online-lernprogramme.de, 1 online-mobile-phone-shop.tk, 1 online-news-usa.tk, 1 +online-personaltrainer.com.au, 1 online-pochta.ml, 1 online-pr.at, 1 online-shop-equipment.tk, 1 @@ -108530,7 +108655,9 @@ online-store-phones.tk, 1 online-taxes.tk, 1 online-tesis.com, 1 +online-textil.com, 1 online-textil.cz, 1 +online-textil.sk, 1 online-umwandeln.de, 1 online-video-cutter.com, 1 online-voice-recorder.com, 1 @@ -108544,7 +108671,6 @@ online365.ga, 1 onlineaccess.io, 1 onlinebathrooms.ie, 1 -onlinebettingacademy.com, 1 onlinebiller.com, 1 onlinebillingform.com, 1 onlinebookmarks.tk, 1 @@ -108615,6 +108741,7 @@ onlinepaydayloans365.tk, 1 onlineplay.ml, 1 onlinepokieau.net, 1 +onlinepokies.me, 1 onlineprojects.in, 1 onlineradio.com.pl, 1 onlineradio.pp.ua, 1 @@ -108630,7 +108757,6 @@ onlineseminar.nl, 1 onlineservisprogrami.com, 1 onlineshopsatkhira.tk, 1 -onlinesim.com, 1 onlinesitereviews.com, 1 onlinesloten.nl, 1 onlinesorusor.cf, 1 @@ -108743,23 +108869,22 @@ ontariopropertybuyers.com, 1 ontarioreporting.com, 1 ontariostorage.com, 1 -ontdekhetzelf.nu, 1 +ontdekhetzelf.nu, 0 ontestpad.com, 1 onthe.network, 1 ontheballbuilding.com.au, 1 -onthegosystems.com, 1 onthemend.com, 1 onthesocials.com.au, 1 onthisday.com, 1 ontimeemergencyroadsideandbatteryservice.com, 1 ontogenese.net, 1 ontopoflove.nl, 1 +ontora.ee, 1 ontourmarketing.at, 1 ontreams.com, 1 ontrio.cz, 1 ontrip.dk, 1 ontrip.kr, 1 -ontruck.org, 1 ontscore.com, 1 ontsnappingskamer.nl, 1 onttt.com, 1 @@ -108809,7 +108934,6 @@ ooo.xxx, 1 oooaltera.ru, 1 oooh.events, 1 -oooir.ru, 1 ooonja.de, 1 oooo.loan, 1 ooooo.cz, 1 @@ -108851,7 +108975,6 @@ opdi.aero, 1 ope.ee, 1 opeixinho.com.br, 1 -opel-focken.de, 0 opelim.net, 1 open-banking-access.uk, 1 open-bs.com, 1 @@ -108897,7 +109020,6 @@ openbeecloud.com, 1 openbible.com.au, 1 openbiblebookstore.com.au, 1 -openbleam.com, 1 openblink.biz, 1 openblink.org, 1 openblox.org, 1 @@ -108944,7 +109066,7 @@ openhandhelds.org, 1 openhisto.com, 1 openhistory.de, 1 -openhome.com.co, 1 +openhome.com.co, 0 openhousemelbourne.org, 1 openhwgroup.cn, 1 openhwgroup.org, 1 @@ -108968,7 +109090,6 @@ openmdm.eu, 1 openmdm.org, 1 openmind.ga, 1 -openmindonline.it, 1 openmindsec.com, 1 openmirrors.cf, 1 openmirrors.ml, 1 @@ -108994,7 +109115,6 @@ openreplay.com, 1 openresa.com, 1 openresearch.amsterdam, 1 -openreview.net, 1 openroademail.com, 1 openrtm.org, 1 openscience.ml, 1 @@ -109188,7 +109308,7 @@ optik-sehstern.de, 0 optik-tamara.de, 1 optik-trosdorff.de, 1 -optikabane.com, 1 +optikabane.com, 0 optikflow.com, 1 optikoscolombia.com, 1 optilan.tk, 1 @@ -109208,6 +109328,7 @@ optimisedlabs.uk, 1 optimization-online.org, 1 optimizationanalyticsest.ga, 1 +optimizatunomina.es, 1 optimize-jpg.com, 1 optimizedlabs.co.uk, 1 optimizedlabs.info, 1 @@ -109358,6 +109479,7 @@ orbit.church, 1 orbita.zp.ua, 1 orbitaclub.cf, 1 +orbital8.com.au, 1 orbitalcommerce.com.br, 0 orbitdefence.co.uk, 1 orbitfab.com, 1 @@ -109378,6 +109500,7 @@ orcas.tk, 1 orcasecurity.io, 1 orchardnh.org, 1 +orchardpure.com, 1 orchestra.tk, 1 orchestremetropolitain.com, 1 orchidee-mariage.com, 1 @@ -109425,7 +109548,6 @@ ordner.tk, 1 ordoptimisten.se, 1 ordoro.com, 1 -ordr.net, 1 ordr.no, 1 ordremk.fr, 1 orduhaberleri.tk, 1 @@ -109449,7 +109571,6 @@ orel-news.net, 1 orel-sait.tk, 1 orel.ga, 1 -orel.se, 1 orelblog.tk, 1 orelnet.tk, 1 orem.gov, 1 @@ -109486,15 +109607,17 @@ organicossuliani.com.br, 1 organicpoint.in, 1 organicrootsfestival.tk, 1 -organicsearcher.com, 1 organictanningest.ga, 1 organisatieteam.nl, 1 +organisemyday.in, 1 organist.de, 1 organizacasa.com.br, 0 organizalpha.com, 1 +organizar360.com.br, 1 organizasyon.tk, 1 organizasyonbul.com, 1 organization-of-holidays.tk, 1 +organized.cooking, 1 organizedrhyme.tk, 1 organizewithmarie.com, 1 organo.pk, 1 @@ -109572,7 +109695,6 @@ oris.edu.ee, 1 orisline.com, 1 oritain.com, 1 -orito-hifuka.com, 1 oriveda.com, 1 orix.com.au, 1 oriya-hrs.com, 0 @@ -109584,6 +109706,7 @@ orkestron.com, 1 orkiv.com, 0 orkkikerho.tk, 1 +orkomedia.com, 1 orland.tk, 1 orlandgo.com, 1 orlandhillspdil.gov, 1 @@ -109594,6 +109717,7 @@ orleika.ml, 1 orlowisko.pl, 1 ormondcatclinic.com, 1 +ormsson.is, 1 ornc.org, 1 ornikar.com, 1 ornithopter.tk, 1 @@ -109606,7 +109730,6 @@ orocojuco.com, 1 oroconews.com.br, 1 orodelsalento.com, 1 -oroeditions.com, 1 orologeria.roma.it, 1 orologi.roma.it, 1 oronomn.gov, 1 @@ -109652,6 +109775,7 @@ ortiatuttogas.it, 1 ortigasmalls.com, 1 ortigueira.ga, 1 +ortizbotellaabogados.es, 1 ortizmario.com, 1 ortocity.com.br, 1 ortocraft.tk, 1 @@ -109700,6 +109824,7 @@ osamatoon.ml, 1 osandp.com, 1 osankj.tk, 1 +osano.ai, 1 osano.com, 1 osano.id, 1 osarahealth.com, 1 @@ -109797,6 +109922,7 @@ oslinux.net, 1 oslo-kammerorkester.no, 1 oslofjorden.org, 1 +oslogreenbelt.no, 1 osm.is, 1 osmaniyehaber.tk, 1 osmanlitakilari.tk, 1 @@ -109842,7 +109968,6 @@ ostankino.tk, 1 ostechnix.com, 1 ostek.tk, 1 -ostendorf.com, 1 osteolaclusaz.com, 0 osteopathe-voisine.com, 1 osteopatiaymasaje.com, 1 @@ -109865,7 +109990,6 @@ ostrovseocitra.ga, 1 ostrovseocitra.gq, 1 ostrovseocitra.ml, 1 -ostrovsky-web.de, 1 ostseebad-sellin.de, 1 osttopst.online, 1 osuarez3.com, 1 @@ -109884,13 +110008,11 @@ oswestrysff.co.uk, 1 oswmlab.com, 1 osworx.net, 1 -oszteralexandra.hu, 1 ot-honfleur.fr, 1 ot-vinta.tk, 1 ot.id, 1 otaikajang.org, 1 otako.pl, 0 -otaku-treasure.com, 1 otakubox.de, 1 otakucloud.net, 0 otakuie.tk, 1 @@ -109997,6 +110119,7 @@ ouipharma.fr, 1 oujj.link, 1 ouldlamara.tk, 1 +oulmes.ma, 1 oulunjujutsu.com, 1 ouminews.net, 1 oumlaut.net, 1 @@ -110031,6 +110154,7 @@ ourladyqop.org, 0 ourladyqueenofmartyrs.org, 1 ourlink.tk, 1 +ourlittlejoys.com, 1 ourlocality.org, 1 ourmarket.live, 1 ourmuktsarsaheb.in, 1 @@ -110044,7 +110168,6 @@ ourplanetary.com, 1 oursibparksplan.com, 1 oursmartcity.au, 1 -oursportscentral.com, 1 ourstory.rip, 1 oursweb.com, 1 oursweb.net, 1 @@ -110131,7 +110254,6 @@ outworking.com, 1 ouverture-coffre-fort.fr, 1 ouvindo.com.br, 1 -ouvrierbtp.com, 1 ouwerling.tk, 1 ovabastecedoraindustrial.com, 1 ovalle.tk, 1 @@ -110266,6 +110388,7 @@ owlbee.it, 1 owlbee.nl, 1 owlbee.uk, 1 +owlchess.com, 1 owldevelopers.tk, 1 owlhollowbakery.com, 1 owllee.com, 1 @@ -110350,7 +110473,6 @@ oxydac.com, 1 oxydrate.com, 1 oxygames.tk, 1 -oxygen.com, 1 oxygenated.cf, 1 oxygenforchennai.com, 1 oxygenupdater.com, 1 @@ -110374,7 +110496,6 @@ oyaptcdsb.com, 1 oyaquelegal.com.br, 1 oyemobile.ca, 1 -oyemobile.com, 1 oyk13tyuj8ljpete31edj2tes-9if7bi.com, 0 oyo.moe, 1 oyoshi.com.my, 1 @@ -110416,6 +110537,7 @@ ozgesezen.com, 1 ozgoz.com, 1 ozgpp.de, 1 +ozgurbilge.com, 1 ozgurbozkurt.com, 1 ozgurgokmen.net, 1 ozgurkazancci.com, 1 @@ -110477,6 +110599,7 @@ p333b.net, 1 p333e.net, 1 p333j.net, 0 +p35consulting.com, 1 p36533.com, 1 p4.pm, 1 p4c-admin.azurewebsites.net, 1 @@ -110540,7 +110663,6 @@ pabloarteaga.xyz, 1 pablocamino.tk, 1 pablocelorio.com, 1 -pablodominio.sbs, 1 pablofain.com, 0 pablofonta.es, 1 pablogracia.es, 1 @@ -110578,6 +110700,7 @@ pachamamita.eu, 1 pachetomat.ro, 1 pachinstyle.com, 1 +pachuta.pl, 1 paciella.com, 1 pacificaent.net, 1 pacificbags.com.au, 1 @@ -110596,7 +110719,7 @@ pacificpalisadeslandscapelighting.com, 1 pacificprivatebank.com, 1 pacificpuke.com, 1 -pacificscience.com, 1 +pacificscience.com, 0 pacificstates.net, 1 pacifictechnologie.com, 1 pacifique-web.nc, 1 @@ -110647,7 +110770,7 @@ pacteo.com, 1 pactf-flag-4boxdpa21ogonzkcrs9p.com, 1 pactf.com, 1 -pactnetwork.com.au, 0 +pactnetwork.com.au, 1 pactum.com, 1 pactumdr.com.au, 1 pacxodka.ru, 1 @@ -110699,7 +110822,6 @@ padutip.cz, 1 padutip.eu, 1 paduwitze.de, 1 -padzilla.com, 1 pae.com, 1 paegae.gr, 1 paerbikes.com, 1 @@ -110745,7 +110867,6 @@ pageuppeople.com, 1 pagevitals.com, 1 pagewizz.com, 1 -pagexl.com, 1 pagiamtzis.com, 1 pagina394.com.br, 1 paginamaravillosa.tk, 1 @@ -110809,6 +110930,7 @@ paisa-dev.azurewebsites.net, 1 paisagia.com, 1 paisagia.com.br, 1 +paisano-online.com, 1 paisley.is, 1 paisleyandsparrow.com, 1 paistation.ch, 1 @@ -110827,6 +110949,7 @@ paketwisataliburan.com, 1 pakeystonesaves.gov, 1 pakeystonescholars.gov, 1 +pakfactory.com, 1 pakforces.tk, 1 pakho.xyz, 1 pakingas.lt, 1 @@ -110854,6 +110977,7 @@ paksui-ne.tk, 1 pakun.org, 1 palabr.as, 1 +palabrapp.com, 1 palaceitalia.tk, 1 palacezamkidwory.com, 1 paladin.wtf, 1 @@ -110981,7 +111105,6 @@ pana4ucloud.ddns.net, 1 panaceainfosec.com, 1 panaceallc.net, 1 -panama-listings.com, 1 panamacity.gov, 1 panamacitypolice.gov, 1 panamatravel.tk, 1 @@ -111019,6 +111142,7 @@ pancake-world.com, 1 pancake.gg, 1 panchajanyafashions.com, 1 +panchaminteriors.com, 1 panda-bg.com, 1 panda-community.com, 1 panda-craft.tk, 1 @@ -111038,6 +111162,7 @@ pandamoto.fr, 1 pandaplanes.com, 1 pandapsy.com, 1 +pandascrow.io, 1 pandasilk.com, 1 pandavpn.pro, 1 pandavpnpro.com, 1 @@ -111074,6 +111199,7 @@ panele-fotowoltaiczne.pl, 1 paneljobsers.ga, 1 panelsandwich.com, 1 +panerusan.desa.id, 1 paneu.de, 1 panezai.tk, 1 pang.ga, 1 @@ -111206,6 +111332,7 @@ papel.az, 1 papelcraft.co.uk, 1 papeleo.digital, 1 +papeleria-tecnica.net, 1 papeleriayasesorias.com.co, 1 papelisimo.es, 1 paper.aero, 1 @@ -111232,7 +111359,6 @@ papierowyrycerz.pl, 1 papillomatest.com, 1 papillon-events.be, 1 -papkinadochka.ru, 1 paplajsoftware.com, 1 papotage.net, 1 papouille.ml, 1 @@ -111242,7 +111368,7 @@ pappys.kitchen, 1 papuaone.com, 0 papuzkija.pl, 1 -papygeorges.fr, 1 +papygeorges.fr, 0 paqtam.com, 1 par-allel.ru, 1 parabellum-barakaldo.tk, 1 @@ -111274,6 +111400,7 @@ paradiselost.com, 0 paradisemassagenj.com, 1 paradisend.tk, 1 +paradisepdf.com, 1 paradisetownshipmi.gov, 1 paradisim.tk, 1 paradisu.fr, 1 @@ -111312,8 +111439,8 @@ paranoid.is, 1 paranoidandroid.co, 1 paranoidandroid.tk, 1 +paranoidhome.net, 1 paranoidpengu.in, 1 -paranoidpenguin.net, 1 paranormales.tk, 1 paranoxer.hu, 1 paranoxido.tk, 1 @@ -111342,7 +111469,6 @@ parc.com, 1 parcare.at, 1 parcbotanique.com, 1 -parcdumbravaminunata.ro, 1 parceirofinanceiro.pt, 1 parcelauditpartners.com, 1 parceltrackr.com, 1 @@ -111365,6 +111491,7 @@ parenthaven.com, 1 parentingplaydough.tk, 1 parentinterview.com, 1 +parentpay.com, 1 parentpayments.com.au, 1 parents-as-allies.com, 1 parentsandzebrasunited.com, 1 @@ -111374,6 +111501,7 @@ pareto.space, 1 paretoit.com, 1 paretorule.cf, 1 +paretox.com, 1 parfin.io, 1 parfum-best.ml, 1 parfumer.tk, 1 @@ -111384,7 +111512,6 @@ pari-vinci.org, 1 pari.cafe, 1 pari.cz, 1 -paribus.io, 1 parichadrelax.se, 1 parideal.com, 1 parideal.de, 1 @@ -111392,12 +111519,10 @@ paridurable.com, 1 parikmag-pm.ru, 1 parikmaxeru.tk, 1 -parimatch-best.com, 1 parimatch-chance.com, 1 parimatch-email.com, 1 parimatch-sport.com, 1 parimatch-sports.com, 1 -parimatch-world.com, 1 parimatch.co.tz, 1 parimatch.com, 1 parimatch.in, 1 @@ -111409,7 +111534,6 @@ paripesa.com, 1 paripesa.ng, 1 paris-avenues.com, 1 -paris-elysees.com, 0 paris-luttes.info, 1 paris.edu, 1 parisa-panahi.com, 1 @@ -111424,6 +111548,7 @@ parisdimitriou.com, 1 parisdomino.tk, 1 parisereporters.com, 1 +parishofcove.org.uk, 1 parishoftheholycross.org, 1 parishome.jp, 1 parismalleg.com, 1 @@ -111453,6 +111578,7 @@ parked.com.br, 1 parkeer.nl, 1 parkeergaragesintjan.nl, 1 +parkeergaragest-jan.nl, 1 parkeergaragestjan.nl, 1 parkeerserviceboxtel.nl, 1 parkefficient.de, 0 @@ -111592,7 +111718,6 @@ partin.nl, 0 partiono.com, 1 partir-en-livre.fr, 1 -partisaani.com, 1 partisan-berlin.tk, 1 partituras.tk, 1 partner-finden.tk, 1 @@ -111650,6 +111775,7 @@ partykanal.cz, 1 partymat.de, 1 partymusikband.de, 1 +partyonbici.com, 1 partypearl.de, 1 partypeeps.tk, 1 partyphoto.tk, 1 @@ -111724,6 +111850,7 @@ passfoto-deinfoto.ch, 1 passgator.com, 1 passieposse.nl, 1 +passings.io, 1 passion-billard.fr, 1 passion-net.fr, 1 passionatefoodie.co.uk, 1 @@ -111760,7 +111887,7 @@ passware.com, 1 passwd.one, 1 password-checker.de, 1 -password.codes, 1 +password.codes, 0 password.consulting, 1 password.town, 1 passwordass.org, 1 @@ -111794,6 +111921,7 @@ pasternak.net, 1 pasternok.org, 1 pasteros.io, 1 +pasters.wtf, 1 pasteworks.com, 1 pasticceria.milano.it, 1 pasticcerialorenzetti.com, 1 @@ -111803,7 +111931,6 @@ pastor.icu, 1 pastorbelgagroenendael.com.br, 1 pastorcanadense.com.br, 1 -pastordin.us, 1 pastordocaucaso.com.br, 1 pastorello.cf, 1 pastorello.ga, 1 @@ -111831,7 +111958,7 @@ patchassociates.com, 1 patchli.fr, 1 patchofabsence.com, 1 -patchstack.com, 0 +patchstack.com, 1 patchyvideo.com, 1 patdorf.com, 1 patechmasters.com, 1 @@ -111854,6 +111981,7 @@ pathofexile2.com, 0 pathogen.nl, 1 pathologie-dna.nl, 1 +pathos.gg, 1 pathpartnertech.com, 1 pathsaversers.ga, 1 pathsaversest.ga, 1 @@ -111865,7 +111993,6 @@ patientdesk.ai, 1 patientenverfuegung.digital, 1 patientjourneyapp.com, 0 -patientspaid.com, 1 patientup.com, 1 patientys.com, 1 patiga.ga, 1 @@ -111920,7 +112047,6 @@ patrikjohan.gq, 1 patrikjohan.tk, 1 patriksima.cz, 1 -patrikx3.com, 1 patrimoine-neuwiller.fr, 0 patrimoniumtouraine.com, 1 patriotbearingsupply.com, 1 @@ -111999,7 +112125,6 @@ paulmilligan.co.uk, 1 paulmolloy.guitars, 1 paulmolloydesign.com, 1 -paulmurraycleaningservices.ie, 1 paulo.nom.za, 1 pauloalcalde.co, 1 pauloalcobianeves.pt, 1 @@ -112063,6 +112188,7 @@ pavelstriz.cz, 1 pavementpr.com, 1 paven.io, 0 +paverlaunch.com, 1 pavernosmatao.tk, 1 pavestone.co.uk, 1 pavilion-bukitjalil.com, 1 @@ -112215,6 +112341,7 @@ paymentaccuracy.gov, 1 paymentap.co.uk, 1 paymentjs.com, 1 +paymentportaldev.io, 1 paymentportaldevopslocal.io, 1 payments.google.com, 1 paymeservice.com, 1 @@ -112226,6 +112353,7 @@ paynode.com, 1 payonline-api.xyz, 1 payop.com, 1 +payorth.com, 1 paypac.biz, 1 paypac.co.nz, 1 paypac.co.uk, 1 @@ -112250,6 +112378,7 @@ payroll.ch, 0 payroll.myftp.org, 1 payrollaustralia.au, 1 +payrollbridge.co.uk, 1 payrollconstructionservices.com, 1 payrollhr.be, 1 payrolloutsourcing.com.au, 1 @@ -112292,17 +112421,18 @@ pb.ax, 0 pbaby.com, 1 pback.se, 1 -pband.ch, 1 pbbm.com.ph, 1 pbc.gov, 1 pbcables.tk, 1 pbcknd.ml, 1 pbcpao.gov, 1 pbcu.com, 1 +pbebank.com, 1 pbern.xyz, 1 pbest.tk, 1 pbforestry.net, 1 pbgfl.gov, 1 +pbgroup.hu, 1 pbhs.co.uk, 1 pbiexplorer.com, 1 pbla.biz, 1 @@ -112324,7 +112454,6 @@ pbz.im, 1 pc-center.tk, 1 pc-construction.fr, 1 -pc-mac.de, 1 pc-master.pl, 1 pc-pharma.com, 1 pc-reanimator.ru, 1 @@ -112395,6 +112524,7 @@ pcnaid.com, 1 pcnewsoft.tk, 1 pcnotdienst-oldenburg-rastede.de, 1 +pcosworkoutplan.com, 1 pcpao.gov, 1 pcpartspicker.in, 1 pcpasokh.ir, 1 @@ -112408,6 +112538,7 @@ pcrab.ml, 1 pcrecovery.ga, 1 pcrla.com, 1 +pcrobot.cz, 1 pcrypt.org, 1 pcsafe.cf, 1 pcsbrasil.ml, 1 @@ -112445,6 +112576,7 @@ pdau.edu.ua, 1 pdavislawgroup.com, 1 pdax.ph, 0 +pdb-group.co.uk, 1 pdcs.nl, 1 pderas.com, 1 pdesinc.org, 1 @@ -112482,6 +112614,7 @@ pdtppfl.gov, 1 pdvault.co, 1 pdxcoinclub.org, 1 +pdxretro.com, 1 pdxroofingandsiding.com, 1 pdz.net, 1 pe-bank.jp, 1 @@ -112529,7 +112662,6 @@ pearle.nl, 1 pearlharbordrydockeisopenhouse.org, 0 pearljamargentina.tk, 1 -pearloc.com, 1 pearlsonly.ca, 1 pearlsonly.com, 1 pearlsonly.com.au, 1 @@ -112555,6 +112687,7 @@ pec.net, 1 pecadis.de, 1 pecan.ai, 1 +pecanplantationland.com, 0 pecasse.be, 0 pecetowicz.pl, 1 pecheneg.tk, 1 @@ -112563,7 +112696,6 @@ pecker-johnson.com, 1 pecmd.net, 1 pecs.com, 1 -pecsusa.com, 1 pect.com.pk, 1 pectusbar.com, 1 ped-bike.de, 1 @@ -112602,7 +112734,6 @@ pedrosaurus.com, 1 pedrosillo-delosaires.tk, 1 pedrotimoteo.com, 1 -peduse.com, 1 peekabooboudoir.com, 1 peekier.com, 1 peekit.ai, 1 @@ -112613,7 +112744,9 @@ peene.be, 1 peenee.in.th, 1 peenor.xyz, 1 +peep.gq, 1 peeptalk.dk, 1 +peeqback.com, 1 peer.travel, 1 peerbearing.com, 1 peerberry.com, 1 @@ -112676,7 +112809,7 @@ peihouston.com, 1 peippo.at, 1 peirong.me, 1 -pejetroperformance.com.br, 1 +pejetroperformance.com.br, 0 pejupiel.com, 1 pekarnasazava.cz, 1 pekarskis.com, 1 @@ -112723,6 +112856,7 @@ pelmeni.cf, 1 pelmeniuralskie.tk, 1 pelo.tk, 1 +peloduro.cl, 1 pelopoplot.com, 0 pelosanimais.org, 1 peloton-technologies.com, 1 @@ -112772,7 +112906,6 @@ pengisatelier.net, 1 pengu.us.kg, 1 pengui.uk, 1 -penguin-stats.cn, 1 penguin-stats.io, 1 penguinclientsystem.com, 1 penguindominatrix.com, 1 @@ -112977,7 +113110,6 @@ peredovaya.tk, 1 peredoz.tk, 1 pereezd.ml, 1 -peregorodka77.ru, 1 peregrinefund.org, 1 peregrinus.es, 1 pereiravillela.com.br, 1 @@ -113049,6 +113181,7 @@ performing-art-schools.com, 1 performingdreams.tk, 1 performive.com, 1 +performx.me, 1 perfumerie.tk, 1 perfumes.com.br, 1 perfumesweb.com.br, 1 @@ -113123,6 +113256,7 @@ permis-apoints.fr, 1 permis.online, 1 permiscoderoute.fr, 1 +permisecole.com, 1 permistheorique.be, 1 permistheoriqueenligne.be, 1 permitting.gov, 1 @@ -113163,8 +113297,8 @@ persianasmodernasluxury.com, 1 persiandating.tk, 1 persianmassagetherapy.com, 1 -persianpool.ir, 1 persianrom.com, 1 +persianwithel.com, 1 persiart.shop, 1 persiennexperten.se, 1 persistence.one, 1 @@ -113172,7 +113306,7 @@ persjrp.ca, 1 perso.pl, 1 persoform.ch, 1 -personacommunications.com.au, 0 +personacommunications.com.au, 1 personal-genome.com, 1 personal-scrum.de, 1 personal-scrum.eu, 1 @@ -113195,6 +113329,10 @@ personalpages.us, 1 personalstructures.com, 1 personaltrainer-senti.de, 1 +personaltrainerdarwin.com.au, 1 +personaltraineressendon.com.au, 1 +personaltrainergeelong.com.au, 1 +personaltrainerportmelbourne.com.au, 1 personaltransporter.es, 1 personalwebsite.services, 1 personcar.com.br, 1 @@ -113214,6 +113352,7 @@ persuasionmatters.com, 1 perthdayhospital.com.au, 1 perthhillsarmadale.com.au, 1 +perthpainspecialists.com.au, 1 perthunicyclists.tk, 1 perthweekend.com.au, 1 pertwarp.tk, 1 @@ -113314,6 +113453,7 @@ petcolor.ga, 1 petcounty.ga, 1 petcrawler.ga, 1 +petdairy.com, 1 petdesign.tk, 1 petdesigning.ga, 1 petdir.ga, 1 @@ -113401,7 +113541,6 @@ petit-bebe.fr, 1 petitbleu.fr, 1 petite-annonce.tk, 1 -petite-maison.ch, 0 petitenote.ch, 1 petitions.by, 1 petitions.pro, 1 @@ -113454,8 +113593,8 @@ petrobench.com, 1 petrochemprojects.ga, 1 petrol-power.tk, 1 -petrol.com.ua, 1 petroleum-schools.com, 1 +petroleumacronyms.com, 1 petroleumservicecompany.com, 1 petroll.ga, 1 petropoulos.ng, 1 @@ -113538,7 +113677,6 @@ pfannkuchenbratze.de, 1 pfarchimedes-pensioen123.nl, 1 pfarr-rad.de, 1 -pfarreiengemeinschaft-neuerburg.de, 1 pfarrhaus-mon.ch, 1 pfashionmart.com, 1 pfaswatersettlement.com, 1 @@ -113649,6 +113787,7 @@ phantomware.tk, 1 pharma-insights.nl, 0 pharma-management.net, 1 +pharma-synergy.hu, 1 pharmaabsoluta.com.br, 1 pharmabach.com, 1 pharmaboard.de, 1 @@ -113664,6 +113803,7 @@ pharmacy.org.pk, 1 pharmacycouncil.org.nz, 1 pharmacyevalar.ru, 1 +pharmacyregulation.org, 1 pharmadrugtest.com, 1 pharmakeia.com, 1 pharmalab.eu, 1 @@ -113725,7 +113865,6 @@ phialo.de, 1 phibureza.com, 1 phigrupopolideportivo.es, 0 -phihq.com, 0 phil-dirt.com, 1 phil-phillies.com, 1 phil.red, 1 @@ -113796,6 +113935,7 @@ phillyhometech.com, 1 phillyinjurylawyer.com, 1 philmontphotography.com, 1 +philna.sh, 1 philographie.com, 1 philology.tk, 1 philomathiclife.com, 1 @@ -113804,6 +113944,7 @@ philosophers.tk, 1 philosopherswool.com, 1 philosophy-colleges.com, 1 +philosophy.moe, 1 philosophyguides.org, 1 philosophyofatheism.com, 1 philphonic.de, 1 @@ -113851,6 +113992,7 @@ phoenixville.online, 1 phol.io, 1 pholder.com, 1 +pholio.ai, 1 pholio.com, 1 phone-service-center.de, 1 phone-spy.ml, 1 @@ -113968,7 +114110,6 @@ photosafari.com.my, 1 photosafaribg.com, 1 photosbyadeline.com, 1 -photosbybstuartseniors.com, 1 photosbyzachary.tk, 1 photoscheduleers.ga, 1 photoscheduleest.ga, 1 @@ -113992,7 +114133,6 @@ phpcraft.de, 1 phpdevlabs.tk, 1 phpdorset.co.uk, 1 -phpfactory.io, 1 phpfashion.com, 1 phpinfo.in.th, 1 phpkari.cz, 1 @@ -114014,6 +114154,7 @@ phr.org, 1 phr34kz.pw, 0 phra.gs, 1 +phraselock.com, 1 phreakaus.tk, 1 phreaker.ml, 1 phreaknet.org, 1 @@ -114084,6 +114225,7 @@ physiomeproject.org, 1 physionova-badenstedt.de, 1 physiopraxisteam.de, 1 +physiosense.net, 1 physioteam-franz.de, 1 physiotherapie-buk.de, 1 physiotherapie-concept.de, 1 @@ -114141,7 +114283,6 @@ piavonpadberg.com, 1 pib.gd, 1 pibgd.fr, 1 -piboston.org, 1 piboubes.me, 1 pic-sl.com, 1 pic.gov, 1 @@ -114162,7 +114303,6 @@ piccolitrasporti.it, 1 piccolopark.co.nz, 1 piccolosgombero.it, 1 -piccolospace.com, 1 piccolotrasloco.it, 1 picdefacer.com, 1 pichainlabs.com, 1 @@ -114217,6 +114357,7 @@ picsalesers.ga, 1 picsastock.com, 1 picshare.nz, 1 +picsquish.com, 1 picstar.tk, 1 picsto.re, 0 pictominoes.com, 1 @@ -114262,7 +114403,6 @@ piening.ddns.net, 1 piensa-escribe.tk, 1 piepermail.nl, 1 -piepet.net, 1 pieq.eu, 1 pieq.eu.org, 1 pier1url.com, 1 @@ -114314,12 +114454,12 @@ pigeonracinginformation.com, 1 pigeons-rings.com, 1 pigfox.com, 1 -piggingcleaning.com, 1 pigment.com, 1 pigmentcollective.com, 1 pigop.com, 1 pigsbytebooks.org, 0 pigslv.com, 1 +pigtracker.com.ar, 1 piguet.com, 0 pigzilla.co, 1 pihaar.de, 1 @@ -114361,7 +114501,6 @@ pilatespt.nl, 1 pilbaraports.com.au, 1 pilchuck.org, 1 -pile.systems, 1 pileawayremovals.com, 1 pilgermaske.org, 1 pili-serv.ovh, 1 @@ -114385,10 +114524,10 @@ pilotknobmo.gov, 1 pilotodianws.azurewebsites.net, 1 pilotorg.ru, 1 -pilotpen.us, 1 pilotproject.tk, 1 pilotshop.com, 1 pilsen.fun, 1 +pilsencr.com, 1 pilseta24.lv, 1 pilsook.com, 1 pilvi.space, 1 @@ -114397,6 +114536,7 @@ pimhaarsma.nl, 1 pimhaarsmamedia.nl, 1 pimmel.stream, 1 +pimo.id, 1 pimoid.fr, 1 pimplelotionest.ga, 1 pimpmymac.ru, 1 @@ -114508,6 +114648,7 @@ pinmeto.com, 1 pinnacle-tex.com, 1 pinnaclecommunityservices.com.au, 1 +pinnaclefoundationrepair.com, 1 pinnacleholdings.com, 1 pinnaclelife.nz, 1 pinnacletrailers.com, 1 @@ -114525,6 +114666,7 @@ pinoytambayan.tk, 1 pinoytimes.tk, 1 pinpaituiguang.com.cn, 1 +pinpals.com.au, 1 pinpayments.com, 1 pinpointengineer.co.uk, 1 pinse.club, 1 @@ -114578,6 +114720,7 @@ pioneer.eu, 0 pioneerbible.org, 1 pioneercredit.com.au, 1 +pioneerks.com, 1 pioneerscar.com, 1 pionierboat.cf, 1 pionierboat.ga, 1 @@ -114605,6 +114748,7 @@ piquaoh.gov, 1 piquark6046.blog, 1 piqueteway.tk, 1 +piraino.fr, 1 piraja.io, 1 piramalglassusa.com, 1 piramide.nl, 1 @@ -114668,7 +114812,6 @@ pita.ninja, 1 pitakashop.hu, 1 pitang.com, 1 -pitaya.ai, 1 pitbooks.ga, 1 pitbox8.nl, 1 pitbullclub.tk, 1 @@ -114766,7 +114909,6 @@ pixelorastudio.com, 1 pixelpaper.org, 1 pixelplex.io, 1 -pixelprint.la, 1 pixelrain.info, 1 pixelsbanking.com, 1 pixelsearch.eu, 1 @@ -114774,7 +114916,7 @@ pixelsketch.co.uk, 1 pixelsquared.us, 1 pixelstamp.net, 1 -pixelstechfest.in, 1 +pixelstechfest.in, 0 pixeltech.com.bd, 1 pixeltranslating.com, 1 pixelturkey.art, 1 @@ -114802,7 +114944,6 @@ pixouno.com, 1 pixshop.fr, 1 pixstudio.ai, 1 -pixsystem.com, 1 pixxxels.cc, 1 pixyship.com, 1 pixzilla.de, 1 @@ -114868,7 +115009,6 @@ pko.ch, 0 pkov.cz, 1 pkservice.tk, 1 -pkshs.my, 1 pkspskov.tk, 1 pkwebsolutions.cf, 1 pkz.ch, 1 @@ -114886,7 +115026,6 @@ placedsupport.com, 1 placeforgames.tk, 1 placehold.co, 1 -placements.io, 0 placenet.fr, 1 placeofindia.com, 1 placepay.com, 1 @@ -114970,6 +115109,7 @@ planetaprogramas.tk, 1 planetarapluso.tk, 1 planetarian.moe, 1 +planetarica.org, 1 planetasilius.tk, 1 planetasuboficial.com.br, 1 planetau2.com, 1 @@ -114987,6 +115127,7 @@ planetgolf.de, 1 planetgrehen.tk, 1 planethowl.com, 1 +planeticke.com, 1 planetickettravel.com, 1 planetknauer.net, 1 planetmath.org, 1 @@ -115011,9 +115152,7 @@ planify.io, 0 planisanin.tk, 1 planiserin.tk, 1 -planisware.academy, 1 planisware.cn, 1 -planisware.io, 1 planisware.live, 1 planisys.net, 1 planit-inc.com, 1 @@ -115085,6 +115224,7 @@ plassmann.ws, 1 plast.bg, 1 plast.design, 1 +plastacier.fr, 1 plastdesign.com.ua, 1 plastex.tk, 1 plastic2print.com, 0 @@ -115102,7 +115242,6 @@ plasticsurgerypartyest.ga, 1 plasticwindows.tk, 1 plastikkirurgiskane.se, 1 -plastischechirurgie-linz.at, 1 plastokna.tk, 1 plastovelehatko.cz, 1 plastrequest.com, 1 @@ -115219,7 +115358,6 @@ playit.rs, 1 playkids.com, 0 playmei.com, 0 -playmyinbox.com, 1 playnow.com, 1 playnuganug.com, 1 playocean.net, 1 @@ -115257,7 +115395,6 @@ plcgurus.net, 1 plchardware.com, 1 pldeyewear.com.ua, 1 -pldx.org, 1 ple.jp, 1 ple.llc, 1 pleasantonca.gov, 1 @@ -115338,7 +115475,6 @@ ploi.io, 1 plokko.com, 0 plomberie-rivesud.ca, 1 -plombierjob.com, 1 plomeros.cl, 1 plomin.tk, 1 plongee-phuket.fr, 1 @@ -115366,6 +115502,7 @@ pluginuri-wordpress.ro, 1 plugmeubelen.nl, 1 plugnroll.com, 1 +plugra.com, 1 plugshare.com, 1 pluimveeplanner.nl, 1 plumair-ve.com, 1 @@ -115402,7 +115539,7 @@ plurilock.com, 1 pluriumint.com, 1 plus-project.co.uk, 1 -plus.ai, 1 +plus.ai, 0 plus.google.com, 1 plus.sandbox.google.com, 1 plus15.ml, 1 @@ -115415,7 +115552,6 @@ plusfitness.com.au, 1 plusgrandevilledefrance.com, 1 plushev.tk, 1 -pluslink.co.jp, 1 pluspass.com, 1 plusport-api.com, 1 plusport.com, 1 @@ -115481,6 +115617,7 @@ pmg.ua, 1 pmgroup-global.com, 0 pmh.codes, 1 +pmh.so, 1 pmhh.com.br, 1 pmi-install.com, 1 pmi.edu, 1 @@ -115508,7 +115645,6 @@ pn.id.lv, 1 pnakosoft.com.au, 1 pnbholdings.com, 1 -pnch.fi, 1 pneu01.fr, 1 pneu74.fr, 1 pneuhaus-lemp.ch, 1 @@ -115663,6 +115799,7 @@ pocketmags.com, 1 pocketnow.com, 1 pocketoption.com, 1 +pocketoption.cz, 1 pocketoption.ru, 1 pocketsquare.jp, 1 pockettradesman.com, 1 @@ -115673,6 +115810,7 @@ pocopizza.co.uk, 1 pocopt.com, 1 pocopt.ru, 1 +pocsai.hu, 1 pocsaismartsystem.hu, 1 pocze.ch, 1 pocztowski.it, 1 @@ -115700,7 +115838,7 @@ podcastname.space, 1 podcastpulse.net, 1 podcastsaver.com, 1 -podcaststudio.com, 1 +podcaststudio.com, 0 podcasty.cz, 1 podcastz.cz, 1 podcreative.ca, 1 @@ -115708,6 +115846,7 @@ podcrypters.ga, 1 podcryptest.ga, 1 podd.xyz, 1 +poderdafelicidade.com.br, 1 podersul.com, 1 podia.com.gr, 0 podia.gq, 1 @@ -115843,7 +115982,6 @@ pokemondb.net, 1 pokemonforums.tk, 1 pokemongoclub.tk, 1 -pokemongodata.com, 1 pokemonguide.tk, 1 pokemonlab.com, 1 pokemonsimulator.com, 1 @@ -115936,6 +116074,7 @@ polemik.tk, 1 polenautohuur.nl, 1 polerka.tk, 1 +polerush.com, 1 polestar.com.tw, 1 poletaem.tk, 1 polezno-v-internete.ml, 1 @@ -115973,9 +116112,9 @@ polina-gagarina.gq, 1 polioptics.com, 1 polis.or.at, 1 -polis812.ru, 1 polisanaraka.pl, 1 polisanarciarska.pl, 1 +polisave.co.il, 1 polish-dictionary.com, 1 polish-flag.com, 1 polish-translations.com, 1 @@ -116003,6 +116142,7 @@ politeka.net, 1 politex.tk, 1 politic.org.ua, 1 +politica.ai, 1 political-science-schools.com, 1 politicalasylum.tk, 1 politicaprivacidade.com, 1 @@ -116076,6 +116216,7 @@ poltek-petrokimia.ac.id, 1 poltsamaa.edu.ee, 1 poltsamaalasteaed.edu.ee, 1 +poly-glot.ai, 1 polyatomic.ai, 1 polycoise.com, 1 polycraftual.co.uk, 0 @@ -116085,13 +116226,14 @@ polygonote.com, 1 polygonthemes.com, 1 polygraphi.ae, 1 +polylineworks.com, 1 polymaint-services.com, 1 polymake.org, 1 polymarketwatch.info, 1 polymath.pm, 1 polymerexpert.biz, 1 polymerix.de, 1 -polymesh.network, 0 +polymesh.network, 1 polymics.com, 0 polyna.eu, 1 polynesia.tech, 1 @@ -116131,13 +116273,13 @@ pompes-funebres-girard.com, 1 pomphreyslaw.com, 1 pon.com, 1 +ponabana.com, 1 ponavia-rezidence.cz, 1 ponca-nsn.gov, 1 poncagedemarbre.fr, 1 poncatribe-ne.gov, 1 poncho-bedrucken.de, 0 pondacademy.com, 1 -pondband.net, 1 pondof.fish, 1 pondot.it, 1 pondsama.com, 1 @@ -116148,7 +116290,6 @@ ponio.xyz, 1 ponpokorin.tk, 1 ponpon.tk, 1 -ponsanliving.com, 1 ponte-camp.de, 1 ponteggi.it, 1 ponteggi.roma.it, 1 @@ -116156,6 +116297,7 @@ pontiwerx.com.au, 1 pontodogame.com.br, 1 pontosdevista.pt, 1 +pontosnews.gr, 1 pontotoccountyms.gov, 1 pontupagina.com, 1 ponvelab.com, 1 @@ -116174,7 +116316,6 @@ poodlefan.net, 1 poohcottage.co.uk, 1 pooi.me, 1 -poojanews.com, 1 pookhaarden.nl, 1 pookl.com, 1 pool-selber-bauen.de, 1 @@ -116186,7 +116327,6 @@ poolsonline.tk, 1 poolspa.es, 1 pooltools.net, 1 -poolvilla-margarita.net, 1 poon.io, 1 poonawallafincorp.com, 1 poopa.loan, 1 @@ -116389,6 +116529,7 @@ port5060.net, 1 port67.org, 1 portable-games.tk, 1 +portableconveniences.com, 1 portablespeakers.tk, 1 portablespeakersfinder.com, 1 portagecounty-oh.gov, 1 @@ -116528,6 +116669,7 @@ poshasaudi.com, 1 poshcastles.co.uk, 1 poshe.tk, 1 +poshmark.ca, 1 poshmark.com, 1 poshsecurity.com, 1 posicionament.tk, 1 @@ -116599,7 +116741,6 @@ postern.uk, 1 posters.win, 1 posterspy.com, 1 -postfactum.info, 1 postfalls-naturopathic.com, 1 postfalls.gov, 1 postfallspolice.gov, 1 @@ -116747,6 +116888,7 @@ power-of-interest.com, 0 power-plugins.com, 1 power-recovery.com, 1 +power-sunshine.jp, 1 power-technology.com, 1 power-tools24.com, 1 power100.co.uk, 1 @@ -116772,7 +116914,6 @@ poweredbyiris.nl, 1 powerembedded.com.br, 1 powerentertainment.tv, 1 -powerfifty.com, 1 powerforpeople.tk, 1 powerfortunes.com, 1 powerfulcom.net, 1 @@ -116781,13 +116922,13 @@ powerhouse.pro, 1 powerhousediscovery.com, 1 powerhouseforensics.com, 1 -powerhousegym.co, 1 powerinboxperformance.com, 1 powerlifting.tk, 1 powerling.com, 1 powerlp.com, 1 powerman.name, 1 powerman.top, 1 +powerofmilk.com, 1 powerpc.pt, 1 powerpilot.co.za, 1 powerplay.xyz, 0 @@ -116846,6 +116987,7 @@ poxiao.net, 1 poylabo.com, 1 poynter.net, 1 +poyntr.ai, 1 pozarevac.tk, 1 pozd.tk, 1 pozdravlyalka.gq, 1 @@ -116913,7 +117055,6 @@ ppy.sh, 1 pqcrypta.com, 1 pqforce.com, 1 -pqg.capital, 1 pqgruber.com, 1 pqscript.com, 1 pr-news.spb.ru, 1 @@ -116942,7 +117083,6 @@ practicalcontracting.ca, 1 practicalgrowth.life, 1 practicalhomes.com.au, 1 -practicallyedible.com, 1 practicallyunhackable.com, 1 practicalmamawellness.com, 1 practicalneurology.com, 0 @@ -117035,6 +117175,7 @@ prathambooks.org, 1 pratic.it, 1 praticienmedecinechinoise.be, 1 +praticijenu.com, 1 praticonnect.com, 1 pratopronto.org, 1 pratorotoli.it, 1 @@ -117192,8 +117333,7 @@ prematureacceleration.club, 1 premazon.com, 1 preme.name, 1 -premiachef.com, 1 -premier-dream.co, 1 +premier-dream.co, 0 premier-mt.uk, 1 premier-pallets.com, 1 premier-stores.co.uk, 1 @@ -117204,6 +117344,7 @@ premieresloges.ca, 1 premierevents.ie, 1 premierevr.com, 1 +premierfwrestoration.com, 1 premierlacewigs.com, 1 premierleague.gq, 1 premierloto.cm, 1 @@ -117228,6 +117369,7 @@ premium.web.id, 1 premiumcredit.am, 1 premiumdesign.hr, 1 +premiumhealth.be, 1 premiumkeystore.com, 1 premiumlegalsupport.ga, 1 premiumpeaches.com, 1 @@ -117265,7 +117407,6 @@ preparetheword.com, 1 prepfba.com, 1 preply.com, 1 -prepping.com, 1 prepr.io, 1 preprodfan.gov, 1 prepscouts.tk, 1 @@ -117280,7 +117421,6 @@ presencefactory.nl, 1 presenciainternet.com, 1 presengage.com, 1 -presensita.com, 1 present-m.com, 1 presentaline.ch, 1 presentationmedia.com, 0 @@ -117334,7 +117474,6 @@ presson.shop, 1 pressreleasecentral.tk, 1 pressreleasepedia.tk, 1 -pressreleasespower.com, 1 pressride.jp, 1 pressrush.com, 1 pressup.it, 1 @@ -117367,7 +117506,6 @@ prestigelegalgroup.com.au, 1 prestigesigns.net, 1 prestigesoundandlight.co.uk, 1 -prestigia.com, 1 prestoinventario.com, 1 prestonadamscountywi.gov, 1 prestonmn.gov, 1 @@ -117446,6 +117584,7 @@ pricelooper.com, 0 pricepropharmacy.com, 1 priceri.com, 1 +pricesdairy.com, 1 priceshop.com, 1 pricesmax.com.mx, 0 pricesniffer.co, 1 @@ -117562,6 +117701,7 @@ primorsk.com, 1 primorus.lt, 1 primos-tech.com, 1 +primotim.hr, 1 primrosehillvets.ie, 1 primrosenyagwaya.online, 1 princebazawule.com, 1 @@ -117656,6 +117796,7 @@ priorityelectric.net, 1 priorityessays.com, 1 priorityfakes.com, 1 +prioritymeds.health, 1 prioritynissannewportnewsparts.com, 1 prioritysignsandgraphics.com, 1 priorlakemn.gov, 1 @@ -117713,7 +117854,6 @@ privacysecuritybrainiacs.com, 1 privacystatement.tk, 1 privacysvcs.net, 1 -privacytrust.sg, 1 privacyweek.at, 1 privacyweek.de, 1 privacyweek.eu, 1 @@ -117762,6 +117902,7 @@ privatetrainingonline.se, 1 privateuploader.com, 1 privatevpn.com, 1 +privatmegleren-match.no, 1 privatstunden.express, 1 privc.io, 1 privcloud.org, 1 @@ -117845,9 +117986,11 @@ proacousticsusa.com, 1 proact-it.co.uk, 1 proactivenews.ml, 1 +proactivsports.com, 1 proactivsports.net, 1 proadvanced.com, 1 proadvisorcoach.com, 0 +proaktiv.io, 1 proalist.com, 1 proalter.ch, 1 proambt.nl, 0 @@ -117863,7 +118006,6 @@ probationforms.com, 1 probationnotes.com, 1 probely.com, 1 -probiancanarias.com, 1 probiller.com, 1 probinarin.ga, 1 probioticnacistila.si, 1 @@ -117894,6 +118036,7 @@ procert.ch, 0 procesadorafenix.com.mx, 1 procesio.com, 1 +process.st, 1 processesinmotion.com, 1 processevolution.com.au, 1 processtec.com.br, 1 @@ -117913,12 +118056,12 @@ procountorsolo.com, 1 procrastinatingengineer.uk, 1 procrastinationland.com, 1 -procreditbank.com.al, 1 proctor.ml, 1 proctorauth.com, 1 proctorial.cf, 1 proctorio.com, 1 proctorio.net, 1 +proculair.com, 1 proculair.nl, 1 proculaircontent.com, 1 proculairworkers.com, 1 @@ -117929,6 +118072,7 @@ prod-bp-geotab-api.azurewebsites.net, 1 prod-vigl-www-master.azurewebsites.net, 1 prodapt.com, 1 +prodato.cl, 1 prodemos.nl, 1 prodentim101-us.com, 1 prodesigntools.com, 1 @@ -117945,7 +118089,6 @@ produc.ro, 1 producent-sanek.pl, 1 producentbalustrad.pl, 1 -producentparapetow.pl, 1 producersnational.com, 1 producertools.io, 1 producerwereld.nl, 1 @@ -117975,7 +118118,6 @@ proefexamensvhsocialehygiene.nl, 1 proeflokaalbakker.nl, 1 proefteksten.nl, 0 -proekt.moscow, 1 proekt.tk, 1 proelectro.pro, 1 proemployeeprotection.com, 1 @@ -118035,7 +118177,6 @@ profiles.google.com, 1 profiletree.com, 1 profilewatcher.ga, 1 -profilfueller.eu, 1 profilib.com, 1 profilib.net, 1 profilib.top, 1 @@ -118081,6 +118222,7 @@ progas-diva.de, 1 progas.de, 1 progaudio.be, 1 +progenaisolutions.com, 1 progenda.be, 1 proger.ga, 1 proger.ml, 1 @@ -118166,6 +118308,7 @@ project1service.com, 1 project25.org, 1 project86fashion.com, 1 +projectai-r.tech, 1 projectalias.com, 1 projectborealisgitlab.site, 1 projectbuild.tk, 1 @@ -118213,11 +118356,13 @@ projectweb.gr, 1 projectxyz.eu, 1 projectzet.tk, 1 +projegez.com, 1 projehocam.com, 1 projekt-allianz.de, 1 projekt-manufaktur.de, 1 projekt-office.ch, 1 projekt-umbriel.de, 1 +projekt-weltherrschaft.de, 1 projekt-wild.tk, 1 projektarbeit-projektplanung.de, 1 projektentwicklung-westfalen.de, 1 @@ -118280,6 +118425,7 @@ promocion2007.tk, 1 promocionesperrigo.com, 1 promocjedladzieci.pl, 1 +promocode.co.il, 1 promocodes777.com, 1 promocodius.com, 1 promocoesbrastemp.com.br, 1 @@ -118289,7 +118435,7 @@ promods.net, 1 promods.store, 1 promofirstmedia.co.id, 1 -promohulp.nl, 0 +promohulp.nl, 1 promohunt.ru, 0 promokodi.tk, 1 promolife.be, 1 @@ -118345,6 +118491,7 @@ propaganda.love, 1 propagandablog.de, 0 propagationtools.com, 1 +propagroup.es, 1 propanesale.cf, 1 propbot.com, 1 propcashflow.my, 1 @@ -118393,6 +118540,7 @@ properwills.com, 1 propfirmdiscount.com, 1 prophetdesign.ch, 1 +proplandrealtor.com, 1 propmark.com.br, 1 propolisturkiye.tk, 1 proporcer.tk, 1 @@ -118587,7 +118735,6 @@ prowebservices.ca, 1 prowechsel.de, 1 prowi.se, 1 -prowindow.sk, 1 prowise.com, 1 prowise.me, 1 prowoodthai.com, 1 @@ -118595,6 +118742,7 @@ prowrestlingevents.tk, 1 prowrestlingsheet.com, 1 proxaccess.com, 1 +proxaiqc.com, 1 proxar.co.uk, 1 proxidize.com, 1 proxiel.com, 1 @@ -118618,6 +118766,7 @@ proxylink.pro, 1 proxymonitor.org, 1 proxytool.cf, 1 +proxytracer.com, 1 proyectodia.com.mx, 1 proyectomca.es, 1 proyectosaludecuador.org, 1 @@ -118634,6 +118783,7 @@ prpr.icu, 1 prpr.rip, 1 prpr.win, 1 +prpzy.com, 1 prrams.com, 1 prrefrigeration.com.au, 1 prsg.tk, 1 @@ -118714,7 +118864,6 @@ psdpt-tpfd.gc.ca, 1 psdreams.com, 1 psdsuc.com, 1 -pseek.com, 1 psemc.com, 1 pseta.ru, 1 psevdonim.ga, 1 @@ -118726,7 +118875,6 @@ pshul.com, 1 pshweb.tk, 1 psi-tv.tk, 1 -psi.doctor, 1 psicanalista.milano.it, 1 psicoblog.tk, 1 psicoeduca.com.br, 1 @@ -118884,10 +119032,10 @@ psychotherapie-ahlmeyer.de, 1 psychotherapie-hensiek.de, 1 psychotherapie-leipzig.eu, 1 -psychotherapie-lichterfelde.berlin, 1 psychotherapie1220wien.at, 0 psychotiq.tk, 1 psychotropical.com, 1 +psychpedia.com, 1 psychpsyo.com, 1 psychservice.com.au, 1 psychvarsity.com, 1 @@ -118898,7 +119046,6 @@ psyh.tk, 1 psyhelp.ro, 1 psyk-patienten.tk, 1 -psykologmonica.dk, 1 psykologtidningen.cf, 1 psykologtidningen.ga, 1 psykologtidningen.gq, 1 @@ -119058,6 +119205,7 @@ puertodramaturgia.tk, 1 puertomalaga.com, 1 puestifiestas.mx, 1 +puffball.io, 1 puffinvapes.co, 1 puffverse.pro, 1 puffyan.us, 1 @@ -119077,7 +119225,6 @@ pujd3.gq, 1 puka.cc, 1 puka.edu.ee, 1 -pukfalkenberg.dk, 1 pul-ingenieure.de, 1 pula-site.tk, 1 pulci.it, 1 @@ -119135,7 +119282,6 @@ punchlinetheatre.co.uk, 1 punchlinetheatre.com, 1 punchlist.com, 1 -punchlistprosdfw.com, 1 punctually.gq, 1 pundak.games, 1 puneindia.tk, 1 @@ -119230,13 +119376,13 @@ purefoot.jp, 1 pureholisticwellness.com, 1 purekrea.com, 1 -pureleverage.com, 1 purelife.photography, 1 pureliferx.com, 1 purelovecoaching.fi, 1 purelymail.com, 1 purelypestcontrol.com, 1 puremosquito.com, 1 +purenote.live, 1 purepestandlawn.com, 0 pureromance.com, 1 puresanitization.com, 1 @@ -119245,17 +119391,18 @@ puretermite.com, 1 puretone.pro, 1 pureunpay.com, 1 +pureuspeptide.com, 1 purevicky.com, 1 purewaterguide.net, 1 purewealth.cloud, 1 purfaction.nl, 1 purga.news, 1 -purikore.com, 1 purinaexpress.com, 0 puritanas.tk, 1 puritas.lk, 1 purits.de, 1 purityclothing.co.uk, 1 +puritydairy.com, 1 purkupalvelut.fi, 1 puroprazer.pt, 1 purovive.tk, 1 @@ -119344,7 +119491,6 @@ putman-it.nl, 1 putnam-fl.gov, 1 putnam-ga.gov, 1 -putnamcollision.com, 1 putnamcountywv.gov, 1 putnamil.gov, 1 putnamvalley.gov, 1 @@ -119382,6 +119528,7 @@ pvao.gov.ph, 0 pvawa.com.au, 1 pvda.nl, 1 +pvdesignusa.com, 1 pvdplanet.tk, 1 pvebuilds.xyz, 1 pver.nl, 1 @@ -119392,7 +119539,6 @@ pvp-factions.fr, 1 pvp.edu.ee, 1 pvpagario.tk, 1 -pvpcheck.com, 1 pvpcraft.ca, 1 pvpctutorials.de, 1 pvpheroes.gg, 1 @@ -119503,7 +119649,6 @@ pythonatrix.com, 1 pythonblog.tk, 1 pythondiscord.com, 1 -pythonfactory.io, 1 pythonhosted.org, 1 pythonmorsels.com, 1 pytodon.com, 1 @@ -119518,6 +119663,7 @@ pzc.nl, 1 pzmk.org.pl, 1 pzsearch.nl, 1 +pztools.com, 1 pzu-masa.pl, 1 pzz.by, 1 q-and-a.tk, 1 @@ -119580,6 +119726,7 @@ qarto.com, 1 qashio.com, 1 qask.ml, 1 +qasmaintarget.pt, 1 qasphere.com, 1 qassay.com, 1 qataridiareg.com, 1 @@ -119598,7 +119745,6 @@ qbrix.dk, 1 qbstores.com, 1 qbug.cf, 1 -qburst.com, 1 qc-ikonwork.com, 1 qc.search.yahoo.com, 0 qcash.tw, 1 @@ -119612,6 +119758,7 @@ qcnet.com, 1 qconline.com, 1 qconnan-photos.fr, 1 +qcoresecure.com, 1 qcstudentcenter.com, 0 qcstyleacademy.com, 0 qctimes.com, 1 @@ -119703,6 +119850,7 @@ qisda.com.vn, 1 qisheiosxz.com, 1 qitano.com, 1 +qitmeir.com, 1 qiu.moe, 0 qiuwenbaike.cn, 1 qivonline.pt, 1 @@ -119723,6 +119871,7 @@ qlc.co.th, 1 qlcvea.com, 1 qlcvea.it, 1 +qld.kr, 1 qldducati.club, 1 qldformulaford.org, 1 qldnetwork.com.au, 1 @@ -119751,7 +119900,6 @@ qnap.de, 1 qnap.hk, 1 qnap.tw, 1 -qnected.nl, 1 qnixon.com, 1 qnotafm.com.co, 1 qnq.moe, 1 @@ -119808,7 +119956,6 @@ qr1.at, 1 qraa.qld.gov.au, 1 qrara.net, 1 -qrbird.com, 1 qrcoba.org, 1 qrcodedynamic.com, 1 qrcodes.tools, 1 @@ -119843,7 +119990,6 @@ qtakehd.com, 1 qtdrop.com, 1 qthotels.com, 1 -qtn.net, 1 qto.com, 1 qto.com.hk, 1 qto.net, 1 @@ -119852,6 +119998,7 @@ qtpass.org, 1 qtpower.co.uk, 1 qtpower.org, 1 +qtr5.com, 1 qtspace.cn, 1 qttransformation.com, 1 qtv.ge, 1 @@ -120001,7 +120148,7 @@ quarus.net, 1 quasar.gr, 1 quasarcr.com, 1 -quasarelectronics.co.uk, 0 +quasarelectronics.co.uk, 1 quasarhomes.com, 1 quasarnet.gr, 1 quasartech.gr, 1 @@ -120027,7 +120174,7 @@ qubotondo.it, 1 qubyte.codes, 1 quchronicle.com, 1 -qudini.com, 1 +qudini.com, 0 quebeccat.com, 1 quebeccats.com, 1 quebecdogs.com, 1 @@ -120103,6 +120250,7 @@ quernon.fr, 0 querocalcular.com.br, 1 query-massage.com, 0 +queryguard.net, 1 quesecelebra.info, 1 quessinternational.com, 1 quest-crusaders.de, 1 @@ -120126,9 +120274,7 @@ question.cf, 1 questionandanswer.ml, 1 questionyu.com, 0 -questlawoffice.com, 1 questofaidance.tk, 1 -questofprogress.com, 1 questoj.cn, 1 questsocial.it, 1 questsys.com, 1 @@ -120154,9 +120300,11 @@ quick-seo.tk, 1 quickbooksguru.com.au, 1 quickboysvrouwen2.nl, 1 +quickcart-pro.com, 1 quickcashcarremovals.com.au, 1 quickcel.tk, 1 quickcrypt.org, 1 +quickcuttreeservice.com, 1 quickdiamond.com, 1 quickelectricity.com, 1 quickerticker.tk, 1 @@ -120175,8 +120323,8 @@ quicksell.co, 1 quicksell.store, 1 quickshops.ga, 1 +quicksit.io, 1 quickstart.co.za, 1 -quicksupplies.us, 0 quicksupply.com, 1 quicksus.com, 1 quicktapstudios.com, 1 @@ -120186,6 +120334,7 @@ quickvideo.tk, 1 quickyshare.com, 1 quicomo.it, 1 +quics.io, 1 quidax.com, 1 quidlo.com, 1 quieoltre.it, 1 @@ -120224,7 +120373,6 @@ quinnlawcenters.com, 1 quinnstech.ga, 1 quinpro.nl, 1 -quinta.news, 1 quintadesanamaro.com, 1 quintanadelmonte.tk, 1 quintanilla.tk, 1 @@ -120234,7 +120382,6 @@ quintobarrio.tk, 1 quintonic.fr, 0 quipcheck.com, 1 -quiq-cdn.com, 1 quiq-frp.com, 1 quiq-in.com, 1 quiq-io.com, 1 @@ -120396,7 +120543,6 @@ r00tsandwings.com, 1 r0t.co, 1 r102.ch, 1 -r15cookie.com, 1 r17.co.id, 1 r1a.eu, 1 r1ch.net, 1 @@ -120482,7 +120628,6 @@ rabynska.eu, 1 racaliz.tk, 1 racasdecachorro.org, 1 -racco.com.br, 1 raccoltadifferenziata.it, 1 raccoltarifiuti.milano.it, 1 raceandecology.ca, 1 @@ -120495,8 +120640,8 @@ rachaelholtphotography.com, 1 rachaelsmaids.com, 1 rachaeltaylor.tk, 1 +rachel-gentit.com, 1 rachelandadamarethebest.com, 1 -rachelcarsoncouncil.org, 1 rachelchen.me, 1 racheldiensthuette.de, 1 rachelmoorelaw.com, 1 @@ -120528,6 +120673,9 @@ ract.info, 1 ract.net, 1 ract.net.au, 1 +ractergroup.com, 1 +racterlabs.com, 1 +ractermx.com, 1 racti.com.au, 1 racunalo.com, 1 racunovodstvo-prina.si, 1 @@ -120553,6 +120701,7 @@ radarcupon.ro, 1 radarerp.net, 1 radarfirst.com, 1 +radarimoveisdeleilao.com.br, 1 radarstationery.com, 0 radartatska.se, 0 radartek.com, 1 @@ -120666,7 +120815,6 @@ radiodoblen.tk, 1 radiodxguatemala.tk, 1 radioeldoradofm.com.br, 1 -radioelectrodance.fr, 1 radioelectronic.tk, 1 radioenam.tk, 1 radioenergia.tk, 1 @@ -120850,7 +120998,6 @@ raftingbali.net, 1 rafvorsselmans.com, 1 rafy.com.br, 1 -rafy.site, 1 rag-deutsche-steinkohle.de, 1 rag.de, 1 ragazzi-music.de, 1 @@ -120929,7 +121076,7 @@ railpassie.nl, 1 railroadhistory.net, 1 railsafetysystems.com.au, 1 -railserve.com, 1 +railserve.com, 0 railsideworks.com, 1 railsperformance.com.br, 1 railto.cm, 1 @@ -120994,11 +121141,13 @@ rainuk.com, 1 raipet.no-ip.biz, 1 raipet.spdns.eu, 1 +rais-on.com, 1 raise-educationandwellbeing.co.uk, 1 raisecalculator.com, 1 raisects.co.uk, 1 raisedandrooted.com, 1 raiseeducationtrust.org, 1 +raiseproof.ai, 1 raisetheyouth.co.uk, 1 raiseyoursales.co.uk, 1 raiseyoursales.de, 1 @@ -121074,6 +121223,7 @@ rally-vysledky.cz, 1 rallybase.cz, 1 rallybase.eu, 1 +rallybro.com, 1 rallycycling.com, 0 rallyekrumlov.cz, 1 rallyfotosaswin.tk, 1 @@ -121122,7 +121272,6 @@ rampestyuma.com, 1 rampgov.com, 1 ramplaysugente.tk, 1 -ramsay.xyz, 1 ramsayshorsetransport.com, 1 ramsayshorsetransport.com.au, 1 ramsdensplc.com, 1 @@ -121153,6 +121302,7 @@ randallwilk.com, 1 randburgplumber-247.co.za, 1 randburgplumbing.co.za, 1 +randdtaxcreditspecialists.com, 1 randmevape.net, 1 randoequipement.com, 1 randolf.ca, 1 @@ -121228,7 +121378,6 @@ ranking-deli.jp, 1 ranking-mensesthe.jp, 1 ranking10hits.tk, 1 -rankingbyseo.com, 1 rankingide.tk, 1 rankingofe.com.pl, 1 rankingubezpieczeniowy.pl, 1 @@ -121241,21 +121390,21 @@ ranksite.tk, 1 ranktis.com, 1 rankya.com, 1 -rannamoisaaiasalong.ee, 1 +ranquel.com, 1 +ranquel.es, 1 ransomleak.com, 1 -ransomspares.co.uk, 1 ranson.com.au, 1 ransonwv.gov, 1 rantalaholcomb.tk, 1 rantamplan.tk, 1 rantanda.com, 1 ranters.nl, 1 -rany.eu.org, 1 ranyeh.co, 1 ranyeh.com, 1 ranzbak.nl, 1 raoliveoil.ga, 1 raomed.com.ar, 1 +raonpick.com, 1 raovatsaigon.tk, 1 rap4ever.org, 1 rapala.com, 1 @@ -121337,6 +121486,7 @@ raserbajs.tk, 1 rashbogota.tk, 1 rasheed-nuss.tk, 1 +rashidi.nl, 1 rashmipandit.com, 1 rashodkin.tk, 1 rasing.me, 1 @@ -121359,6 +121509,7 @@ rassro.sk, 1 rastabooks.ga, 1 rasteniem.ru, 1 +rastimbilingva.ru, 1 rastko-jevtovic.tk, 1 rasty.cz, 1 rat.pw, 1 @@ -121379,6 +121530,7 @@ rates.ca, 1 ratespy.com, 1 ratexindex.com, 1 +rateyourcyber.com, 1 ratgeber-alltag.de, 1 ratgeber-beauty.com, 1 ratgeber-massagen.com, 1 @@ -121457,7 +121609,6 @@ ravenstonejeweler.com, 1 raventechnology.es, 1 ravenx.me, 1 -ravescout.club, 1 ravesteijn.nl, 1 ravhaaglanden.org, 1 ravihotel.com, 0 @@ -121556,7 +121707,6 @@ rbcardiacsavers.com, 1 rbcdn.cz, 1 rbclub.cz, 1 -rbcosmetici.it, 1 rbd.events, 1 rbensch.com, 0 rbet.tk, 1 @@ -121585,10 +121735,8 @@ rburchell.com, 0 rburz.com, 1 rbx.com, 1 -rbx.gg, 1 rc-offi.net, 1 rc-shop.ch, 1 -rc.cruises, 1 rc21x.com, 1 rc2edit.nl, 1 rc3n.com, 1 @@ -121603,7 +121751,6 @@ rccrush.com, 1 rcdeescolasantcugat.com, 1 rcdevs.com, 1 -rcdmh.org, 1 rcdocuments.com, 1 rcdrone.tk, 1 rce.delivery, 1 @@ -121729,8 +121876,8 @@ reachwithed.com, 1 reaconverter.com, 1 reacteev.com, 1 -reactfactory.io, 1 reactionindex.com, 1 +reactive-load.ai, 1 reactive-load.com, 1 reactive-press.com, 1 reactive.com.ru, 1 @@ -121754,11 +121901,13 @@ readingrats.de, 1 readless.cf, 1 readmynews.cf, 1 +readnovelis.com, 1 readpages.gq, 1 readsportsonly.com, 0 readup.tk, 1 +ready-leaf.com, 1 ready4bf.tk, 1 -ready5g.net, 1 +ready5g.net, 0 readycentbid.com, 0 readycentral.com, 1 readychurchsites.com, 1 @@ -121787,7 +121936,6 @@ reaksi.id, 1 real-it.nl, 1 real-linux.tk, 1 -real-milk.ru, 1 real-site.tk, 1 real-srebrenica-genocide.cf, 1 real-srebrenica-genocide.ga, 1 @@ -121804,6 +121952,7 @@ realclearlife.com, 1 realcom.hu, 1 realdomdom.cf, 1 +realeco.ai, 1 realestagency.com, 1 realestate-in-uruguay.com, 1 realestate-lidl.lu, 1 @@ -121827,7 +121976,6 @@ realgiulianova.it, 1 realhelpcompany.ga, 1 realhorsegirls.net, 1 -realhost.name, 1 realhypnosistraining.com.au, 1 realidad.tk, 1 realincest.tv, 1 @@ -121878,6 +122026,7 @@ realrapfans.tk, 1 realschule-rain.de, 1 realtechreviews.com, 1 +realtime-chart.info, 1 realtimenetworks.com, 1 realtimeregister.com, 1 realtorjohnfincher.com, 1 @@ -121893,7 +122042,6 @@ realum.net, 1 realvapamarde.cf, 1 realvestors.com, 1 -realvnc.com, 1 realvnc.help, 1 realware.com, 1 realwebsite.ga, 1 @@ -121934,12 +122082,12 @@ rebeldeway-al.tk, 1 rebeldeway-ks.tk, 1 rebellecare.com, 1 -rebelliouskitten.art, 1 rebello.trade, 1 rebellyon.info, 1 rebelonline.nl, 1 rebelsi.pl, 1 rebelstudio.ml, 1 +rebelz.se, 1 rebirthlongboard.co.th, 1 rebizzield.com, 1 rebo.ai, 1 @@ -121966,6 +122114,7 @@ recambiofacil.com, 1 recaptcha-demo.appspot.com, 1 recaptime.eu.org, 1 +recargafaciloficial.com, 1 recat-project.eu, 1 receipts-app.com, 1 receitas.tk, 1 @@ -121977,7 +122126,7 @@ receptenwebsite.com, 1 reception247.com, 0 receptionsbook.com, 1 -receptveka.ru, 1 +receptveka.ru, 0 recessmonkeyz.tk, 1 recetasdemape.com, 1 recetips.com, 1 @@ -122033,8 +122182,6 @@ recoilbox.com, 1 recolic.cc, 1 recolic.net, 1 -recollect.co.nz, 1 -recollect.net.au, 1 recollection.fr, 1 recollective.com, 1 recolor.ml, 1 @@ -122063,7 +122210,6 @@ recriereciclagem.com.br, 1 recroommasters.com, 1 recruit.net, 1 -recruitcrm.io, 0 recruiterbox.com, 1 recruiting.ai, 1 recruitpediacorp.com, 1 @@ -122073,7 +122219,6 @@ recruitskill.ga, 1 recruitskill.gq, 1 recruitwithclutch.com, 1 -rectale.com, 1 rectale.xyz, 1 rectecforum.com, 1 rectoraudiparts.com, 1 @@ -122119,6 +122264,7 @@ redable.nl, 1 redactibio.com, 1 redactieco.nl, 1 +redactionscientifique.com, 1 redaktcms.com, 1 redaktorii.com.ua, 1 redartgames.com, 1 @@ -122131,7 +122277,6 @@ redcandycane.tk, 1 redcapital.cl, 1 redcardinal.tk, 1 -redcarnationhotels.com, 1 redcarpetmonday.com, 1 redcatrampageforum.com, 1 redcedar.gov, 1 @@ -122162,7 +122307,6 @@ rede-reim.de, 1 rede-t.com, 1 redearsliderturtles.com, 1 -redecsirt.pt, 1 rededca.com, 1 rededecuidadores.pt, 1 redeemerlutheranschoolkokomo.org, 1 @@ -122219,6 +122363,7 @@ redington-bizboard.com, 1 redingtonconnect.com, 1 redingtongroup.com, 1 +redingtononline.com, 1 redion.me, 1 redir.me, 1 redireci.one, 1 @@ -122232,7 +122377,7 @@ redite.co, 1 redivis.com, 1 redjuice.co.uk, 1 -redkite.se, 1 +redkite.se, 0 redknothomes.com, 1 redlands.gov, 1 redlandspd.gov, 1 @@ -122263,7 +122408,6 @@ redneragenturen.org, 1 rednex.tk, 1 rednsx.org, 0 -rednumberone.com, 1 redoikos.org, 1 redondo.gov, 1 redoracle.com, 1 @@ -122314,7 +122458,6 @@ redte.com, 1 redteagame.com, 1 redteam-pentesting.de, 1 -redteam.coach, 1 redteamabseiling.co.uk, 1 redtomato.ga, 1 redtsar2000papers.tk, 1 @@ -122366,7 +122509,6 @@ reentry.gov, 1 reerguer.pt, 1 rees-carter.net, 1 -reesefortraviscounty.org, 1 reesmichael1.com, 1 reeson.at, 1 reeson.de, 1 @@ -122383,6 +122525,7 @@ refb.org, 1 refbanners.com, 1 refbanners.website, 1 +refcc.co.uk, 1 refer.codes, 1 refer.nhs.uk, 1 referat.club, 1 @@ -122432,7 +122575,6 @@ reformasflores.com, 1 reformatreality.com, 1 reformayobra.com, 1 -reformedermatology.com, 1 refpa.top, 1 refpa170071.top, 1 refpa4496162.top, 1 @@ -122456,7 +122598,6 @@ refpatqltx.top, 1 refpavikwm.top, 1 refpavnpad.top, 1 -refpaydc.top, 1 refpayio.top, 1 refpazkjixes.top, 1 reframeituk.org.uk, 1 @@ -122478,7 +122619,6 @@ refugeephrasebook.de, 1 refundo.cz, 1 refundo.sk, 1 -refundthem.com, 1 refurb-tracker.com, 1 refusedcarfinance.com, 1 refx.com, 1 @@ -122491,6 +122631,7 @@ regalador.com, 1 regalautosport.com, 1 regalcapitalwi.com, 1 +regalify.com, 1 regalosuhlala.com, 1 regalpaintingfdl.com, 1 regalradio.net, 1 @@ -122529,6 +122670,7 @@ reggea.tk, 1 reggiodigital.com, 1 reggiotoday.it, 1 +regiaodeleiria.pt, 1 regie-sc.ch, 1 regiftable.com, 1 regime-anticellulite.com, 1 @@ -122613,6 +122755,7 @@ rehasport-informationen.de, 1 rehasportwelt.de, 1 rehazonaliftservice.nl, 0 +rehberimgo.com.tr, 1 reher.pro, 1 rehive.com, 1 rehoboth-hollandscheveld.nl, 1 @@ -122652,7 +122795,7 @@ reimgr.com, 1 reims-digital.fr, 1 reimsmediaslibres.info, 1 -rein.ca, 1 +rein.ca, 0 reinaertvandecruys.com, 1 reinaertvandecruys.me, 1 reinaldudrasfamily.ee, 1 @@ -122696,6 +122839,7 @@ reissnehme.com, 1 reisspecialistdevalk.nl, 1 reitbeteiligungen.ch, 1 +reiterdairy.com, 1 reitmeier.me, 1 reitstall-goettingen.de, 1 reittherapie-tschoepke.de, 1 @@ -122804,6 +122948,7 @@ relishify.com, 1 relisten.nl, 1 reliware.co.uk, 1 +relixcheats.com, 1 rellek.org, 1 reloading.ml, 1 relocatefeds.gov, 1 @@ -122853,6 +122998,7 @@ remi-saurel.com, 1 remi-theriault.com, 1 remiafon.com, 1 +remiandre.fr, 1 remicade.com, 1 remifajardo.cf, 1 remilner.co.uk, 1 @@ -122898,7 +123044,6 @@ remontypodkarpackie.pl, 1 remora.tk, 1 remorse.ga, 1 -remoteassistants.io, 1 remotedesktop.corp.google.com, 1 remotedxb.com, 1 remoteoffice.ga, 1 @@ -122912,7 +123057,6 @@ removalsandstoragex.com, 1 removalsmanandvan.org, 1 removedrepo.com, 1 -remploy.co.uk, 1 remptmotors.com, 0 remsenny.gov, 1 remservices.ky, 1 @@ -122955,6 +123099,7 @@ renderzone.tk, 1 rendez-vous.gq, 1 rendezvous-cafe.co.uk, 1 +rendify.fr, 1 rendre-service.ch, 0 rendutowers.org.au, 1 rene-cafe.nl, 1 @@ -123065,7 +123210,7 @@ rentberry.com, 1 rentbrowser.com, 1 rentcafe.co.uk, 1 -rentex.com, 1 +rentex.com, 0 rentfaster.ca, 1 renthelper.us, 1 renticar.com, 1 @@ -123172,9 +123317,11 @@ reportexhq.com, 1 reporting.gov, 1 reportingonthetimes.com, 1 +reportmytaxes.com, 1 reportoid.tk, 1 reportoverdose.com, 1 reportquest.com, 1 +reportsrad.org, 1 reposaarenkuva.fi, 1 reposeed.dev, 1 reposeed.org, 1 @@ -123379,6 +123526,7 @@ ressupply.com, 1 rest-in-moscow.tk, 1 resta.ga, 1 +restacity.com, 1 restad.org, 1 restars-logistics.com, 1 restart-brno.cz, 1 @@ -123459,6 +123607,7 @@ resumic.io, 1 resumic.net, 1 resumic.org, 1 +resumocast.com.br, 1 resurfacehub.com, 1 resurgent.network, 1 resurspartner.tk, 1 @@ -123485,8 +123634,8 @@ retetop95.it, 0 retfe.com, 1 reth.ch, 1 +rethinkcommuting.org, 1 rethinkingchurch.net, 1 -rethinkproductivity.co.uk, 1 rethymnorooms.tk, 1 retia.cloud, 1 reticle.cf, 1 @@ -123585,7 +123734,7 @@ revconnect.tk, 1 revcovi.com, 1 revda.su, 1 -reveal-sound.com, 1 +revdashpro.com, 1 revealcellcamtracker.com, 1 revealdata.com, 1 revealmarket.xyz, 1 @@ -123608,7 +123757,6 @@ reversedns.tk, 1 reverseengineer.net, 1 reversemortgageguides.com, 1 -reversemortgageguides.org, 1 reversesouthafrica.com, 1 reversetransfer.org, 1 revgen.life, 1 @@ -123725,7 +123873,6 @@ rexel.fr, 1 rexeldvf.nl, 1 rexenergy.fi, 1 -rexeroofing.com, 1 rexo.ch, 1 rexograph.com, 1 rexskz.info, 1 @@ -123738,6 +123885,7 @@ rey.id, 1 reyesfernando.com, 1 reyesholdings.com, 1 +reyeswraps.com, 1 reykjaviktips.com, 1 reykjaviktips.nl, 1 reynders.xyz, 1 @@ -123794,6 +123942,7 @@ rggraphics.mx, 1 rgmdtri.ru, 1 rgnext.com, 1 +rgoods.com, 1 rgpd-elearning.com, 1 rgservice.ml, 1 rgshealthcare.com, 1 @@ -123816,7 +123965,6 @@ rhein-erft-kreis.de, 1 rhein-liebe.de, 1 rhein-main-rna.de, 1 -rheincargo.com, 1 rheine.schule, 1 rheineschulen.de, 1 rheinland-pilgern.de, 1 @@ -123927,7 +124075,6 @@ riceforafrica.net, 1 ricelasvegas.com, 1 ricettedellanonna.net, 1 -ricettesemplicieveloci.altervista.org, 1 rich-good.com, 0 richadams.me, 1 richandsteph.co.uk, 1 @@ -123943,7 +124090,6 @@ richardharpur.com, 1 richardhouts.tk, 1 richardinesrolltop.com, 1 -richardkorom.hu, 1 richardlangham.plumbing, 1 richardleereporting.com, 1 richardlewisjewelry.com, 1 @@ -123961,7 +124107,6 @@ richardson.tw, 1 richardsonceballo.com, 1 richardsoncountyne.gov, 1 -richardsongomes.com, 1 richardsreporting.com, 1 richardstengel.com, 1 richardstonerealestate.com, 0 @@ -124011,7 +124156,6 @@ rickelrath.de, 1 rickengineering.com, 1 ricki-z.com, 0 -rickmakes.com, 1 rickmanlegal.com, 1 rickmartensen.nl, 0 ricknewman.pro, 1 @@ -124060,7 +124204,6 @@ ridgelineit.com.au, 1 ridgelysradar.com, 1 ridgespringsc.gov, 1 -ridgewaterlodge.com, 1 ridgewaywi.gov, 1 ridgidgear.eu, 1 ridho.id, 1 @@ -124132,7 +124275,6 @@ rigonidiasiago.de, 1 rigonidiasiago.es, 1 rigonidiasiago.fr, 1 -rigonidiasiago.international, 1 rigonidiasiago.it, 1 rigonidiasiago.nl, 1 rigonidiasiago.pl, 1 @@ -124164,7 +124306,6 @@ rikuwe.eu, 1 rikuwe.work, 1 rileyevans.co.uk, 1 -rileypaige.com, 1 rileys.club, 0 rileyskains.com, 0 rileystar.com, 1 @@ -124177,6 +124318,10 @@ rime.red, 1 rimessaggio.it, 1 rimetsu.com, 1 +rimi.ee, 1 +rimi.lt, 1 +rimi.lv, 1 +rimibaltic.com, 1 rimin.moe, 1 riminghuts.com, 1 riministreet.com, 0 @@ -124186,7 +124331,6 @@ rimorrecherche.nl, 1 rimpianto.com, 1 rimzim.tk, 1 -rinabhabra.com, 1 rincat.ch, 1 rincon-nsn.gov, 1 rinconanimalista.com, 1 @@ -124194,6 +124338,7 @@ rinconga.gov, 1 rinconplacas.com, 1 rinconwaterca.gov, 1 +rindepo.com, 1 rineke.art, 1 ring.com, 1 ring2.de, 1 @@ -124230,7 +124375,6 @@ riomi.org, 1 riosoil.co.uk, 1 riosoil.com, 1 -riosoils.co.uk, 1 riosoils.com, 1 riotplus.com, 1 ripadores.tk, 1 @@ -124261,7 +124405,6 @@ riptidetech.io, 1 ripvip.ie, 1 riri-tendedasole.it, 1 -riri.my, 1 ririro.com, 1 ris.fi, 1 ris2048.pt, 1 @@ -124324,6 +124467,7 @@ risquefetish.net, 1 risquefetish.org, 1 risquefetishtoys.com, 1 +risson.space, 1 ristioja.ee, 1 ristisanat.fi, 0 ristorante-orchidea.be, 1 @@ -124359,7 +124503,6 @@ rittau.org, 1 ritterspach.me, 1 ritual-gratek.ru, 1 -ritual.com, 1 ritual.ml, 0 rituelamour.com, 1 ritus.md, 1 @@ -124371,6 +124514,7 @@ rivals.space, 1 rivalsa.cn, 1 rivalsa.net, 1 +rivalyse.fr, 1 rivastation.de, 1 riveal.fr, 1 rivenmains.com, 1 @@ -124385,6 +124529,7 @@ rivercityroofs.com, 1 riverford.co.uk, 1 riverlea.com.au, 1 +riveros.tv, 1 riverotravel.cl, 1 riverpark.casa, 1 riverrun.tk, 1 @@ -124400,6 +124545,7 @@ riversmeet.co.uk, 1 riverspromo.com, 1 riversroses.de, 1 +riversseasoceans.org, 1 riverton.se, 1 rivertv.ca, 1 riverviewcamp.com, 1 @@ -124411,6 +124557,7 @@ rivethealthlaw.com, 1 rivian.com, 1 riviantrackr.com, 1 +rivierainvest.hu, 1 rivingtongreenwich.co.uk, 1 rivirliving.com, 1 rivistadipsichiatria.it, 1 @@ -124464,7 +124611,6 @@ rlan.eu.org, 1 rland.ph, 1 rleeden.servehttp.com, 1 -rleh.de, 1 rllinsure.com, 0 rlmud.tk, 1 rlove.org, 1 @@ -124511,7 +124657,7 @@ rmsupply.nl, 1 rmt-construction.co.za, 1 rmtconstruction.co.za, 1 -rmurai.com, 0 +rmurai.com, 1 rmvalues.com, 1 rmw-energy.de, 1 rn29.me, 1 @@ -124619,6 +124765,7 @@ robin-novotny.com, 1 robin.co.kr, 1 robin.info, 1 +robinapersonaltrainers.com, 1 robinb0s.nl, 1 robinbos.nl, 1 robinbrook.co.uk, 1 @@ -124720,9 +124867,9 @@ rock4life.be, 1 rocka.me, 1 rockabilly-sinners.tk, 1 +rockalendar.es, 1 rockandroll.tk, 1 rockats.org, 1 -rockbandparty.com, 1 rockbankland.com.au, 1 rockbridge.tk, 1 rockcelebrities.net, 1 @@ -124749,30 +124896,6 @@ rocketpin.com, 1 rocketr.net, 1 rocketrubber.com, 1 -rocketsales.al, 1 -rocketsales.at, 1 -rocketsales.be, 1 -rocketsales.bg, 1 -rocketsales.by, 1 -rocketsales.cz, 1 -rocketsales.dk, 1 -rocketsales.es, 1 -rocketsales.eu, 1 -rocketsales.fi, 1 -rocketsales.fr, 1 -rocketsales.gr, 1 -rocketsales.io, 1 -rocketsales.it, 1 -rocketsales.lt, 1 -rocketsales.lu, 1 -rocketsales.md, 1 -rocketsales.me, 1 -rocketsales.mk, 1 -rocketsales.pt, 1 -rocketsales.ro, 1 -rocketsales.se, 1 -rocketsales.si, 1 -rocketsales.sk, 1 rocketsciencerealty.com, 1 rocketsworld.tk, 1 rockettube.com, 0 @@ -124806,7 +124929,6 @@ rockportusa.com, 1 rockpov.com.br, 1 rockptx.com, 1 -rockraiders.rocks, 1 rockrider.tk, 1 rockriver.tk, 1 rockrivertrail.com, 1 @@ -124821,6 +124943,7 @@ rockworldteam.tk, 1 rockyford-co.gov, 1 rockymountaininsurancecenter.com, 1 +rockymountainrolloffandwaste.com, 1 rockymountainspice.com, 1 rockymountva.gov, 1 rockymtnexpress.com, 1 @@ -124923,7 +125046,6 @@ roguenexus.io, 1 roguerocket.com, 1 roguetech.ca, 1 -roguevalleywinecountry.com, 1 rohal.tk, 1 rohansingh.cf, 1 rohde.de, 0 @@ -124944,6 +125066,7 @@ roishopper.com, 1 roisu.org, 0 rojandaru.com, 1 +rojgarmandi.com, 1 rojiblancos.tk, 1 rojotv.tk, 1 rok-pro-dobro.cz, 1 @@ -125210,7 +125333,6 @@ roots.io, 1 rootsandrain.com, 1 rootsbar.fr, 0 -rootsindia.com, 1 rootsinmadrid.tk, 1 rootsland.de, 1 rootsland.net, 1 @@ -125225,7 +125347,6 @@ roozbeh.tk, 1 rop.cx, 1 ropd.info, 1 -ropesmart.com, 1 ropo.uk, 1 roquebrunesurargens-tourisme.fr, 1 roques.tk, 1 @@ -125287,7 +125408,6 @@ rosewebdesignstudio.co.uk, 1 rosewebdesignstudio.uk, 1 rosfan.by, 1 -rosgenea.ru, 1 roshanrsivakumar.com, 0 roshiya.co.in, 1 roshmed.com, 1 @@ -125313,11 +125433,11 @@ rosscountyohiocourts.gov, 1 rosscountyohiotaxlist.gov, 1 rossen.be, 1 +rosser.no, 1 rosset.me, 1 rosset.net, 1 rossi-aero.com, 1 rossia.ga, 1 -rossignoli.it, 1 rossiyskaja.cf, 1 rosskingbooks.com, 1 rosslug.org.uk, 1 @@ -125342,9 +125462,7 @@ rostzaschita.ru, 1 roswellcity.tk, 1 rosystemsint.com, 1 -rot256.io, 1 rot47.net, 1 -rot8nutrition.com, 1 rota.te.it, 1 rotamap.net, 1 rotanaval.tk, 1 @@ -125394,6 +125512,7 @@ rottnestexpress.com.au, 1 rottweil-hilft.de, 1 rottweilerdogcare.com, 1 +rotulo.fit, 1 rotunneling.net, 1 rouair.com, 1 rouamatfashion.gr, 1 @@ -125406,6 +125525,7 @@ roughnotes.com, 1 roughtime.se, 1 rouken.bio, 1 +roukencells.com, 1 roulettelive.ml, 1 roulettestar.com, 1 roulinfo.ch, 0 @@ -125431,6 +125551,7 @@ routemates.tk, 1 router24.info, 1 routerclub.ru, 1 +routeto.com, 1 routevanverzoening.nl, 1 rouwcentrumterheide.be, 1 rouxb.in, 1 @@ -125472,7 +125593,6 @@ roxswinery.com, 1 roxville.tk, 1 roy-buehring.de, 1 -roy-space.com, 1 roy.wang, 1 royacshop.com, 1 royal-coatings.com, 1 @@ -125493,7 +125613,6 @@ royal84.com, 0 royal851.com, 0 royal852.com, 0 -royal869.com, 0 royal876.com, 0 royal877.com, 0 royal88.com, 1 @@ -125571,8 +125690,6 @@ royzez.com, 1 rozalisbengal.ro, 1 rozalynne-dawn.ga, 1 -rozar.eu, 1 -rozar.sk, 1 rozataki.com.tr, 1 rozemaandag.tk, 1 rozemuller.com, 0 @@ -125581,6 +125698,7 @@ rozprodat.cz, 1 rozsvitsvet.cz, 1 roztilefona.net, 1 +rozwazania.pl, 1 rozwod.bydgoszcz.pl, 1 rozwod.gdansk.pl, 1 rozwod.gdynia.pl, 1 @@ -125761,7 +125879,9 @@ rtestore.eu, 1 rtgame.co.uk, 1 rtgnews.cf, 1 +rtholf.nu, 1 rths.tk, 0 +rtidhonbe.com, 1 rtjobsite.com, 1 rtkbe.com, 1 rtlnitro.de, 1 @@ -125808,6 +125928,7 @@ rubberband.com, 1 rubberduckers.co.uk, 1 rubbermaidoutlet.com, 0 +rubbermetrics.com, 1 rubbleedenvale.co.za, 1 rubblekempton.co.za, 1 rubblemidrand.co.za, 1 @@ -125826,7 +125947,6 @@ rubens.cloud, 0 rubensalgado.com, 1 rubenschulz.nl, 1 -rubenshotel.com, 1 rubenshuis.be, 1 rubenslikkarchive.com, 1 rubensteinphotography.com, 1 @@ -125853,7 +125973,6 @@ rubooks.gq, 1 rubreklama.tk, 1 ruby-auf-schienen.de, 1 -rubyfactory.io, 1 rubyhornet.com, 1 rubykon.com, 1 rubymaybetranslations.com, 1 @@ -125861,6 +125980,7 @@ rubyonline.tk, 1 rubyonremote.com, 1 rubyquincunx.org, 1 +rubyrelay.com, 1 rubystore.ga, 1 rucheentreprise.fr, 1 ruchka-mashinka.gq, 1 @@ -125952,6 +126072,8 @@ ruiruigeblog.com, 1 ruisai.org, 1 ruitersportbak.nl, 1 +ruitio.com, 1 +ruixin.org, 1 ruja-pass.ddnss.de, 1 rujbin.ddns.net, 1 rukhaiyar.com, 1 @@ -126025,11 +126147,12 @@ rungutan.com, 1 runharbor.com, 1 runicspells.com, 1 +runique.io, 1 runjak.codes, 1 runklesecurity.com, 1 runlet.gq, 1 runlevel3.de, 1 -runmyprocess.com, 1 +runmyprocess.com, 0 runmyqubit.com, 1 runmyqubit.de, 1 runmyvillage.com, 1 @@ -126073,6 +126196,7 @@ ruralaventura.com, 1 ruralenergy.com, 1 ruralratings.us, 1 +ruralseptictn.com, 1 ruralsuppliesdirect.co.uk, 1 rurange-les-thionville.fr, 1 rurian-gyohen.com, 1 @@ -126166,8 +126290,8 @@ rustamkhanko.gq, 1 rustarg.com, 1 rustargentina.com, 1 +rustbanned.net, 1 rustdesk.com, 1 -rustfactory.io, 1 rustfu.rs, 1 rusticus-consulting.de, 0 rustls.com, 1 @@ -126251,18 +126375,18 @@ rw19.de, 1 rw2.de, 1 rwalch.at, 1 -rwandalicious.com, 1 +rwandalicious.com, 0 rway.pro, 1 rwb.charity, 1 rwbstuff.com, 1 rwgamernl.ml, 1 rwglaw.com, 1 rwhapdentalservicesreport.net, 1 -rwlib.net, 1 rwnpropertyservices.com, 1 rwp7.com, 1 rws-cc.com, 1 rws-vertriebsportal.de, 1 +rwu.edu.pk, 1 rwuhawksherald.com, 1 rwx.ovh, 1 rwx.work, 1 @@ -126275,10 +126399,8 @@ rxcarbon.com, 1 rxcom.net, 1 rxhill.com, 1 -rxkids.org, 1 rxperiusdata.com, 1 -rxphoto.com, 1 -rxsecurestores.com, 1 +rxphoto.com, 0 rxxx.ml, 1 rya.nc, 1 ryabinushka.tk, 1 @@ -126456,7 +126578,9 @@ s5g8.com, 1 s64.cz, 1 s6729.co, 1 +s69.no, 1 s6957.co, 1 +s6967.de, 1 s6jl.com, 1 s6n.jp, 0 s6o.de, 1 @@ -126468,7 +126592,7 @@ s9297.co, 1 s95.de, 1 s9728.co, 1 -s9h.cn, 0 +s9h.cn, 1 sa-blog.net, 1 sa-mp.me, 1 sa-mp.ro, 1 @@ -126512,7 +126636,6 @@ sabe.cc, 1 sabedinovski.tk, 1 saber-nyan.com, 1 -sabesprev.com.br, 1 sabghijewelers.com, 1 sabharwallawfirm.ca, 1 sabians.tk, 1 @@ -126548,6 +126671,7 @@ sabworldtricks.tk, 1 sac-cu2.org, 1 sac-shoes.fr, 1 +sac.gov, 1 sacademica.tk, 1 sacaentradas.com, 1 saccani.net, 1 @@ -126558,6 +126682,7 @@ sacektirme.tk, 1 sacfreightlines.com, 1 sacha-botz.com, 0 +sachagoldberg.com, 1 sacharidovejednotky.eu, 1 sachasmets.be, 1 sachi.lk, 1 @@ -126663,6 +126788,7 @@ safecargotraining.com.br, 1 safechoicestas.org.au, 1 safecircuitelectric.com, 1 +safecleansanitation.com, 1 safeclima.com, 1 safecode1.com, 1 safecoin.tech, 1 @@ -126671,6 +126797,7 @@ safedatabasesystems.com, 1 safedrivepod.com, 1 safeers.tk, 1 +safefilestore.com, 1 safefreehost.gq, 1 safefreepornsites.com, 1 safegold.ca, 1 @@ -126696,6 +126823,7 @@ safeo.fr, 1 safeocs.gov, 1 safepassvpn.com, 0 +safeplayground.net, 0 safer-software.tk, 1 safera.com, 1 safercar.gov, 1 @@ -126706,6 +126834,7 @@ saferproducts.gov, 1 safersurfing.eu, 0 safertruck.gov, 1 +saferutar.com, 1 safes24.com, 1 safesail.pt, 1 safescif.com, 1 @@ -126757,7 +126886,6 @@ safkgroup.com, 1 safleo.org, 1 safor-sante-formation.com, 1 -safquh.com, 1 safranarea.com, 1 safranarea.eu, 1 sag-consultores.com, 1 @@ -126784,7 +126912,6 @@ sagicorgeneral.com, 1 sagicorlife.com, 1 sagicorlifeusa.com, 1 -sagilityhealth.com, 1 saginawtx.org, 1 sagitta.hr, 1 saglik-haberleri.tk, 1 @@ -126795,7 +126922,7 @@ sagogangen.se, 1 sagomedia.tk, 1 sagradamadre.hu, 1 -sagradobyme.cl, 1 +sagradobyme.cl, 0 sagsaga.org, 1 saguarocc.com, 1 sahabatnesia.com, 1 @@ -126807,7 +126934,6 @@ sahar.io, 1 saharacloud.com, 1 sahararun.tk, 1 -saharax.io, 1 saharazik.tk, 1 saharmassachi.com, 1 sahatchaiy.ddns.net, 1 @@ -126893,7 +127019,6 @@ sainthedwig-saintmary.org, 1 sainthelena-centersquare.net, 1 sainthelenaparish.net, 1 -sainthelenas.org, 1 saintisidorecyo.com, 1 saintjamestheapostle.org, 1 saintjohn-bocaraton.com, 1 @@ -126932,7 +127057,6 @@ saisecure.net, 1 saiserver.online, 1 saisons-fruits-legumes.fr, 1 -saisyuusyou-ikebukuro.com, 1 sait.health, 1 saitapovan.com, 1 saitas.net, 1 @@ -126947,7 +127071,7 @@ sajetekengineering.com, 1 sajter.ga, 1 sak.pt, 1 -sakac.cz, 1 +sakac.cz, 0 sakainvest.com, 1 sakaki.anime.my, 0 sakamichi.moe, 1 @@ -126991,6 +127115,7 @@ salamence.tk, 1 salamkisan.com, 1 salamon-it.de, 1 +salampolyclinic.om, 1 salamzibaei.com, 1 salariominimo.com.co, 1 salaryfinance.com, 1 @@ -127065,7 +127190,6 @@ salfraedingarnir.is, 1 salge.rocks, 1 salgueirocarlos.com, 1 -salianmod.ir, 1 salibandy.tk, 1 salidaswap.com, 1 salient-dialers.com, 1 @@ -127136,7 +127260,6 @@ salonmarjon.nl, 1 salonni.tk, 1 salonpaikku.fi, 1 -salonsantebienetre.ch, 0 salontaidemuseo.fi, 1 salsa-disaster.net, 1 salsa-straubing.de, 1 @@ -127199,6 +127322,7 @@ salzburg-erfahren.at, 1 salzburg-verkehr.at, 1 salzburgsfinest.tk, 1 +salzerdigital.de, 1 salzerperu.com, 1 salzmann.solutions, 1 sam-football.fr, 1 @@ -127238,7 +127362,6 @@ samclarke.uk, 1 samcollin.be, 1 samdev.io, 1 -same.lol, 1 samedamci.com, 1 samedayglendoracleantruckcheck.com, 1 samedis.care, 1 @@ -127261,7 +127384,6 @@ sametcanaz.tk, 1 sameteem.com, 1 sametimetomorrow.tk, 1 -samhall.se, 1 samhsa.gov, 1 samhuri.net, 1 sami.photo, 1 @@ -127310,6 +127432,7 @@ samozdraw.ga, 1 sampaguide.com, 1 sampath.lk, 1 +sampati.com.br, 1 sampatjewelers.com, 1 samplechapterpodcast.com, 1 samplefashion.nl, 1 @@ -127318,7 +127441,6 @@ sampsoncountync.gov, 1 sampsonplumbing.com, 0 samquick.me.uk, 1 -samroelants.com, 1 samsara.nl, 1 samscollection.in, 1 samsebe.ml, 1 @@ -127374,6 +127496,7 @@ sanagustin.com, 1 sanalaile.tk, 1 sanalikaforum.tk, 1 +sanalsehrim.com, 1 sanandreasstories.com, 1 sanantoniolocksmithtx.com, 1 sanaorganizasyon.com, 1 @@ -127417,7 +127540,6 @@ sandbox.mydigipass.com, 0 sandcastle.eu.org, 1 sanddev.com, 1 -sanddollarsstudio.com, 1 sandelduggal.com, 1 sanderdesign.tk, 1 sanderdorigo.nl, 1 @@ -127496,6 +127618,7 @@ sandybigboobs.com, 1 sandybigboobs.net, 1 sandycreekrvpark.com, 1 +sandykeymedical.com, 1 sandyvazquez.com, 1 sanemind.de, 1 sanetschka.tk, 1 @@ -127585,11 +127708,11 @@ sanpatigroup-recruit.jp, 1 sanpatriciocountytx.gov, 1 sanpham-balea.org, 1 +sanpure.in, 1 sanqinyinshi.com.cn, 1 sanrafaelvigo.org, 1 sanraizu.top, 1 sanroque.es, 1 -sans-hotel.com, 1 sans-papiers.ch, 1 sansairyu-kuyoukai.com, 1 sansdb.io, 0 @@ -127601,7 +127724,6 @@ sanskritiyoga.com, 1 sansonehowell.com, 1 sansukien.com, 1 -sansumclinic.org, 1 santa-ana.gov, 1 santa-fell-from.space, 1 santabarbaraca.gov, 1 @@ -127656,7 +127778,6 @@ santiagogarza.co, 1 santiagomeli.ar, 1 santiagomeli.com.ar, 1 -santiagoslandscapingservicesinc.com, 1 santibanezdetera.tk, 1 santibz.es, 1 santigl.es, 1 @@ -127774,7 +127895,6 @@ sarahweinman.com, 1 sarahwellington.com, 1 sarahwikeley.co.uk, 1 -saraleedesserts.com, 1 saranamayyappa.tk, 1 sarand.ch, 0 saransk-news.net, 1 @@ -127883,7 +128003,6 @@ sashascollections.com, 1 sashleighaust.com, 1 sashok724.net, 1 -sashroy.shop, 1 sashroyee.com, 1 sasioglu.co.uk, 1 sasken.com, 1 @@ -127970,6 +128089,7 @@ saubooks.tk, 1 saucelabs.com, 1 saucesmaster.com, 1 +sauco.io, 1 saudecoluna.com, 1 saudedigitalnews.com.br, 1 saudenoclique.com.br, 1 @@ -128205,12 +128325,14 @@ sboh.nl, 1 sborka.ml, 1 sbpk.fr, 1 +sbplatform.pages.dev, 1 sbpropman.co.uk, 1 sbrc.gov, 1 sbristolme.gov, 1 sbrouwer.org, 1 sbrownbourne.com, 0 sbs-studies.gr, 1 +sbsc.se, 1 sbscyber.com, 1 sbspectr.ru, 1 sbspp.ru, 1 @@ -128227,6 +128349,7 @@ sc019.com, 1 sc2labs.com, 1 sc2pte.eu, 1 +sc88.trade, 1 sca-webdesign.be, 1 scadalliance.org, 1 scadanews.net, 1 @@ -128234,13 +128357,11 @@ scaffoldhiremidrand.co.za, 1 scaffoldhirerandburg.co.za, 1 scaffoldhiresandton.co.za, 1 -scaffoldinghiresandton.co.za, 1 scaffoldingmidrand.co.za, 1 scaffoldingsandton.co.za, 1 scag9.com, 1 scalable.capital, 1 scalableb2b.com, 1 -scalafactory.io, 1 scalaire.com, 1 scalaire.fr, 1 scale.at, 1 @@ -128323,11 +128444,11 @@ scatteredcode.net, 1 scatterscasino.com, 1 scatterwin.net, 1 +scattopro.it, 1 scavalentenx.duckdns.org, 1 scavenged.ga, 1 scayle.com, 1 scbdh.org, 1 -scbfireworks.com, 1 scbodner.com, 1 scc-aircompressors.com, 1 sccan.scot, 1 @@ -128406,7 +128527,10 @@ scheduleareporter.com, 1 scheduledepo.com, 1 schedulehero.io, 1 +schedulure.com, 1 scheervergelijker.nl, 1 +schefczyk-privat.de, 1 +schefczyk.ch, 1 schefczyk.com, 1 schefczyk.de, 1 schefczyk.eu, 1 @@ -128520,6 +128644,7 @@ schmucker.it, 1 schmunzelgeist.de, 1 schnalstal.info, 1 +schnalz.net, 1 schnapke.name, 1 schnapsverein.ddns.net, 1 schnaube.de, 1 @@ -128543,7 +128668,6 @@ schody-rozycki.pl, 1 schoenheitsop.com, 1 schoenstatt-fathers.link, 1 -schoenstatt-fathers.us, 1 schoenstatt.link, 1 schoental.de, 1 schoepski.de, 1 @@ -128575,6 +128699,7 @@ scholledev.com, 1 scholohost.tk, 1 scholtensupport.nl, 1 +scholven.marketing, 1 scholz-kallies.de, 1 schonstedt.com, 1 school-22.tk, 1 @@ -128595,6 +128720,7 @@ schoolbag.gq, 1 schoolbag.ml, 1 schoolbag.tk, 1 +schoolbreach.org, 1 schoolbytes.com.au, 1 schoolbytes.education, 1 schoolcafe.com, 1 @@ -128609,6 +128735,7 @@ schooleducationharyana.gov.in, 1 schoolheads.ph, 1 schoolhouse.world, 1 +schoolofrussianballetsingapore.com, 1 schoolroom.ga, 1 schoolrumble.tk, 1 schoolsafety.gov, 1 @@ -128618,6 +128745,7 @@ schoolstreaks.com, 1 schoolsystemonthego.com, 1 schooltransport.com.au, 1 +schoolwork.bot, 1 schoolyogainstitute.com, 1 schoonheidssalon-annelies-santpoort.nl, 1 schoonheidssalon-annelies-velserbroek.nl, 0 @@ -128761,6 +128889,10 @@ scienceofpeople.com, 0 sciencequality.tk, 1 scienceschool.ml, 1 +sciencesoft.co, 1 +sciencesoft.io, 1 +sciencesoft.org, 1 +sciencesoft.tech, 1 sciencesolutions.eu, 1 sciencetechworld.tk, 1 sciencetoymaker.org, 1 @@ -128817,6 +128949,11 @@ scnow.com, 1 scnsoft.com, 1 scnsoft.de, 1 +scnsoft.lt, 1 +scnsoft.lv, 1 +scnsoft.om, 1 +scnsoft.pl, 1 +scnvision.com, 1 scodeno.vn, 1 scoebg.org, 1 scoffable.com, 1 @@ -128943,7 +129080,6 @@ scpslgame.wiki, 1 scqpw.com, 1 scra.gov, 1 -scrabble-solver.com, 1 scrabblecheat.com, 1 scrabbleonline.nl, 1 scrambled.online, 1 @@ -128981,14 +129117,12 @@ screenwalker.de, 1 screenwatermarksoftware.com, 1 screenwriter.tk, 1 -screenzy.io, 1 screfer.com, 1 screvencosheriffga.gov, 1 screvencountyga.gov, 1 scribbler.monster, 1 scribbler.tk, 1 scribd.com, 1 -scribesecurity.com, 1 scripo-bay.com, 1 scrippsnews.com, 1 script-sign.com, 1 @@ -129007,6 +129141,7 @@ scroar.net, 1 scrod.me, 1 scroll-to-top-button.com, 1 +scroll.pt, 1 scrollbots.com, 1 scroollocker.tk, 1 scrot.de, 1 @@ -129021,7 +129156,6 @@ scryfall.com, 1 scrylytics.com, 1 scrypro.com, 1 -scs-technik.de, 1 scsd.si, 1 scservis.cz, 1 scsp.ai, 1 @@ -129042,6 +129176,7 @@ sculpteo.com, 1 sculptor.com, 1 sculpturesworldwide.tk, 1 +scum.fr, 1 scunna.com, 1 scunthorpemoneyman.com, 1 scuolabandistica.ch, 1 @@ -129069,6 +129204,7 @@ sd2017.com, 1 sd44.ca, 1 sdaniel55.com, 1 +sdap.io, 1 sdarcc.gov, 1 sdarot.tw, 1 sdayman.com, 1 @@ -129079,6 +129215,7 @@ sdc-uae.ae, 1 sdcardrecovery.de, 1 sdcargo.net, 1 +sdcitytimes.com, 1 sdeb.org, 1 sdebitati.it, 1 sdeu.fr, 1 @@ -129121,6 +129258,7 @@ sdsmanagement.me, 0 sdsmt.engineering, 1 sdstack.com, 1 +sdsucollegian.com, 1 sduconnect.nl, 0 sdut.gq, 1 sdvv.nl, 1 @@ -129158,7 +129296,7 @@ sealink.co.nz, 1 sealofbiliteracy.org, 1 sealoffantasy.de, 1 -sealtitebasement.com, 1 +sealtitebasement.com, 0 sealvault.org, 1 seamac.info, 1 seamester.com, 1 @@ -129274,11 +129412,13 @@ sebar-iklan.gq, 1 sebariklanmassal.gq, 1 sebarin.tk, 1 +sebastiaandenboer.eu, 1 sebastiaandouma.co.uk, 1 sebastiaanwijnimport.nl, 1 sebastian-bergmann.de, 1 sebastian-bravo.com, 1 sebastian-elisa-pfeifer.eu, 1 +sebastian-goetz.com, 1 sebastian-haeutle.de, 1 sebastian-janich.de, 1 sebastian-kraus.me, 1 @@ -129352,6 +129492,7 @@ secondmeasure.com, 1 secondnature.bio, 1 secondperson.net, 1 +secondround.ch, 1 secondsightmgt.com, 1 secondthought.ai, 1 secondtreasuresmv.com, 1 @@ -129419,6 +129560,7 @@ sectv.com, 1 secudoc.nl, 1 secularweb.org, 1 +seculynx.com, 1 secumailer.com, 0 secumailer.nl, 0 secundity.com, 1 @@ -129563,7 +129705,9 @@ sedro-woolley.gov, 1 seduxury.com, 1 seduzironline.com.br, 1 +see-me.co, 1 see-now.co, 1 +see-you.co, 1 see.you, 1 seearmenia.tk, 1 seeaway.com.br, 1 @@ -129576,6 +129720,7 @@ seedandleisure.co.uk, 1 seedbox.fr, 1 seedbox.hosting, 1 +seedcraftdigital.com, 1 seedersinstruments.com, 1 seedhammer.com, 1 seedisclaimers.com, 1 @@ -129618,6 +129763,7 @@ seetheprogress.eu, 1 seetheprogress.net, 1 seetheprogress.org, 1 +seethis.place, 1 seetow.sg, 1 seetv.ga, 1 seeusercontent.com, 1 @@ -129626,6 +129772,7 @@ seewines.com, 1 seexw.com, 1 sef.co.za, 1 +sefan.ru, 1 sefaratvisa.com, 1 sefareshpardeh.com, 0 seferleri.net, 1 @@ -129641,7 +129788,6 @@ sega-play.online, 1 sega73.hu, 1 segamastersystem.tk, 1 -segaretro.org, 1 segaskets.com.au, 1 segdo.de, 1 segdo.media, 1 @@ -129732,6 +129878,7 @@ sejutaproperti.com, 1 sek.ai, 0 seka-ru.com, 1 +sekai-kabuka.com, 1 sekainokokki.jp, 1 sekfung.me, 1 sekiei-lifeservice.net, 1 @@ -129756,7 +129903,6 @@ sel4.systems, 1 selang.cf, 1 selang.ml, 1 -selatv.com, 1 selayar.vacations, 1 selber-coden.de, 1 selbst-schmiede.de, 1 @@ -129779,7 +129925,6 @@ selen.com.br, 1 selena-armavir.ml, 1 selenapelletier.tk, 1 -selenegames.com, 1 seleondar.ru, 1 selesnafes.com, 0 selezionebarbrboguaccero.cf, 1 @@ -129806,6 +129951,7 @@ selfiestick.bg, 1 selfimprovementdaily.com, 1 selfishness.com, 1 +selfiys.com, 1 selfloath.in, 1 selfmade.id, 1 selfmade4u.de, 0 @@ -129828,7 +129974,6 @@ selldorado.com, 1 seller.diamonds, 1 sellerengine.com, 1 -sellerrunning.com, 0 sellers.market, 1 sellersfunding.com, 1 sellersmart1.com, 1 @@ -129939,7 +130084,8 @@ semrush.com, 1 sems-cnm.net, 1 semsec.net, 1 -semtinde.com, 1 +semtinde.com, 0 +semuasekolah.com, 1 semver.ca, 1 semyonov.su, 1 sen-uni-lu.ch, 1 @@ -129973,7 +130119,6 @@ sendai-sisters.com, 1 sendai-sougou.com, 1 sendai-works.com, 1 -sendaimori.com, 1 sendaiouji.com, 1 sendbird.com, 1 sendcredit.com, 1 @@ -130080,6 +130225,7 @@ senterada.tk, 1 sentez-cro.com, 1 sentia.com, 1 +sentientforge.ai, 1 sentiment.rest, 1 sentiments.io, 1 sentinel.com, 1 @@ -130088,6 +130234,7 @@ sentinelone.com, 1 sentinelproject.io, 1 sentinels.tk, 1 +sentinexrisk.com, 1 sentirmebien.org, 1 sentitvia.email, 1 sentmail.ga, 1 @@ -130095,8 +130242,8 @@ sentorsecurity.com, 1 sentrafield.com, 1 sentral.com, 1 -sentralegal.com, 1 sentry.io, 1 +sentrygateopener.com, 1 sentrysoftware.com, 1 sentworks.com, 0 senvion.in, 1 @@ -130108,6 +130255,7 @@ seo-dr-it.com, 1 seo-dvizh.ru, 1 seo-forum.nu, 1 +seo-inc.ru, 0 seo-linz.at, 1 seo-obmen.tk, 1 seo-phpbb.cf, 1 @@ -130214,6 +130362,7 @@ seosprint.gq, 1 seostrit.cf, 1 seostrit.tk, 1 +seosuccor.com, 1 seoteam.tk, 1 seotec.com.br, 1 seotesty.cz, 1 @@ -130228,6 +130377,7 @@ seoviziti50.tk, 1 seowerkz.com, 0 seowhizone.com, 1 +seowordpress.pl, 1 seowork.tk, 1 seozel.tk, 1 seozen.top, 1 @@ -130238,7 +130388,6 @@ sepadental.com.my, 0 separacioniglesiaestado.tk, 1 separate.ly, 1 -sepehrmahan.com, 1 sepenggal.info, 1 sepio.systems, 1 sepiocyber.com, 1 @@ -130292,6 +130441,7 @@ serecoponsillo.it, 1 sereema.com, 1 serele.fr, 1 +seren.link, 1 seren.tk, 1 serenahotels.com, 1 serenaparadise.com, 1 @@ -130370,6 +130520,7 @@ serp.technology, 1 serpensin.com, 1 serpenteq.com, 0 +serpentsway.com, 1 serpes.nz, 1 serphost.ml, 1 serpinco.com, 1 @@ -130415,7 +130566,6 @@ server-daten.de, 1 server-essentials.com, 1 server-kiste.de, 1 -server-zugang.eu, 1 server.fm, 1 server.pro, 1 server.vote, 1 @@ -130431,7 +130581,6 @@ serverco.com, 1 serverd.de, 1 serverdechile.tk, 1 -serverdensity.io, 1 serverdozen.nl, 1 serverdragon.site, 1 serveretail.com, 1 @@ -130448,7 +130597,7 @@ serverninja.tk, 1 serveroffline.net, 1 serverpedia.de, 1 -serverscan.com, 1 +serverscan.com, 0 serversify.host, 1 serversify.net, 0 serverstatus.tk, 1 @@ -130529,7 +130678,6 @@ servingupsouthern.com, 1 servipizza.com, 1 servis-azd.cz, 1 -servis.in.net, 1 servis4u.top, 1 servisebi.ge, 1 servisibursa.net, 1 @@ -130648,6 +130796,9 @@ sevastopol-news.com, 1 sevastopol-news.ru, 1 sevastopol.tk, 1 +sevecn.cc, 1 +sevecn.cn, 1 +sevecn.com, 1 seven-seas.ml, 1 sevenangelsmassage.com, 1 sevenartzpublicidad.com, 1 @@ -130691,14 +130842,13 @@ sewtracker.com, 1 sex-test.com, 1 sex-vergleich.com, 1 -sex5.com, 1 sexandthecitty.tk, 1 sexastr.club, 1 sexastr.com, 1 sexawynet.cam, 1 sexblag.club, 1 sexcamexpert.com, 1 -sexcamsbay.com, 1 +sexcamsbay.com, 0 sexdocka.nu, 1 sexdollg.com, 1 sexedquickies.com, 1 @@ -130718,7 +130868,7 @@ sexoclicker.com, 1 sexoclicker.net, 1 sexoclicker.org, 1 -sexocomgravidas.com, 1 +sexocomgravidas.com, 0 sexogsamfunn.no, 1 sexogsamfunn.online, 1 sexohab.guru, 1 @@ -130731,7 +130881,6 @@ sexolviv.com, 1 sexonsight.com, 1 sexonwax.com, 0 -sexopolis.gr, 1 sexorzn.red, 1 sexorzn.xyz, 1 sexosintabues30.com, 1 @@ -130860,8 +131009,6 @@ sfg-net.org, 1 sfg-nordholz.de, 1 sfhp.org, 1 -sfi.org.pl, 1 -sfi.pl, 1 sfile.eu, 1 sfilm.cz, 1 sfinance.cz, 1 @@ -130932,7 +131079,6 @@ sgrossi.it, 1 sgrowe.de, 0 sgrs.be, 1 -sgrub.xyz, 1 sgs-systems.de, 1 sgs.camera, 1 sgs.systems, 1 @@ -130947,7 +131093,6 @@ sgtrains.com, 1 sgtsnookums.net, 1 sgtt.ch, 0 -sgutranscripts.org, 1 sh-heppelmann.de, 1 sh-network.de, 1 sh0rt.zone, 1 @@ -131146,7 +131291,6 @@ sharedgoals.co, 1 sharedhealthmb.ca, 1 sharedhost.de, 0 -sharedreview.com, 1 shareforcelegal.com, 1 sharefox.eu, 0 sharefunfacts.com, 1 @@ -131198,20 +131342,25 @@ sharkpaint.tk, 1 sharks.football, 1 sharky.ro, 1 +sharky009.de, 1 sharmafamily.tk, 1 +sharneylaura.co.uk, 1 sharnoffphotos.com, 1 sharona.cloud, 1 sharonnh.gov, 1 sharonpope.com, 1 sharpapi.com, 1 +sharpapi.io, 1 sharpcranehire.com.au, 1 sharpe-practice.co.uk, 1 sharpe.systems, 1 sharpiesscrubs.tk, 1 sharpletters.net, 0 +sharplines.io, 1 sharpmetals.com, 1 sharpsburg-ga.gov, 1 sharptudhope.co.nz, 1 +sharqsouq.com, 1 sharren.org, 1 sharstonbooks.co.uk, 1 sharvey.ca, 1 @@ -131290,7 +131439,6 @@ sheet.host, 1 sheetengine.net, 1 sheetflowpro.com, 1 -sheetseeker1486.it, 1 sheezy.art, 1 sheezy.blog, 1 sheezy.games, 1 @@ -131334,7 +131482,9 @@ shelly-forum.com, 1 shelma.tk, 1 shelt.com, 1 +shelter.money, 1 shelterislandtown.gov, 1 +shelterofflint.org, 1 sheltieplanet.com, 1 sheltonvirtual.com, 1 shelvacu.com, 1 @@ -131348,7 +131498,6 @@ shemsconseils.ma, 1 shemy.eu, 1 shenandoahrealestate.org, 1 -shenandoahwoodwork.com, 1 shenannigans.tk, 1 shenderman.ml, 1 sheng-wai.com, 1 @@ -131384,7 +131533,6 @@ shermanshebcowi.gov, 1 shermantwphuronmi.gov, 1 sherpa.blog, 1 -sherpany.com, 1 sherpnortheast.com, 1 sherrikelley.com, 0 sherston.com, 1 @@ -131505,8 +131653,6 @@ shinta.ro, 1 shintoism.com, 1 shiny.gg, 1 -shinyhappydoggy.com, 0 -shinyoko-saisyuusyou.com, 1 shinyokumiai.or.jp, 1 shinypebble.uk, 1 shinyupai.com, 1 @@ -131716,7 +131862,6 @@ shopific.co, 1 shopific.com, 1 shopifycloud.com, 1 -shopifyfactory.io, 1 shopikal.com, 1 shopingbiz.tk, 1 shopintra.net, 1 @@ -131909,8 +132054,10 @@ shopunderwear.tk, 1 shopunilever.com, 1 shopupnorth.com, 1 +shopwice.com, 1 shopwinedirect.com, 1 shopx.co.il, 1 +shopyub.com, 1 shopzona.biz, 1 shore.co.il, 1 shorebreaksecurity.com, 1 @@ -131918,6 +132065,7 @@ shorehamfort.co.uk, 1 shorehillgolf.com, 1 shorelinelaserdesigns.com, 1 +shorelinewebdesigns.com, 1 shoresofshawneebend.com, 1 shorewoodil.gov, 1 shorewoodmn.gov, 1 @@ -131960,7 +132108,6 @@ shota.pictures, 1 shotbow.net, 1 shotcounter.nl, 1 -shotdeck.com, 1 shotoniphone.ga, 1 shotsbyferry.nl, 1 shotsleeve.com, 1 @@ -131990,6 +132137,7 @@ showerdoorco.com, 1 showersnet.com, 1 showf.om, 1 +showfom.com, 1 showfom.sb, 1 showgirls.ga, 1 showkase.com.br, 1 @@ -131997,6 +132145,7 @@ showme.co.za, 1 showme.hu, 1 showmeengland.co.uk, 1 +showmemorocco.com, 1 showmethescore.cf, 1 showmoviz.com, 1 showmyip.com, 1 @@ -132080,6 +132229,7 @@ shuiyu.com, 1 shuizilan.com, 1 shukatsu-ichiba.com, 1 +shukr.ch, 1 shulan.moe, 1 shuletime.ml, 1 shulman.tk, 1 @@ -132106,7 +132256,6 @@ shura.eu.org, 1 shurita.org, 1 shurporno.com, 1 -shushuwoa.com, 1 shutdowntimer.com, 1 shuttelportal.nl, 1 shutter-shower.com, 1 @@ -132209,6 +132358,7 @@ sidatbacklink.tk, 1 sidaways.co.uk, 1 siddhamehta.tk, 1 +siddhkar.com, 1 siddigsami.com, 1 sidechannel.blog, 1 sidechannel.media, 1 @@ -132245,7 +132395,6 @@ siduga.com, 1 sie.at, 1 siebenhirten7.at, 1 -siebeve.be, 1 siecon-it.com, 1 siega.pl, 1 siegemund-frankfurt.de, 1 @@ -132399,6 +132548,7 @@ signupgenius.com, 1 signuponline.events, 1 signwell.com, 1 +sigoo.co.jp, 1 sigparser.com, 0 sigpas.fr, 1 sigptr.me, 1 @@ -132464,6 +132614,7 @@ siliconlightworks.com, 1 siliconlowcode.com, 1 siliconvalley.center, 1 +silicosis.org.au, 1 silina.tk, 1 silk, 1 silk.com, 1 @@ -132487,6 +132638,7 @@ silqueskineyeserum.com, 1 silsha.me, 1 silta.tk, 1 +silueta21.com, 1 silv.tk, 1 silvalli.com, 0 silver-fenrir.cn, 1 @@ -132612,7 +132764,7 @@ sim-minaoshi.jp, 1 sim-mobile.ml, 1 sim4seed.org, 1 -simabonnement.nl, 1 +simabonnement.nl, 0 simac.fr, 1 simacek.cz, 1 simaogv.net, 1 @@ -132790,7 +132942,6 @@ simplixos.org, 1 simplrflex.com, 1 simplus.id, 1 -simplusbr.com, 1 simply-bob.de, 1 simply-pattinson.tk, 1 simply-pdf.de, 1 @@ -132803,6 +132954,7 @@ simplychocolate.com, 1 simplycloud.de, 1 simplycodes.com, 0 +simplydogtalk.com, 1 simplydonelegal.com, 1 simplydonot.com, 1 simplydonut.com, 1 @@ -132833,7 +132985,6 @@ simpsonizeme.co, 1 simpul.nl, 1 simpvp.net, 1 -simrail.cn, 1 simrail.nl, 1 simranmehta.ga, 1 sims4hub.ga, 1 @@ -132922,6 +133073,7 @@ sindromebenjamin.tk, 1 sinefili.com, 1 sinemakurd.tk, 1 +sinemetrik.com, 1 sinergify.com, 1 sinetron.ga, 1 sinews.tk, 1 @@ -133000,7 +133152,6 @@ sinpermiso.info, 1 sinquin.eu, 1 sinsalida.tk, 1 -sinsandscents.com, 1 sinsin.io, 1 sinsitio.tk, 1 sinsolucion.tk, 1 @@ -133143,6 +133294,7 @@ sistemapronto.ml, 1 sistemaseinformacao.com.br, 1 sistemasespecializados.com, 1 +sistemaslogitron.com, 1 sistemaspleno.com, 1 sistemika.cl, 1 sistemista.it, 1 @@ -133180,12 +133332,12 @@ sitebuilderreport.com, 0 sitechange.dedyn.io, 1 sitechecker.pro, 1 +sitecherish.co.uk, 1 siteclick.co.uk, 1 sitecore.com, 1 sitecreation.tk, 1 sitecreator.tk, 1 sitecrew.cf, 1 -sitedebelezaemoda.com.br, 1 sitedynamix.co.uk, 1 siteforce.com, 1 sitehizlandir.com, 1 @@ -133221,12 +133373,11 @@ sitetuners.com, 1 siteu.nl, 1 siteviseagency.com, 1 -siteweb-seo.fr, 1 -sitgesbeachhouse.com, 1 sitgesfilmfestival.com, 1 sithijaya.tk, 1 sithmanifest.com, 1 sitinjau.com, 1 +sitisnab.kz, 1 sitiwebferrara.it, 1 sitnik.ru, 1 sitnikov.ga, 1 @@ -133339,6 +133490,7 @@ skaiman.ga, 1 skaitliukas.tk, 1 skakun.io, 1 +skaldhotel.is, 1 skalec.org, 1 skalniak.pl, 1 skamper.tk, 1 @@ -133705,6 +133857,7 @@ skylander.cf, 1 skylandsoft.com, 1 skylarker.org, 1 +skylerknauss.com, 1 skylightcreative.com.au, 0 skylightipv.com, 1 skyline.tw, 1 @@ -133777,7 +133930,6 @@ skyscanner2024.com, 1 skyscheduler.work, 1 skyscnr.com, 1 -skyscrapers.eu, 1 skyseo.cf, 1 skysoftbg.com, 1 skysplash.gq, 1 @@ -133852,6 +134004,7 @@ slashrepeat.com, 1 slate.fr, 1 slate.to, 1 +slatemc.com, 1 slatemc.fun, 1 slateteams.com, 0 slathering.cf, 1 @@ -133861,6 +134014,7 @@ slatteryauctions.com.au, 1 slaughter.com, 1 slaughterhouse.fr, 1 +slaughters.club, 1 slava.ml, 1 slavasoloviev.com, 1 slavasveta.info, 1 @@ -133873,7 +134027,7 @@ slavnineznami.cz, 1 slavyansk-news.ru, 1 slaws.io, 1 -slayden.com, 1 +slayden.com, 0 slayersonline.net, 1 slbbiromaru.sch.id, 1 slbetx.com, 1 @@ -134044,7 +134198,6 @@ slovenskycestovatel.sk, 1 slow.social, 1 slow.zone, 0 -slowakei.international, 1 slowandsimple.co, 1 slowapi.com, 1 slowblinkmainecoons.com, 1 @@ -134096,6 +134249,7 @@ sm-supplements.gr, 1 sm.ms, 1 sm161.cn, 1 +sm17p.me, 1 sm2016.ch, 1 sm2ct.cn, 1 sma-dev.de, 1 @@ -134185,21 +134339,19 @@ smart-vilp.com, 1 smart-wind.ru, 1 smart-zona.tk, 1 +smart11.ai, 1 smartacademy.ge, 1 smartagilesolution.com, 1 smartandcom.ch, 1 smartapplianceservices.com, 1 smartar.com, 1 -smartart.gr, 1 smartart.tk, 1 smartass.space, 0 smartass0027.com, 1 smartassembly.tk, 1 smartasset.com, 1 -smartbear.com, 1 smartbetaler.no, 1 smartbis.com, 1 -smartbiz.vn, 1 smartblock.cloud, 1 smartboardesl.com, 1 smartbooqing.com, 1 @@ -134252,7 +134404,6 @@ smartiflix.com, 1 smartius.it, 1 smartjoin.style, 1 -smartkraftcircuits.com, 1 smartland.com, 1 smartlandapartments.com, 1 smartlandconstruction.com, 1 @@ -134270,7 +134421,6 @@ smartlogstock.com, 1 smartlogtower.com, 1 smartlooks.es, 1 -smartmail.io, 1 smartmail24.de, 1 smartme.pl, 1 smartmeal.ru, 1 @@ -134284,7 +134434,6 @@ smartnews-smri.com, 1 smartnoob.de, 1 smartnotify.ca, 1 -smartoctopus.art, 1 smartology.net, 1 smartoneclub.com, 1 smartools.pro, 1 @@ -134332,6 +134481,7 @@ smartview.cloud, 1 smartviewhub.com, 1 smartvisionoptometry.com.au, 1 +smartvoting.cl, 1 smartwatchsolutions.com, 1 smartwealthmanagement.org, 1 smartweb.ge, 1 @@ -134390,7 +134540,6 @@ smeweb.com, 1 smeys.be, 1 smfdmn.gov, 1 -smgbs.com, 1 smgl.cm, 1 smh.me, 1 smi-a.me, 1 @@ -134455,6 +134604,7 @@ smithteresa.tk, 1 smithvillehomehardware.ca, 1 smithwealth.com.au, 1 +smits.com, 1 smits.frl, 1 smitsdesigncenter.nl, 1 smitsmail.net, 1 @@ -134548,6 +134698,7 @@ sms1.ro, 1 sms72.tk, 1 smsaero.ru, 1 +smsalert.mobi, 1 smsalvand.tk, 1 smsappointment.com, 0 smsben.com, 0 @@ -134605,7 +134756,6 @@ snacky.nl, 1 snafu.cz, 1 snagator.com, 1 -snail.observer, 1 snaildos.tk, 1 snajdr.online, 1 snajdrova.eu, 1 @@ -134692,6 +134842,7 @@ sniderman.xyz, 1 sniep.net, 1 sniffcat.com, 1 +sniffies.com, 1 sniffing.gq, 1 sniffle.eu, 1 snikket.de, 1 @@ -134699,6 +134850,7 @@ snipdrive.com, 1 snipettemag.com, 1 snipl.io, 1 +snipp.gg, 1 snipp.lol, 1 snippet.host, 1 snippet.ml, 1 @@ -134770,7 +134922,6 @@ snrd.eu, 1 snrlaw.in, 1 snroth.de, 1 -snrub.co, 1 sns-beta.com, 1 sns-dev.com, 1 sns-tg.pl, 1 @@ -134809,6 +134960,7 @@ sobaki.tk, 1 sobakoh-nyc.com, 1 sobatkaos.biz.id, 1 +sobaudon.f5.si, 1 sobchak.ga, 1 sobieray.dyndns.org, 1 sobkite.com, 1 @@ -134947,6 +135099,7 @@ socradar.io, 1 socratec-pharma.de, 1 socraticsolutions.us, 1 +socript.com, 1 socseti.cf, 1 socseti.ga, 1 socseti.gq, 1 @@ -135025,7 +135178,6 @@ softbit.pt, 1 softblinds.co.uk, 1 softchin.ir, 1 -softcleanr.shop, 0 softcompany.tk, 1 softcomplex.com, 1 softconcept.pt, 1 @@ -135038,7 +135190,7 @@ softfuture.tk, 1 softgamez.net, 1 softhints.com, 1 -softios.com, 1 +softi.co.kr, 1 softizy.com, 1 softloom.com, 1 softmachine.es, 1 @@ -135105,7 +135257,6 @@ sogravatas.com.br, 1 sogravatas.net.br, 1 sogut.bel.tr, 1 -sogutma.com.tr, 1 sohamroy.me, 1 sohanakhan.tk, 1 soherco.cl, 1 @@ -135114,7 +135265,6 @@ soho-art.com, 1 soil-journal.net, 1 soil2.ch, 1 -soilegustafsson.fi, 1 soillessgeek.com, 1 soilscapesolutions.com, 1 sointelcom.com.co, 1 @@ -135182,7 +135332,7 @@ solarpanels.tk, 1 solarpanelscentralcoast.com, 1 solarplan-berlin.de, 1 -solarscan.com, 1 +solarpoolheatingsa.co.za, 1 solarseason.ga, 1 solarstrom.net, 1 solartek.cf, 1 @@ -135217,6 +135367,7 @@ solemare-hotel.it, 1 solencell.com.tr, 1 solentbubblesandbounce.co.uk, 1 +soleur.ai, 1 solfegiator.ch, 0 solfipinformatique.org, 1 solgar.dk, 1 @@ -135235,7 +135386,6 @@ solidhost.cf, 1 solidimage.com.br, 1 solidincome.ga, 1 -solidityfactory.io, 1 solidnet.software, 1 solidnetwork.org, 1 solidpoint.com.my, 1 @@ -135244,8 +135394,9 @@ solidshield.com, 1 solidsteel.tk, 1 solidtuesday.com, 1 +solidus.cards, 1 solifi.com, 1 -solihull.ac.uk, 0 +solihull.ac.uk, 1 solihullinflatables.com, 1 solihullpcrepairs.co.uk, 1 solikreis-stuttgart.tk, 1 @@ -135263,10 +135414,10 @@ solium.com, 1 soliver.de, 1 soliver.eu, 1 -solix.com, 1 sollah.com, 1 sollahlibrary.com, 1 sollea.co, 1 +sollers-digital.ru, 1 sollet.ac, 1 sollishealth.com, 0 solmek.co.uk, 1 @@ -135296,7 +135447,6 @@ solosesso.tk, 1 solostocks.com, 1 solostocks.it, 1 -solostocks.ma, 1 solovault.io, 1 sols.style, 1 solsea.io, 1 @@ -135317,7 +135467,6 @@ solution.ch, 1 solutionalbum.com, 1 solutionbuilders.com, 1 -solutionmotsfleches.com, 1 solutionpieces.com, 1 solutions-ii.com, 1 solutions-it.net, 1 @@ -135391,6 +135540,7 @@ sommerrodelbahn-gutach.de, 1 somnam.tk, 1 somni.one, 1 +somnoterapia.com, 1 somnus.com, 1 somogyivar.hu, 1 somosanna.hu, 1 @@ -135444,6 +135594,7 @@ sonderkomission.ch, 1 sondoro.tk, 1 sondriotoday.it, 1 +soneofficial.com, 1 sonesinafar.tk, 1 sonesisonesi.tk, 1 sonesonesisi.tk, 1 @@ -135456,7 +135607,6 @@ songesdeplumes.fr, 1 songi.net, 1 songlab.ai, 1 -songsigrewupsinging.com, 1 songslaura.tk, 1 songsonline.tk, 1 songsterr.com, 1 @@ -135593,6 +135743,7 @@ sorrentofc.com.au, 1 sorrentoparking.com, 1 sorrowfulunfounded.com, 1 +sorsby.mx, 1 sortandpack.com, 0 sortaweird.net, 0 sorted.org.nz, 1 @@ -135647,6 +135798,7 @@ sosns.com, 1 soso.ga, 1 soso.loan, 1 +soso.stream, 1 sosoft.tk, 1 sosoftplay.co.uk, 1 sosok.tk, 1 @@ -135662,6 +135814,7 @@ sosyalevin.com, 1 sosysadmin.com, 1 sosz.org, 1 +sota-ink.com, 1 sota.sh, 1 sotadb.info, 1 sotaltamer.it, 1 @@ -135685,7 +135838,6 @@ sottomarini.tk, 1 sotypicallydutch.nl, 1 soubriquet.org, 1 -soudebalsa.com.br, 1 souenfermagem.com.br, 1 souenfermagem.org.br, 1 souenfermeira.com, 1 @@ -135717,7 +135869,6 @@ soulwinning.tk, 1 soulyfunerals.co.nz, 1 soulyi.io, 1 -soumafukutora.com, 1 soumen.tk, 1 soumikghosh.com, 1 soumissionalarme.ca, 1 @@ -135783,6 +135934,7 @@ soupleyoga.com, 1 souqfriday.com, 1 sour.is, 1 +souravbhor.com, 1 souravbhor.gq, 1 souravbhor.ml, 1 source-clan.tk, 1 @@ -135801,7 +135953,6 @@ sourcehut.net, 1 sources.tk, 1 sourcesdegarrigue.fr, 1 -sourceweb.com, 1 sourcing4exports.co.uk, 1 sourcitec.com, 1 souria.tk, 1 @@ -135814,6 +135965,7 @@ southadamswaterco.gov, 1 southambouncycastle.co.uk, 1 southamptontownnypolice.gov, 1 +southbankpersonaltrainers.com, 1 southbankregister.com.au, 1 southbaycu.com, 1 southbaylatherapy.com, 1 @@ -135835,8 +135987,6 @@ southcoastlocksmiths.com.au, 0 southdakotahealth.tk, 1 southdakotanet.tk, 1 -southeast-wholesale.com, 1 -southeastasianarchaeology.com, 1 southeastattacksquadron.org, 1 southeastwsf.org, 1 southelginumc.org, 1 @@ -135845,8 +135995,6 @@ southernfashiondecorbd.com, 1 southernfirst.com, 1 southernforge.com, 1 -southerngospelnow.com, 1 -southerngospelprizes.com, 1 southernislands.llc, 1 southernlights.cf, 1 southernlights.club, 1 @@ -135859,6 +136007,7 @@ southernvalve.com, 1 southfieldtownshipmi.gov, 1 southfloridaopenhousesearch.com, 1 +southforkresort.net, 1 southforkresort.us, 1 southgatemi.gov, 1 southjacksonville-il.gov, 1 @@ -135869,6 +136018,7 @@ southmarengo.com, 1 southmarengoal.gov, 1 southmelbourne.apartments, 1 +southmelbournepersonaltrainers.com, 1 southmill.com, 1 southmilwaukee.gov, 1 southmorangtownhouses.com.au, 1 @@ -135876,6 +136026,7 @@ southpeacearchives.org, 1 southphoenixair.tk, 1 southportland.gov, 1 +southportpersonaltrainers.com, 1 southridgeservices.com, 1 southrock.com, 1 southsands.com, 1 @@ -135906,6 +136057,7 @@ sova.cc, 1 sova.st, 1 sova.wiki, 1 +sovana.fr, 1 sovasage.com, 1 sovelia.com, 1 sovendus-benefits.com, 1 @@ -135917,6 +136069,7 @@ sovereign.bounceme.net, 1 sovereigngroup.com, 1 sovereignpcs.com, 0 +sovereigntyacademy.net, 1 soverin.net, 1 sovest.ml, 1 sovetiogorodniku.info, 1 @@ -135932,7 +136085,6 @@ sovryn.com, 1 sovtech.tk, 1 sovxoz.gq, 1 -sowero.com, 1 sowero.de, 1 sowget.com, 1 sowhat.dk, 0 @@ -135997,7 +136149,6 @@ space-time-elements.com, 1 space-y.cf, 1 space.com.pt, 1 -space.gov.ae, 1 spaceanimalnutrition.com, 1 spaceapi.io, 1 spacebabies.nl, 1 @@ -136005,6 +136156,7 @@ spacebear.ee, 1 spacebestnews.tk, 1 spacebooster.pl, 1 +spacecarcelia.com, 1 spacecityweather.com, 1 spacecoastdumpsterrental.com, 1 spacedance.tk, 1 @@ -136152,7 +136304,6 @@ sparkresearch.net, 1 sparkresto.com, 1 sparkseo.com.br, 1 -sparksfoundation.net, 1 sparksga.gov, 1 sparkweld.biz, 1 sparmedo.de, 1 @@ -136165,6 +136316,7 @@ sparta.ee, 1 spartacuslife.com, 1 spartaermelo.nl, 1 +spartakexchange.com, 1 spartamet.tk, 1 spartan300.tk, 1 spartan300charity.org, 1 @@ -136185,7 +136337,6 @@ spatter.tk, 1 spatzenwerkstatt.de, 1 spawn.cz, 1 -spaworldhouston.com, 1 spaziobenedetti.com.br, 1 spaziotennis.com, 1 spaziowrestling.it, 1 @@ -136194,11 +136345,13 @@ spb-apple-helpgroup.com, 1 spb-clean.ru, 1 spb-electric.ru, 1 +spb-svarka.ru, 1 spbatelec.fr, 1 spbcodes.online, 1 spbelect.info, 1 spbelect.org, 1 spbet99.com, 1 +spbevso.com, 1 spbot.ml, 1 spc-ag.ch, 1 spcconnect.com, 0 @@ -136224,6 +136377,7 @@ speakersbusiness.com, 1 speakersden.tk, 1 speakertwpmi.gov, 1 +speakfrench.cn, 1 speaklanguages.com, 1 speakol.com, 1 spear.ga, 1 @@ -136243,7 +136397,7 @@ specialist.srv.br, 1 specialistskin.com.sg, 1 specialized-hosting.eu, 1 -specialmomentvideo.com, 0 +specialneedsadventurefamily.com, 1 specialnoise.tk, 1 specialofficesupplies.tk, 1 specialphotos.ca, 1 @@ -136349,7 +136503,6 @@ spencernc.gov, 1 spencerpauly.com, 0 spend.cloud, 1 -spendable.money, 1 spendd.co, 1 spendebt.com, 1 spendedge.com, 1 @@ -136425,6 +136578,7 @@ spiderworking.com, 1 spidometr.ml, 1 spie-wirliebenkabel.de, 1 +spiegel-deutschland.de, 1 spiegelglass-gc.com, 1 spiegelingenblog.nl, 1 spiegels-op-maat.nl, 1 @@ -136440,7 +136594,9 @@ spieltexte.de, 1 spieringsdakbedekking.nl, 1 spiet.nl, 1 +spiff.ie, 1 spiga.ch, 0 +spiielherz.li, 1 spikar.gr, 1 spike.sh, 1 spikejeon.tk, 1 @@ -136475,7 +136631,6 @@ spinscity.info, 1 spinscity.net, 1 spinscity777.info, 1 -spintools.pro, 1 spintracer.de, 1 spion.su, 1 spireat.it, 1 @@ -136484,13 +136639,12 @@ spirerecoverysolutions.com, 1 spirio.cz, 1 spirion.com, 1 -spirit-hunters-germany.de, 0 +spirit-hunters-germany.de, 1 spirit-url.com, 1 spirit55555.dk, 1 spiritbionic.ro, 1 spiritdesigns.tk, 1 spiritedengineers.tk, 1 -spiritgruppen.no, 1 spiritindia.com, 1 spiritlakehealthcenter.com, 1 spiritous.cf, 1 @@ -136537,7 +136691,6 @@ sploitus.com, 1 splorge.cloud, 0 splorge.website, 1 -splosh.nl, 1 splotchify.com, 1 splytech.io, 1 spm-servis.tk, 1 @@ -136550,7 +136703,6 @@ spocasi.cz, 1 spocool.com, 1 spodelime.com, 1 -spoelbakzaak.nl, 1 spofia.nu, 1 spokane.gov, 1 spokanecounty.gov, 1 @@ -136597,7 +136749,6 @@ sportadictos.com, 1 sportal.se, 1 sportalliance.com, 1 -sportanaliz.com, 1 sportausbildung.com, 1 sportbikeadventures.com, 1 sportboot.mobi, 1 @@ -136666,17 +136817,18 @@ sportsdestinations.com, 1 sportsenvivotv.com, 1 sportservice.bz, 1 +sportshake.com, 1 sportskibat.tk, 1 sportsmagy.com, 1 sportsmania.tk, 1 sportsmansblog.com, 1 sportsmashup.com, 1 sportsnacklove.com, 1 -sportspainmanagementnyc.com, 1 sportspassbremen.de, 1 sportspeople.com.au, 1 sportssurfaces.com.au, 0 sportstips.tk, 1 +sportstraveler.net, 1 sportstreetstyle.com, 1 sportsupports-hertogenbosch.nl, 1 sportsxplay.com, 1 @@ -136745,6 +136897,7 @@ sprawnymarketing.pl, 1 sprayontv.com, 0 spraypolyurethane.org, 1 +spreadfinds.com, 1 spreadgreatideas.com, 1 spreadgreatideas.org, 1 spreadsheets.google.com, 1 @@ -136803,7 +136956,7 @@ springsoffthegrid.com, 1 springspeedshop.com, 1 springtxcarpetcleaning.com, 1 -springwellclinic.co.uk, 1 +springwellclinic.co.uk, 0 sprintgrad.com, 1 sprintkitchen.com, 1 sprintlee.com, 1 @@ -136851,7 +137004,6 @@ spurghi.roma.it, 1 spurstark.de, 1 sputnikvaccine.com, 1 -spweb.cz, 1 spx.com, 1 spy-net.tk, 1 spychala-it.de, 1 @@ -136919,6 +137071,7 @@ square.ly, 1 square.mx, 1 square.site, 1 +square1.de, 1 squarecdn.com, 1 squaredancedance.tk, 1 squaredaway.co.nz, 1 @@ -136966,7 +137119,6 @@ squirtingpussygirl.com, 1 squirtqueen.org, 1 sqxb0.ga, 1 -sr-33.com, 1 sr-f.tk, 1 sr.ht, 1 sr3cybersecurity.com, 1 @@ -136993,6 +137145,7 @@ sreality.cz, 1 sreb.loan, 1 srebro.cc, 1 +sree.build, 1 sreedhareeyam.tk, 1 sreeharis.tk, 1 sreemetaliks.com, 1 @@ -137036,6 +137189,7 @@ srkb.net, 1 srlconsult.ro, 1 srle.tk, 1 +srmdn.com, 1 srmi.biz, 1 srmllc.net, 1 srmstatic.com, 1 @@ -137141,6 +137295,7 @@ ssl247.de, 1 ssl247.dk, 1 ssl4all.gq, 1 +sslboard.com, 1 sslc.gov, 1 sslcertificaten.nl, 1 sslcheck.nl, 1 @@ -137183,7 +137338,6 @@ ssrvpn.tech, 1 sss.red, 1 ssslelectricfencing.co.za, 1 -ssslgaragedoors.co.za, 1 sssppp.gq, 1 sssss.click, 1 ssstructures.net, 1 @@ -137229,6 +137383,7 @@ stacabinetdepot.com, 1 staceygillinphotography.com, 1 stacisezeptat.cz, 1 +stackanchor.net, 1 stacker.news, 1 stackery.io, 1 stackhub.cc, 1 @@ -137266,49 +137421,6 @@ stadtwerke-sw.de, 1 staer.ro, 1 staff.direct, 1 -staffaugmentation.ae, 1 -staffaugmentation.al, 1 -staffaugmentation.at, 1 -staffaugmentation.ba, 1 -staffaugmentation.be, 1 -staffaugmentation.bg, 1 -staffaugmentation.ch, 1 -staffaugmentation.co.il, 1 -staffaugmentation.co.uk, 1 -staffaugmentation.com.ar, 1 -staffaugmentation.com.ua, 1 -staffaugmentation.cz, 1 -staffaugmentation.de, 1 -staffaugmentation.dk, 1 -staffaugmentation.ee, 1 -staffaugmentation.es, 1 -staffaugmentation.eu, 1 -staffaugmentation.fi, 1 -staffaugmentation.fr, 1 -staffaugmentation.ge, 1 -staffaugmentation.gr, 1 -staffaugmentation.hr, 1 -staffaugmentation.hu, 1 -staffaugmentation.it, 1 -staffaugmentation.jp, 1 -staffaugmentation.li, 1 -staffaugmentation.lt, 1 -staffaugmentation.lu, 1 -staffaugmentation.lv, 1 -staffaugmentation.md, 1 -staffaugmentation.me, 1 -staffaugmentation.mk, 1 -staffaugmentation.mx, 1 -staffaugmentation.nl, 1 -staffaugmentation.no, 1 -staffaugmentation.pe, 1 -staffaugmentation.ph, 1 -staffaugmentation.pl, 1 -staffaugmentation.pt, 1 -staffaugmentation.ro, 1 -staffaugmentation.rs, 1 -staffaugmentation.si, 1 -staffaugmentation.us, 1 staffaugmentation.vn, 1 staffi.tk, 1 staffingnation.com, 1 @@ -137322,7 +137434,6 @@ stage-props-blank-guns.com, 1 stage.wepay.com, 1 stageandtraining.com, 1 -stagebtp.com, 1 stageirites.com, 1 stageirites.fr, 1 stageirites.org, 1 @@ -137421,6 +137532,7 @@ standard-wohnungsbaukredit.info, 1 standard-wohnungsbaukredit.net, 1 standard-wohnungsbaukredit.org, 1 +standard.co.me, 1 standardlifters.com, 1 standardmetrics.io, 1 standardnotes.com, 1 @@ -137445,7 +137557,6 @@ standoffarena.com, 1 standrewsbookshop.co.uk, 1 standsearch.cf, 1 -standup2cancer.ca, 1 standup2cancer.org, 1 standupcomedy.cf, 1 standupcomedy.ga, 1 @@ -137482,6 +137593,7 @@ star-clean.it, 1 star-life.tk, 1 star-one.co.uk, 1 +star.watch, 1 starase.com, 0 starazagora.bg, 1 starb.in, 1 @@ -137585,13 +137697,13 @@ starsoft.io, 1 starspie.com, 1 starsplay.com, 1 -start-dropshipping.com, 1 start-knighki.gq, 1 start-nadlan.co.il, 1 start-school.by, 1 start.stockholm, 1 start2dance.tk, 1 startablog.tv, 1 +startag.xyz, 1 startandstop.fr, 1 startaninflatablebusiness.com, 1 startaxi.com.ua, 1 @@ -137654,6 +137766,7 @@ starvizyon.com, 1 starwarschronology.com, 1 starwarshunters.com, 1 +starwarsmilk.com, 1 starwatches.eu, 1 starworksglobal.com, 1 starx.ink, 1 @@ -137695,6 +137808,7 @@ statesville.com, 1 statewideoutdoorblinds.com, 1 statfluence.com, 1 +stathamquotes.ru, 1 static-assets.io, 1 static-myfxee-808795.c.cdn77.org, 1 static-myfxoau-808795.c.cdn77.org, 1 @@ -137723,7 +137837,6 @@ stats-co.eu, 1 stats-mailtracker.com, 1 stats.g.doubleclick.net, 1 -statscrew.com, 1 statsit.ga, 1 statsme-app.com, 1 statsndata.org, 1 @@ -137771,6 +137884,7 @@ staywelladjusted.com, 1 stazi.tk, 1 stb-buegel.de, 1 +stb-schefczyk.ch, 1 stb-schefczyk.com, 1 stb-schefczyk.de, 1 stb-schefczyk.info, 1 @@ -137780,7 +137894,6 @@ stb.gov, 1 stbarnabashealthsystem.com, 1 stbartholomewmanchester.org, 1 -stbcg.com, 1 stbernardnk.org, 1 stbk.link, 1 stbl.org, 1 @@ -137822,7 +137935,7 @@ steakovercooked.com, 1 stealingheather.com, 1 stealsaga.net, 1 -stealth.design, 1 +stealth.design, 0 stealth.net, 1 stealthbinders.tk, 1 stealthmodel.fi, 1 @@ -137945,6 +138058,7 @@ stek-usa-shop.com, 1 stek-usa.com, 1 stekelenburg.me, 1 +steklein.de, 1 stelcomp.com, 1 stelcron.com, 1 steldingreporters.com, 1 @@ -137998,7 +138112,6 @@ stemgirls.co.za, 1 stemklank.tk, 1 stemlabadvanced.pt, 1 -stemmayhem.com, 1 stemoplinks.nl, 1 stempelfarben.de, 1 stemps.pl, 1 @@ -138021,6 +138134,7 @@ stepanyansurgical.com, 1 steparovi.cz, 1 stepbrobd.com, 1 +stepgf.com, 1 steph.ninja, 1 steph3n.me, 1 stephan-matthiesen.de, 1 @@ -138037,6 +138151,7 @@ stephanielantry.com, 1 stephanieleonidasfan.tk, 1 stephanieschreiber.com, 1 +stephanisutherland.com, 1 stephanoptiek.nl, 1 stephen-oliver-art.co.uk, 1 stephenbakalian.com, 1 @@ -138067,6 +138182,7 @@ steppesisters.org, 1 steppicrew.de, 1 steppingoutinstyleonline.com, 1 +steppingstonessb.com, 1 steppinout.tk, 1 stepplanning.com, 1 steppowerplant.com, 1 @@ -138085,6 +138201,7 @@ stereob.it, 1 stereochro.me, 0 stereoembersmagazine.com, 1 +stereologic.com, 1 stereostudio.cf, 1 stereotyped.de, 1 sterilium.tk, 1 @@ -138096,6 +138213,7 @@ sterlingcustomsheetmetal.com, 0 sterlingheights.gov, 1 sterlinginsurance.com.au, 0 +sterlingpestcontrol.com, 1 sterlingpropertiesmi.com, 1 sterlinx.de, 1 stern-freunde.de, 1 @@ -138114,8 +138232,6 @@ steroidswiki.com, 1 sterr.in, 1 sterretranen.tk, 1 -stersoftware.com, 1 -stersoftware.nl, 1 sterva.mobi, 0 sterydki.pl, 1 sterz.io, 1 @@ -138123,7 +138239,6 @@ stesti.cz, 1 stetson.edu, 1 stetsonrealestate.com, 1 -stetten-akm.de, 1 steuer-voss.de, 1 steuerberater-bayreuth.com, 1 steuerberater-essen-steele.com, 1 @@ -138169,6 +138284,7 @@ stevenski.com, 0 stevensonal.gov, 1 stevensontaxservices.com, 1 +stevensonvillager.com, 1 stevenspoint.gov, 1 steventress.com, 1 stevenz.blog, 1 @@ -138251,8 +138367,6 @@ stickypassword.com, 1 stickypigbbq.com, 1 stidmobile-id.com, 1 -stiebel.co.nz, 1 -stiebel.com.au, 1 stiebelrewards.com.au, 1 stiebelservice.com.au, 1 stiehler-leipzig.tk, 1 @@ -138341,7 +138455,6 @@ stjscatholicchurch.org, 1 stjude-ettekkar.tk, 1 stjustin.org, 1 -stkeverneparishcouncil.org.uk, 1 stkevin-stbenedict.org, 1 stkildaosteopathy.com.au, 1 stlautoenhancements.com, 1 @@ -138380,7 +138493,7 @@ stmaryskutztown.com, 1 stmarysmdsao.gov, 1 stmarysprestwich.org, 0 -stmarystfd.org, 1 +stmarystfd.org, 0 stmaryswv.gov, 1 stmatthewri.org, 1 stmattsparish.com, 1 @@ -138419,6 +138532,7 @@ stockportny.gov, 1 stockportspiritualistchurch.co.uk, 1 stockpricetrends.com, 1 +stockpulse247.com, 1 stocks-adviser.com, 1 stockslam.ga, 1 stocksnews.tk, 1 @@ -138482,7 +138596,6 @@ stomatologia-narkoza.pl, 1 stomatologiya.gq, 1 stomatologiya.ml, 1 -stompai.com, 1 stomproced.ro, 1 stomt.com, 1 stone-guru.co.uk, 1 @@ -138490,9 +138603,11 @@ stone-support.de, 1 stoneandtile.design, 1 stonebriarpropertyinspections.com, 1 +stonebridge-systems.org, 1 stonechat.de, 1 stonecountyar.gov, 1 stonecutgods.com, 1 +stonedepot.com.au, 1 stonedwarf5.net, 1 stonedworms.de, 0 stoneedgeconcrete.com, 1 @@ -138563,6 +138678,7 @@ stopransomware.gov, 1 stoprat.fr, 1 stopsafeguardingnow.org.uk, 1 +stopscams.com, 1 stopshopnyeremeny.hu, 1 stopsmoke.gq, 1 stopssherdenking.tk, 1 @@ -138570,10 +138686,8 @@ stopthemoss.com, 1 stoptheperio.com, 1 stopthethyroidmadness.com, 1 -stopthinkconnect.jp, 1 stopves.tk, 1 stor-guard.com, 1 -storables.com, 1 storage-base.de, 1 storage-books.gq, 1 storageideas.uk, 1 @@ -138582,7 +138696,6 @@ storck.com, 1 stordbatlag.no, 1 store-en-stock.com, 1 -store10.de, 0 store71.it, 1 storeandforward.email, 1 storeandforward.eu, 1 @@ -138609,7 +138722,6 @@ storeplus.ml, 1 storesonline.fr, 1 storestdigital.com, 1 -storewebshop.com, 1 storex.storage, 1 storgaarddieu.com, 1 storiadellarte.com, 1 @@ -138705,6 +138817,7 @@ stpaulcatholicchurcheastnorriton.net, 1 stpaulsbullville.org, 1 stpaulschambers.com, 1 +stpaulsfeedback.com, 1 stpe.co, 1 stperseo.tk, 1 stpeterparishva.org, 1 @@ -138782,7 +138895,7 @@ strasserhaustechnik.de, 1 strasweb.fr, 1 stratagemlabs.tech, 1 -stratahealth.com, 1 +stratahealth.com, 0 stratcat.com, 1 stratebi.com, 1 strategery.io, 1 @@ -138803,13 +138916,11 @@ strategysystems.com, 1 stratekispiel.at, 1 stratexonline.com, 1 -stratford.ac.uk, 0 stratfordct.gov, 1 stratfordnh.gov, 1 stratfordwi.gov, 1 stratforge.com, 1 strathspeycrown.com, 1 -stratiacyber.com, 1 stratible.com, 1 stratik.com.co, 1 stratinator.com, 1 @@ -138880,12 +138991,14 @@ streamgifter.com, 1 streamgoalandres.ml, 1 streamion.city, 1 +streamiptv8k.com, 1 streamkino.cz, 1 streamline.enterprises, 1 streamlinedprocesses.com, 1 streamliner.fr, 1 streamlineverify.com, 1 streammasterpro.com, 1 +streammaxx.net, 1 streammusic.cz, 1 streamnetlibrary.org, 1 streamnetwork.cz, 1 @@ -138901,6 +139014,7 @@ streamusic.cz, 1 streamvi.com, 1 streamvideo.cz, 1 +streamwizard.de, 1 streamz.be, 1 streamzilla.com, 1 streathamfoodfestival.com, 1 @@ -138957,6 +139071,7 @@ stressfreeprobate.com, 1 stressfrei-marceva.de, 1 streszczenia.pl, 1 +strettch.com, 1 strettonreserve.com.au, 1 strettoweb.com, 1 strgco.com, 1 @@ -139121,7 +139236,6 @@ stubbmail.de, 1 stubentiga.de, 1 stuc-groep.nl, 1 -stuccorepairrenonv.com, 1 stuckateur-weber.de, 1 stucki-bagger.ch, 1 stucki-sanitaer.ch, 1 @@ -139156,6 +139270,7 @@ studentquickpay.com, 1 studentrobotics.org, 1 students4sports.org, 1 +studentsamfunnet.no, 1 studentscodecamp.com, 1 studentse.fr, 1 studentsfirstnb.com, 1 @@ -139238,10 +139353,12 @@ studiopirrate.com, 1 studiopoen.com.br, 1 studiorachunkowe.pl, 1 +studiosaulnier.synology.me, 1 studioshiftup.net, 1 studiosql.ml, 1 studiostawki.com, 1 studiostudio.net, 1 +studiosubtelnosci.pl, 1 studiosuracidenunzio.it, 1 studiotmb.com, 1 studiovaud.com, 0 @@ -139422,6 +139539,7 @@ subdivider.tk, 1 subestan.tk, 1 subgirl.ga, 1 +subgoal.gg, 1 subhamchettinadtx.com, 1 subiblia.com, 1 subic.ga, 1 @@ -139455,7 +139573,6 @@ subscriptionplus.uk, 1 subserv.tk, 1 subsidioalempleo.cl, 1 -subsistence.wiki, 1 subsistencematters.net, 1 subsitude.tk, 1 subsoft.tk, 1 @@ -139496,7 +139613,6 @@ successminds.com, 1 successrice.com, 1 successwizard.com, 1 -succmy.wang, 1 succorfish.net, 1 succubus.me, 1 succubus.network, 1 @@ -139528,11 +139644,11 @@ sudaraka.org, 0 suddenlysavvy.com, 1 sudeleycastle.co.uk, 1 -sudetytour.cz, 1 sudoash.com, 1 sudocat.me, 1 sudoku-insight.tk, 1 sudoku.org.ua, 1 +sudokuaday.com, 1 sudokuenlinea.com, 1 sudosaveclimate.com, 1 sudoschool.com, 1 @@ -139661,7 +139777,6 @@ sullivancontractingct.com, 1 sullivancountypa.gov, 1 sulman4paf.tk, 1 -sulminastv.com.br, 1 sulphurspringsar.gov, 1 sultanrecords.com, 1 sultans.tk, 1 @@ -139733,9 +139848,8 @@ summerschoolcybersecurity.org, 1 summersummit.eu, 1 summing.ga, 1 -summit-group.com, 1 summit-research.org, 1 -summit-smile.com, 1 +summit-smile.com, 0 summit7.media, 1 summitcountyboe.gov, 1 summitcustomsbrokers.com, 1 @@ -139810,7 +139924,6 @@ sundeskole.no, 0 sundhedsdatastyrelsen.dk, 1 sundhedsvejen.dk, 1 -sundialpowdercoating.com, 1 sundiel.tk, 1 sundown.fr, 1 sundylinks.com, 1 @@ -139828,7 +139941,6 @@ sungem.nl, 1 sunglassstyle.co.nz, 1 sungoldsolar.com, 1 -sungreen.info, 1 sunhaoxiang.net, 1 sunho.net.tw, 1 sunioso.com, 1 @@ -139926,7 +140038,6 @@ suomiheraa.com, 1 suomika.pl, 1 suonet.org, 1 -suourl.com, 0 sup-net.de, 1 supa.sexy, 1 supabase.com, 1 @@ -140054,7 +140165,6 @@ superiorseamlessinc.com, 1 superiorvision.com, 1 superiorwi.gov, 1 -superiptv.pro, 1 superis.eu, 1 superit.com.br, 1 superjuf.com, 1 @@ -140165,6 +140275,7 @@ supportivecare.org, 1 supportlafd.org, 1 supportme123.com, 0 +supportmydream.net, 1 supportrelatecare.org, 1 supportsave.com, 1 supportyourapp.com, 1 @@ -140182,6 +140293,7 @@ supreme.com.br, 1 supremecarnage.de, 1 suprememale.tk, 1 +suprfi.com, 1 suprintbot.xyz, 0 supriville.com.br, 1 supropionegocio.tk, 1 @@ -140216,6 +140328,7 @@ surfduck.xyz, 1 surfenergy.tk, 1 surfersconnect.net, 1 +surfersparadisepersonaltrainers.com, 1 surfingshare.com, 0 surfkath.de, 1 surflessonslisbon.com, 1 @@ -140231,7 +140344,6 @@ surgicalassociates.sg, 1 surgicalassociateswny.com, 0 surgicalresourcesgroup.com, 1 -surgispa.net, 1 surgoinsvilletn.gov, 1 surialternat.tk, 1 surik.de, 1 @@ -140255,7 +140367,6 @@ surprisepubliclibrary.gov, 1 surpriz-net.tk, 1 surrattlegal.com, 1 -surrealdb.com, 1 surrealistas.tk, 1 surreyandsussex.nhs.uk, 1 surreycyclingclub.co.uk, 1 @@ -140370,6 +140481,7 @@ suwanya.cn, 1 suwcountyfl.gov, 1 suwebcreativa.com, 1 +suyool.com, 1 suzanne.soy, 1 suzannejauchius.com, 1 suzansalem.nl, 1 @@ -140446,6 +140558,7 @@ svenmuller.com, 1 svenmuller.nl, 1 svenska.events, 1 +svenskafederationer.se, 1 svenskakyrkansunga.tk, 1 svenskamassan.se, 1 svenskapsalmer.se, 1 @@ -140518,6 +140631,7 @@ svsewerut.gov, 1 svsg.co, 1 svswebmarketing.com, 1 +svtemplemn.org, 1 svtl.ch, 1 svtr.de, 1 svtv.org, 1 @@ -140624,6 +140738,7 @@ sweeteleven.tk, 1 sweetgood.de, 1 sweetgracemarket.com, 1 +sweethawk.com, 1 sweethearts.tk, 1 sweetheartvideo.com, 1 sweethomesnohomishrenovations.com, 1 @@ -140632,6 +140747,7 @@ sweetlegs.jp, 1 sweetloaded.com, 1 sweetlycakes.com, 1 +sweetmecreamery.com, 1 sweetnest.com, 1 sweetparis.cf, 1 sweetpinkpussy.org, 1 @@ -140660,7 +140776,7 @@ swhw.io, 1 swi.sytes.net, 1 swid.co.uk, 1 -swiezastrona.pl, 1 +swiezastrona.pl, 0 swift-cut.com, 1 swift-cut.de, 1 swift-devedge.de, 1 @@ -140676,7 +140792,6 @@ swiftcrypto.com, 1 swifteh.net, 1 swifteq.com, 1 -swiftfactory.io, 1 swiftgram.ml, 1 swiftirc.net, 1 swiftmod.net, 1 @@ -140731,7 +140846,7 @@ swiss404.net, 1 swissaquashop.ch, 1 swissbearfoodservices.com, 0 -swissbit.com, 1 +swissbit.com, 0 swissborg.com, 1 swisscannabis.club, 1 swisschat.tk, 1 @@ -140742,7 +140857,7 @@ swissfreshaircan.ch, 0 swissfreshaircan.com, 0 swissgarden.com, 1 -swissgrid.ch, 0 +swissgrid.ch, 1 swisshex.ch, 1 swisshex.net, 1 swisshub.io, 1 @@ -140752,6 +140867,7 @@ swissmodular.com, 1 swissneutral.net, 1 swissnoso.ch, 1 +swisspremiumdairy.com, 1 swissquawk.ch, 1 swisstechmap.ch, 1 swisstranslate.ch, 0 @@ -140913,7 +141029,6 @@ symbols.gov, 1 symcare.com.au, 0 symend.com, 0 -symeonchen.com, 1 symetri.co.uk, 1 symetri.com, 1 symetri.dk, 1 @@ -140934,12 +141049,12 @@ sympa-by.eu, 1 sympatent.com, 1 symphonyai.com, 1 +symplelending.com, 1 sympletrade.com, 1 symplexia.com.br, 1 symplicit.com.au, 1 symplyos.tk, 1 sympmarc.com, 1 -symposit.com, 0 symptome-erklaert.de, 1 syna.dev, 1 syna.site, 1 @@ -140964,6 +141079,7 @@ syncpdi.com, 1 syncplay.pl, 1 syncresis.com, 1 +syncrolab.es, 1 syncsci.com, 1 syncspace.live, 1 synctera.com, 1 @@ -140984,12 +141100,13 @@ synergytherm.com, 1 synergyzone.tk, 1 synerio.com, 1 +synerionagile.com, 1 +synerionenterprise.com, 1 synetiq.co.uk, 1 synfrait.com, 1 synitsa.tk, 1 synony.me, 1 synonym24.at, 1 -synoptek.com, 1 synotna.eu, 1 synoviasolutions.com, 1 synrelay.com, 1 @@ -141035,6 +141152,7 @@ syrianair.ga, 1 syrianair.ml, 1 syrianet.cf, 1 +syriansharks.com, 1 syrianskaif.com, 1 syrius.tk, 1 syronex.com, 1 @@ -141057,12 +141175,12 @@ syscaponline.co.uk, 1 sysco.biz, 1 syscom.be, 1 +syscomnext.com, 1 sysconautomation.com, 1 syscoon.com, 1 sysctl.se, 1 syscurve.com, 1 sysdb.io, 1 -sysdig.com, 1 syselg.com, 1 sysert.tv, 0 sysfreight.com, 1 @@ -141145,7 +141263,6 @@ szabadpingvin.eu, 1 szablinski.pl, 1 szadeczky.com, 1 -szafadziecka.com.pl, 1 szafkirtv.pl, 1 szakszervezet.work, 1 szalaiterko.hu, 1 @@ -141183,6 +141300,7 @@ szmidtinwest.pl, 1 szotkowski.fun, 1 szotkowski.info, 1 +szotkowski.online, 1 szotkowski.tech, 1 szpalskimd.com, 1 szpet.jp, 1 @@ -141203,6 +141321,8 @@ szw-hessen.de, 1 szwrc.co, 1 szww99.cc, 1 +szybakominkowa.pl, 1 +szybka.pl, 1 szybkaekipa.pl, 1 szybkiebieganie.pl, 1 szymczak.at, 1 @@ -141247,12 +141367,11 @@ t12u.com, 1 t1cloud.com, 1 t1f.ru, 1 +t1movie.com, 1 t2-sit-test.tk, 0 t2000headphones.com, 1 t2000laserpointers.com, 1 t22.uk, 1 -t23a.eu, 1 -t2informatik.de, 1 t33.eu, 1 t36533.com, 1 t3concrete.my, 1 @@ -141269,7 +141388,6 @@ t5118.com, 1 t51365.com, 1 t5197.co, 1 -t630.nl, 1 t666.com, 1 t6729.co, 1 t6957.co, 1 @@ -141337,6 +141455,7 @@ tabegamisama.com, 1 tabelaci.tk, 1 tabelaofert.pl, 1 +tabelazdrowia.pl, 1 tabelekaloryczne.waw.pl, 1 tabella.fi, 1 taberna.tk, 1 @@ -141369,11 +141488,13 @@ tablethype.de, 1 tabletkinamase.ga, 1 tabletkinatradzik.ga, 1 +tabletoplocal.com, 1 tabletopmachine.com, 1 tabletopmachines.com, 1 tabletopwealth.reviews, 0 tabletopworkshop.com, 1 tablettes-tactiles.tk, 1 +tablouricartoon.ro, 1 taboomale.com, 1 tabordaadvogados.ga, 1 taborsky.cz, 1 @@ -141389,7 +141510,6 @@ tac-performance.net, 1 tac-sys.net, 1 tacay.co, 1 -tachikawa-saisyuusyou.com, 1 tachonetbg.com, 1 tachoplus.pl, 1 tachoplusweb.com, 1 @@ -141411,7 +141531,6 @@ taconic.com, 1 tacoroumen.nl, 1 tacotown.tk, 1 -tacti.cc, 1 tacticalavocado.com, 1 tacticalsquare.com, 1 tacticalvote.co.uk, 1 @@ -141424,6 +141543,7 @@ tadalafilindia.gq, 1 tadashiku.jp, 1 tadaweb.com, 1 +tadawulstocks.com, 1 tadj-mahalat.com, 1 tadjiki.tk, 1 tadjikistan.tk, 1 @@ -141463,6 +141583,7 @@ tagg.is, 1 taggeru.com, 1 taggigkaktus.tk, 1 +taggley.com, 1 taghit.tk, 1 tagid.ga, 1 tagid.tk, 1 @@ -141482,6 +141603,7 @@ taguette.fr, 1 tagungsstaette-usedom.de, 0 tagungsstaette-zinnowitz.de, 0 +tahacinkilic.com, 1 tahaluf.ai, 1 tahaonline.tk, 1 tahcardealers.com, 1 @@ -141541,7 +141663,6 @@ taiwaniha.org.tw, 1 taiwanprize.com, 1 taiwantechtrek.tk, 1 -taiwantour.info, 0 taiway.com, 1 taiyo-eg.com, 1 taj-portal.tk, 1 @@ -141556,6 +141677,7 @@ tajniy-smisl.ml, 1 tajniy-smisl.tk, 1 tajnyodtah.sk, 1 +tajra.store, 1 tajrobe.wiki, 1 tajtowereg.com, 1 tak.gov, 1 @@ -141590,7 +141712,7 @@ takememoriesleavefootprints.com, 1 takemetomontpellier.fr, 1 taken.cf, 1 -taken.pl, 1 +taken.pl, 0 takenote.co, 1 takenouchi-dc.com, 1 takenouchi-perio.com, 1 @@ -141612,8 +141734,6 @@ takipcikutusu.com, 1 takipcisihir.com, 1 takiplekazan.ga, 1 -takito.net, 1 -takiwaku.com, 1 takk.pl, 1 takkaaaaa.com, 1 takkguitar.net, 1 @@ -141638,7 +141758,6 @@ talalaok.gov, 1 talarislog.com, 1 talbottimber.co.uk, 1 -talcualdigital.com, 1 taldia.es, 1 taleatherworks.com, 1 talendipank.ee, 1 @@ -141730,9 +141849,9 @@ talos-staging.io, 1 talosquant.com, 1 talpurwadalions.tk, 1 -taltech.ee, 1 +talqo.ai, 1 +taltech.ee, 0 talusan.tk, 1 -talxis.com, 1 tam-moon.com, 1 tam-safe.com, 1 tam7t.com, 0 @@ -141839,7 +141958,6 @@ tangipahoa.gov, 1 tanglepatterns.com, 1 tango-cats.de, 1 -tango-networks.com, 0 tango-querida.tk, 1 tango.berlin, 1 tango.info, 1 @@ -141873,7 +141991,6 @@ tankos.tk, 1 tankpassen-vergelijken.nl, 1 tanks.je, 1 -tankski.co.uk, 0 tanming.com.my, 1 tanned.tk, 1 tanner.sh, 1 @@ -141955,7 +142072,6 @@ tapquad.com, 1 taprix.org, 1 taproot.com, 1 -tapsandtables.net, 1 tapstertastingroom.com, 1 taquilla.com, 1 taqun.club, 1 @@ -142066,7 +142182,6 @@ taskhorizon.audio, 1 taskido.pl, 1 taskin.me, 1 -taskmo.de, 1 taskotron.fedoraproject.org, 1 taskotron.stg.fedoraproject.org, 1 taskrunnr.com, 1 @@ -142160,7 +142275,6 @@ taubenweiss.eu, 1 taubenweiss.net, 1 taubin.cc, 1 -tauedu.org, 1 taufers.info, 1 taufiqzainal.com, 1 tauntonme.org.uk, 1 @@ -142295,7 +142409,6 @@ taylormadesoft.com, 1 taylorruhland.com, 1 taylors-castles.co.uk, 1 -taylorshillsamoan.org, 1 taylorstauss.com, 1 taysiz.ir, 1 taytaytiangge.ph, 1 @@ -142488,7 +142601,7 @@ teachwithouttears.com, 1 teacuppersiancats.com, 1 teacupyorkiespets.com, 1 -teagardenspa.com, 1 +teagardenspa.com, 0 teaguepdtx.gov, 1 teahawaii.ga, 1 teahouse.gq, 1 @@ -142536,6 +142649,7 @@ teambranch.io, 1 teamceleris.com, 1 teamcg.ru, 1 +teamclarity.ai, 1 teamclean.bg, 1 teamcoco.com, 1 teamcode.tk, 1 @@ -142587,40 +142701,7 @@ teams.microsoft.us, 1 teamsakura.net, 1 teamsass.ca, 1 -teamsecure.al, 1 -teamsecure.at, 1 -teamsecure.be, 1 -teamsecure.bg, 1 -teamsecure.ch, 1 -teamsecure.co.il, 1 -teamsecure.co.uk, 1 -teamsecure.com.ua, 1 -teamsecure.cz, 1 -teamsecure.de, 1 -teamsecure.dk, 1 -teamsecure.ee, 1 -teamsecure.es, 1 -teamsecure.fi, 1 -teamsecure.fr, 1 -teamsecure.gr, 1 -teamsecure.hu, 1 -teamsecure.io, 1 teamsecure.is, 1 -teamsecure.it, 1 -teamsecure.li, 1 -teamsecure.lt, 1 -teamsecure.lu, 1 -teamsecure.lv, 1 -teamsecure.md, 1 -teamsecure.me, 1 -teamsecure.mk, 1 -teamsecure.pl, 1 -teamsecure.pt, 1 -teamsecure.ro, 1 -teamsecure.rs, 1 -teamsecure.se, 1 -teamsecure.si, 1 -teamsecure.sk, 1 teamsherry.realtor, 1 teamshirts.at, 1 teamshirts.be, 1 @@ -142660,6 +142741,7 @@ teamwolf.tk, 1 teamwork-bad-wurzach.de, 1 teamworld.blog, 1 +teamx.agency, 1 teaparty.id, 1 teapiraeus.gr, 1 teara.govt.nz, 1 @@ -142733,7 +142815,6 @@ tech4founders.co, 1 tech4greece.gr, 1 tech506.com, 1 -techaachen.de, 1 techangel.tk, 1 techanit.de, 1 techarab.ga, 1 @@ -142776,7 +142857,6 @@ techdocscove.xyz, 1 techdoms.tk, 1 techdracula.com, 1 -techeasyblog.com, 1 teched-creations.com, 1 techexeter.uk, 1 techexpert.tips, 1 @@ -142828,6 +142908,7 @@ techland.net, 1 techlearningcollective.com, 1 techlevel.org, 1 +techli.si, 1 techlit.pk, 1 techlovers.com, 1 techlr.de, 1 @@ -142864,7 +142945,6 @@ technician.academy, 1 technician.cn, 1 technicus.nl, 1 -technicv.com, 1 technikerle.at, 1 technikforum-backnang.de, 1 technikoma.com, 1 @@ -142961,33 +143041,6 @@ techopr.com, 1 techpartes.com.br, 1 techpartneralliance.com, 1 -techpeer.al, 1 -techpeer.at, 1 -techpeer.be, 1 -techpeer.bg, 1 -techpeer.ch, 1 -techpeer.co.uk, 1 -techpeer.cz, 1 -techpeer.de, 1 -techpeer.dk, 1 -techpeer.ee, 1 -techpeer.es, 1 -techpeer.eu, 1 -techpeer.fr, 1 -techpeer.hu, 1 -techpeer.lt, 1 -techpeer.lu, 1 -techpeer.lv, 1 -techpeer.md, 1 -techpeer.me, 1 -techpeer.nl, 1 -techpeer.pl, 1 -techpeer.pt, 1 -techpeer.ro, 1 -techpeer.rs, 1 -techpeer.se, 1 -techpeer.si, 1 -techpeer.sk, 1 techpilipinas.com, 1 techpoint.org, 0 techpp.com, 1 @@ -143010,7 +143063,6 @@ techshift.se, 1 techshout.com, 1 techsite.tk, 1 -techsolus.io, 1 techsolvency.com, 1 techsoup.net.nz, 1 techstation.co.il, 1 @@ -143117,9 +143169,9 @@ teddyss.com, 0 teddywayne.com, 1 teddywp.com, 1 -tedgautsch.com, 1 tedhardy.com, 1 tedirgin.tk, 1 +tedpac.xyz, 1 tedroche.com, 1 tedscoffeecompany.com, 1 tedsdivingsystem.com, 1 @@ -143162,7 +143214,6 @@ teenslesbian.com, 1 teenslikeitbig.com, 1 teenslovehugecocks.com, 1 -teentinytits.com, 1 teenusernames.com, 1 teenviet.ga, 1 teenwebcams.ml, 1 @@ -143224,9 +143275,9 @@ tejasnetworks.com, 1 tejo.tk, 1 tejomaya.net, 1 -tek-el.ru, 1 teka.ro, 1 tekanswer.com, 1 +tekenkaart.nl, 1 tekila.cf, 1 tekila.ga, 1 tekila.tk, 1 @@ -143237,6 +143288,7 @@ tekme.pt, 1 teknashop.com, 1 teknik-sipil.tk, 1 +teknikaldomain.me, 1 teknikhjalpen.ax, 1 tekniksnack.se, 1 tekniksomine.com.tr, 1 @@ -143247,12 +143299,13 @@ teknoharekat.com, 1 teknokanguru.com.tr, 1 teknoleet.com, 1 +teknologipendidikan.biz.id, 1 +teknologipendidikan.id, 1 teknologipendidikan.or.id, 1 teknomarko.com, 0 teknon.tk, 1 teknoparkistanbul.com.tr, 1 teknorix.com, 1 -teknoscienze.com, 1 teknow.tk, 1 teknozilla.com.tr, 1 teko.se, 1 @@ -143309,9 +143362,8 @@ telecharger-winrar.com, 1 telechirkut.xyz, 1 telechnics.com.au, 1 -telecinesound.it, 1 +telecinesound.it, 0 teleclaro.com, 1 -teleclases.com, 1 telecom-sudparis.eu, 1 telecomarmenia.am, 1 telecommande-express.com, 1 @@ -143358,7 +143410,6 @@ telenovelas-france.tk, 1 telent.com, 1 teleogistic.net, 1 -teleoposiciones.es, 1 telepati.info, 1 telephonedirectories.us, 1 telephoni-cdma.tk, 1 @@ -143373,7 +143424,6 @@ teleradio.ga, 1 teleradio.tk, 1 teleroute.com, 0 -telesales.guru, 1 teleshkronja.ml, 1 teleshop.be, 1 teleskell.org, 1 @@ -143453,7 +143503,6 @@ temis.nl, 1 temizim.com, 1 temizlik.ml, 1 -temizmama.com, 1 teml.in, 1 temnacepel.cz, 1 temnikova.tk, 1 @@ -143531,6 +143580,7 @@ tender.run, 1 tendermint.com, 1 tenderned.nl, 1 +tenderradar.nl, 1 tenderwizard.com, 1 tendiris.ga, 1 tendmed.com.br, 1 @@ -143588,6 +143638,7 @@ tenshokudo.com, 1 tenshokufair.jp, 1 tensor.trade, 0 +tensure.io, 1 tent.io, 1 tentacle.monster, 1 tentacle.net, 1 @@ -143600,14 +143651,12 @@ tentinger.co, 1 tentou.com, 1 tentrentals.com, 1 -tentries.com, 1 tentsforsale.com, 1 tenue-traditionnelle.fr, 1 tenyx.de, 1 tenzan.com, 1 tenzer.dk, 1 tenzorpro.com, 0 -teoassessoria.com.br, 1 teoitaly.com, 1 teoletextsq.tk, 1 teolino.eu, 1 @@ -143760,7 +143809,6 @@ terraweb.net, 1 terrax.net, 1 terrelltx.gov, 1 -terremetisagency.com, 1 terremoto.com.br, 1 terrenal.tk, 1 terrenasparadise.com, 1 @@ -143830,6 +143878,7 @@ test-textbooks.com, 1 test-verz.online, 1 test.de, 1 +test.sn, 1 test.support, 1 test1-isrewards.com, 1 test1974.nl, 1 @@ -143939,7 +143988,6 @@ tetramax.eu, 1 tetrapak.com, 1 tetrimus.com, 1 -tetryyn.com, 1 tetsumaki.net, 1 tetweb.ir, 1 teu-fel.com, 1 @@ -144046,6 +144094,7 @@ tezcam.tk, 1 tezfab.com, 1 teztarama.com, 1 +tf-amd.com.my, 1 tf-network.de, 1 tf2b.com, 1 tf2calculator.com, 1 @@ -144084,6 +144133,7 @@ tfx.com.br, 1 tfxstartup.com, 1 tfxstartup.com.br, 1 +tfyou.co, 1 tfyre.co.za, 1 tg-servce-timesheet.azurewebsites.net, 1 tg.pe, 1 @@ -144091,7 +144141,6 @@ tgb.org.uk, 1 tgcfabian.nl, 1 tgcgrain.com, 1 -tgchambers.com, 1 tgexport.eu, 1 tghez.net, 1 tglbbs.com, 0 @@ -144150,7 +144199,6 @@ thais.tk, 1 thaislots.online, 1 thaisurveys.com, 1 -thaitonic.de, 1 thaiunion.com, 1 thaiwatsadu.com, 1 thaiwrestling.tk, 1 @@ -144209,6 +144257,7 @@ the-allmighty-mike.tk, 1 the-archive.io, 1 the-archive.ml, 1 +the-asset.de, 1 the-azad.com, 1 the-big-bang-theory.com, 1 the-brandidentity.com, 1 @@ -144262,6 +144311,7 @@ the7eye.org.il, 1 the8rules.co.uk, 1 thea-team.net, 1 +theacademicpapers.co.uk, 1 theacc.com, 1 theaccountant-online.com, 1 theaccountingcompanyleeds.co.uk, 1 @@ -144285,7 +144335,6 @@ theajwatson.com, 1 thealbionrooms.live, 1 thealchemistatelier.com, 1 -thealeph.com, 1 theallmanteam.com, 0 thealmoners.com, 1 thealonas.cf, 1 @@ -144293,7 +144342,6 @@ thealonas.gq, 1 thealonas.ml, 1 thealonas.tk, 1 -thealtaconferences.com, 1 theamandatappingclub.tk, 1 theamandatappingcontest.tk, 1 theamegroup.com, 1 @@ -144373,10 +144421,12 @@ thebasicstudio.com, 1 thebatesstudent.com, 1 thebathroomexchange.ga, 1 +thebatt.com, 1 thebaytalland.com, 1 thebcm.co.uk, 1 thebeatyard.nl, 0 thebeautifuledge.com, 1 +thebeautyofmilk.com, 1 thebeautyqueen.tk, 1 thebedfordcitizen.org, 1 thebeef.info, 1 @@ -144431,7 +144481,7 @@ theblogstarter.com, 1 theblondeabroad.com, 0 theblue.tk, 1 -theblueprint.global, 1 +thebluebanner.net, 1 thebluered.net, 0 theblueroofcottage.ca, 1 thebluewindowdesigns.com, 1 @@ -144521,12 +144571,12 @@ thecelticfiles.tk, 1 thecentraltrend.com, 1 theceocollective.com, 1 -thecfef.org, 1 thechaikinreport.com, 1 thechallenge.fit, 1 thechannels.org, 1 thechatlinenumbers.com, 1 thechavs.xyz, 1 +thecheapairlinetickets.com, 1 thecheat.tk, 1 thecheese.co.nz, 1 thechels.uk, 1 @@ -144577,6 +144627,7 @@ thecostymusic.tk, 1 thecotsworth.com, 1 thecougarpress.org, 1 +thecouplesroom.com, 1 thecoverlot.com, 1 thecovky.gov, 1 thecowboy.cafe, 1 @@ -144667,11 +144718,13 @@ thedroneely.com, 1 thedronevortex.com, 1 theduchessbudapest.com, 1 +thedumpsterrentaltoday.com, 1 thedysfunctionalangel.cf, 1 thedysfunctionalangel.ga, 1 thedysfunctionalangel.gq, 1 thedysfunctionalangel.ml, 1 theeagle.com, 1 +theeastcoastkitchen.com, 1 theebookkeepers.co.za, 1 theeducatoronline.com, 1 theeffingyogablog.com, 1 @@ -144683,7 +144736,6 @@ theeldritchhounds.gq, 1 theeldritchhounds.ml, 1 theelephant.info, 1 -theeliteneet.com, 1 theemeraldmagazine.com, 1 theemployeeapp.com, 1 theemploymentnetworkcla.com, 1 @@ -144693,7 +144745,6 @@ theepicstorm.com, 1 theescapegame.com, 0 theestatesatstgeorge.com, 1 -theesuhlmann.de, 1 theeuropeanlibrary.org, 1 theevergreen.me, 0 theeverydayprepper.com, 1 @@ -144743,6 +144794,7 @@ thefoodieblogger.com, 1 thefoot.tk, 1 theforbiddenfruitbar.co.uk, 1 +thefordhamram.com, 1 theforkedspoon.com, 1 thefountain.eu, 1 thefox.com.fr, 1 @@ -144845,6 +144897,7 @@ theguerrilla.agency, 0 thegungrabber.ca, 1 thegungrabber.com, 1 +theguttercenter.com, 1 thegvoffice.net, 1 thegymnasium.com, 0 thegypsythread.org, 1 @@ -144881,6 +144934,7 @@ thehinhonline.com.vn, 1 thehivedesign.org, 1 thehoff.ddnss.de, 1 +thehofstrachronicle.com, 1 thehollandfam.com, 0 theholloways.tk, 1 thehomeassignment.com, 1 @@ -144937,6 +144991,7 @@ theislandwellness.com, 1 theissen.io, 1 theisthelpline.com, 1 +theithacan.org, 1 theixiangrand.gr, 1 thejacksoninstitute.com.au, 1 thejakartapost.com, 1 @@ -144970,7 +145025,6 @@ theknowitguy.com, 0 thekochampionship.com, 1 thekodaichronicle.com, 1 -thekolye.com, 1 thekonsulthub.tk, 1 thekuwayama.net, 1 thelakedistrict.tk, 1 @@ -145031,7 +145085,6 @@ thelordofthewing.gq, 1 thelordofthewing.ml, 1 thelordsofthefallen.com, 1 -thelosangelesconservative.com, 1 thelounge.chat, 1 theloveequation.com, 1 theloves.com, 1 @@ -145098,6 +145151,11 @@ themissionman.com, 1 themizellbrothers.tk, 1 themlmsuccessnow.tk, 1 +themo.app, 1 +themo.dev, 1 +themo.group, 1 +themo.host, 1 +themo.studio, 1 themobileinterview.com, 1 themodel.ie, 1 themodernreviewer.ga, 1 @@ -145119,6 +145177,7 @@ themsuspokesman.com, 1 themtwashingtongroup.com, 1 themusecollaborative.org, 1 +themuseexperience.nl, 1 themusicofchrisbulman.tk, 1 themusicthatnobodylikes.tk, 1 themusicuk.com, 1 @@ -145160,8 +145219,6 @@ thenorthwindonline.com, 1 thenowheremen.com, 1 thenrdhrd.nl, 1 -thenudge.com, 1 -thenutritionalreset.ca, 0 thenviews.com, 1 theo.agency, 0 theo.me, 1 @@ -145173,6 +145230,7 @@ theobmcircle.com, 1 theobromos.fr, 0 theoc4ever.tk, 1 +theoceaned.com, 1 theocharis.org, 1 theocjournal.tk, 1 theocoffee.com, 0 @@ -145244,7 +145302,6 @@ theparticipants.tk, 1 thepartner.co.uk, 1 thepartydoctors.co.uk, 1 -thepassiveplan.com, 1 thepathsofdiscovery.com, 1 thepaul.tk, 1 thepavilionbanbury.co.uk, 0 @@ -145301,6 +145358,7 @@ theportlandinnproject.com, 1 thepostflow.com, 1 thepowerboys.tk, 1 +thepowerdistrict.com, 1 theprairienews.com, 1 thepreachersportal.org, 1 thepressroom.com, 1 @@ -145311,6 +145369,7 @@ theprimegroup.ca, 1 theprimepr.in, 1 theprinceshort.tk, 1 +theprivacy.com.br, 1 theprivacysolution.com, 1 theprivatetherapyclinic.co.uk, 1 theprodigaljournal.com, 1 @@ -145321,7 +145380,7 @@ thepromenadeshopsatsauconvalley.com, 1 theprospectordaily.com, 1 theprowlernews.org, 1 -thepsi.com, 1 +thepsi.com, 0 theptclist.tk, 1 thepuffprof.com, 1 thepulicegroup.com, 1 @@ -145329,6 +145388,7 @@ thepuppetdolls.tk, 1 thepureplan.com, 1 thepurplechickens.tk, 1 +thepursuitfitnesswi.com, 1 thepuzzles.eu.org, 1 thepyre.tk, 1 thepyrographytool.com, 1 @@ -145456,11 +145516,11 @@ thesage.cf, 1 thesage.ga, 1 thesagresapartments.com, 1 +thesandb.com, 1 thesarogroup.com, 1 thesashcompany.com.au, 1 thesatriantoshow.tk, 1 thesaturdaypaper.com.au, 1 -thesaunalife.com, 1 thescarlet.org, 1 thesceneawards.com, 1 thescienceofdeduction.tk, 1 @@ -145479,6 +145539,7 @@ thesemisouthernhomemaker.com, 1 theseoframework.com, 1 theseosystem.com, 1 +theserenenook.com, 1 theserpent.tk, 1 theserver.ml, 1 theserver201.tk, 1 @@ -145496,6 +145557,7 @@ theshots.cz, 1 thesigit.tk, 1 thesignacademy.co.uk, 1 +thesignpostwsu.com, 1 thesilentfew.tk, 1 thesilentlink.org, 1 thesilentplanet.tk, 1 @@ -145521,6 +145583,7 @@ theslotz.com, 1 theslotz1.co, 1 theslotz1.uk, 1 +theslowtravelplanner.com, 1 thesmartconsumer.com, 1 thesmexperiences.com, 1 thesocialcopywriter.com, 1 @@ -145545,6 +145608,7 @@ thestandards.tk, 1 thestatementjewelry.com, 1 thestellahouse.com, 1 +thestinkingship.com, 1 thestockoasis.com, 1 thestonestudio.in, 1 thestopoff.tk, 1 @@ -145566,10 +145630,12 @@ thesugargirls.com, 1 thesultans.tk, 1 thesunflower.com, 1 +thesuntease.com, 1 thesupersunday.tk, 1 thesuppercircle.com, 1 thesupportplatform.org.uk, 1 thesurgeons.sg, 1 +thesustainabilityalliance.us, 1 theswanstation.tk, 1 theswanwindsor.co.uk, 1 theswissbay.ch, 0 @@ -145612,11 +145678,11 @@ thetrafficgeek.com, 1 thetravel.com, 1 thetravelczar.com, 1 +thetravelerspersona.com, 1 thetravelhack.com, 0 thetravelingbudget.com, 1 thetravelshop.com, 1 thetravelstylist.nl, 1 -thetreeradio.com, 1 thetrendspotter.net, 1 thetropics.tk, 1 thetrulycharming.com, 0 @@ -145686,6 +145752,7 @@ thewarwhoop.com, 1 thewatchdog.com.br, 1 thewaterfrontpoole.com, 1 +thewaternerd.com, 1 thewave.tk, 1 thewaxhouse.academy, 1 thewayofislam.ml, 1 @@ -145823,6 +145890,7 @@ thingsivesaid.com, 1 thingsof.org, 1 thingswithleaves.co.uk, 1 +thingvaktin.is, 1 think-ai.eu, 1 think-positive-watches.de, 1 think.law, 1 @@ -145830,6 +145898,7 @@ thinkbigjesse.com, 1 thinkbot.de, 1 thinkbrands.co.uk, 1 +thinkcapital.com, 1 thinkcash.nl, 1 thinkchina.sg, 1 thinkcogency.com, 1 @@ -145848,6 +145917,8 @@ thinkingnull.com, 0 thinkittech.com, 1 thinklogistics.com, 1 +thinkmarkets.asia, 1 +thinkmarkets.com, 1 thinko.it, 1 thinkoffer.com, 1 thinkon.com, 1 @@ -145879,7 +145950,6 @@ thisdayinhockey.tk, 1 thisdot.site, 1 thisfreelife.gov, 1 -thishousedoesnotexist.org, 1 thisis.id, 1 thisisacompletetest.ga, 1 thisisamericansoccer.com, 1 @@ -145907,7 +145977,6 @@ thiswasntinthebrochure.wtf, 1 thisyear.jp, 1 thitat.net, 1 -thitruongsi.com, 1 thl.com, 1 thlautogarage.nl, 1 thlfoods.com, 1 @@ -145936,8 +146005,6 @@ thomas717.com, 1 thomasbeckers.be, 1 thomascountyne.gov, 1 -thomasdbrown.com, 1 -thomasduerlund.dk, 1 thomasdybdahl.no, 1 thomasebenrett.de, 1 thomaseikel.de, 0 @@ -145985,7 +146052,6 @@ thorntonnh.gov, 1 thorntonshvacservice.com, 1 thoropass.com, 1 -thoroughbredrecords.com, 1 thors-hearth.tk, 1 thorsteinsson.com, 1 thorsten-schaefer.com, 1 @@ -146009,7 +146075,6 @@ thouky.co.uk, 1 thouqi.com, 1 thousandoaksca.gov, 1 -thousandoakselectrical.com, 1 thowzzy.be, 1 thoxyn.com, 1 thpatch.net, 1 @@ -146135,6 +146200,7 @@ throneofmolok.tk, 1 thronia2.ro, 1 throopny.gov, 1 +throughlinecare.com, 1 throughout.ga, 1 throwable.website, 1 throwaway.link, 1 @@ -146171,7 +146237,6 @@ thunderkeys.net, 1 thunderlotusgames.com, 1 thunderwolves.ca, 1 -thundr.com, 1 thunk.ai, 1 thunktank.org, 1 thuprai.com, 1 @@ -146204,6 +146269,7 @@ tiadolores.com.br, 1 tiagocasalribeiro.ml, 1 tiagomoraismorgado.tk, 1 +tiagomoreira.pt, 1 tiagoneves.tk, 1 tiagonunes.pt, 1 tiagosimao.com, 1 @@ -146246,6 +146312,7 @@ tibber.com, 1 tibbitshall.ca, 1 tibc.ch, 1 +tibcon.net, 1 tibek-cnc-technik.de, 1 tiberian.tk, 1 tibetanmalashop.com, 1 @@ -146270,6 +146337,7 @@ tickertable.com, 0 ticket-9.de, 1 ticket-time.es, 1 +ticket-tracker.co.uk, 1 ticketassist.nl, 1 ticketbande.at, 1 ticketbande.ch, 1 @@ -146284,7 +146352,6 @@ ticketbande.us, 1 ticketcity.com, 1 ticketdeal.it, 1 -ticketfan.es, 1 tickethut.be, 1 ticketix.com, 1 ticketmaze.com, 1 @@ -146294,6 +146361,8 @@ ticketpro.ca, 1 ticketroster.com, 1 tickets2004.tk, 1 +ticketscheapairline.com, 1 +ticketscheapflights.com, 1 ticketsolve.com, 0 ticketsource.co.uk, 1 ticketsource.eu, 1 @@ -146351,7 +146420,6 @@ tiendaengeneral.com, 1 tiendafetichista.com, 1 tiendamacoco.com.ar, 1 -tiendamagia.com, 1 tiendamarina.com, 1 tiendamia.co, 1 tiendamia.com, 1 @@ -146421,6 +146489,7 @@ tigernewspaper.net, 1 tigernode.com, 1 tigerprop.com, 1 +tigerroofpa.com, 1 tigerspike.co.uk, 1 tigerspike.com, 1 tigerspike.com.au, 1 @@ -146456,7 +146525,6 @@ tikhonovy.ru, 1 tiki-god.co.uk, 1 tiki.id, 1 -tikimpact.com, 1 tikitak-o-rama.tk, 1 tikkie.me, 1 tikkio.com, 1 @@ -146536,6 +146604,7 @@ timco.cloud, 1 timcomp.com, 1 timcorp.net.ph, 1 +timcpa.com, 1 timdebruijn.nl, 1 timdemisch.de, 1 timdemisch.email, 1 @@ -146556,7 +146625,6 @@ time2060.ru, 1 time2choose.com, 1 time2time.ru, 1 -timeai.io, 1 timebomb.tk, 1 timebookings.cf, 1 timebox.tk, 1 @@ -146596,8 +146664,9 @@ timeroll.ml, 1 timersuite.com, 1 timertomato.com, 1 -timerway.com, 1 +timerway.com, 0 timescrypto.com, 1 +timesdelphic.com, 1 timesedlen.dk, 1 timeseller.ru, 1 timeserver0.de, 1 @@ -146642,10 +146711,10 @@ timmyrs.de, 1 timnash.co.uk, 1 timnegocia.com.br, 0 -timnextgen.com.ph, 1 timniclasdemisch.de, 1 timniclasdemisch.eu, 1 timo-viveen.nl, 1 +timochan.cn, 1 timogrossenbacher.ch, 1 timonenko.cf, 1 timonline.tk, 1 @@ -146932,6 +147001,7 @@ tkcm.online, 1 tkd-itf.tk, 1 tkddn.com, 1 +tkglobalexperts.co.za, 1 tkhirianov.tk, 1 tkhsurgery.com, 1 tkic.com.au, 1 @@ -146980,7 +147050,6 @@ tlsmail.cc, 1 tlsrobot.se, 1 tlumaczenie.com, 1 -tlv77.net, 1 tlvgraffiti.co.il, 1 tlyphed.net, 1 tlys.de, 1 @@ -146988,7 +147057,6 @@ tm-sydney.au, 1 tm2ts.com, 1 tm80plus.com, 0 -tma.us, 1 tmachinery.cz, 1 tmadev.com.au, 1 tmartravel.com, 1 @@ -147062,7 +147130,6 @@ tnosha.gov, 1 tnosworld.com, 1 tnp.sg, 1 -tnpsconline.com, 1 tnr.com.au, 1 tnrealid.gov, 1 tnrf.eu, 1 @@ -147114,9 +147181,7 @@ tobias-kluge.com, 1 tobias-kluge.de, 0 tobias-olbrich.de, 1 -tobias-picha.de, 1 tobias-sachs.de, 1 -tobias-weidhase.de, 1 tobias.gr, 1 tobias4.com.au, 1 tobiasbrunner.net, 1 @@ -147187,7 +147252,6 @@ todaysbestinsurance.com, 1 todaysdatenow.com, 1 todaysparent.com, 1 -todaytrailer.com, 1 todayupdates.ga, 1 toddassoc.com, 1 toddcullumresearch.com, 1 @@ -147239,6 +147303,7 @@ tofu.cf, 1 tofu.kim, 1 tofuixi.com, 1 +togaether.me, 1 togashishika.com, 1 together.gov, 1 togetherplanning.com, 0 @@ -147258,10 +147323,8 @@ toilestas.ca, 1 toilestci.com, 1 toilet-guru.com, 1 -toilville.com, 1 toimitaax.fi, 1 toio.io, 1 -toitjob.com, 1 tojeit.cz, 1 tojevune.cz, 1 tok4.com, 1 @@ -147397,7 +147460,6 @@ tomatofrogs.com, 1 tomatohq.com, 1 tomaz.eu, 1 -tomba.io, 1 tombaker.me, 1 tombclan.ga, 1 tombdr.com, 1 @@ -147416,7 +147478,7 @@ tomdapice.com, 1 tomdougiamas.com, 1 tomdubovich.com, 1 -tomdudfield.com, 1 +tomdudfield.com, 0 tome.ae, 1 tome.ru, 1 tomedo.de, 1 @@ -147562,7 +147624,6 @@ tonik.tk, 1 tonikbank.com, 0 tonimorena.net, 1 -tonkatowz.com, 1 tonkawaok.gov, 1 tonmo.com, 1 tonnycat.com, 1 @@ -147591,6 +147652,7 @@ tonyhagerlund.tk, 1 tonykarbo.tk, 1 tonymanning.com, 1 +tonyrush.com, 1 tonysantos.tk, 1 tonysciuto.com, 1 tonytan.cn, 1 @@ -147652,6 +147714,7 @@ toondergroup.com, 1 toonetcreation.com, 0 toonict.nl, 0 +toonit.ai, 1 toonmate.tk, 1 toonpool.com, 1 toonsburgh.com, 1 @@ -147782,8 +147845,8 @@ topesdegama.com, 1 topeyechang.com.tw, 1 topfd.net, 1 +topfived.com, 1 topfivepercent.co.uk, 1 -topflightwildlife.com, 1 topfrags.pl, 1 topfreeporn.com, 1 topfx.com, 1 @@ -147886,12 +147949,14 @@ topsuper60.org, 1 toptapety.cz, 1 toptapparelle.it, 0 +topteamtips.com, 1 toptec.net.br, 1 toptechnews.cf, 1 toptechnews.tk, 1 topteen.tk, 1 toptenwebhostingsites.com, 1 toptexture.com, 1 +topthetater.com, 1 toptheto.com, 1 toptica-eagleyard.com, 1 toptier.com.ar, 1 @@ -147902,7 +147967,6 @@ toptravelgram.com, 1 toptropicals.com, 1 toptur.tk, 1 -toptv88.com, 1 topu.ro, 1 topupindo.net, 1 topurls.tk, 1 @@ -147911,7 +147975,6 @@ topvisor.com, 1 topvisor.ru, 1 topvpn.pl, 1 -topwatch.com, 1 topwin.la, 1 topwindows-eg.com, 1 topwipers.com, 1 @@ -147938,6 +148001,7 @@ torch.security, 0 torchbearer.tk, 1 torchmc.ru, 1 +torchonline.com, 1 tordenskjold.de, 1 tordo.net, 1 toreni.us, 1 @@ -147959,7 +148023,6 @@ torkel.se, 1 torlock.com, 1 torlock2.com, 1 -tormentedradio.com, 0 tormentgame.com, 1 tormox.ml, 1 tornada-cz.cz, 1 @@ -147991,6 +148054,7 @@ torontotransit.tk, 1 toropova.tk, 1 toros-outdoors.de, 1 +torpenhow.ai, 1 torproject.org, 0 torproject.ovh, 1 torprojects.com, 1 @@ -148007,8 +148071,6 @@ torrent.fedoraproject.org, 1 torrent.is, 1 torrent.tm, 1 -torrentbd.com, 1 -torrentbd.me, 1 torrentbox.moe, 1 torrentdb.tk, 1 torrentdownload.gq, 1 @@ -148033,6 +148095,7 @@ torstens-buecherecke.de, 1 torstensenf.de, 1 torstenzimmermann.com, 1 +tortaboutique.hu, 1 tortak.ml, 1 tortar.me, 1 torte.roma.it, 1 @@ -148076,7 +148139,7 @@ totalbyverizon.com, 1 totalcarcheck.co.uk, 1 totalcare.co.nz, 1 -totalchecklist.com, 1 +totalchecklist.com, 0 totalcontrols.eu, 1 totaleaseventures.co.ke, 1 totalemaildelivery.com, 1 @@ -148096,6 +148159,7 @@ totalfoundationpros.com, 1 totalhost.gq, 1 totalityservices.co.uk, 1 +totaljs.es, 1 totallegal.com, 1 totally-dakota.tk, 1 totallyjessica.tk, 1 @@ -148111,6 +148175,7 @@ totalparts.com.au, 1 totalsport-bg.com, 1 totaltriathlon.com, 1 +totalwealth.co.nz, 1 totalwebpartners.com, 1 totalzen.ga, 1 totch.de, 1 @@ -148145,6 +148210,7 @@ touchbasesm2.ca, 1 touchboobs.ml, 1 touchdown.co, 1 +touche-moi.com, 1 touchingwetpaint.com, 1 touchka.ga, 1 touchmagazine.eu, 1 @@ -148188,7 +148254,6 @@ tourdeltalento.org, 1 tourdewestwoud.nl, 1 toureiffel.paris, 1 -tourfunnels.com, 1 tourgest.net, 1 touringinmorocco.com, 1 tourism-exegetai.tk, 1 @@ -148228,6 +148293,7 @@ touslesdrivers.com, 1 touslesforums.tk, 1 toussaint-romain.be, 1 +tousu.com, 0 tout-a-fait.fr, 1 tout-art.ch, 1 tout-vendre.com, 1 @@ -148284,6 +148350,7 @@ towessi.tk, 1 towing-waco.com, 1 towingmoore.com, 1 +towingnashvilletn.com, 1 town-night.jp, 1 townerkc.com, 1 townforge.net, 1 @@ -148524,11 +148591,13 @@ townofwrightstownwi.gov, 1 townofwyomingwi.gov, 1 townresults.ga, 1 +townscorereport.com, 1 townsendhotel.com, 1 townshendvt.gov, 1 townshipoflower.org, 1 townshipofthenorthshore.ca, 1 townswalker.com, 1 +towpath.com, 1 towschool.org, 1 towywebdesigns.uk, 1 tox21.gov, 1 @@ -148621,6 +148690,7 @@ trabaja.xyz, 1 trabajadormigrante.gov, 1 trabajaenvitamina.cl, 1 +trabajarytrabajar.com, 1 trabajoreal.com, 1 trabajouniversitario.tk, 1 trabbel.org, 1 @@ -148650,7 +148720,6 @@ traceurdirect.com, 1 traceurlocation.com, 1 traceuroccas.com, 1 -tracinsurance.com, 1 track.plus, 1 trackablemap.com, 1 trackadblock.com, 1 @@ -148667,6 +148736,7 @@ trackfocusdirect.com, 1 trackhs.com, 1 trackify.tk, 1 +tracking-adac-wtb.de, 1 tracking-app.tk, 1 tracking.best, 1 trackinsight.com, 1 @@ -148715,6 +148785,7 @@ tradedesk.co.za, 0 tradeeasy.com, 1 tradefxp.com, 1 +tradeintocash.com, 1 tradeiq.ch, 1 tradeledger.io, 1 tradelink.cf, 1 @@ -148740,6 +148811,7 @@ tradesolution.no, 1 tradesrenovations.ca, 1 tradet.fi, 1 +tradetaurex.com, 1 tradeview.eu, 1 tradeville.ro, 1 tradewindsdental.com, 1 @@ -148844,7 +148916,6 @@ trainings-handschuhe-test.de, 1 trainingsalicante.tk, 1 trainingscatalogus.nl, 1 -trainingsecke.de, 1 trainingswiese.at, 1 trainline.io, 1 trainmagazine.nl, 1 @@ -148888,7 +148959,6 @@ tramadolhcl.ga, 1 tramclub-basel.ch, 1 tramikshop.ml, 1 -tramin.in, 1 tramitelegal.com.ar, 1 tramplin.tk, 1 tramway.org, 0 @@ -149003,7 +149073,6 @@ transinbeeld.nl, 1 transit.my.id, 1 transitables.tk, 1 -transitionslc.com, 1 transitllc.ru, 1 transito.tk, 1 transitownplaza.com, 1 @@ -149057,6 +149126,7 @@ transporticonline.com, 1 transportnews.tk, 1 transportnsw.info, 1 +transportpigeon.com, 1 transporttalent.com, 1 transsensual.com, 1 transsensualnetwork.com, 1 @@ -149076,6 +149146,7 @@ trantrongtri.info, 1 tranvia.info, 1 tranzact.net, 1 +tranzguard.com, 1 tranzron.ga, 1 trapay.net, 1 trapezegroup.de, 1 @@ -149155,7 +149226,9 @@ traveladdiction.tk, 1 traveladventure.ml, 1 travelafricamag.com, 1 +travelagent.ai, 1 travelaiengineer.pro, 1 +travelairtravel.com, 1 travelamm.com, 1 travelanchor.ga, 1 travelandtourism.tk, 1 @@ -149196,10 +149269,12 @@ travelexecutive.de, 1 travelexinternational.com, 1 travelexpress.tk, 1 +travelfab.co.uk, 1 travelfashionlife.com, 1 travelfeature.ga, 1 travelfield.org, 1 travelfiesta.ga, 1 +travelflighthotel.com, 1 travelfoot.com, 1 travelfriend.tk, 1 travelfusion.com, 1 @@ -149290,7 +149365,6 @@ traveltomachupichu.com, 1 traveltourist.tk, 1 traveltovietnam.ga, 1 -traveltruster.com, 0 travelturbo.ga, 1 travelultra.ga, 1 travelunique.ga, 1 @@ -149332,6 +149406,7 @@ trbn.me, 1 trctaborda.com.br, 1 trdepoist.net, 1 +trdesk.com, 1 tre-sp.jus.br, 1 treadmillrepair.co.nz, 0 treadwellgordon.co.nz, 0 @@ -149491,7 +149566,6 @@ trhastane.com, 1 trhknih.cz, 0 tri.gg, 1 -triad.earth, 1 triadstop.com, 1 triage.clinic, 1 triage.md, 1 @@ -149548,13 +149622,14 @@ tributh.net, 1 tributh.tk, 1 tributoconsuegra.tk, 1 +tricare.mil, 1 tricefy4.com, 1 tricherenligne.com, 1 triciaree.com, 0 tricityrogues.eu, 1 trickest.com, 1 trickey.io, 1 -trickle.works, 1 +trickle.works, 0 trico-pigmentazione.it, 1 tricolortotal.tk, 1 triconinfotech.com, 1 @@ -149591,7 +149666,6 @@ trigueros.tk, 1 trigular.de, 1 trihedron.tk, 1 -trihunter6000.com, 1 trik-komputer.tk, 1 trik.es, 0 triker.tk, 1 @@ -149721,6 +149795,7 @@ triumphgroup.com, 1 triumphmotorcycles.co.uk, 1 triventsc.com, 1 +trivid.in, 1 trividtech.in, 1 triwan.sk, 1 trixi.com, 1 @@ -149754,7 +149829,6 @@ troisprime.com, 0 trojanchronicles.tk, 1 trojanherring.com, 1 -trojanrecords.com, 1 trok.co.il, 1 trolebusesdevalparaiso.tk, 1 troll-gaming.tk, 1 @@ -149919,7 +149993,6 @@ truecrypt.org, 1 truedarkness.tk, 1 trueduality.net, 1 -trueflowplumbing.com, 1 trueformroofing.co.nz, 1 truehealth.tk, 1 trueimpactsigns.com, 1 @@ -149932,25 +150005,14 @@ truenorthtalk.com, 1 truenorthvip.com, 1 truentumvet.it, 1 -truepartner.academy, 1 -truepartner.capital, 1 truepartner.cn, 1 truepartner.education, 1 -truepartner.email, 1 truepartner.eu, 1 truepartner.fund, 1 -truepartner.group, 1 truepartner.hk, 1 truepartner.holdings, 1 -truepartner.limited, 1 -truepartner.ltd, 1 truepartner.nl, 1 truepartner.sg, 1 -truepartner.software, 1 -truepartner.tech, 1 -truepartner.technology, 1 -truepartner.university, 1 -truepartner.us, 1 truepartneradvisor.cn, 1 truepartneradvisor.com, 1 truepartneradvisor.nl, 1 @@ -149969,18 +150031,14 @@ truepartnerchinafuturesfund.cn, 1 truepartnerchinagrowthfund.cn, 1 truepartnerchinaoptionsfund.cn, 1 -truepartneredu.com, 1 truepartnereducation.cn, 1 -truepartnereducation.com, 1 truepartnerfund.cn, 1 truepartnerfund.hk, 1 truepartnerfund.nl, 1 truepartnerinvestments.com.hk, 1 truepartnerinvestments.hk, 1 -truepartnertech.com, 1 truepartnertech.nl, 1 truepartnertech.sg, 1 -truepartnertechnology.com, 1 truepartnertechnology.nl, 1 truepartnertechnology.sg, 1 truepointdigital.com.au, 1 @@ -149993,7 +150051,6 @@ truestor.com, 1 truetraveller.com, 1 truetrophies.com, 1 -truetype.tech, 1 trueweb.es, 1 truewebmaster.com, 1 truewinter.net, 1 @@ -150010,10 +150067,12 @@ trulock.tk, 1 trulycharmed.tk, 1 trulyhardseltzer.com, 1 +trulypakistan.net, 1 trumag-international.com, 1 trumanlibrary.gov, 1 trumansburgoptical.com, 1 trummer.xyz, 1 +trumoo.com, 1 trumpet-call.org, 1 trumpet-whistleblowing.eu, 1 trumplibrary.gov, 1 @@ -150051,6 +150110,7 @@ trustcloud.ai, 1 trustcrest.in, 1 trustcruit.com, 1 +trustcv.com, 1 trustdental.jp, 1 trusted-medications.com, 1 trusted-signatures.com, 1 @@ -150072,6 +150132,7 @@ trustreview.tk, 1 trustserv.de, 1 trustserver.cn, 1 +trustsig.eu, 1 truststamp.ai, 1 trustswiftly.com, 1 trustted.co.uk, 1 @@ -150104,14 +150165,17 @@ trw-reseller.com, 1 trxnews.today, 1 try-upguard.com, 1 +try.li, 1 try2hack.it, 1 trybabyschoice.com, 1 +trybeaverdock.com, 1 trycaviar.com, 1 trychameleon.com, 1 trydoggo.com, 1 tryfabulousdiet.com, 1 tryfabulousskincream.com, 1 tryfabulousskinserum.com, 1 +trygghetsteknik.se, 1 trygrupp.africa, 1 tryhard.cz, 1 tryharder.ca, 1 @@ -150190,7 +150254,6 @@ tshirai.work, 1 tshirtgenerator.ga, 1 tshirtmemoryquilts.com, 0 -tshirts.durban, 1 tshirtsangola.co.za, 1 tshirtsbotswana.co.za, 1 tshirtscapetown.com, 1 @@ -150239,6 +150302,7 @@ tst-band.tk, 1 tstr.io, 1 tstrom.net, 1 +tsttalent.com, 1 tsu.re, 0 tsuda-dental-ortho.info, 1 tsudakahama.tech, 1 @@ -150266,6 +150330,7 @@ tsuyuzakihiroyuki.com, 1 tsv-1894.de, 0 tsv-hittfeld.de, 0 +tswg.gov, 1 tswinvest.com, 1 tsxxlangel.com, 1 tsybanov.com, 1 @@ -150325,7 +150390,6 @@ ttwtrader.com, 1 tty.space, 1 tty1.net, 1 -tty12.org, 1 ttyystudio.com, 1 tu-com.es, 1 tu-muenchen.de, 1 @@ -150339,7 +150403,7 @@ tubator.com, 1 tubby.ovh, 1 tubchair.com, 1 -tube.tools, 1 +tube.tools, 0 tube8vip.com, 1 tubebegana.com, 1 tubedesire.com, 1 @@ -150370,6 +150434,7 @@ tucsonpcrepair.com, 1 tucsonsewerscopes.com, 1 tucuatro.com, 1 +tucuxi.org, 1 tudatosantejmentesen.hu, 1 tudatosdori.hu, 1 tudinerito.tk, 1 @@ -150456,6 +150521,7 @@ tullphone.com.mx, 1 tulocura.tk, 1 tulosleep.com, 1 +tulpa.network, 1 tulpawiki.org, 1 tulsa.tech, 1 tulsameetingroom.com, 1 @@ -150487,6 +150553,7 @@ tunenet.ml, 1 tuner.cloud, 1 tuneserver.tk, 0 +tunevoter.com, 1 tuning-werkstatt-nuernberg.de, 1 tuningblog.eu, 0 tunisia-tech.tk, 1 @@ -150525,7 +150592,6 @@ tuppenceworth.ie, 1 tuppennysfireplace.com, 1 tuppersexmadrid.com.es, 1 -tupperwaresalamanca.com, 1 tuprag.com.tr, 1 tupsicoayuda.com, 0 tupugoya.org, 1 @@ -150647,6 +150713,7 @@ turnalikoyu.tk, 1 turnaroundinsights.com, 1 turnbacktogod.com, 1 +turncircles.com, 1 turneragsupply.com, 0 turneroregon.gov, 1 turnet.tk, 1 @@ -150670,6 +150737,7 @@ turquoise.health, 1 turquoisetassel.com, 1 turretlabs.io, 1 +tursiae.org, 1 turtle.ai, 0 turtle.ky, 1 turtlecomputers.net, 1 @@ -150688,12 +150756,12 @@ tusar.cf, 1 tusar.ga, 1 tuscaloosacourtreporting.com, 1 +tuscandairy.com, 1 tuscanyleather.it, 0 tusconsultorex.com, 1 tusdtapi.com, 1 tusharwalaskar.com, 1 tusi.co, 1 -tuslamparasonline.com, 1 tusmedicamentos.com, 1 tusociofinanciero.com, 1 tussenuur.tk, 1 @@ -150754,7 +150822,6 @@ tuva-news.net, 1 tuvankinhdoanhonline.com, 1 tuvanmat.com, 1 -tuvi.es, 1 tuwaner.com, 1 tuwima48.pl, 1 tuxamca.com, 1 @@ -150813,7 +150880,6 @@ tvcmarketing.com, 1 tvdenevar.net, 0 tvdheijden.com, 1 -tvears.com, 1 tveni.com, 1 tvenligne.tk, 1 tver-news.net, 1 @@ -150869,6 +150935,7 @@ tvsportguide.de, 1 tvsportiva.it, 1 tvsscs.com, 1 +tvsscs.it, 1 tvstore-247.net, 1 tvszn.cz, 1 tvtj.ml, 1 @@ -150963,6 +151030,7 @@ twistyspremium.com, 1 twistysreel.com, 1 twit-guide.com, 1 +twitchauth.work, 1 twitchplaysleaderboard.info, 1 twitchy.tk, 1 twitcker.com, 1 @@ -150983,6 +151051,7 @@ twobitbusker.com, 1 twobridges.co.uk, 1 twobrothersbbq.com, 0 +twobrothersinn.com, 1 twocantalk.ca, 1 twoconnect.com, 0 twocornertiming.com, 1 @@ -151001,6 +151070,8 @@ twolittlefleas.co.uk, 1 twoninersix.com, 1 twonodes.games, 0 +twonum-servers.net, 1 +twonum.net, 1 twonum.org, 1 twoodoo.de, 1 twopinescreative.com, 1 @@ -151035,7 +151106,7 @@ txsmartbids.gov, 1 txsmartbuy.gov, 1 txtd.io, 1 -txtdb.com, 1 +txtdb.com, 0 txtdirect.com, 1 txtdirect.dev, 1 txtdirect.io, 1 @@ -151113,6 +151184,7 @@ typecho.site, 0 typeclasses.com, 1 typecodes.com, 1 +typefun.xyz, 1 typegrow.com, 1 typehub.net, 0 typeof.pw, 1 @@ -151131,6 +151203,7 @@ typica.com.tw, 1 typika.gr, 1 typing.com, 1 +typingbandhu.in, 1 typingcheck.ga, 1 typinglounge.com, 1 typist.tech, 1 @@ -151140,10 +151213,8 @@ tyr0wl.com, 1 tyrael.eu, 1 tyraga.ga, 1 -tyrannize.us, 1 tyrasuki.be, 1 tyre-search.ga, 1 -tyres-mechanical.com.au, 1 tyresales.com.au, 1 tyrkey.tk, 1 tyrocity.com, 1 @@ -151197,7 +151268,6 @@ tzunami.tk, 1 tzunamiblog.tk, 1 tzwe.com, 1 -u-buy.jp, 1 u-chan.com, 0 u-fms.com.au, 1 u-he.com, 1 @@ -151205,7 +151275,6 @@ u-msg.com.au, 1 u-page.nl, 1 u-pas.com.au, 1 -u-ranking.es, 1 u-time.com.au, 1 u-watch.it, 1 u.ls, 1 @@ -151324,7 +151393,7 @@ ubezpieczonedziecko.pl, 1 ubicaciones-vitamina.cl, 1 ubicv.com, 1 -ubik.capital, 1 +ubik.capital, 0 ubill.ge, 1 ubimail.org, 1 ubiminds.com, 1 @@ -151332,7 +151401,6 @@ ubis.group, 1 ubiurbe.com, 1 ubleam.com, 0 -ubn-speed.fr, 0 ubook.com, 1 uborcare.com, 1 uborka-812.ru, 1 @@ -151388,7 +151456,6 @@ ucphotography.net.au, 1 ucpparts.com, 1 ucppe.org, 1 -ucraft.ai, 1 ucrdatatool.gov, 1 ucretleri.net, 1 ucsdguardian.org, 1 @@ -151398,6 +151465,8 @@ uctarna.online, 1 ucware.com, 1 ucybodyinc.com, 1 +uczciweit.pl, 1 +uczciwestrony.pl, 1 udahni.com, 1 udb.kr, 1 udbina.tk, 1 @@ -151538,6 +151607,7 @@ uinvest.tk, 1 uiop.link, 1 uiquipedia.org, 1 +uir.ac.ma, 1 uisd.net, 1 uitdeoudekoektrommel.com, 1 uiterwijk.org, 1 @@ -151571,7 +151641,7 @@ ukdefencejournal.org.uk, 1 ukdri.ac.uk, 1 ukem.co.uk, 1 -ukformify.co.uk, 0 +ukformify.co.uk, 1 ukforum.net, 1 ukhas.net, 1 ukimmigration.law, 1 @@ -151579,6 +151649,7 @@ ukjent.net, 1 uklawfirm.tk, 1 uklidgaraze.fun, 1 +uklidovkaplzen.cloud, 1 uklizim-garaz.fun, 1 uklizim.fun, 1 uklizimgaraz.fun, 1 @@ -151617,7 +151688,6 @@ ukrtabletki.tk, 1 ukrzoloto.ua, 1 ukseafood.co.uk, 1 -ukstaa.org, 1 ukta.tk, 1 uktw.co.uk, 0 uku.lt, 1 @@ -151672,7 +151742,6 @@ ultimateappreviews.co, 1 ultimatebabyshowergifts.ga, 1 ultimatebattle.tk, 1 -ultimatebattles.club, 1 ultimatecheerleaders.com, 1 ultimateclub.tk, 1 ultimateconnector.com, 1 @@ -151698,6 +151767,7 @@ ultrablock.org, 1 ultrabuilds.com, 1 ultracentr.ml, 1 +ultracompanygc.com, 1 ultracoupon.net, 1 ultrafine.cf, 1 ultrahang-maganrendeles.hu, 1 @@ -151731,7 +151801,6 @@ ulysses.co.uk, 1 ulyssesenergy.it, 1 um-sachsen-pictures.de, 1 -um.es, 0 um6p.ma, 1 umagoyal.com, 1 umami.vercel.app, 1 @@ -151747,7 +151816,6 @@ umasstransit.org, 1 umatilla.gov, 1 umatillacounty.gov, 1 -umbertheprussianblue.com, 1 umbraco.com, 1 umbrellamediagroup.com, 1 umbrellaye.online, 1 @@ -151767,6 +151835,7 @@ umisonoda.com, 1 umitribe.gov, 1 umity.com.ua, 1 +umkashir.com, 1 umkdd.com, 1 umkomaaslodge-aliwalshoal.co.za, 1 umlautpress.com, 1 @@ -151792,10 +151861,10 @@ umww.com, 1 umzuege-hannover.net, 1 umzugschecker.de, 1 +umzugsmeister-wolters.de, 1 umzugsunternehmen.berlin, 1 umzugsunternehmenberlin.eu, 1 un-box.org, 1 -un-zero-un.fr, 1 una.py, 1 unacasitadepapel.com, 1 unaffectedsound.tk, 1 @@ -151938,7 +152007,6 @@ unhappy.tk, 1 uni-arts.com, 1 uni-chem.rs, 1 -uni-cleaner.com, 1 uni-watch.com, 1 uni2share.com, 1 unia.es, 1 @@ -151971,7 +152039,6 @@ uniclejess.ca, 1 unicode.gq, 1 unicode.link, 1 -unicode.website, 1 unicodeart.com, 1 unicodeplus.com, 1 unicodesign.ch, 1 @@ -151986,7 +152053,7 @@ unicorn.melbourne, 1 unicorndesign.ninja, 1 unicornheaven.net, 1 -unicorni72.online, 1 +unicornmarket.net, 1 unicornmusic.tk, 1 unicornsoft.tk, 1 unicorntooling.eu, 1 @@ -152022,7 +152089,6 @@ unikbio.com, 1 unike.tech, 1 unikimages.com, 1 -unikon.su, 1 unikos.tk, 1 unikrn.com, 1 unikrn.tech, 1 @@ -152148,7 +152214,6 @@ unitreedoor.com, 0 unitycardiology.com.au, 1 unityconsciousnessbooks.com, 1 -unityfactory.io, 1 unityor.gov, 1 unitysavannah.org, 1 unitysyndicate.tk, 1 @@ -152265,7 +152330,6 @@ unmask.earth, 1 unmatched.ventures, 1 unmetric.com, 1 -unmfoundation.com, 1 unminutomami.com, 1 unmo.com, 1 unmoneye.com, 1 @@ -152292,6 +152356,7 @@ unosconotros.com, 1 unovosti.tk, 1 unp.me, 1 +unpar.ac.id, 1 unparenting.com, 1 unpi06cannes.fr, 1 unpkg.com, 1 @@ -152322,7 +152387,6 @@ unseeliefilms.com, 1 unseeliepress.com, 1 unser-barsinghausen.de, 1 -unser-gartenbauverein.de, 1 unser-gartenforum.de, 1 unsigcrazy.art, 1 unsourirealecole.fr, 1 @@ -152345,13 +152409,13 @@ unternimmteam.de, 1 unti.me, 1 unti.tk, 1 +untold.agency, 1 untrading.org, 1 untvweb.com, 1 unufoundation.com, 1 unukase.ac.id, 1 unun.fi, 0 unusualhatclub.com, 1 -unusualsubstance.com, 1 unvarnishedco.com, 1 unveilturkey.com, 1 unvired.com, 1 @@ -152361,7 +152425,6 @@ unwishingmoon.com, 1 unwomen.de, 1 unworthy.ml, 1 -unwrittens.net, 1 unx.dk, 1 unxicdellum.cat, 1 uny.ac.id, 1 @@ -152379,13 +152442,13 @@ up.nic.in, 1 up1s.tk, 1 up2date.com.ua, 1 -up2mark.com, 0 up2staff.com, 1 upaaquila.org, 1 upaisa.com, 1 upakovka-podarkov.tk, 1 upandatom.biz, 1 upandrunningtutorials.com, 1 +upanh.org, 1 upar.org, 1 upay.uz, 1 upbad.com, 1 @@ -152397,7 +152460,7 @@ upbeatrobot.nl, 1 upbeatrobot.org, 1 upbeatrobot.social, 1 -upbit.com, 1 +upbit.com, 0 upbtrbt.com, 1 upbtrbt.eu, 1 upbtrbt.net, 1 @@ -152427,7 +152490,6 @@ upgamerengine.com.br, 1 upgamerengine.net, 1 upgeradores.com.br, 1 -upgintl.com, 1 upgrade.com, 1 upgradeguru.de, 1 upgradeit.dk, 1 @@ -152441,7 +152503,6 @@ upguard.in, 1 upguard.org, 1 upguardinc.com, 1 -uphabit.io, 1 uphold-15-party.com, 1 upholsterydesign.com.au, 1 uphost.be, 1 @@ -152475,7 +152536,6 @@ upmon.com, 1 upnetwork.ml, 1 upnext.tk, 1 -upnorth.solutions, 1 uportal.tk, 1 uppercloud.cf, 1 upperglass.co.uk, 1 @@ -152490,6 +152550,7 @@ upr.llc, 1 upr.si, 1 upr.ua, 1 +upra.gov.co, 1 uprawnienia-1kv.pl, 1 uprawnienia-dronowe.pl, 1 uprawnienia-drony.pl, 1 @@ -152542,8 +152603,8 @@ upundit.com, 1 upviews.tk, 1 upwardcreative.com, 1 -upwardflourish.com, 1 upwardtraining.co.uk, 1 +upwebmobilepro.com, 1 upwork.com, 1 upyourbusiness.nl, 1 uq1k.com, 1 @@ -152653,7 +152714,6 @@ urcentral.org, 1 urcommunitytimebanking.org.au, 1 urdoverie.com, 1 -urdumediamonitor.com, 1 urenaphoto.com, 1 ureve.paris, 1 urfreecon.tk, 1 @@ -152757,6 +152817,7 @@ usability.com.gr, 1 usability.gov, 1 usacarry.com, 1 +usacontainerllc.com, 1 usacrime.com, 1 usadba.net.ru, 1 usadepo.com, 1 @@ -152765,6 +152826,7 @@ usadirectory.tk, 1 usadocnetwork.com, 1 usaestaonline.com, 1 +usaeuc.com, 1 usage.be, 1 usagi-ku.ga, 1 usagm.gov, 1 @@ -152792,6 +152854,7 @@ usatiuk.com, 1 usatodaynetworkservice.com, 1 usatodaysportsplus.com, 1 +usautomatic.com, 1 usavingsbank.com, 1 usaweblist.tk, 1 usawireguard.com, 1 @@ -152800,6 +152863,7 @@ usbevents.co.uk, 1 usbmakers.com, 1 usbr.gov, 1 +uscc.gov, 1 uscc.org.ua, 1 uscdn.xyz, 0 uscis.gov, 1 @@ -152898,7 +152962,6 @@ usmiddleclass.net, 1 usmint.gov, 1 usmission.gov, 1 -usmoneyreserve.com, 1 usmrecycles.com, 1 usnews-new.tk, 1 usnews.ga, 1 @@ -152908,7 +152971,6 @@ usoog.com, 1 usoptical.com, 1 uspaacc.com, 1 -usparceldelivery.com, 1 usparklodging.com, 1 uspasecurity.com, 1 uspeh62.tk, 1 @@ -152920,7 +152982,6 @@ uspon.tk, 1 usportsgo.com, 1 uspory.cz, 1 -uspower.us, 1 uspsblog.com, 0 uspsoig.gov, 1 uspsolutions.at, 1 @@ -152942,14 +153003,14 @@ ustc.fun, 1 ustc.run, 1 ustg.net, 1 +ustoy.com, 1 ustr.gov, 1 -ustreasuryetf.com, 1 ustugov.kiev.ua, 1 ustugova.kiev.ua, 1 ustyj.tk, 1 usu.org.ua, 1 usuan.net, 1 -usul.ai, 1 +usul.ai, 0 usuluddin.ga, 1 usuluddin.tk, 1 usuwanie-wirusow-wordpress.pl, 1 @@ -153013,8 +153074,10 @@ utilizaciya.com, 1 utko12.ru, 1 utleg.gov, 1 +utleio.no, 1 utloperadora.com.br, 1 utodyg.ga, 1 +uton.cz, 1 utonia.ch, 1 utop.io, 1 utopialgb.org.uk, 1 @@ -153034,7 +153097,6 @@ uttama.ga, 1 uttenheim.net, 1 utterberry.io, 1 -utube.ai, 1 utural.tk, 1 utusan.com.my, 1 utvbloggen.se, 1 @@ -153072,7 +153134,6 @@ uvsa.org.au, 1 uvsar.com, 1 uvt.com.co, 1 -uwac.co.uk, 0 uwalumni.com, 0 uwat.cc, 1 uwat.cf, 1 @@ -153145,6 +153206,7 @@ uzvod.com, 1 uzzamari.com, 1 uzzamari.com.br, 1 +v-chipak.de, 1 v-cn.net, 1 v-d-p.net, 1 v-empower.com, 1 @@ -153217,6 +153279,7 @@ vaayaa.com, 1 vabusinesses.org, 1 vacaf.org, 1 +vacances-ideales-france.top, 1 vacances-ideales.top, 1 vacansier.com, 1 vacanze-in-montagna-dolomiti.com, 1 @@ -153377,8 +153440,8 @@ valeuraenergy.com, 1 valgagym.ee, 1 valgavesi.ee, 1 -valgeklaar.ee, 1 valhallastrengthsthbne.com.au, 1 +valia.health, 1 valiakhmetov.tk, 1 valiant.finance, 1 valiantprep.org, 1 @@ -153418,7 +153481,6 @@ valledibraies.org, 1 vallee-egoutiers.ca, 1 valleesenlutte.org, 1 -vallei-veluwe.nl, 1 vallejo.gov, 1 vallejoca.gov, 1 vallenar.tk, 1 @@ -153431,7 +153493,6 @@ valleycountyne.gov, 1 valleydalecottage.com.au, 1 valleydisasterfair.com, 1 -valleymarketonline.com, 1 valleyofdeath.tk, 1 valleyofpeace.co.nz, 1 valleyshop.ca, 1 @@ -153529,13 +153590,13 @@ van-rutten.nl, 1 van.ddns.net, 1 van11y.net, 1 -vanadrighem.eu, 1 vanafhier.nl, 0 vanamersfoortracing.nl, 1 vananservices.com, 1 vanarok.xyz, 0 vanbalen.be, 1 vanbarel.tk, 1 +vanboven.nl, 1 vanboyvital.tk, 1 vanbruchem.tk, 1 vanburencounty-mi.gov, 1 @@ -153548,7 +153609,6 @@ vancouverdriveband.com, 1 vancouverok.com, 1 vancouverpetsitter.ca, 1 -vancouversbestplaces.com, 1 vancouverwaseo.org, 1 vancubers.com, 1 vandaalen.email, 1 @@ -153630,7 +153690,6 @@ vanrichie.nl, 1 vanstoftotleven.nl, 1 vanta.com, 1 -vantagepointpreneed.com, 1 vantru.is, 1 vanuithartenziel.nl, 1 vanvanlines.com, 1 @@ -153638,6 +153697,7 @@ vanwijngaardentegelzetters.nl, 1 vanwoensei.xyz, 1 vanwoensel.directory, 1 +vanwoensel.net, 1 vanwort.de, 1 vanwunnik.com, 1 vanya.click, 1 @@ -153711,6 +153771,7 @@ variohyp.de, 1 variomedia.de, 1 various.at, 1 +varitas.io, 1 variusunum.com, 1 varizh.by, 1 varjo.tk, 1 @@ -153751,6 +153812,7 @@ vashdohod.ml, 1 vashel.us, 1 vasheradio.tk, 1 +vashidverivikna.com.ua, 1 vashmatrass.ru, 1 vashprazdnik.tk, 1 vasilev.wtf, 1 @@ -153778,7 +153840,6 @@ vatav.eu, 1 vatav.tk, 1 vatazhok.com, 1 -vatc.org, 1 vatcompliance.com, 1 vates.tech, 1 vatikantour.tk, 1 @@ -153791,6 +153852,7 @@ vaughanchiropractic.com, 1 vaughanrisher.com, 1 vaulavalpola.tk, 1 +vaulk.com, 1 vault-am.lu, 1 vault-tec.info, 1 vault.investments, 1 @@ -153898,7 +153960,6 @@ vdolg8000rub.gq, 1 vdolg8000rub.ml, 1 vdolg8000rub.tk, 1 -vdotdatasharing.org, 1 vdownloader.com, 1 vdprotezai.lt, 1 vdrei.at, 1 @@ -153911,6 +153972,7 @@ ve3oat.ca, 1 veadoscomfome.tk, 1 veast.network, 1 +veaverdock.com, 1 vebbankir-zajm-onlajn.gq, 1 vebdengi.tk, 1 veber.bg, 1 @@ -153947,6 +154009,7 @@ vedom.ru, 1 vedran-zulin.from.hr, 1 veeam.com, 1 +veebiaken.ee, 1 veebill.com, 1 veebiveski.ee, 1 veefna.com, 1 @@ -153956,11 +154019,9 @@ veessen.tk, 1 veetalen.art, 1 veetechnologies.com, 1 -veethi.com, 1 veeva.link, 1 veg-leiden.nl, 0 veg.lv, 0 -vega-is.com, 1 vega-rumia.com.pl, 1 vegaforeducation.com, 1 vegalanguageacademy.ca, 1 @@ -154114,7 +154175,7 @@ vendingsierra.com, 1 vendiot.com, 1 vendis.ai, 1 -vendiscapital.com, 1 +vendiscapital.com, 0 vendisrls.it, 1 venditorepoa.com.br, 1 vendloop.com, 1 @@ -154176,6 +154237,7 @@ veniceoarsman.com, 1 venicerealdeal.com, 1 venlafaxine.gq, 1 +venncare.com.au, 1 venndor.eu, 1 venndordiagram.com, 1 venndordiagram.eu, 1 @@ -154226,7 +154288,6 @@ venturum.de, 1 venturum.eu, 1 venturum.net, 1 -ventuseo.com, 1 ventusnavigation.com, 1 venuescanner.com, 1 venuescanner.net, 1 @@ -154240,6 +154301,7 @@ vepein.ga, 1 vepein.gq, 1 veply.com, 1 +ver-me.com, 1 ver.ma, 0 vera-1.ru, 1 verae.tk, 1 @@ -154258,6 +154320,8 @@ verascityscience.com, 1 verasoie.fr, 1 verata.co, 0 +veratlas.com, 1 +veraxiss.me, 1 verbacxss.it, 1 verbatimreporting.com, 1 verberne.nu, 1 @@ -154280,6 +154344,7 @@ vercel.org, 1 vercel.sh, 1 vercountyil.gov, 1 +verdant.works, 1 verdantnature.com, 1 verdensflag.dk, 1 verdeplus.net, 1 @@ -154289,6 +154354,7 @@ verdonkadvocaten.nl, 1 verduccies.com, 0 verdugosxerecistas.tk, 1 +verdurelle.bg, 1 veredadelaestrella.tk, 1 verein-kiekin.de, 1 vereinscheck.de, 1 @@ -154297,6 +154363,7 @@ verena.gallery, 1 vereshagino.tk, 1 verfassungsklage.at, 1 +vergaderenalmerehaven.nl, 1 verge-solutions.com, 1 vergelijksimonly.nl, 1 vergesense.com, 1 @@ -154329,7 +154396,6 @@ verifiny.com, 1 verifize.co.za, 1 verify-365.com, 0 -verify.gov.sg, 1 verifymyeligibility.com, 1 verifyos.com, 1 verifyyourip.com, 1 @@ -154345,6 +154411,7 @@ veritafineviolins.com, 1 veritas-data.de, 1 veritashomeschoolers.org, 1 +veritaslab.co, 1 veriteliberte.fr, 1 veriteslibertes.com, 1 veriteslibertes.fr, 1 @@ -154412,7 +154479,6 @@ vernonspeedskatingclub.com, 1 vernonvt.gov, 1 veronasera.it, 1 -veronaswellness.com, 1 veroncloud.com, 1 veronic.hu, 1 veronicasuperguide.nl, 1 @@ -154472,6 +154538,7 @@ vertexsmb.com, 1 vertexventures.co.il, 0 vertexventures.sg, 0 +vertexvps.com, 1 vertica.com, 1 verticalmindventures.com, 1 verticals.tk, 1 @@ -154531,7 +154598,6 @@ veselyjpovar.gq, 1 vesen.tk, 1 vesgroupinvest.com, 1 -vesinhcongnghiepttchome.com, 1 veski.hr, 0 vesmail.biz, 1 vesmail.email, 1 @@ -154548,7 +154614,7 @@ vestakassa-online.cf, 1 vestal.nl, 1 vestalny.gov, 1 -vestberry.com, 1 +vestberry.com, 0 vestd.com, 0 vestia.com.tr, 1 vestia.nl, 1 @@ -154575,6 +154641,7 @@ vetclick.com, 1 veteranarmy.com, 1 veteranpcs.com, 0 +veteranrealestatesa.com, 1 veterans-railcard.co.uk, 1 veteransadvantage.com, 1 veteranscrisisline.net, 1 @@ -154606,7 +154673,6 @@ vetrehabsummit.com, 1 vetren.tk, 1 vetreria.roma.it, 1 -vetres.net.au, 1 vetrnikyjavornickyhreben.cz, 1 vetrnikyrychleby.cz, 1 vets.gov, 1 @@ -154647,12 +154713,14 @@ vfree.org, 0 vfsglobal.com, 1 vfu.cz, 1 +vfxstudy.com, 1 vg-resource.com, 1 vg43.pt, 1 vgatest.nl, 1 vgbf.tk, 1 vgcheat.com, 1 vgdocs.com, 1 +vgep.nl, 1 vgerak.com, 1 vgfacts.com, 1 vgis.io, 1 @@ -154680,7 +154748,6 @@ via15.nl, 1 viabill.com, 1 viacdn.org, 1 -viacon.io, 1 viacu.org, 1 viaelegancestore.com.br, 1 viaenginfeed.com, 1 @@ -154745,7 +154812,7 @@ vician.cz, 1 vicicode.com, 1 vicinityindustrial.com.au, 1 -vicioanimal.pt, 1 +vicioanimal.pt, 0 viciousflora.com, 1 viciousracing.tk, 1 vicjuwelen-annelore.be, 1 @@ -154796,6 +154863,7 @@ victoriait.com.au, 1 victoriamn.gov, 1 victorianosaez.tk, 1 +victoriapolicefitnesstest.com.au, 1 victoriareporting.com, 1 victoriareporting.net, 1 victoriastudio.ru, 1 @@ -154823,7 +154891,7 @@ vicyu.com, 1 vidacalendaria.pt, 1 vidaliala.gov, 1 -vidanuevaparaelmundo.org, 1 +vidanuevaparaelmundo.org, 0 vidaparalela.tk, 1 vidapositiva.tk, 1 vidarity.com, 1 @@ -154833,7 +154901,7 @@ vidawichi.tk, 1 vidaxp.com, 1 vidb.me, 1 -vidboost.net, 1 +vidboost.net, 0 vidbuchanan.co.uk, 1 vidcruiter.com, 0 vide-dressing.org, 0 @@ -154913,6 +154981,8 @@ vidos.id, 1 vidracariaembh.com, 1 vidracariaespelhosbh.com.br, 1 +vidrasec.com, 1 +vids.cz, 1 vidulo.com, 1 vidyalayalms.com, 1 vidyamonk.com, 1 @@ -154962,7 +155032,6 @@ vientosur.info, 1 vieon.vn, 1 vierarkitekter.no, 1 -vieraskuu.org, 1 vierdaagsehotel.nl, 1 vieref.eu, 1 vierna.ga, 1 @@ -155008,11 +155077,13 @@ views4you.com, 1 viewstub.com, 1 viez.vn, 1 +vifluent.com, 1 vifranco.cl, 1 vifsoft.com, 1 viggio.com.br, 0 vigiaviesaitaly.com, 1 vigil.com, 0 +vigilaclick.com, 1 vigilance.ca, 1 vigilanciaysalud.com, 1 vigilantesporcolombia.org, 1 @@ -155043,7 +155114,7 @@ viikko.ml, 1 viilari.fi, 1 viilup.com, 1 -viio.me, 0 +viio.me, 1 viitanen.xyz, 1 vijay-international.com, 1 vijayam.ml, 1 @@ -155243,7 +155314,6 @@ ville-vif.fr, 1 villegasphoto.com, 1 villehardouin.fr, 1 -villejobbtp.com, 1 villek.fi, 1 villekaaria.eu, 1 villekautto.com, 1 @@ -155254,10 +155324,10 @@ villesalonen.fi, 1 villian.tk, 1 villitalia.nl, 1 -villnoesser-tal.com, 1 villu.ga, 1 villu.stream, 1 villup.com, 1 +vilna.io, 1 vilondo.com, 1 vilostore.my.id, 1 viltsu.net, 1 @@ -155383,8 +155453,8 @@ vinylplus.eu, 1 vinzer.tk, 1 vinzhelmets.com, 1 -vinzite.com, 1 vinzlocks.com, 1 +vinzrzo.fr, 1 viointel.com, 1 violapiekut.com, 1 violarenate.com, 1 @@ -155412,6 +155482,7 @@ vip6132.com, 1 vipaairportsp3.gov, 1 vipbox.city, 1 +vipc.cn, 1 vipcan.com, 1 vipenvia.com.br, 1 viper-drones.com, 1 @@ -155600,7 +155671,6 @@ visatitans.co.uk, 1 visatitans.com, 1 visaxplorer.com, 1 -visaya.com.co, 1 visceralsound.ca, 1 viscondedemaua.com.br, 1 visdetech.com, 1 @@ -155624,7 +155694,6 @@ visio.org, 0 vision-du-net.com, 1 vision-painting.com, 0 -vision-ridge.com, 1 vision-sonnenschein.de, 1 vision2005.tk, 1 visionagrupo.com, 1 @@ -155657,7 +155726,6 @@ visionxcreative.gq, 1 visionzerocfl.gov, 1 visionzeroreporting.com, 1 -visiquate.com, 1 visit-chiyoda.tokyo, 1 visit-ro.com, 1 visit-sanbenedettodeltronto.it, 1 @@ -155677,6 +155745,7 @@ visitcolumbusga.com, 1 visitconwaysc.gov, 1 visitcrete.com, 1 +visitdenbosch.nl, 1 visitdubai.com, 1 visiteasternoregon.com, 1 visiter-tunis.tk, 1 @@ -155758,6 +155827,7 @@ vitakov.tk, 1 vital-bg.com, 1 vital-heart.com, 1 +vital-strat.com, 1 vital.no, 1 vitalamin.at, 1 vitalamin.ch, 1 @@ -155840,7 +155910,6 @@ vittoria.pro, 1 vittoria.run, 1 vittoriaconseil.com, 1 -vittoriorestaurant.cz, 1 vitucho.tk, 1 vitus-meppen.de, 1 viv.fi, 1 @@ -156075,7 +156144,7 @@ vloenhout.nl, 1 vloggerfaire.com, 1 vloggerspace.tk, 1 -vlogmusic.io, 1 +vlogmusic.io, 0 vlos.com.pl, 1 vlovgr.se, 1 vltx.gr, 1 @@ -156153,11 +156222,13 @@ vns6969.com, 0 vnsc.org, 0 vntyper.org, 1 +vnumngr.com, 1 vnxf.vn, 1 vnya.loan, 1 voanaboa.pt, 1 voapt.by, 1 voatz.com, 1 +voboxcore.com, 1 vocably.de, 1 vocalcoach.com, 1 vocaloid.my, 1 @@ -156271,7 +156342,6 @@ vojk.au, 1 vojtat.cz, 1 vokabl.io, 1 -vokabula.com, 1 vokieciupamokos.lt, 1 vokimberlywi.gov, 1 vokov.ml, 1 @@ -156346,6 +156416,7 @@ vollmondstollen.de, 1 volnamista.cz, 1 volnamobile.ru, 1 +volo.global, 1 volochaevskiy.tk, 1 volochisk.tk, 1 voloder.net, 1 @@ -156359,14 +156430,14 @@ volreinsistemas.com, 1 volshebniki.ua, 1 volstatebank.com, 1 +volt-e.de, 1 volt.link, 1 volt.social, 1 volt.team, 1 -volta.io, 1 voltacircuit.com, 1 voltageelectricity.tk, 1 voltagevb.com, 1 -voltainsite.com, 1 +voltainsite.com, 0 voltalbania.org, 1 voltarengelprice.tk, 1 voltarengeneric.tk, 1 @@ -156395,6 +156466,7 @@ voltkosova.org, 1 voltkosovo.org, 1 voltletzebuerg.org, 1 +voltlinjeforening.no, 1 voltluxembourg.org, 1 voltluxemburg.org, 1 voltmagyarorszag.org, 1 @@ -156430,7 +156502,6 @@ volusiaelections.gov, 1 volusiasheriff.gov, 1 volusiavotes.gov, 1 -volveraslapelicula.com, 1 volvo-klub.cz, 1 volvo1800es.tk, 1 volvoklub.cz, 1 @@ -156496,7 +156567,6 @@ vortari.tk, 1 vorte.ga, 1 vortexbaits.com, 1 -vortexevents.net, 1 vortexflight.com, 1 vortexhosting.ga, 1 vortexplumbinginc.com, 1 @@ -156590,7 +156660,6 @@ votrespace.ca, 1 votrevoyagedenoces.fr, 1 vouchers4u.com, 1 -voucherx.co.uk, 1 vought-vip.com, 1 vous-etre-utile-ceidf.fr, 1 vous-les-jeunnes.tk, 1 @@ -156650,6 +156719,7 @@ vparilke.su, 1 vpbuilds.com, 1 vpcfiberglass.com, 1 +vpd-calculator.com, 1 vpetkov.tk, 1 vpex.de, 1 vpn-review.com, 1 @@ -156687,7 +156757,6 @@ vpsji.com, 1 vpsmore.com, 1 vpsou.com, 1 -vpspenergy.com, 1 vpsport.ch, 1 vpsssl.com, 1 vpstrial.net, 1 @@ -156880,7 +156949,6 @@ vroomvroomvroom.co.nz, 1 vros.co.id, 1 vrostove.tk, 1 -vrpornsites.xxx, 1 vrre.ag, 1 vrre.at, 1 vrre.biz, 1 @@ -156951,6 +157019,7 @@ vsee.com, 1 vsekulinar.ru, 0 vsem-reiki.tk, 1 +vsempodarok.com, 1 vsemrabota.ml, 1 vsenovosti.cf, 1 vseostile.ml, 1 @@ -156992,6 +157061,7 @@ vtbclub.xyz, 1 vtbs.moe, 1 vtcourts.gov, 1 +vtcynic.com, 1 vtech.com, 1 vtechda.com, 1 vtechhealthcare.com, 1 @@ -157018,10 +157088,8 @@ vtvnetwork.org, 1 vtwonen.be, 1 vtwonen.nl, 1 -vuasach.net, 1 vubgenerali.sk, 1 vue-sur-mer.com, 1 -vuefactory.io, 1 vuelacaruru.com, 1 vueworks.com, 1 vugt.me, 1 @@ -157048,7 +157116,6 @@ vulndetect.org, 1 vulnerability.ch, 1 vulnerabilityscans.nl, 1 -vulnerable.af, 1 vulns.sexy, 1 vulns.xyz, 1 vulnscan.org, 1 @@ -157057,7 +157124,6 @@ vultrhxl.com, 1 vulva.observer, 1 vulva.photos, 1 -vumea.top, 1 vumerity.com, 0 vunn.com, 1 vuojolahti.fi, 0 @@ -157086,7 +157152,6 @@ vvd.bz, 1 vvd.nl, 1 vvdbronckhorst.nl, 1 -vveactiefbeheer.nl, 0 vvelzen.com, 1 vvg-vermietung.de, 1 vvlemmer.tk, 1 @@ -157181,6 +157246,7 @@ w-graj.net, 1 w-hub.ru, 1 w-o-o.nl, 1 +w-oasis.co.jp, 1 w-p-k.de, 1 w-permission.com, 1 w-spotlight.appspot.com, 1 @@ -157208,6 +157274,7 @@ w36594.com, 1 w398.com, 1 w3app.nl, 1 +w3consult.org, 1 w3ctag.com, 1 w3ctag.org, 1 w3docs.com, 1 @@ -157229,7 +157296,6 @@ w4eg.de, 1 w4g-security.com, 1 w4nvu.org, 1 -w4r.nl, 1 w4solutions.de, 1 w4tec.de, 1 w4xzr.xyz, 0 @@ -157295,7 +157361,6 @@ wackyblackie.ml, 1 wackys.com, 1 wacotrib.com, 1 -wacpericias.com.br, 1 wacsports.com, 1 waddenzee.nl, 1 wade.gdn, 0 @@ -157322,7 +157387,6 @@ wageworks.com, 1 wagidopaczek.pl, 1 wagihakowe.pl, 1 -wagipaletowe.pl, 1 wagn3r.de, 1 wagrowieckierekodzielo.pl, 1 wagspuzzle.space, 1 @@ -157502,11 +157566,12 @@ waltermartmalls.com, 1 waltermartsupermarket.com, 1 waltermulders.be, 1 +waltio.com, 1 waltontrust.org, 1 waltthirion.com, 1 walutomat.pl, 1 wam-tech.com, 1 -wamdajo.com, 0 +wamdajo.com, 1 wamia.wa.gov.au, 1 wammu.eu, 1 wamobilisations.com.au, 1 @@ -157525,6 +157590,7 @@ wander.al, 0 wander.tk, 1 wanderaura.com, 1 +wandercabins.mx, 1 wanderersfc.tk, 1 wanderfost.com, 1 wanderfullcoven.tk, 1 @@ -157545,7 +157611,6 @@ wangcun.eu.org, 1 wangji.com, 1 wangjiatun.com.tw, 1 -wangjiezhe.com, 1 wangluoyunying.com, 1 wangpedersen.com, 1 wangpromherb.hu, 1 @@ -157603,7 +157668,6 @@ wapplerbrewing.com, 1 wapresri.go.id, 1 wapspaces.tk, 1 -wapsychiatry.com.au, 1 waptransfer.tk, 1 wapuru.co.jp, 1 wapveil.ml, 1 @@ -157621,6 +157685,7 @@ warcraftwikicz.tk, 1 ward.nl, 1 wardeath.tk, 1 +wardek.io, 1 wardemons.tk, 1 warden.navy, 1 wardnd.gov, 1 @@ -157659,6 +157724,7 @@ warhaggis.com, 1 warhistoryonline.com, 0 warid.ga, 1 +warigo.pl, 1 warispak.tk, 1 warking.ml, 1 warlions.info, 0 @@ -157796,6 +157862,7 @@ wastewaterservicesltd.co.uk, 0 wastewise.com, 0 wastrel.ch, 1 +wasunserwartet.de, 1 wasys.com.br, 1 wat.sh, 1 wataclinic.com, 1 @@ -157804,6 +157871,7 @@ wataugaonline.com, 1 wataugatx.gov, 1 watboeithet.nl, 1 +watbug.com, 1 watch-host.ga, 1 watch-wiki.org, 1 watchamovie.ga, 1 @@ -157814,6 +157882,7 @@ watchcow.org, 0 watchdis.tv, 1 watchdogs.tk, 1 +watchdogsmodding.com, 1 watchdreamer.com, 1 watchersrealm.tk, 1 watches-of-switzerland.co.uk, 1 @@ -157838,7 +157907,7 @@ watchfinder.hk, 1 watchfinder.hr, 1 watchfinder.hu, 1 -watchfinder.ie, 1 +watchfinder.ie, 0 watchfinder.is, 1 watchfinder.it, 1 watchfinder.lt, 1 @@ -157910,10 +157979,8 @@ waterlens.moe, 1 waterliteracy.tk, 1 waterloo-abba-show.de, 1 -waterloo1815.be, 1 waterloofaucets.com, 1 waterlootwpmi.gov, 1 -watermanaspen.co.uk, 1 watermarkktp.com, 1 watermarkly.com, 0 watermonitor.gov, 1 @@ -157952,6 +158019,7 @@ watisleukemie.tk, 1 watmar.com.au, 1 watnongpangtru.com, 1 +watobi.jp, 1 watongaok.gov, 1 watoo.tech, 1 watrd.com, 1 @@ -158087,7 +158155,6 @@ wc64.org, 1 wca.link, 1 wcaganalytics.com, 1 -wcally.com, 1 wcaquatics.org, 1 wcarc.ca, 0 wcatherinekendall.co.uk, 1 @@ -158116,6 +158183,7 @@ wcvb.com, 1 wcwcd.gov, 1 wcwcg.net, 1 +wcx.cx, 1 wd-api.com, 0 wd-ljt.com, 1 wd.is, 1 @@ -158134,6 +158202,7 @@ wdmg.com.ua, 1 wdmleds.com, 1 wdmn.eu, 1 +wdmodding.com, 1 wdmpa.org, 1 wdnmd.org, 1 wdntcr.com, 1 @@ -158142,7 +158211,6 @@ wdophoto.com, 1 wdpapi.io, 1 wdpui.io, 1 -wdrl.info, 0 wdsdownload.cf, 1 wdstrings.com, 1 wdt.cz, 0 @@ -158163,6 +158231,7 @@ wealthprofessional.ca, 1 wealthprojector.com, 1 wealthprojector.com.au, 1 +wealthsolutions.com, 1 wealthx.com, 1 wear-largesizes.tk, 1 wear-referrals.co.uk, 1 @@ -158183,18 +158252,17 @@ weareher.com, 1 weareincognito.org, 1 wearejh.com, 1 -wearemarketing.com, 1 wearemojo.com, 1 wearemoso.nl, 1 wearemullet.com, 1 wearenh.gov, 1 wearepapermill.co, 1 wearepapermill.com, 1 -wearepoo.com, 1 wearereasonablepeople.com, 0 wearereasonablepeople.nl, 0 wearesilverbullet.com, 1 wearesolomon.com, 1 +wearesolutions.com, 1 wearesuma.com, 1 wearetravellers.nl, 1 wearetuzag.com, 1 @@ -158213,7 +158281,7 @@ weatherbell.com, 1 weatherbell.net, 1 weatherfordfumc.com, 1 -weatherguard.com, 1 +weatherguard.com, 0 weathermelon.io, 1 weathernet.co.uk, 1 weatherproduct.ga, 1 @@ -158283,10 +158351,12 @@ web-wack.at, 1 web-warrior.de, 1 web-worker.cn, 1 +web-ya3.com, 1 web.ca, 1 web.de, 1 web.net, 1 web1212.top, 1 +web1n.com, 1 web22.eu, 1 web2ldap.de, 1 web2screen.tv, 1 @@ -158304,6 +158374,7 @@ webadiccion.net, 1 webadicta.net, 1 webadicto.net, 1 +webadish.co.uk, 0 webadmit.org, 1 webagenturschmid.ch, 1 webaholic.co.in, 1 @@ -158400,7 +158471,7 @@ webdesign-note.jp, 1 webdesignagency.cf, 1 webdesigncompanyindia.com, 1 -webdesignelftal.eu, 1 +webdesignelftal.eu, 0 webdesignersinchennai.tk, 1 webdesignfenua.tk, 1 webdesignplay.com, 1 @@ -158457,7 +158528,6 @@ webfoersterei.de, 1 webforce.pt, 1 webforthemasses.tk, 1 -webfrenz.com, 1 webfun.tk, 1 webgadgets.tk, 1 webgaku.net, 1 @@ -158580,7 +158650,6 @@ webnestify.cloud, 1 webnetmail4u.com, 1 webnexty.com, 1 -webnoob.net, 1 webo.agency, 1 webo.pl, 1 weboflies.tk, 1 @@ -158881,7 +158950,7 @@ weho.gov, 1 wehrmacht.org, 1 wei-mao.com.ua, 1 -wei.com, 0 +wei.com, 1 weibbb.com, 1 weibel.me, 1 weibomiaopai.com, 1 @@ -158934,6 +159003,7 @@ weisskircher.tk, 1 weissman.agency, 1 weisstech.com, 1 +weit-weg.de, 1 weiter.so, 1 weiterbildung-vdz.de, 1 weiterbildungsmonitor.eu, 1 @@ -158947,6 +159017,7 @@ wekibe.de, 1 wekipedia.com, 1 weknowhowtodoit.com, 1 +wekompare.fr, 1 welby.cat, 1 welcare.co.kr, 1 welcaremall.com, 0 @@ -158958,6 +159029,7 @@ welcomepowayan.tk, 1 welcometoohio.gov, 1 welcoop-logistique.com, 1 +welcorp.com, 1 weld.gov, 1 weldersnet.tk, 1 weldynz.co.nz, 1 @@ -158971,7 +159043,6 @@ wellbutrinxlgeneric.cf, 1 wellcarehealthsurvey.com, 1 wellcomemdhealth.com, 1 -welldeals.store, 1 welldoc.com, 0 welldocinc.com, 1 welldressedwalrus.com, 0 @@ -158999,6 +159070,7 @@ wellnesstravelhub.com, 1 wellnesszone.com, 1 welloffpodcast.ca, 1 +wellola.com, 1 wellpaid.hu, 1 wellreceived.com, 1 wellsbourne.co.uk, 1 @@ -159041,7 +159113,6 @@ welty.me, 1 wemadegod.tk, 1 wemake.cx, 1 -wemakeadifference.com.au, 1 wemakebookkeepingeasy.com, 1 wemakemx.mx, 1 wemakeonlinereviews.com, 1 @@ -159099,6 +159170,7 @@ werbewelt-tv.de, 1 werbezentrum-stiebler.de, 1 werbik.at, 1 +werbungmacher.de, 1 werehub.org, 1 wereldkoffie.eu, 1 wereldplanner.nl, 0 @@ -159124,7 +159196,6 @@ werkenbijmagentazorg.nl, 1 werkenbijpelsrijcken.nl, 1 werkenbijpromovendum.nl, 1 -werkenbijrexel.nl, 1 werkenbijsanitairwinkel.be, 1 werkenbijsanitairwinkel.nl, 1 werkenbijvanderventions.com, 1 @@ -159162,15 +159233,14 @@ weshopy.com, 1 wesl.cc, 1 wesleyanbank.co.uk, 1 -wesleymc.org, 1 wesleyville.gov, 1 wesleywarnell.com, 1 wesoco.de, 1 wespeakgeek.co.za, 1 wespeakk9.com, 1 -wespringforward.com, 1 wesreportportal.com, 1 wessafety.net, 1 +wesseldijk.eu, 1 wesseling.de, 1 wesselius.tk, 1 wessner.co, 0 @@ -159207,7 +159277,6 @@ westcoastpoly.com.au, 1 westcode.de, 1 westcountrydentalcrafts.uk, 1 -westcountrystalking.com, 1 westcreekna.org, 1 westendwifi.net, 1 westerdraai.tk, 1 @@ -159219,7 +159288,6 @@ westernmedia.ie, 1 westernpadermatologist.com, 1 westernparts.com, 0 -westernresourceadvocates.org, 1 westernriversidecog.gov, 1 westernskydental.com, 0 westernwaterca.gov, 1 @@ -159238,9 +159306,6 @@ westlake.com, 1 westlakehills.gov, 1 westlaketx.gov, 1 -westlakevillageelectric.com, 1 -westlakevillageelectrical.com, 1 -westlakevillageelectrician.com, 1 westland.eu, 1 westlandcultuur.tk, 1 westlander-nostalgie.tk, 1 @@ -159279,11 +159344,9 @@ westporthoney.com, 1 westportisland.gov, 1 westportok.gov, 1 -westreet-store.com, 1 westsalemwi.gov, 1 westsidechildrenstherapy.com, 1 westsidepackaging.com.au, 1 -westsidewinemsp.com, 1 westskinlaser.com, 1 westsoundwildlife.org, 1 westspace.org.uk, 1 @@ -159308,7 +159371,6 @@ weteam24.ru, 1 wetheghosts.eu, 1 wetheglobalpeople.com, 1 -wethemovement.org, 1 wetherbyvets.co.uk, 1 wetherspoonapprenticeshipacademy.co.uk, 1 wetnwild.com.au, 1 @@ -159321,7 +159383,7 @@ wettbuero.de, 1 wetter.de, 1 wetthost.com, 1 -wetu.com, 1 +wetu.com, 0 wetumpkaal.gov, 1 wevah.com, 0 wevape.online, 1 @@ -159338,6 +159400,7 @@ wexilapp.com, 1 wexller.com, 1 weyerstall1880.de, 1 +weygers.be, 1 wf-bigsky-master.appspot.com, 1 wf-demo-eu.appspot.com, 1 wf-demo-hrd.appspot.com, 1 @@ -159360,8 +159423,8 @@ wfrlee.com, 1 wfuogb.com, 1 wfxs.com.tw, 1 +wfy24.com, 1 wg-smue.de, 1 -wg-store.my.id, 1 wg-tools.de, 1 wg2023.com.br, 1 wgal.com, 1 @@ -159393,7 +159456,7 @@ wh-guide.de, 1 wh.gov, 1 wh966.com, 0 -whadda.uk, 0 +whadda.uk, 1 whakamatutu.org.nz, 1 whale-tales.org, 1 whalecrew.com, 1 @@ -159505,6 +159568,7 @@ wheredoi.click, 1 wheregoes.com, 1 whereicode.org, 0 +whereismyfair.com, 1 whereismyorigin.cf, 1 whereisthekeep.com, 1 whereiszakir.com, 1 @@ -159522,6 +159586,7 @@ whichgender.today, 1 whichphish.com, 1 whichwasfirst.com, 1 +whieda-plovdiv.com, 1 whiff-of-grape.ca, 0 whigfieldspain.tk, 1 whil.com, 1 @@ -159558,7 +159623,6 @@ whistleblower.report, 1 whistleblowerordning.com, 1 whistleblowers.gov, 1 -whistleblowers.org, 1 whistleblowersoftware.com, 1 whistlerbillboards.com, 1 whistlingdog.media, 0 @@ -159582,6 +159646,7 @@ whitebirdclinic.org, 1 whitebox.ga, 1 whitechristmas.com.au, 1 +whitecloudconcierge.com, 1 whitecollar.net, 1 whitecollarfraud.com, 1 whitecreekny.gov, 1 @@ -159688,7 +159753,6 @@ whoisamitsingh.com, 1 whoiscuter.ml, 1 whoiscutest.ml, 1 -whoisonthebench.com, 1 whoistheorchid.com, 1 whoiswho.tk, 1 wholebody.je, 1 @@ -159712,7 +159776,6 @@ whoopee.my, 0 whooshkaa.com, 1 whoownswhom.co.za, 1 -whop.com, 1 whoplusyou.com, 1 whoreofwallstreet.tk, 1 whorepresentsme.us, 1 @@ -159729,7 +159792,6 @@ wht.one, 1 whta.eu, 1 whta.se, 1 -whtcsj.com, 0 whwcornwall.co.uk, 1 why-brexit.uk, 1 why918.com, 0 @@ -159797,7 +159859,6 @@ widmer.bz, 1 widner.xyz, 1 widoj.gov, 1 -widow411.com, 1 widowsquad.com, 1 widsl.de, 1 widum.ru, 1 @@ -159822,6 +159883,7 @@ wienergyjobs.com, 1 wieobensounten.de, 1 wiesbadener-kurier.de, 1 +wieson.com, 1 wiet2home.nl, 1 wifesbank.com, 1 wifi-hack.com, 0 @@ -160059,7 +160121,6 @@ wildaboutarizona.com, 1 wildanalysis.ga, 1 wildbergh.tk, 1 -wildberries.lol, 1 wildbirdsuets.com, 1 wildbluepress.com, 1 wildcatdiesel.com.au, 1 @@ -160073,7 +160134,6 @@ wildern.org, 1 wildernessdestinations.com, 1 wildernpartnership.co.uk, 1 -wildeshausen272.de, 1 wildfilm.tv, 1 wildfire.gov, 1 wildfirechain.xyz, 1 @@ -160159,6 +160219,7 @@ williamle.com, 1 williammcgill.com, 1 williamparedes.tk, 1 +williamsburgservices.com.au, 1 williamscomposer.com, 1 williamscountyoh.gov, 1 williamsflintlocks.com, 0 @@ -160171,7 +160232,7 @@ willianchopin.tk, 1 willich.tk, 1 williejackson.com, 1 -willingness.ru, 1 +willingness.ru, 0 willistonpdvt.gov, 1 willit.fi, 1 willjackson.com, 1 @@ -160203,7 +160264,6 @@ willtc.uk, 1 willturner.tk, 1 willvision.com, 0 -willwilkins.com, 1 willwoodworth.com, 1 willywangstory.com.tw, 1 willywangstory.org, 1 @@ -160228,7 +160288,6 @@ wiltonsandstonequarry.com.au, 1 wiltrovira.com, 1 wiltshirehealthyschools.org, 1 -wimasons.foundation, 1 wimbledon.com, 1 wimbledon.org, 1 wimlanphen.nl, 1 @@ -160255,6 +160314,7 @@ win8.am, 1 win88-line.com, 1 win88-line.net, 1 +winabrandnew.com, 1 winampnederlands.tk, 1 winancreekbarn.com, 1 winario.de, 1 @@ -160329,6 +160389,7 @@ wine.com.my, 1 wine.my, 1 winebrasil.com.br, 1 +wineconnect.ai, 1 winedineunwind.org, 1 wineexperience.com.au, 1 wineforhelp.cz, 1 @@ -160391,6 +160452,7 @@ winnebagocountywi.gov, 1 winneconnesd3wi.gov, 1 winner.ua, 1 +winnerodds.com, 1 winnersaffiliate.com, 1 winnery.tk, 1 winnicadzika.pl, 1 @@ -160494,7 +160556,7 @@ wiris.be, 1 wirkaufen.it, 1 wirkaufendeinau.to, 1 -wirken.info, 1 +wirken.info, 0 wirksportal.com, 1 wirkstatt-lq.at, 1 wirkstatt-lq.ch, 1 @@ -160532,7 +160594,6 @@ wisdomise.io, 1 wisdomize.me, 1 wisdomteethonly.com, 1 -wisdomteethsydney.com.au, 1 wisdotplans.gov, 1 wise-parenting.com, 0 wise.design, 1 @@ -160550,6 +160611,7 @@ wisers.com.tw, 1 wisersp.com, 1 wisertp.com, 1 +wiseshifts.eu, 1 wisestatus.info, 1 wisetechglobal.cn, 1 wisetechglobal.com, 1 @@ -160558,6 +160620,7 @@ wiseupcorp.com, 1 wiseuplive.com.br, 1 wisewaynutrition.com, 1 +wish2025.com, 1 wishedu.com, 1 wishing3.com, 1 wishingyou.co.uk, 1 @@ -160605,6 +160668,7 @@ witez.net, 1 witgoedexpert.com, 1 with-environment.com, 1 +withacta.com, 1 withamscouts.org.uk, 1 withdati.fr, 1 withdcc.com, 1 @@ -160728,7 +160792,6 @@ wmar2news.com, 1 wmasphaltservices.com, 1 wmataoig.gov, 1 -wmbviaggi.it, 1 wmcuk.net, 1 wmcurrency.exchange, 1 wmcurrency.online, 1 @@ -160813,7 +160876,9 @@ wohlpa.de, 0 wohnbau-mobilitaet.ch, 1 wohnberatung-wien.at, 1 +wohnfrisch.de, 1 wohnsitz-ausland.com, 1 +wohnung-dus.de, 1 wohnungsaufloesung-berlin.net, 1 wohnungsbaukredit.ag, 1 wohnungsbaukredit.biz, 1 @@ -160843,6 +160908,7 @@ wolfachtal-alpaka.de, 1 wolfandleaf.com, 1 wolfarth.info, 1 +wolfbard.art, 1 wolfen-nord.social, 1 wolfermann.org, 1 wolfermans.com, 1 @@ -160982,6 +161048,8 @@ woodcock.cloud, 1 woodcountywi.gov, 1 woodcraftcompany.ru, 1 +woodenonesiesr.us, 1 +woodenonesiesrus.com, 1 woodenson.com, 1 woodev.us, 1 woodfarm2020.com, 1 @@ -161022,7 +161090,6 @@ woodward-vets.co.uk, 1 woodwicker.cl, 1 woodwing.cloud, 1 -woodwo.se, 1 woodworkcare.com, 1 woodworkingforabeginner.com, 1 woodwormtreatment.com, 1 @@ -161031,6 +161098,7 @@ woodysinstalaciones.com, 1 wooeffi.at, 1 woof.blue, 1 +woof.gq, 1 woofngoof.com, 1 woofsbakery.com, 1 woohoo.in, 1 @@ -161147,12 +161215,13 @@ workfromhomesites.ml, 1 workfromhometexas.tk, 1 workhandyman.com, 1 +workhorsemkt.com, 1 workin.space, 1 workindia.ml, 1 workinestonia.com, 0 working-group-cloudsecurityalliance.org, 1 workingclassmedia.com, 1 -workingfamilies.org.uk, 0 +workingfamilies.org.uk, 1 workinghardinit.work, 1 workingmachine.info, 1 workingpapers.biz, 1 @@ -161175,7 +161244,6 @@ workonit.cf, 1 workoutdigital.com, 1 workpass.co.uk, 1 -workperfect.com.au, 1 workplace.com, 1 workplace.tools, 1 workreap.tk, 1 @@ -161218,7 +161286,6 @@ world-politics.tk, 1 world-selena.tk, 1 world-tanks.tk, 1 -world-web.pro, 1 worldarmy.tk, 1 worldatwork.org, 1 worldbelow.tk, 1 @@ -161285,7 +161352,7 @@ worldjobs.tk, 1 worldjusticeproject.org, 1 worldlanguage.tk, 1 -worldline.com, 0 +worldline.com, 1 worldluxuryhome.tk, 1 worldmarathons.tk, 1 worldnewsinbox.ga, 1 @@ -161450,6 +161517,7 @@ wp-stack.pro, 1 wp-tao.com, 1 wp-webagentur.de, 1 +wp2date.com, 1 wpac.de, 1 wpadelaide.org, 1 wpauctions.com, 1 @@ -161474,7 +161542,6 @@ wpekspres.com, 1 wpetri.nl, 1 wpexplainer.com, 1 -wpfactory.io, 1 wpformation.com, 1 wpforum.tk, 1 wpg-verwaltungen.de, 1 @@ -161493,13 +161560,10 @@ wplicious.com, 1 wplistings.pro, 1 wpmafias.com, 1 -wpmaintenance.site, 1 wpmatik.com, 1 wpmeer.com, 1 wpmet.com, 1 -wpml.org, 1 wpmu-tutorials.de, 1 -wpna.fm, 1 wpnesia.id, 1 wpnews.cf, 1 wpnews.ga, 1 @@ -161588,6 +161652,7 @@ writeandedit-for-you.com, 1 writeaword.tk, 1 writebrigade.com, 1 +writememos.com, 1 writemyessay.today, 1 writemyessays.com, 1 writemypaperhub.com, 1 @@ -161617,7 +161682,6 @@ writingiswork.ga, 1 writingpapersonlineformoney.ga, 1 writingtoserve.net, 1 -writtenandrecorded.com, 1 writtenhorror.com, 1 writtenworld.bg, 1 wrm.sr, 1 @@ -161636,7 +161700,6 @@ ws3917.space, 1 wsa.poznan.pl, 1 wsadek.ovh, 1 -wsave.be, 1 wsb.pl, 1 wsc.rip, 1 wscauth.de, 1 @@ -161680,7 +161743,6 @@ wtfast.com, 1 wtfbryan.com, 0 wtfindonesia.tk, 1 -wtfit.io, 1 wtfnope.org, 1 wth-security.nl, 1 wth.in, 1 @@ -161804,7 +161866,6 @@ wwtg.gov, 1 wwv-8522.com, 1 wwv-8722.com, 1 -wwvip88.com, 1 www-2998hh.com, 1 www-33445.com, 1 www-38978.com, 1 @@ -161910,6 +161971,7 @@ www.tl, 1 www.torproject.org, 0 www.tumblr.com, 0 +www.twitter.com, 1 www.united.com, 1 www.usaa.com, 0 www.vino.com, 0 @@ -161980,6 +162042,7 @@ wyomingvalleyjuniorspartans.org, 1 wypiska.pl, 1 wypozyczalniasamochodowkrakow.gq, 1 +wypracowania.pl, 1 wyprawywedkarskiepremium.pl, 1 wyrickstaxidermy.com, 1 wyrihaximus.net, 1 @@ -162046,6 +162109,7 @@ x3650.de, 1 x36533.com, 1 x378.ch, 1 +x3flow.net, 1 x44.at, 0 x500658.com, 1 x5197.co, 1 @@ -162061,6 +162125,7 @@ x7719.com, 0 x77jj.com, 1 x77nn.com, 1 +x7blog.com, 1 x81vv.com, 1 x86.pet, 1 x90.im, 1 @@ -162078,6 +162143,7 @@ xacobeoexperience.com, 1 xactadent.com, 1 xad.ch, 1 +xadwm.top, 1 xage.com, 1 xaira.com, 0 xajh.org, 1 @@ -162101,6 +162167,7 @@ xareltohcp.com, 1 xarmenta.tk, 1 xatr0z.org, 0 +xauzit.com, 0 xav.ie, 1 xaver.exchange, 1 xavi.re, 1 @@ -162182,7 +162249,6 @@ xbjt77.com, 1 xblau.com, 1 xbox, 1 -xbox-mag.net, 1 xboxachievements.com, 1 xboxdynasty.de, 1 xbrlsuccess.appspot.com, 1 @@ -162246,6 +162312,7 @@ xcw8888.net, 0 xcw8889.net, 0 xcxmiku.com, 0 +xcysy.top, 1 xd.cm, 1 xd.gd.cn, 1 xd.gov, 1 @@ -162265,15 +162332,14 @@ xdty.org, 1 xduce.com, 1 xeditpro.com, 1 -xeerpa.com, 1 xeforce.com, 1 xehopdongmuine.vn, 1 xehost.com, 1 xeiropraktiki.gr, 1 +xelencure.com, 1 xelesante.jp, 1 xelionai.com, 1 xemptsecurity.com, 1 -xenaidigital.xyz, 1 xencrystal.me, 1 xenfo.ro, 1 xenforo.forum, 1 @@ -162312,6 +162378,7 @@ xertainty.com, 1 xertainty.de, 1 xetown.com, 1 +xeve.io, 1 xevietanh.com, 1 xevnet.com, 1 xevolkswagen.com, 1 @@ -162397,7 +162464,7 @@ xice.wang, 1 xicreative.net, 1 xiecongan.org, 1 -xiedeacc.com, 0 +xiedeacc.com, 1 xiexiexi.com, 1 xif.at, 1 xifrem.com, 1 @@ -162408,7 +162475,6 @@ xillimite.com, 1 xilnex.com, 1 xilo.net, 1 -xiluetmiami.com, 1 xiluo-sweet-home.tw, 1 ximes.cloud, 1 ximes.com, 1 @@ -162589,7 +162655,6 @@ xlblinds.nl, 1 xldl.ml, 1 xlem.cn, 1 -xler8r.com, 0 xlhalliance.org, 1 xlnaudio.com, 1 xloud.cf, 1 @@ -162709,6 +162774,8 @@ xn--4brt03c.xn--fiqs8s, 1 xn--4brt03c.xn--io0a7i, 1 xn--4gq45ay49m.com, 1 +xn--4gq45ay49m.xn--fiqs8s, 1 +xn--4gq45ay49m.xn--fiqz9s, 1 xn--4gq62f52gdss.com, 1 xn--4kro7fswi.xn--6qq986b3xl, 1 xn--4qs85t91oq9e.com, 1 @@ -162783,7 +162850,6 @@ xn--80aleen8i.site, 1 xn--80aleen8i.xn--c1avg, 1 xn--80ancacgircb8q.xn--p1ai, 1 -xn--80anogxed.xn--p1ai, 1 xn--80aocgsfei.xn--p1ai, 1 xn--80aod6g.tk, 1 xn--80apaljb0ajh8a3d.xn--p1ai, 1 @@ -162798,7 +162864,6 @@ xn--90adahrqfmec.xn--p1ai, 1 xn--90adu.xn--90a3ac, 1 xn--90agmsorb.tk, 1 -xn--90aij9af3f.com.ua, 1 xn--90aimoos.tk, 1 xn--90aizn.tk, 1 xn--90amdjbi3c0ec.xn--p1ai, 1 @@ -163001,8 +163066,10 @@ xn--jkaappi-5waa.fi, 1 xn--jlq480n2rg, 1 xn--jp8hx8f.ws, 1 +xn--jx2a33n.com, 1 xn--kckd0bd4a8tp27yee2e.com, 1 xn--keditr-0xa.biz, 1 +xn--kferkind-0za.ch, 1 xn--kinsthetik-s5a.ch, 1 xn--kkcon-fwab.nz, 1 xn--kl-oja.is, 1 @@ -163149,7 +163216,7 @@ xn--srenpind-54a.dk, 1 xn--ss-sein-fetzt-wob.de, 1 xn--strandhaus-hinter-der-dne-1wc.de, 1 -xn--stubbfrsning-uppsala-hzb.se, 1 +xn--stubbfrsning-uppsala-hzb.se, 0 xn--super-visionr-mfb.de, 1 xn--svezavaukuu-ulb08i.rs, 1 xn--sz8h.ml, 1 @@ -163172,6 +163239,7 @@ xn--u9j920h4sbt5ex10f.online, 1 xn--u9j933ksxs6hu.com, 1 xn--u9jv84l7ea468b.com, 1 +xn--u9jw87h6tdi4hqls.com, 1 xn--u9jy16ncfao19mo8i.nagoya, 1 xn--uba.eu.org, 1 xn--ug8h.st, 1 @@ -163285,10 +163353,10 @@ xosh.fr, 1 xot.gr, 1 xotaku.com, 1 -xotictrends.com, 1 xotika.tv, 1 xoue.com, 1 xoutpost.com, 1 +xovv.io, 1 xp-ochrona.pl, 1 xp.nsupdate.info, 1 xparts.com.tr, 1 @@ -163384,13 +163452,11 @@ xt.om, 1 xt177.com, 1 xt71uc.top, 1 -xtaboo3d.com, 1 xtarget.ru, 1 xtdowner.com, 1 xtec.eu.org, 1 xtechtecnologia.tec.br, 1 xtendafin.com, 1 -xtexx.eu.org, 1 xtianhe.com, 0 xtime.com, 1 xtips.us, 1 @@ -163512,7 +163578,6 @@ xurl.ltd, 1 xushuai.org, 1 xusqui.com, 1 -xuvero.com, 1 xuwei.de, 1 xuxiao.click, 1 xuyh0120.win, 1 @@ -163583,7 +163648,6 @@ xyactive.com.au, 1 xyenon.bid, 1 xyfindit.com, 1 -xyfun.net, 0 xyl.cool, 1 xylexa.ai, 1 xylimelts.com.au, 1 @@ -163853,7 +163917,6 @@ yanik.info, 1 yanisvaroufakis.eu, 1 yaniv.tv, 1 -yankeeinstitute.org, 1 yann.tw, 1 yannic.world, 0 yannickkordel.de, 1 @@ -163938,7 +164001,6 @@ yash.com, 1 yashima-shika.com, 1 yashinstore.com, 1 -yashu.store, 1 yasic.net, 1 yasikish.com, 1 yasking.org, 1 @@ -163991,6 +164053,7 @@ yay-btcl.work, 1 yay.space, 1 yayart.club, 1 +yayfor.me.uk, 1 yayginegitim.net, 1 yayl888.com, 1 yaymaker.com, 1 @@ -164118,6 +164181,7 @@ yenbainet.tk, 1 yengec.co, 1 yenhughes.law, 1 +yeniasir.com.tr, 1 yennhi.co, 1 yenpape.com, 1 yenphat.vn, 1 @@ -164169,7 +164233,6 @@ yetishirt.com, 0 yetivisite.ch, 1 yetkiliservisrehberi.com, 1 -yevhen.cc, 1 yewan.cf, 1 yewan.ml, 1 yewtu.be, 1 @@ -164327,11 +164390,8 @@ yodaremote.tk, 1 yodelmobile.com, 1 yodocon.com, 1 -yoga-bien-etre.com, 1 yoga-erde.de, 0 -yoga-good.fr, 1 yoga-in-aying.de, 1 -yoga-prive.de, 1 yoga-zentrum-narayani.de, 1 yoga.is-an-engineer.com, 1 yogaangels.ga, 1 @@ -164389,8 +164449,6 @@ yoloyolo.top, 0 yomena.in, 1 yomeuno.com, 1 -yomiren.co.jp, 1 -yomiya.eu.org, 1 yon.co.il, 0 yonalink.com, 0 yoneda-paint.com, 1 @@ -164411,6 +164469,7 @@ yopers.com, 0 yopmail.com, 1 yopmail.net, 1 +yopongolacasaconhomecenter.com, 1 yoppoy.com, 1 yops.info.pl, 1 yoramvandevelde.net, 1 @@ -164422,6 +164481,7 @@ yore.tk, 1 yorganica.ga, 1 yorgosbos.nl, 1 +yorickpeterse.com, 1 yorkcountyne.gov, 1 yorkcountysc.gov, 1 yorkcountyschools.org, 1 @@ -164447,7 +164507,6 @@ yosbeda.com, 1 yosefsa.xyz, 1 yosemo.de, 1 -yosh.is, 1 yosheenetwork.fr, 1 yoshibaworks.com, 1 yoshikawa-koumuten.co.jp, 1 @@ -164466,11 +164525,13 @@ yoto.at, 0 yotpinx.com, 0 yotta-zetta.com, 1 +yottaes.com, 1 yottahash.net, 1 yotubaiotona.net, 1 you-working.ru, 1 you.bo, 0 you15iv.com, 1 +youandmedating.in, 1 youandmepps.com.au, 1 youbehero.com, 1 youber.cz, 1 @@ -164524,7 +164585,6 @@ youkyi.fr, 1 youla.gq, 1 youla.ru, 1 -youlayla.com, 1 youlivewesnap.com, 1 youlovehers.com, 1 youmeandjunee.com.au, 1 @@ -164548,7 +164608,6 @@ younglabour.co.nz, 1 younglabour.nz, 1 younglabour.org.nz, 1 -youngleaderssummit.com.ng, 1 younglions.cf, 1 youngmodelsagency.tk, 1 youngpeopleunited.co.uk, 1 @@ -164590,6 +164649,7 @@ yourbreakfast.tk, 1 yourbristolsomerset.wedding, 1 yourbusiness.ml, 1 +yourbusiness.technology, 1 yourbusinessblueprint.com, 1 yourcareerhost.com, 1 yourcheshiremerseyside.wedding, 1 @@ -164651,6 +164711,7 @@ yourlegacy.team, 1 yourlgpd.com, 1 yourlifespirit.de, 1 +yourlink.me, 1 yourloan.gq, 1 yourlondon.wedding, 1 yourlovesong.com.mx, 1 @@ -164800,6 +164861,7 @@ yspa.tv, 1 yspertal.party, 1 ystral.com, 1 +ystv.co.uk, 1 ysuna.xyz, 1 yt-downloader.xyz, 0 yt.kg, 1 @@ -164824,6 +164886,7 @@ yu.nm.cn, 1 yu.vc, 1 yuan.ga, 1 +yuan.idv.tw, 1 yuan.nctu.me, 1 yuan.ren, 1 yuanandyuan.info, 1 @@ -164890,10 +164953,12 @@ yukonconnector.com, 1 yukonlip.com, 1 yukoslibrary.ga, 1 +yukselgorev.com, 1 yula.cf, 1 yulaiz.com, 1 yulamerola.com.br, 1 yule.hk, 1 +yule.ink, 1 yuleyule88game.com, 1 yuliana-hotel.com, 1 yulsn.io, 1 @@ -164939,6 +165004,7 @@ yuquepay.com, 1 yura.cf, 1 yuricarlenzoli.it, 1 +yurigui.com, 1 yurihi.net, 1 yurikirin.me, 1 yuriland.xyz, 1 @@ -164962,6 +165028,7 @@ yuucchi.com, 1 yuuki0xff.jp, 1 yuumari.com, 1 +yuumpk.ru, 1 yuvagalam.com, 1 yuvaskillfoundation.org, 1 yuweetek.com, 0 @@ -165084,6 +165151,7 @@ z6729.co, 1 z6882.com, 1 z6957.co, 1 +z6services.com.br, 1 z6wang.com, 1 z8011.com, 1 z8012.com, 0 @@ -165162,7 +165230,6 @@ zachaysan.com, 1 zachbolinger.com, 1 zachborboa.com, 1 -zachgibbens.org, 1 zachiti.com, 1 zachranari.tk, 1 zachschneider.ca, 1 @@ -165175,6 +165242,7 @@ zaclys.com, 0 zad-academy.com, 1 zadania.wiki, 1 +zadgroup.com.my, 1 zadm.de, 1 zadrot.tk, 1 zadroweb.com, 1 @@ -165212,7 +165280,6 @@ zahnarzt.se, 1 zahnarztpraxis-cevikel.de, 1 zahnarztpraxis-schaerding.at, 1 -zahnarztpraxis-simone-koch.de, 1 zahnarztpraxis-ural.de, 1 zahrowski.com, 1 zaija.tk, 1 @@ -165401,6 +165468,7 @@ zarja.tk, 1 zarjadnik.tk, 1 zarla.com, 1 +zarlaa.shop, 0 zarlacdn.com, 1 zarladomains.com, 1 zarlasites.com, 1 @@ -165416,9 +165484,11 @@ zaruhi.ml, 1 zary.me, 1 zas4eku.tk, 1 +zasbury.com, 1 zaschtnik.ga, 1 zastenchivost.tk, 1 zasudili.ru, 1 +zataz.com, 1 zaterdagwelpen.tk, 1 zatey.ru, 1 zatp.com, 0 @@ -165562,6 +165632,7 @@ zdxiaoda.me, 1 zdymak.by, 1 ze-mag.info, 1 +ze-seo.fr, 1 ze3kr.com, 1 zeal-and.jp, 1 zeal-interior.com, 1 @@ -165670,9 +165741,12 @@ zen-zone.tk, 1 zenaliva.com, 1 zenassociates.com, 1 +zenbalans.nl, 1 zenbox.pl, 1 zenchain.com, 1 zencube.ga, 1 +zencurity.com, 1 +zencurity.dk, 1 zendarhunters.tk, 1 zendave.au, 1 zendev.ga, 1 @@ -165705,7 +165779,6 @@ zenless.top, 1 zenlogic.com, 1 zenmail.ga, 1 -zenmassageusa.com, 1 zenmod.in.rs, 1 zenneo.com, 1 zenniereport.com, 1 @@ -165787,6 +165860,7 @@ zerolink.es, 1 zeromoment.marketing, 1 zeronet.io, 1 +zeroone.sk, 1 zeroplast24.ru, 1 zeroq.cl, 1 zeroscaler.io, 1 @@ -165798,6 +165872,7 @@ zerotoone.studio, 0 zerotrust.plus, 1 zerotwo.ga, 1 +zerowanlabs.com, 1 zerowastesonoma.gov, 1 zeroz.cf, 1 zeroz.ga, 1 @@ -165828,6 +165903,7 @@ zetsubou.games, 1 zettaplan.ru, 1 zettaport.com, 1 +zettatek.com, 1 zettlmeissl.de, 1 zety.com, 1 zety.es, 1 @@ -165842,6 +165918,7 @@ zevenbergenbos.tk, 1 zevrobroker.com, 1 zewtie.com, 1 +zeydoo.com, 1 zeyoking.com, 1 zezov.com, 1 zf.com, 1 @@ -165887,7 +165964,7 @@ zhangyiming.tech, 1 zhanwei.me, 1 zhanxiangyang.com, 1 -zhanzhangb.cn, 0 +zhanzhangb.cn, 1 zhanzhangb.com, 0 zhaochen.xyz, 1 zhaochengtan.com, 1 @@ -165920,7 +165997,6 @@ zhestokijavtor.tk, 1 zhewang.com, 1 zhi.ci, 1 -zhiboba.fun, 1 zhidkiy-kashtan.ga, 1 zhihua-lai.com, 1 zhijikaoyan.com, 1 @@ -165958,6 +166034,7 @@ zhouzanxi.com, 1 zhovner.com, 1 zhref.ch, 1 +zhrhello.top, 1 zhthings.com, 1 zhuhuo.cc, 1 zhuji.com, 1 @@ -165973,6 +166050,7 @@ zhumadilov.kz, 1 zhunlink.com, 1 zhurnalyu.ga, 1 +zhutipu.com, 1 zhuweiwei.cn, 1 zhyz.nl.eu.org, 1 zhz.moe, 1 @@ -166021,7 +166099,6 @@ zillum.com, 1 zilon.com.co, 1 zilore.com, 1 -zilpay.io, 1 zilsen.com, 1 zilv.life, 1 zilver.nl, 1 @@ -166044,7 +166121,6 @@ zinabnews.tk, 1 zinchenko.gq, 1 zindagilive.tk, 1 -zindec.com, 1 zinewords.com, 1 zing.com.pl, 1 zing.me, 1 @@ -166143,7 +166219,6 @@ zkvi.nl, 1 zkz.kz, 1 zl-19.com, 1 -zl-29.com, 1 zl-59.com, 1 zl-89.com, 1 zl.lv, 1 @@ -166184,10 +166259,8 @@ zlatatlapka.cz, 1 zlatograd.bg, 1 zlatom.ru, 1 -zlatyruce.cz, 1 zlavomat.sk, 1 zlhuodong.vip, 1 -zlima12.com, 1 zlogin.nl, 1 zlotykameleon.tk, 1 zlotyslawecin.tk, 1 @@ -166202,7 +166275,6 @@ zmcyclefitness.com, 1 zmeya.tk, 1 zmgroup.cz, 1 -zmiguel.me, 0 zmizelasumava.cz, 1 zmk.fr, 1 zmprjg.ml, 1 @@ -166344,6 +166416,7 @@ zoko.tk, 1 zokuomthawn.tk, 1 zollernalbtour.de, 1 +zolline.com, 1 zollo-hauswartung.ch, 1 zollprozess.ch, 1 zoloft-medication.ml, 1 @@ -166427,6 +166500,7 @@ zonneglossis.tk, 1 zonnenberg.de, 1 zonnigduiven.nl, 1 +zonopoly.io, 1 zontractors.com, 1 zoo-tver.ru, 1 zooforum.tk, 1 @@ -166565,7 +166639,7 @@ zsnm.pl, 1 zsoltbereczki.tk, 1 zsplesivec.cz, 1 -zsq.im, 1 +zsq.im, 0 zsrbcs.com, 1 zstaticcdn.com, 1 zstgmnachod.cz, 1 @@ -166577,18 +166651,20 @@ ztable.io, 1 ztalk.org, 1 ztctarrin.com, 1 +zten.org, 1 ztickerz.nl, 1 ztmovies.cf, 1 ztn.sh, 1 ztt.im, 1 ztv.su, 1 -zuan-in.com, 1 +zuan-in.com, 0 zuan-in.net, 1 zubel.it, 1 zubenciy.tk, 1 zubilo-perm.ru, 1 zubr.net, 1 zubro.net, 0 +zuby.pro, 1 zuccarellostiftelsen.no, 1 zuccolivillage.com.au, 1 zudomc.me, 1 @@ -166610,6 +166686,8 @@ zuiverjegeest.nl, 1 zuiververloskundigen.nl, 1 zukong.party, 1 +zukunft-immobilienverwaltung.de, 1 +zukunft-immobilienwirtschaft.de, 1 zukunft-mobilitaet.net, 1 zukunft-niederrhein.de, 1 zukunftswege.at, 1 @@ -166688,7 +166766,6 @@ zwitterion.au, 1 zwitterion.org, 1 zwk.de, 1 -zwnews.com, 1 zwofroue.ch, 1 zwolle1.nl, 1 zwollemag.nl, 1 @@ -166764,6 +166841,7 @@ zzops.nl, 1 zzops.org, 1 zzphuis.nl, 1 +zzprisico.nl, 1 zzsec.org, 1 zzw.ca, 1 zzz-diary.com, 1 diff -Nru firefox-esr-140.9.1esr/security/manager/tools/PreloadedHPKPins.json firefox-esr-140.10.0esr/security/manager/tools/PreloadedHPKPins.json --- firefox-esr-140.9.1esr/security/manager/tools/PreloadedHPKPins.json 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/manager/tools/PreloadedHPKPins.json 2026-04-15 01:59:56.000000000 +0000 @@ -26,8 +26,8 @@ { "chromium_data" : { - "cert_file_url": "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/transport_security_state_static.pins?format=TEXT", - "json_file_url": "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/transport_security_state_static_pins.json?format=TEXT", + "cert_file_url": "https://raw.githubusercontent.com/chromium/chromium/refs/heads/main/net/http/transport_security_state_static.pins", + "json_file_url": "https://raw.githubusercontent.com/chromium/chromium/refs/heads/main/net/http/transport_security_state_static_pins.json", "substitute_pinsets": { // Use the larger google_root_pems pinset instead of google "google": "google_root_pems" diff -Nru firefox-esr-140.9.1esr/security/manager/tools/log_list.json firefox-esr-140.10.0esr/security/manager/tools/log_list.json --- firefox-esr-140.9.1esr/security/manager/tools/log_list.json 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/manager/tools/log_list.json 2026-04-15 01:59:56.000000000 +0000 @@ -1,6 +1,6 @@ { - "version": "85.16", - "log_list_timestamp": "2026-03-15T13:34:00Z", + "version": "85.43", + "log_list_timestamp": "2026-04-12T13:36:12Z", "operators": [ { "name": "Google", diff -Nru firefox-esr-140.9.1esr/security/nss/cpputil/nss_scoped_ptrs.h firefox-esr-140.10.0esr/security/nss/cpputil/nss_scoped_ptrs.h --- firefox-esr-140.9.1esr/security/nss/cpputil/nss_scoped_ptrs.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/cpputil/nss_scoped_ptrs.h 2026-04-15 01:59:57.000000000 +0000 @@ -56,6 +56,15 @@ void operator()(SEC_PKCS12DecoderContext* dcx) { SEC_PKCS12DecoderFinish(dcx); } + void operator()(SEC_PKCS7DecoderContext* dcx) { + SEC_PKCS7ContentInfo* cinfo = SEC_PKCS7DecoderFinish(dcx); + if (cinfo) { + SEC_PKCS7DestroyContentInfo(cinfo); + } + } + void operator()(SEC_PKCS7ContentInfo* cinfo) { + SEC_PKCS7DestroyContentInfo(cinfo); + } void operator()(NSSInitContext* init) { NSS_ShutdownContext(init); } }; @@ -96,6 +105,8 @@ SCOPED(SECKEYPublicKey); SCOPED(SECMODModule); SCOPED(SEC_PKCS12DecoderContext); +SCOPED(SEC_PKCS7DecoderContext); +SCOPED(SEC_PKCS7ContentInfo); #undef SCOPED diff -Nru firefox-esr-140.9.1esr/security/nss/doc/rst/releases/nss_3_112_4.rst firefox-esr-140.10.0esr/security/nss/doc/rst/releases/nss_3_112_4.rst --- firefox-esr-140.9.1esr/security/nss/doc/rst/releases/nss_3_112_4.rst 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/doc/rst/releases/nss_3_112_4.rst 2026-04-15 01:59:56.000000000 +0000 @@ -0,0 +1,52 @@ +.. _mozilla_projects_nss_nss_3_112_4_release_notes: + +NSS 3.112.4 release notes +======================== + +`Introduction <#introduction>`__ +-------------------------------- + +.. container:: + + Network Security Services (NSS) 3.112.4 was released on *13 April 2026**. + +`Distribution Information <#distribution_information>`__ +-------------------------------------------------------- + +.. container:: + + The HG tag is NSS_3_112_4_RTM. NSS 3.112.4 requires NSPR 4.36 or newer. + + NSS 3.112.4 source distributions are available on ftp.mozilla.org for secure HTTPS download: + + - Source tarballs: + https://ftp.mozilla.org/pub/mozilla.org/security/nss/releases/NSS_3_112_4_RTM/src/ + + Other releases are available :ref:`mozilla_projects_nss_releases`. + +.. _changes_in_nss_3.112.4: + +`Changes in NSS 3.112.4 <#changes_in_nss_3.112.4>`__ +------------------------------------------------------------------ + +.. container:: + + - Bug 2030135 - improve error handling in PK11_ImportPrivateKeyInfoAndReturnKey. + - Bug 2029752 - Improving the allocation of S/MIME DecryptSymKey. + - Bug 2029462 - store email on subject cache_entry in NSS trust domain. + - Bug 2029425 - Heap use-after-free in cert_VerifyCertChainOld via dangling certsList[] entry on NameConstraints violation. + - Bug 2029323 - Improve size calculations in CMS content buffering. + - Bug 2028001 - avoid integer overflow while escaping RFC822 Names. + - Bug 2027378 - Reject excessively large ASN.1 SEQUENCE OF in quickder. + - Bug 2027365 - Deep copy profile data in CERT_FindSMimeProfile. + - Bug 2027345 - Improve input validation in DSAU signature decoding. + - Bug 2026311 - avoid integer overflow in RSA_EMSAEncodePSS. + - Bug 2019357 - RSA_EMSAEncodePSS should validate the length of mHash. + - Bug 2026156 - Add a maximum cert uncompressed len and tests. + - Bug 2026089 - Clarify extension negotiation mechanism for TLS Handshakes. + - Bug 2023209 - ensure permittedSubtrees don't match wildcards that could be outside the permitted tree. + - Bug 2023207 - Fix integer underflow in tls13_AEAD when ciphertext is shorter than tag. + - Bug 2019224 - Remove invalid PORT_Free(). + - Bug 1964722 - free digest objects in SEC_PKCS7DecoderFinish if they haven't already been freed. + - Bug 1935995 - make ss->ssl3.hs.cookie an owned-copy of the cookie. + diff -Nru firefox-esr-140.9.1esr/security/nss/gtests/der_gtest/der_gtest.gyp firefox-esr-140.10.0esr/security/nss/gtests/der_gtest/der_gtest.gyp --- firefox-esr-140.9.1esr/security/nss/gtests/der_gtest/der_gtest.gyp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/gtests/der_gtest/der_gtest.gyp 2026-04-15 01:59:56.000000000 +0000 @@ -14,6 +14,7 @@ 'der_getint_unittest.cc', 'der_quickder_unittest.cc', 'p12_import_unittest.cc', + 'p7_import_unittest.cc', 'secasn1decode_unittest.cc', '<(DEPTH)/gtests/common/gtests.cc' ], diff -Nru firefox-esr-140.9.1esr/security/nss/gtests/der_gtest/p12_import_unittest.cc firefox-esr-140.10.0esr/security/nss/gtests/der_gtest/p12_import_unittest.cc --- firefox-esr-140.9.1esr/security/nss/gtests/der_gtest/p12_import_unittest.cc 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/gtests/der_gtest/p12_import_unittest.cc 2026-04-15 01:59:57.000000000 +0000 @@ -231,6 +231,13 @@ 0x51, 0x04, 0x08, 0xa1, 0x52, 0xdd, 0x64, 0x46, 0xe9, 0x9e, 0x3e, 0x02, 0x02, 0x08, 0x00}; +unsigned char leak_p12[] = { + 0x30, 0x82, 0x20, 0x20, 0x02, 0x01, 0xff, 0x30, 0x82, 0x09, 0x20, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x50, + 0x30, 0x3f, 0x02, 0x01, 0x20, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, + 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x30, 0x20, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01}; + class PK12ImportTest : public ::testing::Test {}; TEST_F(PK12ImportTest, ImportPK12With2P7) { @@ -248,4 +255,20 @@ ASSERT_EQ(SECFailure, rv); } +TEST_F(PK12ImportTest, FailsToImportButShouldNotLeak) { + SECItem password = {siBuffer, nullptr, 0}; + ScopedPK11SlotInfo slot(PK11_GetInternalSlot()); + ScopedSEC_PKCS12DecoderContext dcx( + SEC_PKCS12DecoderStart(&password, slot.get(), nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr)); + ASSERT_TRUE(dcx); + SECStatus rv = SEC_PKCS12DecoderUpdate( + dcx.get(), const_cast(leak_p12), sizeof(leak_p12)); + ASSERT_EQ(SECSuccess, rv); + rv = SEC_PKCS12DecoderVerify(dcx.get()); + // This is not a valid PKCS12 file, so a failing return value is expected. + // However, the implementation shouldn't leak memory as a result. + ASSERT_EQ(SECFailure, rv); +} + } // namespace nss_test diff -Nru firefox-esr-140.9.1esr/security/nss/gtests/der_gtest/p7_import_unittest.cc firefox-esr-140.10.0esr/security/nss/gtests/der_gtest/p7_import_unittest.cc --- firefox-esr-140.9.1esr/security/nss/gtests/der_gtest/p7_import_unittest.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/gtests/der_gtest/p7_import_unittest.cc 2026-04-15 01:59:56.000000000 +0000 @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nss.h" +#include "secpkcs7.h" + +#include "gtest/gtest.h" +#include "nss_scoped_ptrs.h" + +namespace nss_test { + +// This is an invalid PKCS7 message. Among other things, it contains some +// unknown hash OIDs. This should fail to parse, but it should be safe to try. +static const uint8_t p7_with_unknown_hashes[] = { + 0x30, 0x4d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, + 0x02, 0xa0, 0x40, 0x30, 0x3e, 0x02, 0x01, 0x20, 0x31, 0x27, 0x30, 0x0b, + 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x05, 0x30, + 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x05, + 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, + 0x04, 0x30, 0x10, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x07, 0x01, 0xa0, 0x03, 0x04, 0x01, 0x00}; + +// This is an invalid PKCS7 message. It contains multiple hash OIDs (that's not +// what makes it invalid). When it fails to parse, the associated digest data +// structures should be freed correctly. +static const uint8_t p7_with_multiple_hashes[] = { + 0x30, 0x4d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, + 0x02, 0xa0, 0x40, 0x30, 0x3e, 0x02, 0x01, 0x20, 0x31, 0x27, 0x30, 0x0b, + 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x30, + 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, + 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, + 0x04, 0x30, 0x10, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x07, 0x01, 0xa0, 0x03, 0x04, 0x01, 0x00}; + +class P7ImportTest : public ::testing::Test {}; + +TEST_F(P7ImportTest, FailSafeWithUnknownHashes) { + ScopedSEC_PKCS7DecoderContext dcx(SEC_PKCS7DecoderStart( + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr)); + ASSERT_TRUE(dcx); + SECStatus rv = SEC_PKCS7DecoderUpdate( + dcx.get(), reinterpret_cast(p7_with_unknown_hashes), + sizeof(p7_with_unknown_hashes)); + ASSERT_EQ(SECFailure, rv); +} + +TEST_F(P7ImportTest, NoLeakWithMultipleHashes) { + ScopedSEC_PKCS7DecoderContext dcx(SEC_PKCS7DecoderStart( + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr)); + ASSERT_TRUE(dcx); + SECStatus rv = SEC_PKCS7DecoderUpdate( + dcx.get(), reinterpret_cast(p7_with_multiple_hashes), + sizeof(p7_with_multiple_hashes)); + ASSERT_EQ(SECFailure, rv); +} + +} // namespace nss_test diff -Nru firefox-esr-140.9.1esr/security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp firefox-esr-140.10.0esr/security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp --- firefox-esr-140.9.1esr/security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp 2026-04-15 01:59:57.000000000 +0000 @@ -2132,6 +2132,45 @@ Result::ERROR_BAD_DER, Result::ERROR_BAD_DER }, + // Wildcard SANs have subtle outcomes. + { ByteString(), DNSName("*.example.com"), + GeneralSubtree(DNSName(".example.com")), + Success, + Result::ERROR_CERT_NOT_IN_NAME_SPACE + }, + { ByteString(), DNSName("*.example.com"), + GeneralSubtree(DNSName("example.com")), + Success, + Result::ERROR_CERT_NOT_IN_NAME_SPACE + }, + // A certificate with a wildcard SAN entry like `*.example.com` can't be + // issued by a CA with a DNSName name constraint entry like `foo.example.com` + // in either the permitted or excluded subtrees. If in the permitted subtree, + // the certificate would be valid for `bar.example.com`, which would violate + // the constraint. If in the excluded subtree, the certificate would be valid + // for `foo.example.com`, which would violate the constraint. + { ByteString(), DNSName("*.example.com"), + GeneralSubtree(DNSName("foo.example.com")), + Result::ERROR_CERT_NOT_IN_NAME_SPACE, + Result::ERROR_CERT_NOT_IN_NAME_SPACE + }, + { ByteString(), DNSName("*.foo.example.com"), + GeneralSubtree(DNSName("example.com")), + Success, + Result::ERROR_CERT_NOT_IN_NAME_SPACE + }, + { ByteString(), DNSName("*.example.com"), + GeneralSubtree(DNSName("foo.example.org")), + Result::ERROR_CERT_NOT_IN_NAME_SPACE, + Success + }, + // `*invalid.example.com` is an invalid presented DNSID. + { ByteString(), DNSName("*invalid.example.com"), + GeneralSubtree(DNSName("invalid.example.com")), + Result::ERROR_BAD_DER, + Result::ERROR_BAD_DER + }, + ///////////////////////////////////////////////////////////////////////////// // Basic IP Address constraints (non-CN-ID) diff -Nru firefox-esr-140.9.1esr/security/nss/gtests/ssl_gtest/ssl_certificate_compression_unittest.cc firefox-esr-140.10.0esr/security/nss/gtests/ssl_gtest/ssl_certificate_compression_unittest.cc --- firefox-esr-140.9.1esr/security/nss/gtests/ssl_gtest/ssl_certificate_compression_unittest.cc 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/gtests/ssl_gtest/ssl_certificate_compression_unittest.cc 2026-04-15 01:59:57.000000000 +0000 @@ -272,6 +272,25 @@ return SECSuccess; } +/* Decode function that does NOT check input->len != outputLen (unlike + * SimpleXorCertCompDecode). It always sets receivedOutputLen = outputLen and + * returns SECSuccess, bypassing the actualCertLen != decodedCertLen fallback + * so that only the explicit uncompressed_length bounds check blocks an + * oversized allocation. */ +static int called_count = 0; +static SECStatus PermissiveXorCertCompDecode(const SECItem* input, + uint8_t* output, size_t outputLen, + size_t* receivedOutputLen) { + called_count++; + size_t copy = PR_MIN(input->len, outputLen); + PORT_Memcpy(output, input->data, copy); + for (size_t i = 0; i < copy; i++) { + output[i] ^= 0x55; + } + *receivedOutputLen = outputLen; + return SECSuccess; +} + /* These tests are checking the behaviour * using the different compression algorithms. * @@ -500,8 +519,6 @@ EXPECT_TRUE(SSLInt_ExtensionNegotiated(server_->ssl_fd(), ssl_certificate_compression_xtn)); - EXPECT_TRUE(SSLInt_ExtensionNegotiated(client_->ssl_fd(), - ssl_certificate_compression_xtn)); uint16_t certCompressionAlg = filterExtension->getCertCompressionAlg(); EXPECT_EQ(certCompressionAlg, serverPreferableAlg.id); @@ -964,6 +981,56 @@ * } CompressedCertificate; */ +/* Overwrites the uncompressed_length field of a CompressedCertificate message + * with an arbitrary uint24 value, enabling precise boundary-value testing. */ +class TLSCompressedCertUncompressedLenSetter : public TlsRecordFilter { + public: + TLSCompressedCertUncompressedLenSetter(const std::shared_ptr& a, + uint32_t len) + : TlsRecordFilter(a), len_(len) { + EnableDecryption(); + } + + protected: + PacketFilter::Action FilterRecord(const TlsRecordHeader& header, + const DataBuffer& record, size_t* offset, + DataBuffer* output) override { + uint8_t inner_content_type; + DataBuffer plaintext; + uint16_t protection_epoch = 0; + TlsRecordHeader out_header(header); + + if (!Unprotect(header, record, &protection_epoch, &inner_content_type, + &plaintext, &out_header)) { + return KEEP; + } + + uint64_t skip = + findPointerToHandshakeType(plaintext, ssl_hs_compressed_certificate); + if (skip >= plaintext.len() || + plaintext.data()[skip] != ssl_hs_compressed_certificate) { + return KEEP; + } + + /* uncompressed_length is a uint24 at offset 6 from the HandshakeType byte. + */ + plaintext.Write(skip + 6, len_, 3); + + DataBuffer ciphertext; + bool ok = Protect(spec(protection_epoch), out_header, inner_content_type, + plaintext, &ciphertext, &out_header); + EXPECT_TRUE(ok); + if (!ok) { + return KEEP; + } + *offset = out_header.Write(output, *offset, ciphertext); + return CHANGE; + } + + private: + uint32_t len_; +}; + TEST_F(TlsConnectStreamTls13, CertificateCompression_CompressionFunctionCreatesABufferOfSize0) { ConfigureVersion(SSL_LIBRARY_VERSION_TLS_1_3); @@ -1214,6 +1281,47 @@ client_->CheckErrorCode(SSL_ERROR_RX_MALFORMED_CERTIFICATE); } +/* Boundary test for the 100KB uncompressed_length cap. + * At limit (100KB): passes bounds check, Certificate parser sees trailing + * zeros and fires illegal_parameter (tls13con.c:4362) — proves the bounds + * check did not trigger. + * One over (100KB+1): caught by the bounds check (tls13con.c:4220) and fires + * bad_certificate. */ +TEST_F(TlsConnectStreamTls13, CertificateCompression_UncompressedLenBoundary) { + SSLCertificateCompressionAlgorithm t = {0xff01, "test function", + SimpleXorCertCompEncode, + PermissiveXorCertCompDecode}; + + auto run = [&](uint32_t len, uint8_t expected_alert, bool expect_decoded) { + called_count = 0; + Reset(); + EnsureTlsSetup(); + MakeTlsFilter(server_, len); + EXPECT_EQ(SECSuccess, + SSLExp_SetCertificateCompressionAlgorithm(server_->ssl_fd(), t)); + EXPECT_EQ(SECSuccess, + SSLExp_SetCertificateCompressionAlgorithm(client_->ssl_fd(), t)); + ExpectAlert(client_, expected_alert); + StartConnect(); + client_->SetServerKeyBits(server_->server_key_bits()); + client_->Handshake(); + server_->Handshake(); + ASSERT_TRUE_WAIT((client_->state() != TlsAgent::STATE_CONNECTING), 5000); + ASSERT_EQ(TlsAgent::STATE_ERROR, client_->state()); + client_->ExpectSendAlert(kTlsAlertCloseNotify); + server_->ExpectReceiveAlert(kTlsAlertCloseNotify); + client_->CheckErrorCode(SSL_ERROR_RX_MALFORMED_CERTIFICATE); + if (expect_decoded) { + EXPECT_EQ(called_count, 1); + } else { + EXPECT_EQ(0, called_count); + } + }; + + run(100 * 1024, kTlsAlertIllegalParameter, true); + run(100 * 1024 + 1, kTlsAlertBadCertificate, false); +} + TEST_F(TlsConnectStreamTls13, CertificateCompression_ReceivedCertificateTooLong) { EnsureTlsSetup(); @@ -1391,8 +1499,6 @@ server_->ReadBytes(50); EXPECT_EQ(1U, called); - EXPECT_TRUE(SSLInt_ExtensionNegotiated(client_->ssl_fd(), - ssl_certificate_compression_xtn)); SendReceive(60); client_->CheckClientAuthCompleted(); @@ -1469,8 +1575,6 @@ server_->ReadBytes(50); EXPECT_EQ(1U, called); - EXPECT_TRUE(SSLInt_ExtensionNegotiated(client_->ssl_fd(), - ssl_certificate_compression_xtn)); SendReceive(60); client_->CheckClientAuthCompleted(); diff -Nru firefox-esr-140.9.1esr/security/nss/lib/certdb/alg1485.c firefox-esr-140.10.0esr/security/nss/lib/certdb/alg1485.c --- firefox-esr-140.9.1esr/security/nss/lib/certdb/alg1485.c 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/certdb/alg1485.c 2026-04-15 01:59:56.000000000 +0000 @@ -1400,13 +1400,13 @@ if (dest && src && src->data && src->len && src->data[0]) { PRUint32 len = src->len; PRUint32 i; - PRUint32 reqLen = len + 1; + PRUint64 reqLen = (PRUint64)len + 1; /* are there any embedded control characters ? */ for (i = 0; i < len; i++) { if (NEEDS_HEX_ESCAPE(src->data[i])) reqLen += 2; } - if (*pRemaining > reqLen) { + if (*pRemaining >= reqLen) { for (i = 0; i < len; ++i) { PRUint8 c = src->data[i]; if (NEEDS_HEX_ESCAPE(c)) { @@ -1422,7 +1422,7 @@ } } *dest++ = '\0'; - *pRemaining -= reqLen; + *pRemaining -= (PRUint32)reqLen; } } return dest; @@ -1440,7 +1440,7 @@ char* pBuf = NULL; PORTCheapArenaPool tmpArena; PRUint32 maxLen = 0; - PRInt32 finalLen = 0; + PRUint32 finalLen = 0; SECStatus rv; SECItem subAltName; diff -Nru firefox-esr-140.9.1esr/security/nss/lib/certdb/stanpcertdb.c firefox-esr-140.10.0esr/security/nss/lib/certdb/stanpcertdb.c --- firefox-esr-140.9.1esr/security/nss/lib/certdb/stanpcertdb.c 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/certdb/stanpcertdb.c 2026-04-15 01:59:56.000000000 +0000 @@ -1045,10 +1045,15 @@ nssSMIMEProfile *stanProfile; stanProfile = nssCryptoContext_FindSMIMEProfileForCertificate(cc, c); if (stanProfile) { - rvItem = - SECITEM_AllocItem(NULL, NULL, stanProfile->profileData->size); - if (rvItem) { - rvItem->data = stanProfile->profileData->data; + if (stanProfile->profileData) { + rvItem = + SECITEM_AllocItem(NULL, NULL, + stanProfile->profileData->size); + if (rvItem) { + PORT_Memcpy(rvItem->data, + stanProfile->profileData->data, + stanProfile->profileData->size); + } } nssSMIMEProfile_Destroy(stanProfile); } diff -Nru firefox-esr-140.9.1esr/security/nss/lib/certhigh/certvfy.c firefox-esr-140.10.0esr/security/nss/lib/certhigh/certvfy.c --- firefox-esr-140.9.1esr/security/nss/lib/certhigh/certvfy.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/certhigh/certvfy.c 2026-04-15 01:59:57.000000000 +0000 @@ -736,7 +736,7 @@ certsList = tmpCertsList; } for (i = 0; i < subjectNameListLen; i++) { - certsList[namesCount + i] = subjectCert; + certsList[namesCount + i] = CERT_DupCertificate(subjectCert); } namesCount += subjectNameListLen; namesList = cert_CombineNamesLists(namesList, subjectNameList); @@ -993,6 +993,11 @@ rv = SECFailure; done: if (certsList != NULL) { + for (int i = 0; i < namesCount; i++) { + if (certsList[i]) { + CERT_DestroyCertificate(certsList[i]); + } + } PORT_Free(certsList); } if (issuerCert) { diff -Nru firefox-esr-140.9.1esr/security/nss/lib/cryptohi/dsautil.c firefox-esr-140.10.0esr/security/nss/lib/cryptohi/dsautil.c --- firefox-esr-140.9.1esr/security/nss/lib/cryptohi/dsautil.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/cryptohi/dsautil.c 2026-04-15 01:59:56.000000000 +0000 @@ -72,19 +72,18 @@ unsigned char *pDst = dest->data; unsigned int cntSrc = src->len; unsigned int cntDst = dest->len; - int zCount = cntDst - cntSrc; - if (zCount > 0) { + if (cntSrc <= cntDst) { + unsigned int zCount = cntDst - cntSrc; PORT_Memset(pDst, 0, zCount); PORT_Memcpy(pDst + zCount, pSrc, cntSrc); return SECSuccess; } - if (zCount <= 0) { - /* Source is longer than destination. Check for leading zeros. */ - while (zCount++ < 0) { - if (*pSrc++ != 0) - goto loser; - } + /* Source is longer than destination: extra leading bytes must be zero. */ + unsigned int extra = cntSrc - cntDst; + while (extra--) { + if (*pSrc++ != 0) + goto loser; } PORT_Memcpy(pDst, pSrc, cntDst); return SECSuccess; @@ -190,6 +189,12 @@ if (status != SECSuccess) goto loser; + /* A valid DER INTEGER for r or s is at most len+1 bytes (len bytes of + ** magnitude plus at most one leading zero sign byte). Reject anything + ** larger before attempting the conversion to avoid pathological inputs. */ + if (sig.r.len > len + 1 || sig.s.len > len + 1) + goto loser; + /* Convert sig.r and sig.s from variable length signed integers to ** fixed length unsigned integers. */ diff -Nru firefox-esr-140.9.1esr/security/nss/lib/freebl/blapii.h firefox-esr-140.10.0esr/security/nss/lib/freebl/blapii.h --- firefox-esr-140.9.1esr/security/nss/lib/freebl/blapii.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/freebl/blapii.h 2026-04-15 01:59:56.000000000 +0000 @@ -88,6 +88,7 @@ unsigned int emLen, unsigned int emBits, const unsigned char *mHash, + unsigned int mHashLen, HASH_HashType hashAlg, HASH_HashType maskHashAlg, const unsigned char *salt, diff -Nru firefox-esr-140.9.1esr/security/nss/lib/freebl/rsa_blind.c firefox-esr-140.10.0esr/security/nss/lib/freebl/rsa_blind.c --- firefox-esr-140.9.1esr/security/nss/lib/freebl/rsa_blind.c 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/freebl/rsa_blind.c 2026-04-15 01:59:57.000000000 +0000 @@ -200,7 +200,8 @@ goto cleanup; } - rv = RSA_EMSAEncodePSS(encoded_msg, pkS->modulus.len, bit_len_n, msgHash, hashAlg, hashAlg, salt, saltLen); + rv = RSA_EMSAEncodePSS(encoded_msg, pkS->modulus.len, bit_len_n, msgHash, + sizeof(msgHash), hashAlg, hashAlg, salt, saltLen); /* 2. If EMSA-PSS-ENCODE raises an error, raise the error and stop. */ if (rv != SECSuccess) { diff -Nru firefox-esr-140.9.1esr/security/nss/lib/freebl/rsapkcs.c firefox-esr-140.10.0esr/security/nss/lib/freebl/rsapkcs.c --- firefox-esr-140.9.1esr/security/nss/lib/freebl/rsapkcs.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/freebl/rsapkcs.c 2026-04-15 01:59:57.000000000 +0000 @@ -1239,6 +1239,7 @@ unsigned int emLen, unsigned int emBits, const unsigned char *mHash, + unsigned int mHashLen, HASH_HashType hashAlg, HASH_HashType maskHashAlg, const unsigned char *salt, @@ -1252,14 +1253,22 @@ SECStatus rv; hash = HASH_GetRawHashObject(hashAlg); - dbMaskLen = emLen - hash->length - 1; + PORT_Assert(hash); + + if (mHashLen < hash->length) { + PORT_SetError(SEC_ERROR_INVALID_ARGS); + return SECFailure; + } /* Step 3 */ - if (emLen < hash->length + saltLen + 2) { + if ((saltLen > emLen) || + (hash->length + 2 > emLen - saltLen)) { PORT_SetError(SEC_ERROR_OUTPUT_LEN); return SECFailure; } + dbMaskLen = emLen - hash->length - 1; + /* Step 4 */ if (salt == NULL) { rv = RNG_GenerateGlobalRandomBytes(&em[dbMaskLen - saltLen], saltLen); @@ -1336,15 +1345,17 @@ SECStatus rv; hash = HASH_GetRawHashObject(hashAlg); - dbMaskLen = emLen - hash->length - 1; /* Step 3 + 4 */ - if ((emLen < (hash->length + saltLen + 2)) || + if ((saltLen > emLen) || + (hash->length + 2 > emLen - saltLen) || (em[emLen - 1] != 0xbc)) { PORT_SetError(SEC_ERROR_BAD_SIGNATURE); return SECFailure; } + dbMaskLen = emLen - hash->length - 1; + /* Step 6 */ zeroBits = 8 * emLen - emBits; if (em[0] >> (8 - zeroBits)) { @@ -1458,7 +1469,7 @@ emLen--; em++; } - rv = RSA_EMSAEncodePSS(em, emLen, modulusBits - 1, input, hashAlg, + rv = RSA_EMSAEncodePSS(em, emLen, modulusBits - 1, input, inputLen, hashAlg, maskHashAlg, salt, saltLength); if (rv != SECSuccess) goto done; diff -Nru firefox-esr-140.9.1esr/security/nss/lib/mozpkix/lib/pkixnames.cpp firefox-esr-140.10.0esr/security/nss/lib/mozpkix/lib/pkixnames.cpp --- firefox-esr-140.9.1esr/security/nss/lib/mozpkix/lib/pkixnames.cpp 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/mozpkix/lib/pkixnames.cpp 2026-04-15 01:59:57.000000000 +0000 @@ -172,6 +172,12 @@ NameConstraint = 2, }; +enum class NameConstraintsSubtrees : uint8_t +{ + permittedSubtrees = der::CONSTRUCTED | der::CONTEXT_SPECIFIC | 0, + excludedSubtrees = der::CONSTRUCTED | der::CONTEXT_SPECIFIC | 1 +}; + enum class AllowWildcards { No = 0, Yes = 1 }; // DNSName constraints implicitly allow subdomain matching when there is no @@ -184,16 +190,22 @@ bool IsValidDNSID(Input hostname, IDRole idRole, AllowWildcards allowWildcards); +// `subtreesType` is relevant only when `referenceDNSIDRole` is +// `IDRole::NameConstraint`. Result MatchPresentedDNSIDWithReferenceDNSID( Input presentedDNSID, AllowWildcards allowWildcards, AllowDotlessSubdomainMatches allowDotlessSubdomainMatches, IDRole referenceDNSIDRole, + /*optional*/ const NameConstraintsSubtrees* subtreesType, Input referenceDNSID, /*out*/ bool& matches); +// `subtreesType` is relevant only when `referenceDNSIDRole` is +// `IDRole::NameConstraint`. Result MatchPresentedRFC822NameWithReferenceRFC822Name( Input presentedRFC822Name, IDRole referenceRFC822NameRole, + /*optional*/ const NameConstraintsSubtrees* subtreesType, Input referenceRFC822Name, /*out*/ bool& matches); } // namespace @@ -212,7 +224,7 @@ return MatchPresentedDNSIDWithReferenceDNSID( presentedDNSID, AllowWildcards::Yes, AllowDotlessSubdomainMatches::Yes, IDRole::ReferenceID, - referenceDNSID, matches); + nullptr, referenceDNSID, matches); } // Verify that the given end-entity cert, which is assumed to have been already @@ -731,7 +743,7 @@ rv = MatchPresentedDNSIDWithReferenceDNSID( presentedID, AllowWildcards::Yes, AllowDotlessSubdomainMatches::Yes, IDRole::ReferenceID, - referenceID, foundMatch); + nullptr, referenceID, foundMatch); break; case GeneralNameType::iPAddress: @@ -741,7 +753,7 @@ case GeneralNameType::rfc822Name: rv = MatchPresentedRFC822NameWithReferenceRFC822Name( - presentedID, IDRole::ReferenceID, referenceID, foundMatch); + presentedID, IDRole::ReferenceID, nullptr, referenceID, foundMatch); break; case GeneralNameType::directoryName: @@ -767,20 +779,16 @@ return Success; } -enum class NameConstraintsSubtrees : uint8_t -{ - permittedSubtrees = der::CONSTRUCTED | der::CONTEXT_SPECIFIC | 0, - excludedSubtrees = der::CONSTRUCTED | der::CONTEXT_SPECIFIC | 1 -}; - Result CheckPresentedIDConformsToNameConstraintsSubtrees( GeneralNameType presentedIDType, Input presentedID, Reader& nameConstraints, NameConstraintsSubtrees subtreesType); + Result MatchPresentedIPAddressWithConstraint(Input presentedID, Input iPAddressConstraint, /*out*/ bool& foundMatch); + Result MatchPresentedDirectoryNameWithConstraint( NameConstraintsSubtrees subtreesType, Input presentedID, Input directoryNameConstraint, /*out*/ bool& matches); @@ -886,7 +894,7 @@ rv = MatchPresentedDNSIDWithReferenceDNSID( presentedID, AllowWildcards::Yes, AllowDotlessSubdomainMatches::Yes, IDRole::NameConstraint, - base, matches); + &subtreesType, base, matches); if (rv != Success) { return rv; } @@ -911,7 +919,7 @@ case GeneralNameType::rfc822Name: rv = MatchPresentedRFC822NameWithReferenceRFC822Name( - presentedID, IDRole::NameConstraint, base, matches); + presentedID, IDRole::NameConstraint, &subtreesType, base, matches); if (rv != Success) { return rv; } @@ -1094,6 +1102,7 @@ AllowWildcards allowWildcards, AllowDotlessSubdomainMatches allowDotlessSubdomainMatches, IDRole referenceDNSIDRole, + /*optional*/ const NameConstraintsSubtrees* subtreesType, Input referenceDNSID, /*out*/ bool& matches) { @@ -1184,18 +1193,28 @@ return NotReached("Skipping '*' failed", Result::FATAL_ERROR_LIBRARY_FAILURE); } - do { - // This will happen if reference is a single, relative label - if (reference.AtEnd()) { - matches = false; - return Success; - } - uint8_t referenceByte; - if (reference.Read(referenceByte) != Success) { - return NotReached("invalid reference ID", - Result::FATAL_ERROR_INVALID_ARGS); - } - } while (!reference.Peek('.')); + // For the permittedSubtrees of a name constraint, wildcard presented + // DNSIDs of the form `*.example.com` only match if the name constraint is + // of the form `.example.com` or `example.com`. To put it another way, a + // permittedSubtrees of `foo.example.com` does not match a wildcard + // presented DNSID of `*.example.com`, because in that case, the + // certificate could be valid for `bar.example.com`, which does not match + // the name constraint. + if (referenceDNSIDRole != IDRole::NameConstraint || + (subtreesType && *subtreesType != NameConstraintsSubtrees::permittedSubtrees)) { + do { + // This will happen if reference is a single, relative label + if (reference.AtEnd()) { + matches = false; + return Success; + } + uint8_t referenceByte; + if (reference.Read(referenceByte) != Success) { + return NotReached("invalid reference ID", + Result::FATAL_ERROR_INVALID_ARGS); + } + } while (!reference.Peek('.')); + } } for (;;) { @@ -1552,11 +1571,13 @@ } } +// `subtreesType` is relevant only when `referenceRFC822NameRole` is +// `IDRole::NameConstraint`. Result -MatchPresentedRFC822NameWithReferenceRFC822Name(Input presentedRFC822Name, - IDRole referenceRFC822NameRole, - Input referenceRFC822Name, - /*out*/ bool& matches) +MatchPresentedRFC822NameWithReferenceRFC822Name( + Input presentedRFC822Name, IDRole referenceRFC822NameRole, + /*optional*/ const NameConstraintsSubtrees* subtreesType, + Input referenceRFC822Name, /*out*/ bool& matches) { if (!IsValidRFC822Name(presentedRFC822Name)) { return Result::ERROR_BAD_DER; @@ -1599,6 +1620,7 @@ return MatchPresentedDNSIDWithReferenceDNSID( presentedDNSID, AllowWildcards::No, AllowDotlessSubdomainMatches::No, IDRole::NameConstraint, + subtreesType, referenceRFC822Name, matches); } } diff -Nru firefox-esr-140.9.1esr/security/nss/lib/nss/nss.h firefox-esr-140.10.0esr/security/nss/lib/nss/nss.h --- firefox-esr-140.9.1esr/security/nss/lib/nss/nss.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/nss/nss.h 2026-04-15 01:59:57.000000000 +0000 @@ -22,10 +22,10 @@ * The format of the version string should be * ".[.[.]][ ][ ]" */ -#define NSS_VERSION "3.112.3" _NSS_CUSTOMIZED +#define NSS_VERSION "3.112.4" _NSS_CUSTOMIZED #define NSS_VMAJOR 3 #define NSS_VMINOR 112 -#define NSS_VPATCH 3 +#define NSS_VPATCH 4 #define NSS_VBUILD 0 #define NSS_BETA PR_FALSE diff -Nru firefox-esr-140.9.1esr/security/nss/lib/pk11wrap/pk11pk12.c firefox-esr-140.10.0esr/security/nss/lib/pk11wrap/pk11pk12.c --- firefox-esr-140.9.1esr/security/nss/lib/pk11wrap/pk11pk12.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/pk11wrap/pk11pk12.c 2026-04-15 01:59:57.000000000 +0000 @@ -733,12 +733,15 @@ rv = PK11_ImportAndReturnPrivateKey(slot, lpk, nickname, publicValue, isPerm, isPrivate, keyUsage, privk, wincx); -loser: - if (arena != NULL) { - PORT_FreeArena(arena, PR_TRUE); + if (rv != SECSuccess) { + goto loser; } + PORT_FreeArena(arena, PR_TRUE); + return SECSuccess; - return rv; +loser: + PORT_FreeArena(arena, PR_TRUE); + return SECFailure; } SECStatus diff -Nru firefox-esr-140.9.1esr/security/nss/lib/pkcs7/p7decode.c firefox-esr-140.10.0esr/security/nss/lib/pkcs7/p7decode.c --- firefox-esr-140.9.1esr/security/nss/lib/pkcs7/p7decode.c 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/pkcs7/p7decode.c 2026-04-15 01:59:57.000000000 +0000 @@ -230,6 +230,8 @@ { int i, digcnt; + p7dcx->worker.digcnt = 0; + if (digestalgs == NULL) return SECSuccess; @@ -257,7 +259,6 @@ } p7dcx->worker.depth = depth; - p7dcx->worker.digcnt = 0; /* * Create a digest context for each algorithm. @@ -277,7 +278,6 @@ * but we cannot know that until later. */ if (digobj == NULL) { - p7dcx->worker.digcnt--; continue; } @@ -306,25 +306,19 @@ PLArenaPool *poolp, SECItem ***digestsp) { - struct sec_pkcs7_decoder_worker *worker; - const SECHashObject *digobj; - void *digcx; - SECItem **digests, *digest; - int i; - void *mark; - /* * XXX Handling nested contents would mean that there is a chain * of workers -- one per each level of content. The following * would want to find the last worker in the chain. */ - worker = &(p7dcx->worker); + struct sec_pkcs7_decoder_worker *worker = &(p7dcx->worker); /* * If no digests, then we have nothing to do. */ - if (worker->digcnt == 0) + if (worker->digcnt == 0) { return SECSuccess; + } /* * No matter what happens after this, we want to stop filtering. @@ -340,46 +334,46 @@ * was digested. */ if (!worker->saw_contents) { - for (i = 0; i < worker->digcnt; i++) { - digcx = worker->digcxs[i]; - digobj = worker->digobjs[i]; + for (int i = 0; i < worker->digcnt; i++) { + void *digcx = worker->digcxs[i]; + const SECHashObject *digobj = worker->digobjs[i]; (*digobj->destroy)(digcx, PR_TRUE); } + worker->digcnt = 0; return SECSuccess; } - mark = PORT_ArenaMark(poolp); + void *mark = PORT_ArenaMark(poolp); /* * Close out each digest context, saving digest away. */ - digests = - (SECItem **)PORT_ArenaAlloc(poolp, (worker->digcnt + 1) * sizeof(SECItem *)); - digest = (SECItem *)PORT_ArenaAlloc(poolp, worker->digcnt * sizeof(SECItem)); - if (digests == NULL || digest == NULL) { + SECItem **digests = + (SECItem **)PORT_ArenaZAlloc(poolp, (worker->digcnt + 1) * sizeof(SECItem *)); + if (digests == NULL) { p7dcx->error = PORT_GetError(); PORT_ArenaRelease(poolp, mark); return SECFailure; } - for (i = 0; i < worker->digcnt; i++, digest++) { - digcx = worker->digcxs[i]; - digobj = worker->digobjs[i]; - - digest->data = (unsigned char *)PORT_ArenaAlloc(poolp, digobj->length); - if (digest->data == NULL) { + for (int i = 0; i < worker->digcnt; i++) { + const SECHashObject *digobj = worker->digobjs[i]; + digests[i] = SECITEM_AllocItem(poolp, NULL, digobj->length); + if (!digests[i]) { p7dcx->error = PORT_GetError(); PORT_ArenaRelease(poolp, mark); return SECFailure; } + } - digest->len = digobj->length; - (*digobj->end)(digcx, digest->data, &(digest->len), digest->len); - (*digobj->destroy)(digcx, PR_TRUE); + for (int i = 0; i < worker->digcnt; i++) { + void *digcx = worker->digcxs[i]; + const SECHashObject *digobj = worker->digobjs[i]; - digests[i] = digest; + (*digobj->end)(digcx, digests[i]->data, &(digests[i]->len), digests[i]->len); + (*digobj->destroy)(digcx, PR_TRUE); } - digests[i] = NULL; + worker->digcnt = 0; *digestsp = digests; PORT_ArenaUnmark(poolp, mark); @@ -1084,6 +1078,13 @@ if (p7dcx->worker.decryptobj) { sec_PKCS7DestroyDecryptObject(p7dcx->worker.decryptobj); } + for (int i = 0; i < p7dcx->worker.digcnt; i++) { + void *digcx = p7dcx->worker.digcxs[i]; + const SECHashObject *digobj = p7dcx->worker.digobjs[i]; + (*digobj->destroy)(digcx, PR_TRUE); + } + p7dcx->worker.digcnt = 0; + PORT_FreeArena(p7dcx->tmp_poolp, PR_FALSE); PORT_Free(p7dcx); return cinfo; diff -Nru firefox-esr-140.9.1esr/security/nss/lib/pki/tdcache.c firefox-esr-140.10.0esr/security/nss/lib/pki/tdcache.c --- firefox-esr-140.9.1esr/security/nss/lib/pki/tdcache.c 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/pki/tdcache.c 2026-04-15 01:59:57.000000000 +0000 @@ -91,6 +91,7 @@ PRTime lastHit; NSSArena *arena; NSSUTF8 *nickname; + NSSASCII7 *email; }; typedef struct cache_entry_str cache_entry; @@ -229,6 +230,7 @@ NSSCertificate *cert, nssList **subjectList, NSSUTF8 **nickname, + NSSASCII7 **email, NSSArena **arena) { PRStatus nssrv; @@ -242,6 +244,7 @@ nssList_Remove(ce->entry.list, cert); *subjectList = ce->entry.list; *nickname = ce->nickname; + *email = ce->email; *arena = ce->arena; nssrv = PR_SUCCESS; #ifdef DEBUG_CACHE @@ -276,35 +279,34 @@ static PRStatus remove_email_entry( nssTDCertificateCache *cache, - NSSCertificate *cert, + NSSASCII7 *email, nssList *subjectList) { PRStatus nssrv = PR_FAILURE; cache_entry *ce; - /* Find the subject list in the email hash */ - if (cert->email) { - ce = (cache_entry *)nssHash_Lookup(cache->email, cert->email); + if (email) { + ce = (cache_entry *)nssHash_Lookup(cache->email, email); if (ce) { nssList *subjects = ce->entry.list; /* Remove the subject list from the email hash */ if (subjects) { nssList_Remove(subjects, subjectList); #ifdef DEBUG_CACHE - log_item_dump("removed subject list", &cert->subject); - PR_LOG(s_log, PR_LOG_DEBUG, ("for email %s", cert->email)); + PR_LOG(s_log, PR_LOG_DEBUG, + ("removed subject list for email %s", email)); #endif if (nssList_Count(subjects) == 0) { /* No more subject lists for email, delete list and * remove hash entry */ (void)nssList_Destroy(subjects); - nssHash_Remove(cache->email, cert->email); + nssHash_Remove(cache->email, email); /* there are no entries left for this address, free space * used for email entries */ nssArena_Destroy(ce->arena); #ifdef DEBUG_CACHE - PR_LOG(s_log, PR_LOG_DEBUG, ("removed email %s", cert->email)); + PR_LOG(s_log, PR_LOG_DEBUG, ("removed email %s", email)); #endif } } @@ -323,6 +325,7 @@ cache_entry *ce; NSSArena *arena; NSSUTF8 *nickname = NULL; + NSSASCII7 *email = NULL; #ifdef DEBUG_CACHE log_cert_ref("attempt to remove cert", cert); @@ -339,10 +342,10 @@ } (void)remove_issuer_and_serial_entry(td->cache, cert); (void)remove_subject_entry(td->cache, cert, &subjectList, - &nickname, &arena); + &nickname, &email, &arena); if (nssList_Count(subjectList) == 0) { (void)remove_nickname_entry(td->cache, nickname, subjectList); - (void)remove_email_entry(td->cache, cert, subjectList); + (void)remove_email_entry(td->cache, email, subjectList); (void)nssList_Destroy(subjectList); nssHash_Remove(td->cache->subject, &cert->subject); /* there are no entries left for this subject, free the space used @@ -537,6 +540,9 @@ if (nickname) { ce->nickname = nssUTF8_Duplicate(nickname, arena); } + if (cert->email) { + ce->email = nssUTF8_Duplicate(cert->email, arena); + } nssList_SetSortFunction(list, nssCertificate_SubjectListSort); /* Add the cert entry to this list of subjects */ nssrv = nssList_AddUnique(list, cert); @@ -710,6 +716,7 @@ PRUint32 added = 0; cache_entry *ce; NSSCertificate *rvCert = NULL; + NSSASCII7 *email = NULL; NSSUTF8 *certNickname = nssCertificate_GetNickname(cert, NULL); /* Set cc->trust and cc->nssCertificate before taking td->cache->lock. @@ -817,13 +824,13 @@ } if (added >= 2) { (void)remove_subject_entry(td->cache, cert, &subjectList, - &certNickname, &arena); + &certNickname, &email, &arena); } if (added == 3 || added == 5) { (void)remove_nickname_entry(td->cache, certNickname, subjectList); } if (added >= 4) { - (void)remove_email_entry(td->cache, cert, subjectList); + (void)remove_email_entry(td->cache, email, subjectList); } if (subjectList) { nssHash_Remove(td->cache->subject, &cert->subject); diff -Nru firefox-esr-140.9.1esr/security/nss/lib/smime/cmsdecode.c firefox-esr-140.10.0esr/security/nss/lib/smime/cmsdecode.c --- firefox-esr-140.9.1esr/security/nss/lib/smime/cmsdecode.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/smime/cmsdecode.c 2026-04-15 01:59:57.000000000 +0000 @@ -322,7 +322,6 @@ loser: if (mark) PORT_ArenaRelease(poolp, mark); - PORT_Free(childp7dcx); p7dcx->childp7dcx = NULL; return SECFailure; } @@ -555,8 +554,19 @@ SECItem *dataItem = &decoderData->data; offset = dataItem->len; + /* Reject if accumulated size would exceed unsigned int storage. */ + if (len > (unsigned long)(PR_UINT32_MAX - dataItem->len)) { + p7dcx->error = SEC_ERROR_INPUT_LEN; + goto loser; + } if (dataItem->len + len > decoderData->totalBufferSize) { - int needLen = (dataItem->len + len) * 2; + /* Use size_t to avoid truncating the 64-bit sum to int. + * Double to amortize repeated reallocations across chunks. */ + size_t needLen = (size_t)dataItem->len + len; + /* Only double if the result still fits in unsigned int. */ + if (needLen <= PR_UINT32_MAX / 2) { + needLen *= 2; + } dest = (unsigned char *) PORT_ArenaAlloc(p7dcx->cmsg->poolp, needLen); if (dest == NULL) { @@ -567,7 +577,7 @@ if (dataItem->len) { PORT_Memcpy(dest, dataItem->data, dataItem->len); } - decoderData->totalBufferSize = needLen; + decoderData->totalBufferSize = (unsigned int)needLen; dataItem->data = dest; } diff -Nru firefox-esr-140.9.1esr/security/nss/lib/smime/cmspubkey.c firefox-esr-140.10.0esr/security/nss/lib/smime/cmspubkey.c --- firefox-esr-140.9.1esr/security/nss/lib/smime/cmspubkey.c 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/smime/cmspubkey.c 2026-04-15 01:59:57.000000000 +0000 @@ -566,6 +566,7 @@ SECStatus rv; PORT_Memset(&keyWrapAlg, 0, sizeof(SECAlgorithmID)); + PORT_Memset(&originatorpublickey, 0, sizeof(SECKEYPublicKey)); PORT_Assert(bulkalgtag != SEC_OID_UNKNOWN); target = PK11_AlgtagToMechanism(bulkalgtag); diff -Nru firefox-esr-140.9.1esr/security/nss/lib/softoken/softkver.h firefox-esr-140.10.0esr/security/nss/lib/softoken/softkver.h --- firefox-esr-140.9.1esr/security/nss/lib/softoken/softkver.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/softoken/softkver.h 2026-04-15 01:59:56.000000000 +0000 @@ -17,10 +17,10 @@ * The format of the version string should be * ".[.[.]][ ][ ]" */ -#define SOFTOKEN_VERSION "3.112.3" SOFTOKEN_ECC_STRING +#define SOFTOKEN_VERSION "3.112.4" SOFTOKEN_ECC_STRING #define SOFTOKEN_VMAJOR 3 #define SOFTOKEN_VMINOR 112 -#define SOFTOKEN_VPATCH 3 +#define SOFTOKEN_VPATCH 4 #define SOFTOKEN_VBUILD 0 #define SOFTOKEN_BETA PR_FALSE diff -Nru firefox-esr-140.9.1esr/security/nss/lib/ssl/dtlscon.c firefox-esr-140.10.0esr/security/nss/lib/ssl/dtlscon.c --- firefox-esr-140.9.1esr/security/nss/lib/ssl/dtlscon.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/ssl/dtlscon.c 2026-04-15 01:59:57.000000000 +0000 @@ -1101,7 +1101,7 @@ { int errCode = SSL_ERROR_RX_MALFORMED_HELLO_VERIFY_REQUEST; SECStatus rv; - SSL3ProtocolVersion temp; + SSL3ProtocolVersion version; SSL3AlertDescription desc = illegal_parameter; SSL_TRC(3, ("%d: SSL3[%d]: handle hello_verify_request handshake", @@ -1130,22 +1130,39 @@ * Therefore we do not do anything to enforce a match, just * read and check that this value is sane. */ - rv = ssl_ClientReadVersion(ss, &b, &length, &temp); + rv = ssl_ClientReadVersion(ss, &b, &length, &version); if (rv != SECSuccess) { goto loser; /* alert has been sent */ } - /* Read the cookie. - * IMPORTANT: The value of ss->ssl3.hs.cookie is only valid while the - * HelloVerifyRequest message remains valid. */ - rv = ssl3_ConsumeHandshakeVariable(ss, &ss->ssl3.hs.cookie, 1, &b, &length); + /* HelloVerifyRequest is a DTLS 1.2 (and earlier) mechanism; DTLS 1.3 uses + * a cookie extension in HelloRetryRequest instead. Reject an HVR that + * claims a version newer than DTLS 1.2 and cap the negotiable version. + */ + if (version > SSL_LIBRARY_VERSION_TLS_1_2) { + desc = illegal_parameter; + goto alert_loser; + } + if (ss->vrange.max > SSL_LIBRARY_VERSION_TLS_1_2) { + ss->vrange.max = SSL_LIBRARY_VERSION_TLS_1_2; + } + + /* Read the cookie. */ + SECItem cookie; + rv = ssl3_ConsumeHandshakeVariable(ss, &cookie, 1, &b, &length); if (rv != SECSuccess) { goto loser; /* alert has been sent */ } - if (ss->ssl3.hs.cookie.len > DTLS_COOKIE_BYTES) { + if (cookie.len > DTLS_COOKIE_BYTES) { desc = decode_error; goto alert_loser; /* malformed. */ } + PORT_Assert(!ss->ssl3.hs.cookie.data && !ss->ssl3.hs.cookie.len); + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); + rv = SECITEM_CopyItem(NULL, &ss->ssl3.hs.cookie, &cookie); + if (rv != SECSuccess) { + goto loser; + } ssl_GetXmitBufLock(ss); /*******************************/ @@ -1154,6 +1171,8 @@ ssl_ReleaseXmitBufLock(ss); /*******************************/ + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); + if (rv == SECSuccess) return rv; diff -Nru firefox-esr-140.9.1esr/security/nss/lib/ssl/ssl3con.c firefox-esr-140.10.0esr/security/nss/lib/ssl/ssl3con.c --- firefox-esr-140.9.1esr/security/nss/lib/ssl/ssl3con.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/ssl/ssl3con.c 2026-04-15 01:59:57.000000000 +0000 @@ -14266,6 +14266,7 @@ SECITEM_FreeItem(&ss->ssl3.hs.newSessionTicket.ticket, PR_FALSE); SECITEM_FreeItem(&ss->ssl3.hs.srvVirtName, PR_FALSE); SECITEM_FreeItem(&ss->ssl3.hs.fakeSid, PR_FALSE); + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); /* Destroy the DTLS data */ if (IS_DTLS(ss)) { diff -Nru firefox-esr-140.9.1esr/security/nss/lib/ssl/ssl3ext.c firefox-esr-140.10.0esr/security/nss/lib/ssl/ssl3ext.c --- firefox-esr-140.9.1esr/security/nss/lib/ssl/ssl3ext.c 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/ssl/ssl3ext.c 2026-04-15 01:59:57.000000000 +0000 @@ -336,6 +336,26 @@ xtnData->numAdvertised, ex_type); } +void +ssl3_RecordExtensionNegotiated(const sslSocket *ss, TLSExtensionData *xtnData, + PRUint16 ex_type) +{ + /* Record that an extension was negotiated during a full TLS handshake. + * This function must NOT be used to track extensions carried in + * post-handshake messages (e.g. CertificateRequest during PHA); + * their negotiation state should instead be stored in dedicated fields on + * TLSExtensionData or sslSocket (e.g. xtnData->compressionAlg for + * certificate compression). */ + PORT_Assert(!ss->firstHsDone || + ss->opt.enableRenegotiation != SSL_RENEGOTIATE_NEVER); + PORT_Assert(!arrayContainsExtension(xtnData->negotiated, + xtnData->numNegotiated, ex_type)); + PORT_Assert(xtnData->numNegotiated < SSL_MAX_EXTENSIONS); + if (xtnData->numNegotiated < SSL_MAX_EXTENSIONS) { + xtnData->negotiated[xtnData->numNegotiated++] = ex_type; + } +} + PRBool ssl3_ExtensionAdvertisedClientHelloInner(const sslSocket *ss, PRUint16 ex_type) { diff -Nru firefox-esr-140.9.1esr/security/nss/lib/ssl/ssl3ext.h firefox-esr-140.10.0esr/security/nss/lib/ssl/ssl3ext.h --- firefox-esr-140.9.1esr/security/nss/lib/ssl/ssl3ext.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/ssl/ssl3ext.h 2026-04-15 01:59:57.000000000 +0000 @@ -175,6 +175,9 @@ PRBool ssl3_ExtensionNegotiated(const sslSocket *ss, PRUint16 ex_type); PRBool ssl3_ExtensionAdvertised(const sslSocket *ss, PRUint16 ex_type); +void ssl3_RecordExtensionNegotiated(const sslSocket *ss, + TLSExtensionData *xtnData, + PRUint16 ex_type); SECStatus ssl3_RegisterExtensionSender(const sslSocket *ss, TLSExtensionData *xtnData, diff -Nru firefox-esr-140.9.1esr/security/nss/lib/ssl/ssl3exthandle.c firefox-esr-140.10.0esr/security/nss/lib/ssl/ssl3exthandle.c --- firefox-esr-140.9.1esr/security/nss/lib/ssl/ssl3exthandle.c 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/ssl/ssl3exthandle.c 2026-04-15 01:59:57.000000000 +0000 @@ -165,7 +165,7 @@ ssl3_FreeSniNameArray(xtnData); xtnData->sniNameArr = names; xtnData->sniNameArrSize = 1; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_server_name_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_server_name_xtn); } return SECSuccess; @@ -345,7 +345,7 @@ } xtnData->nextProtoState = SSL_NEXT_PROTO_NEGOTIATED; - xtnData->negotiated[xtnData->numNegotiated++] = extension; + ssl3_RecordExtensionNegotiated(ss, xtnData, extension); return SECITEM_CopyItem(NULL, &xtnData->nextProto, &result); } @@ -447,7 +447,7 @@ SECITEM_FreeItem(&xtnData->nextProto, PR_FALSE); xtnData->nextProtoState = SSL_NEXT_PROTO_SELECTED; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_app_layer_protocol_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_app_layer_protocol_xtn); return SECITEM_CopyItem(NULL, &xtnData->nextProto, &protocol_name); } @@ -528,7 +528,7 @@ PORT_Assert(ss->sec.isServer); /* remember that we got this extension. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_cert_status_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_cert_status_xtn); if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) { sender = tls13_ServerSendStatusRequestXtn; @@ -606,7 +606,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_cert_status_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_cert_status_xtn); return SECSuccess; } @@ -859,7 +859,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_session_ticket_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_session_ticket_xtn); return SECSuccess; } @@ -1309,7 +1309,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_session_ticket_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_session_ticket_xtn); /* Parse the received ticket sent in by the client. We are * lenient about some parse errors, falling back to a fullshake @@ -1387,7 +1387,7 @@ /* remember that we got this extension and it was correct. */ CONST_CAST(sslSocket, ss) ->peerRequestedProtection = 1; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_renegotiation_info_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_renegotiation_info_xtn); if (ss->sec.isServer) { /* prepare to send back the appropriate response */ rv = ssl3_RegisterExtensionSender(ss, xtnData, @@ -1522,7 +1522,7 @@ } /* OK, this looks fine. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_use_srtp_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_use_srtp_xtn); xtnData->dtlsSRTPCipherSuite = cipher; return SECSuccess; } @@ -1593,7 +1593,7 @@ /* OK, we have a valid cipher and we've selected it */ xtnData->dtlsSRTPCipherSuite = cipher; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_use_srtp_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_use_srtp_xtn); return ssl3_RegisterExtensionSender(ss, xtnData, ssl_use_srtp_xtn, @@ -1639,8 +1639,12 @@ return SECFailure; } - /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_signature_algorithms_xtn; + /* Keep track of negotiated extensions. Only the server consumes this + * entry; on the client, skipping prevents numNegotiated overflow + * during repeated post-handshake CertificateRequests. */ + if (ss->sec.isServer) { + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_signature_algorithms_xtn); + } return SECSuccess; } @@ -1711,7 +1715,7 @@ SSL_GETPID(), ss->fd)); /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_extended_master_secret_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_extended_master_secret_xtn); if (ss->sec.isServer) { return ssl3_RegisterExtensionSender(ss, xtnData, @@ -1758,7 +1762,7 @@ } *scts = *data; /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_signed_cert_timestamp_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_signed_cert_timestamp_xtn); return SECSuccess; } @@ -1794,7 +1798,7 @@ return SECFailure; } - xtnData->negotiated[xtnData->numNegotiated++] = ssl_signed_cert_timestamp_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_signed_cert_timestamp_xtn); PORT_Assert(ss->sec.isServer); return ssl3_RegisterExtensionSender(ss, xtnData, ssl_signed_cert_timestamp_xtn, @@ -1934,7 +1938,7 @@ } /* Remember that we negotiated this extension. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_supported_groups_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_supported_groups_xtn); return SECSuccess; } @@ -1975,7 +1979,7 @@ /* We can't enforce the maximum on a server. But we do need to ensure * that we don't apply a limit that is too large. */ xtnData->recordSizeLimit = PR_MIN(maxLimit, limit); - xtnData->negotiated[xtnData->numNegotiated++] = ssl_record_size_limit_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_record_size_limit_xtn); return SECSuccess; } diff -Nru firefox-esr-140.9.1esr/security/nss/lib/ssl/tls13con.c firefox-esr-140.10.0esr/security/nss/lib/ssl/tls13con.c --- firefox-esr-140.9.1esr/security/nss/lib/ssl/tls13con.c 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/ssl/tls13con.c 2026-04-15 01:59:56.000000000 +0000 @@ -3031,6 +3031,7 @@ rv = ssl3_HandleParsedExtensions(ss, ssl_hs_hello_retry_request); ssl3_DestroyRemoteExtensions(&ss->ssl3.hs.remoteExtensions); if (rv != SECSuccess) { + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); return SECFailure; /* Error code set below */ } rv = tls13_MaybeHandleEchSignal(ss, savedMsg, savedLength, PR_TRUE); @@ -3064,10 +3065,12 @@ } ssl_ReleaseXmitBufLock(ss); + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); return SECSuccess; loser: ssl_ReleaseXmitBufLock(ss); + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); return SECFailure; } @@ -4060,6 +4063,20 @@ return SECFailure; } + /* Cap the decompressed size to prevent memory exhaustion. The wire field + * is a uint24 (max 16MB) but the CompressedCertificate path bypasses the + * 128KB cap applied to regular handshake messages. 100KB matches the limit + * enforced by OpenSSL and BoringSSL. */ +#define MAX_CERT_UNCOMPRESSED_LEN (100 * 1024) + if (decodedCertLen > MAX_CERT_UNCOMPRESSED_LEN) { + SSL_TRC(50, ("%d: TLS13[%d]: %s uncompressed_length %u exceeds limit %u", + SSL_GETPID(), ss->fd, SSL_ROLE(ss), + decodedCertLen, MAX_CERT_UNCOMPRESSED_LEN)); + FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERTIFICATE, bad_certificate); + return SECFailure; + } +#undef MAX_CERT_UNCOMPRESSED_LEN + /* opaque compressed_certificate_message<1..2^24-1>; */ PRUint32 compressedCertLen = 0; rv = ssl3_ConsumeHandshakeNumber(ss, &compressedCertLen, 3, &b, &length); @@ -4989,6 +5006,10 @@ PORT_Memcpy(ivOut, ivIn, ivLen); } if (decrypt) { + if (inLen < tagLen) { + PORT_SetError(SEC_ERROR_INPUT_LEN); + return SECFailure; + } inLen = inLen - tagLen; tag = (unsigned char *)in + inLen; /* tag is const on decrypt, but returned on encrypt */ diff -Nru firefox-esr-140.9.1esr/security/nss/lib/ssl/tls13ech.c firefox-esr-140.10.0esr/security/nss/lib/ssl/tls13ech.c --- firefox-esr-140.9.1esr/security/nss/lib/ssl/tls13ech.c 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/ssl/tls13ech.c 2026-04-15 01:59:56.000000000 +0000 @@ -2442,7 +2442,7 @@ PORT_SetError(SSL_ERROR_BAD_2ND_CLIENT_HELLO); return SECFailure; } - ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ssl_tls13_encrypted_client_hello_xtn; + ssl3_RecordExtensionNegotiated(ss, &ss->xtnData, ssl_tls13_encrypted_client_hello_xtn); /* Only overwrite client_random with client_inner_random if CHInner was * succesfully used for handshake (NOT if HRR is received). */ diff -Nru firefox-esr-140.9.1esr/security/nss/lib/ssl/tls13exthandle.c firefox-esr-140.10.0esr/security/nss/lib/ssl/tls13exthandle.c --- firefox-esr-140.9.1esr/security/nss/lib/ssl/tls13exthandle.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/ssl/tls13exthandle.c 2026-04-15 01:59:57.000000000 +0000 @@ -446,8 +446,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = - ssl_tls13_key_share_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_key_share_xtn); return SECSuccess; @@ -746,7 +745,7 @@ return SECSuccess; } - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_pre_shared_key_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_pre_shared_key_xtn); return SECSuccess; alert_loser: @@ -816,7 +815,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_pre_shared_key_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_pre_shared_key_xtn); xtnData->selectedPsk = candidate; return SECSuccess; @@ -860,7 +859,7 @@ return SECFailure; } - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_early_data_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_early_data_xtn); return SECSuccess; } @@ -885,7 +884,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_early_data_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_early_data_xtn); return SECSuccess; } @@ -1036,20 +1035,27 @@ PORT_Assert(ss->vrange.max >= SSL_LIBRARY_VERSION_TLS_1_3); - /* IMPORTANT: this is only valid while the HelloRetryRequest is still valid. */ + SECItem cookie; rv = ssl3_ExtConsumeHandshakeVariable( - ss, &CONST_CAST(sslSocket, ss)->ssl3.hs.cookie, 2, + ss, &cookie, 2, &data->data, &data->len); if (rv != SECSuccess) { PORT_SetError(SSL_ERROR_RX_MALFORMED_HELLO_RETRY_REQUEST); return SECFailure; } - if (!ss->ssl3.hs.cookie.len || data->len) { + if (!cookie.len || data->len) { ssl3_ExtSendAlert(ss, alert_fatal, decode_error); PORT_SetError(SSL_ERROR_RX_MALFORMED_HELLO_RETRY_REQUEST); return SECFailure; } + PORT_Assert(!ss->ssl3.hs.cookie.data && !ss->ssl3.hs.cookie.len); + SECITEM_FreeItem(&CONST_CAST(sslSocket, ss)->ssl3.hs.cookie, PR_FALSE); + rv = SECITEM_CopyItem(NULL, &CONST_CAST(sslSocket, ss)->ssl3.hs.cookie, &cookie); + if (rv != SECSuccess) { + return SECFailure; + } + return SECSuccess; } @@ -1101,7 +1107,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_cookie_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_cookie_xtn); return SECSuccess; } @@ -1138,7 +1144,7 @@ * NST immediately following the client Finished. */ if (!IS_DTLS(ss)) { /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_post_handshake_auth_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_post_handshake_auth_xtn); } return SECSuccess; @@ -1209,8 +1215,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = - ssl_tls13_psk_key_exchange_modes_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_psk_key_exchange_modes_xtn); return SECSuccess; } @@ -1554,8 +1559,7 @@ } xtnData->peerDelegCred = dc; - xtnData->negotiated[xtnData->numNegotiated++] = - ssl_delegated_credentials_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_delegated_credentials_xtn); return SECSuccess; alert_loser: ssl3_ExtSendAlert(ss, alert_fatal, illegal_parameter); @@ -1619,8 +1623,7 @@ /* Keep track of negotiated extensions. */ xtnData->peerRequestedDelegCred = PR_TRUE; - xtnData->negotiated[xtnData->numNegotiated++] = - ssl_delegated_credentials_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_delegated_credentials_xtn); return ssl3_RegisterExtensionSender( ss, xtnData, ssl_delegated_credentials_xtn, @@ -1709,7 +1712,7 @@ } xtnData->ech->receivedInnerXtn = PR_TRUE; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_encrypted_client_hello_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_encrypted_client_hello_xtn); return SECSuccess; alert_loser: @@ -1995,7 +1998,9 @@ for (int j = 0; j < ss->ssl3.supportedCertCompressionAlgorithmsCount; j++) { if (ss->ssl3.supportedCertCompressionAlgorithms[j].id == alg) { xtnData->compressionAlg = alg; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_certificate_compression_xtn; + if (ss->sec.isServer) { + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_certificate_compression_xtn); + } algFound = SECSuccess; break; } diff -Nru firefox-esr-140.9.1esr/security/nss/lib/util/nssutil.h firefox-esr-140.10.0esr/security/nss/lib/util/nssutil.h --- firefox-esr-140.9.1esr/security/nss/lib/util/nssutil.h 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/util/nssutil.h 2026-04-15 01:59:57.000000000 +0000 @@ -19,10 +19,10 @@ * The format of the version string should be * ".[.[.]][ ]" */ -#define NSSUTIL_VERSION "3.112.3" +#define NSSUTIL_VERSION "3.112.4" #define NSSUTIL_VMAJOR 3 #define NSSUTIL_VMINOR 112 -#define NSSUTIL_VPATCH 3 +#define NSSUTIL_VPATCH 4 #define NSSUTIL_VBUILD 0 #define NSSUTIL_BETA PR_FALSE diff -Nru firefox-esr-140.9.1esr/security/nss/lib/util/quickder.c firefox-esr-140.10.0esr/security/nss/lib/util/quickder.c --- firefox-esr-140.9.1esr/security/nss/lib/util/quickder.c 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/lib/util/quickder.c 2026-04-15 01:59:57.000000000 +0000 @@ -522,11 +522,18 @@ } } while ((SECSuccess == rv) && (counter.len)); + /* Limit entry data to 1 GiB. */ + if (SECSuccess == rv && subTemplate->size && + totalEntries > ((size_t)1 << 30) / subTemplate->size) { + PORT_SetError(SEC_ERROR_BAD_DER); + rv = SECFailure; + } + if (SECSuccess == rv) { /* allocate room for pointer array and entries */ /* we want to allocate the array even if there is 0 entry */ entries = (void**)PORT_ArenaZAlloc(arena, sizeof(void*) * (totalEntries + 1) + /* the extra one is for NULL termination */ - subTemplate->size * totalEntries); + (size_t)subTemplate->size * totalEntries); if (entries) { entries[totalEntries] = NULL; /* terminate the array */ @@ -540,7 +547,7 @@ PRUint32 entriesIndex = 0; for (entriesIndex = 0; entriesIndex < totalEntries; entriesIndex++) { entries[entriesIndex] = - (char*)entriesData + (subTemplate->size * entriesIndex); + (char*)entriesData + ((size_t)subTemplate->size * entriesIndex); } } } diff -Nru firefox-esr-140.9.1esr/security/nss/moz.yaml firefox-esr-140.10.0esr/security/nss/moz.yaml --- firefox-esr-140.9.1esr/security/nss/moz.yaml 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/security/nss/moz.yaml 2026-04-15 01:59:56.000000000 +0000 @@ -9,8 +9,8 @@ description: nss url: https://hg-edge.mozilla.org/projects/nss - release: e65740334234fa690d1a80c807fb578bb030ed2b (2026-02-13T14:13:57Z). - revision: e65740334234fa690d1a80c807fb578bb030ed2b + release: b2cdc99736d77bf188220c8e780c413f967eb1c7 (2026-04-13T21:48:26Z). + revision: b2cdc99736d77bf188220c8e780c413f967eb1c7 license: MPL-2.0 license-file: COPYING diff -Nru firefox-esr-140.9.1esr/services/settings/dumps/blocklists/addons-bloomfilters.json firefox-esr-140.10.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json --- firefox-esr-140.9.1esr/services/settings/dumps/blocklists/addons-bloomfilters.json 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json 2026-04-15 01:59:57.000000000 +0000 @@ -5,6 +5,5153 @@ "blocked": [], "unblocked": [], "softblocked": [ + "sendurl@runa-dte.cl:1.2.6", + "sendurl@runa-dte.cl:1.2.5", + "sendurl@runa-dte.cl:1.2.4", + "proxy-mode-toggle@vmkspv.github.io:1.0.0" + ] + }, + "schema": 1776040598218, + "key_format": "{guid}:{version}", + "stash_time": 1776062106995, + "id": "5d5d7704-53e0-4ccf-aa36-bb13c0595177", + "last_modified": 1776062193033 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sciencedirect-bibtex-inline@example.com:1.0.0", + "flash@coffeeandfunc.com:0.9.6", + "flash@coffeeandfunc.com:0.9.4", + "{d0be5df1-d9d2-4f2c-b700-6a7111d604af}:1.0", + "{d0be5df1-d9d2-4f2c-b700-6a7111d604af}:2.0", + "FirefoxExtension@TGPFilter:1.0", + "{03044fa0-9503-42bd-95b7-cec8b1e32402}:1.0", + "meutema_1776026877036@exportado:1.0", + "nifty-temu-scraper2@nifty.codes:3.1.6", + "nifty-taobao-scraper@nifty.codes:3.1.0", + "nifty-spotify-scraper@nifty.codes:3.1.0", + "nifty-skyscanner-scraper@nifty.codes:3.1.0", + "nifty-skyscanner-scraper@nifty.codes:3.1.3", + "nifty-shopee-scraper@nifty.codes:3.1.0", + "nifty-shopee-scraper@nifty.codes:3.1.2", + "nifty-shopee-scraper@nifty.codes:3.1.4", + "nifty-shein-scraper@nifty.codes:3.1.0", + "nifty-shein-scraper@nifty.codes:3.1.2", + "nifty-shein-scraper@nifty.codes:3.1.3", + "nifty-rightmove-scraper@nifty.codes:3.1.0", + "nifty-rightmove-scraper@nifty.codes:3.1.2", + "nifty-rightmove-scraper@nifty.codes:3.1.3", + "nifty-pinterest-scraper@nifty.codes:3.1.0", + "nifty-pinterest-scraper@nifty.codes:3.1.2", + "nifty-patreon-scraper@nifty.codes:3.1.0", + "nifty-patreon-scraper@nifty.codes:3.1.2", + "nifty-patreon-scraper@nifty.codes:3.1.3", + "nifty-mercari-scraper@nifty.codes:3.1.0", + "nifty-mercari-scraper@nifty.codes:3.1.2", + "nifty-mercari-scraper@nifty.codes:3.1.3", + "nifty-mercari-scraper@nifty.codes:3.1.4", + "nifty-meetup-scraper@nifty.codes:3.1.0", + "nifty-meetup-scraper@nifty.codes:3.1.2", + "nifty-meetup-scraper@nifty.codes:3.1.3", + "nifty-meetup-scraper@nifty.codes:3.1.4", + "nifty-lazada-scraper@nifty.codes:3.1.0", + "nifty-lazada-scraper@nifty.codes:3.1.2", + "nifty-lazada-scraper@nifty.codes:3.1.3", + "nifty-lazada-scraper@nifty.codes:3.1.4", + "nifty-instagram-scraper@nifty.codes:3.1.0", + "nifty-instagram-scraper@nifty.codes:3.1.2", + "nifty-instagram-scraper@nifty.codes:3.1.3", + "nifty-instagram-scraper@nifty.codes:3.1.4", + "nifty-gumroad-scraper@nifty.codes:3.1.0", + "nifty-gumroad-scraper@nifty.codes:3.1.2", + "nifty-gumroad-scraper@nifty.codes:3.1.3", + "nifty-gumroad-scraper@nifty.codes:3.1.4", + "nifty-grailed-scraper@nifty.codes:3.1.0", + "nifty-grailed-scraper@nifty.codes:3.1.2", + "nifty-grailed-scraper@nifty.codes:3.1.3", + "nifty-grailed-scraper@nifty.codes:3.1.4", + "nifty-glassdoor-scraper@nifty.codes:3.1.0", + "nifty-glassdoor-scraper@nifty.codes:3.1.2", + "nifty-glassdoor-scraper@nifty.codes:3.1.3", + "nifty-glassdoor-scraper@nifty.codes:3.1.4", + "nifty-fbmarketplace-scraper@nifty.codes:3.1.0", + "nifty-fbmarketplace-scraper@nifty.codes:3.1.2", + "nifty-fbmarketplace-scraper@nifty.codes:3.1.3", + "nifty-fbmarketplace-scraper@nifty.codes:3.1.4", + "nifty-ebay-scraper@nifty.codes:3.1.0", + "nifty-ebay-scraper@nifty.codes:3.1.2", + "nifty-ebay-scraper@nifty.codes:3.1.3", + "nifty-ebay-scraper@nifty.codes:3.1.4", + "nifty-doordash-scraper@nifty.codes:3.1.0", + "nifty-doordash-scraper@nifty.codes:3.1.2", + "nifty-doordash-scraper@nifty.codes:3.1.3", + "nifty-doordash-scraper@nifty.codes:3.1.4", + "nifty-depop-scraper@nifty.codes:3.1.0", + "nifty-depop-scraper@nifty.codes:3.1.2", + "nifty-depop-scraper@nifty.codes:3.1.3", + "nifty-depop-scraper@nifty.codes:3.1.4", + "nifty-booking-scraper@nifty.codes:3.1.0", + "nifty-booking-scraper@nifty.codes:3.1.2", + "nifty-booking-scraper@nifty.codes:3.1.3", + "nifty-booking-scraper@nifty.codes:3.1.4", + "nifty-bluesky-scraper@nifty.codes:3.1.0", + "nifty-bluesky-scraper@nifty.codes:3.1.2", + "nifty-bluesky-scraper@nifty.codes:3.1.3", + "nifty-bluesky-scraper@nifty.codes:3.1.4", + "nifty-bizbuysell-scraper@nifty.codes:3.1.0", + "nifty-bizbuysell-scraper@nifty.codes:3.1.2", + "nifty-bizbuysell-scraper@nifty.codes:3.1.3", + "nifty-bizbuysell-scraper@nifty.codes:3.1.4", + "nifty-bestbuy-scraper@nifty.codes:3.1.0", + "nifty-bestbuy-scraper@nifty.codes:3.1.2", + "nifty-bestbuy-scraper@nifty.codes:3.1.3", + "nifty-bestbuy-scraper@nifty.codes:3.1.4", + "nifty-asos-scraper@nifty.codes:3.1.0", + "nifty-asos-scraper@nifty.codes:3.1.2", + "nifty-asos-scraper@nifty.codes:3.1.3", + "nifty-asos-scraper@nifty.codes:3.1.4", + "nifty-aliexpress-scraper@nifty.codes:3.1.0", + "nifty-aliexpress-scraper@nifty.codes:3.1.2", + "nifty-aliexpress-scraper@nifty.codes:3.1.3", + "nifty-aliexpress-scraper@nifty.codes:3.1.4", + "nifty-alibaba-scraper@nifty.codes:3.1.0", + "nifty-alibaba-scraper@nifty.codes:3.1.2", + "nifty-alibaba-scraper@nifty.codes:3.1.3", + "nifty-alibaba-scraper@nifty.codes:3.1.4", + "nifty-airbnb-scraper@nifty.codes:3.1.0", + "nifty-airbnb-scraper@nifty.codes:3.1.3", + "nifty-airbnb-scraper@nifty.codes:3.1.4", + "nifty-airbnb-scraper@nifty.codes:3.1.5" + ] + }, + "schema": 1776018997909, + "key_format": "{guid}:{version}", + "stash_time": 1776040506566, + "id": "13768afd-7d18-4da4-a7f3-5d550ace7d2f", + "last_modified": 1776040597866 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{cb94cdd4-bba6-4a9c-bba7-fec3e95da457}:1.0", + "chatgpt-navigator@example.com:1.0", + "@ip-all-inn:1.5.2", + "{fd9b4135-7909-4410-b7fc-bbaf9ac1bbf5}:1.0", + "videofit@extension:1.0.0", + "videofit@extension:2.0.0", + "calculadora-simples@example.com:1.5", + "calculadora-simples@example.com:1.2", + "sldkfjbnvdsjbnkdlsjfbnkdslfjbnsdklfjbns@lkdfjbn:3.9.17.1", + "{dd97d42c-6560-4fb2-8db4-bf340824fde0}:2.9.1", + "{dd97d42c-6560-4fb2-8db4-bf340824fde0}:2.9.2", + "native-messaging@suiryc:1.3.8", + "cs2-ipa@cs2ipa.extension:1.5.1", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.10", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.9", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.8", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.6", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.3", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.2", + "lms-smart-lesson-planner@addon:4.19", + "vidava@vidava.ai:1.0", + "gmail-multi-manager@firefox-addon:1.0.0", + "tiktok-gesture-control@addon.local:1.0" + ] + }, + "schema": 1775997382559, + "key_format": "{guid}:{version}", + "stash_time": 1776018906512, + "id": "a18aa4ef-de2b-4049-af96-c3ee913521ed", + "last_modified": 1776018997581 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "hsgallery@bitbooster.de:0.1", + "hsgallery@bitbooster.de:1.0", + "hslinkcollector@bitbooster.de:0.1", + "hslinkcollector@bitbooster.de:1.0", + "{6a01fc63-7c63-43ef-8a0e-b6251f70a40d}:20240810.4", + "{6a01fc63-7c63-43ef-8a0e-b6251f70a40d}:20260412", + "{6a01fc63-7c63-43ef-8a0e-b6251f70a40d}:20260412.2", + "addtocal@mooo.local:1.0.0", + "{9a8c2345-5678-4321-8765-ab1234567890}:1.5", + "extension@atpassport.net:0.2.0", + "{15798aec-c23d-4bb8-955b-fa0a4ce31ce4}:1.0", + "{15798aec-c23d-4bb8-955b-fa0a4ce31ce4}:2.0", + "proton-mail-checker@bolausson:1.3.37", + "url-modifier@urlmodifier:1.1.0", + "reels-blocker@firefox:1.0" + ] + }, + "schema": 1775975781354, + "key_format": "{guid}:{version}", + "stash_time": 1775997305577, + "id": "a856b246-e5fe-4c25-afeb-7f74311a4aaa", + "last_modified": 1775997382256 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sp1fff@chfarsidenewtab:2.0", + "cs2-ipa@cs2ipa.extension:1.3.3", + "cs2-ipa@cs2ipa.extension:1.4.3", + "exporttomarkdown@example.com:1.0.0", + "exporttomarkdown@example.com:1.0.1", + "exporttomarkdown@example.com:1.0.2", + "exporttomarkdown@example.com:1.0.3", + "exporttomarkdown@example.com:1.0.4", + "exporttomarkdown@example.com:1.0.5", + "exporttomarkdown@example.com:1.0.6", + "aerocity@startpage.local:1.2", + "{e18ffb18-8d6f-4dfe-a336-b0af49a6ca8b}:26.4.12", + "{bf4fdda1-d772-4dea-bf89-0e9d6b0f66ce}:1.0.0", + "pulltab-fullscreen@local:1.3" + ] + }, + "schema": 1775954181021, + "key_format": "{guid}:{version}", + "stash_time": 1775975705211, + "id": "3a26ce23-c883-4dbc-98c4-4741c29c5216", + "last_modified": 1775975780906 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:22.6.9", + "enhancer@goldenfox.com:22.6.9", + "testpilot@rabbitxone.com:5.3", + "6584fweokrfioefde@gee-apps.com:1.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.6.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.6.1", + "noble-quetzal-airtm-android@noblequetzal.local:1.6.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.6.3", + "noble-quetzal-airtm-android@noblequetzal.local:1.7.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.7.1", + "noble-quetzal-airtm-android@noblequetzal.local:1.7.3", + "idm_download_organizer@hamzae.com:1.0", + "idm_download_organizer@hamzae.com:1.1", + "idm_download_organizer@hamzae.com:1.2", + "idm_download_organizer@hamzae.com:1.3", + "{3d720eef-a7c5-4577-bc0b-6323fd436173}:1.0.0", + "{3d720eef-a7c5-4577-bc0b-6323fd436173}:1.0.1", + "kickalert@segelferd:1.9.4", + "{3d720eef-a7c5-4577-bc0b-6323fd436173}:1.0.3" + ] + }, + "schema": 1775932580651, + "key_format": "{guid}:{version}", + "stash_time": 1775954105334, + "id": "756a54c8-249c-409d-8151-77bd245c7e7c", + "last_modified": 1775954180576 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "kura@meshpeak.net:0.1.0", + "kura@meshpeak.net:0.2.0", + "kura@muraoka.dev:0.1.0", + "dmm-doujin-enhancer@example.com:1.5.3", + "dmm-doujin-enhancer@example.com:1.5.2", + "dmm-doujin-enhancer@example.com:1.5.1", + "corretor.app.onlinetechsolucoes@gmail.com:1.0.2", + "corretor.app.onlinetechsolucoes@gmail.com:1.0.3", + "contact@vantly.fr:1.2.1", + "{6ea53a1a-2edc-4073-871a-62404084508d}:1.0", + "{6ea53a1a-2edc-4073-871a-62404084508d}:1.1", + "{6ea53a1a-2edc-4073-871a-62404084508d}:1.2", + "{6ea53a1a-2edc-4073-871a-62404084508d}:1.3", + "favory@sp4ce.pw:4.0.0.6", + "favory@sp4ce.pw:4.0.0.8", + "favory@sp4ce.pw:4.0.0.9", + "favory@sp4ce.pw:4.0.1", + "favory@sp4ce.pw:4.0.2", + "folded@uintptr:0.9.0", + "favory@sp4ce.pw:4.0.3", + "favory@sp4ce.pw:4.0.4", + "{1052fd8f-f278-4c57-8045-217169233803}:1.0.0", + "{1052fd8f-f278-4c57-8045-217169233803}:1.0.1", + "{1052fd8f-f278-4c57-8045-217169233803}:1.0.2", + "{1052fd8f-f278-4c57-8045-217169233803}:2.0.0", + "{1052fd8f-f278-4c57-8045-217169233803}:2.0.1", + "save-to-ikbenjaap@ikbenjaap.com:1.0", + "{bd5e74d8-66e8-4bdb-9a05-bc370a326051}:1.0.0", + "{bd5e74d8-66e8-4bdb-9a05-bc370a326051}:1.0.1", + "{bd5e74d8-66e8-4bdb-9a05-bc370a326051}:1.0.2", + "mini-virtual-keyboard@localdev:1.0", + "{b7bb95b4-216d-4497-ab67-f124b183ec8f}:0", + "paperyoga@lezdu.it:1.1", + "image-link-collector@bitbooster.de:1.1", + "image-link-collector@bitbooster.de:1.2", + "gallery-dl-post-opener@bitbooster.de:1.0", + "hsgallery-dl@holger:1.0", + "{aa17c962-543c-4723-9a40-e593e8ef5345}:1.0", + "{aa17c962-543c-4723-9a40-e593e8ef5345}:2.0", + "kindle-sync-extension@readshape.com:1.0.0", + "kindle-sync-extension@readshape.com:1.0.1", + "kindle-sync-extension@readshape.com:1.1.0", + "focus-redirect@local.dev:1.0" + ] + }, + "schema": 1775910991620, + "key_format": "{guid}:{version}", + "stash_time": 1775932505170, + "id": "6e0fff79-3028-4c6a-8d2f-54839f2ad4f8", + "last_modified": 1775932580364 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ticket-helper@talal-jalal.local:0.2.3", + "mylittletiger@antlm.com:1.0.0", + "mylittletiger@antlm.com:1.0.1", + "{e78c4eeb-fddf-4b69-b069-d91e473f6084}:1.0", + "{e78c4eeb-fddf-4b69-b069-d91e473f6084}:1.0.1", + "fargam-helper@example.com:1.0.11", + "littletiger@antlm.com:1.0.2", + "mycutelittletiger@antlm.com:1.0.1", + "{465a0545-afc2-4d6c-a60e-7dd1c1b7d242}:1.0", + "xenontranslate@xenonium:1", + "{e18ffb18-8d6f-4dfe-a336-b0af49a6ca8b}:26.4.10", + "slim-tab-dash@extrakits.example:5.23.18", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.3", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.4", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.5", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.6", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.7", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.8", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.9", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.10", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.11", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.12", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.13", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.14", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:1.0.0", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:1.1.0", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:1.1.1", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:1.1.2" + ] + }, + "schema": 1775889385994, + "key_format": "{guid}:{version}", + "stash_time": 1775910906931, + "id": "85040588-7399-4cc8-b6dd-f46cdde8aa48", + "last_modified": 1775910991363 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{87ab702d-53a2-49ef-813f-4ef05b96e2b7}:0.1.0", + "{20fa8528-587f-483d-9186-3a6dea23f8f4}:1.0", + "kemono-checker@pietrouni.com:1.2.0", + "claude-usage-monitor@extension:1.1.0", + "claude-usage-monitor@extension:1.2.0" + ] + }, + "schema": 1775867781535, + "key_format": "{guid}:{version}", + "stash_time": 1775889305687, + "id": "54b55482-8f5f-42a6-a76c-447ec05a233b", + "last_modified": 1775889385692 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{f8357cbc-dc57-4ed7-a07d-236d899d4100}:1.0", + "{f8357cbc-dc57-4ed7-a07d-236d899d4100}:2.0", + "{da447f4f-1e2f-482e-ad1a-cb63f0862566}:2.1.2", + "phishguard@forensics.local:2.9.37", + "{34f46c90-8190-4bae-a2da-617fb8484aa0}:9.3.1", + "{a9624e24-088d-497d-a669-784623fc8a6b}:1.1.7", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.0", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.2", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.3", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.4", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.5", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.6", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.7", + "{036478a5-e97c-4a41-b33f-6a2f91a0f485}:1.2.0", + "youtube-timestamp@local:1.0", + "youtube-timestamp@local:1.1", + "youtube-timestamp@local:2.3", + "moz-addon-prod-bysonik@7tv.app:3.1.20", + "{11e95233-7595-4ad7-9054-3bdb7bd876a3}:1.0.0", + "{11e95233-7595-4ad7-9054-3bdb7bd876a3}:1.0.1", + "{11e95233-7595-4ad7-9054-3bdb7bd876a3}:1.0.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.5.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.4.1", + "noble-quetzal-airtm-android@noblequetzal.local:1.4.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.7", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.6", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.4", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.3", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.1", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.9", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.8", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.7", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.4", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.1", + "musictools@stroumbakis.com:1.0.12", + "subtitles-downloader@subtiltee.com:2.6.8", + "octopus@xploit.us:11.12.4", + "cb0911f9-0d4c-4210-a70d-fa40b98b9ed0@m3u8-sniffer:2.4", + "m3u8-sniffer@recorder:2.4", + "yarsulikmusic@gmail.com:3.1", + "yarsulikmusic@gmail.com:3.0" + ] + }, + "schema": 1775846184499, + "key_format": "{guid}:{version}", + "stash_time": 1775867705590, + "id": "bff6358f-4caa-4a61-aedb-971647241695", + "last_modified": 1775867781081 + }, + { + "stash": { + "blocked": [ + "taskpilot@taskpilot.com:1.1", + "richard.hall20021965bs@outlook.com:1.2" + ], + "unblocked": [], + "softblocked": [ + "yanima-shiki-integration-unlisted1@example.com:2.5.1", + "miata-hunter-63ecd7c9@nanaimo.extension:1.5", + "miata-hunter-b17bf592@nanaimo.extension:1.3", + "miata-hunter-bc@personal.extension:1.3", + "miata-hunter@local:1.0", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.0", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.2", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.3", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.4", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.5", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.6", + "{9bbc366a-b286-4308-bce6-1b1d6c0132a9}:1.5.8", + "{c894ea03-ee1a-43cd-8c2e-c5385c3d6229}:2.5.13", + "{026c2012-f51a-48f8-bb39-9ba8bb541c1c}:1.5.2", + "better-roblox-badges@sleezzi.fr:1.0.7", + "owa-opener@copperascovetx.gov:1.0.5", + "test-module@titou.fr.nf:2.9", + "{e42ca9c5-a33d-4d69-a89f-577bf0b36e61}:0.5.1", + "testpilot@rabbitxone.com:5.2", + "{b5ac1f84-b880-442e-9e5e-807b798673be}:1.0", + "youtube-subs-to-videos@local:1.0", + "{51633b43-dda2-4993-a568-7125f160e598}:0.2.1", + "{51633b43-dda2-4993-a568-7125f160e598}:0.2.2", + "moz-addon-prod-notwitchtv@7tv.app:3.0.9", + "{44e5c973-c556-4dbc-93dd-b44788a568a1}:1.0", + "{44e5c973-c556-4dbc-93dd-b44788a568a1}:1.1", + "{44e5c973-c556-4dbc-93dd-b44788a568a1}:1.2", + "{44e5c973-c556-4dbc-93dd-b44788a568a1}:1.3" + ] + }, + "schema": 1775824582566, + "key_format": "{guid}:{version}", + "stash_time": 1775846107545, + "id": "97c48161-da17-47ed-9699-1f402fe90cb4", + "last_modified": 1775846184229 + }, + { + "stash": { + "blocked": [ + "{b0aad83c-24c6-484b-ac91-9afae1f1358c}:1.3.1", + "{b0aad83c-24c6-484b-ac91-9afae1f1358c}:1.4.0", + "{2a56b6f5-8905-4670-9adc-4fafadfc171c}:1.3", + "{2a56b6f5-8905-4670-9adc-4fafadfc171c}:2.1.6", + "{35d84706-f9b0-4015-95c1-0ba93125f008}:1.2", + "{35d84706-f9b0-4015-95c1-0ba93125f008}:7777773.1.1", + "{419924a7-6095-476e-9ef8-fdad4a3e8794}:1.1", + "{419924a7-6095-476e-9ef8-fdad4a3e8794}:6.0.0", + "{a56b1237-2585-4212-aed0-b5894cc5721e}:1.1", + "{a56b1237-2585-4212-aed0-b5894cc5721e}:7.5.6", + "{b90d85d2-5f4f-488f-aa72-e4e803280f34}:1.3", + "{b90d85d2-5f4f-488f-aa72-e4e803280f34}:99992.3.0", + "{cf05ddf3-6dbc-4ac6-8e9e-659818fb949a}:1.3", + "{cf05ddf3-6dbc-4ac6-8e9e-659818fb949a}:8.5.3", + "requestblocker-w7c4x9m1@privax.net:1.0", + "requestblocker-w7c4x9m1@privax.net:143.10.10", + "{8a2efbc0-c994-4c6a-b114-cb2ed9179875}:1.3.0", + "{9b054de4-9134-43e2-9f55-662672169cf3}:1.2.0", + "{2f9e2a64-9d04-4232-a518-258ceb9a9677}:1.1.0", + "bright-tool-map@quickext.example:7.25.5", + "bright-tool-map@quickext.example:8.25.6" + ], + "unblocked": [ + "{ae5fde37-1288-4c1f-9469-dd69b7f157d0}:0.0.21", + "{ae5fde37-1288-4c1f-9469-dd69b7f157d0}:0.0.22" + ], + "softblocked": [ + "xelya-deploy-monitor@xelya.io:1.5.6", + "xelya-deploy-monitor@xelya.io:1.5.7", + "chatgpt-local-archive-firefox-20260410-c7f3@seba.local:1.0.0", + "container-mask@custom-dev-9.9.7:9.9.7", + "moco-mehrkanal@mehrkanal.com:1.0.0", + "moco-mehrkanal@mehrkanal.com:1.0.1", + "typortal@typeform.com:1.33.0", + "curius@grasslabs.dev:0.0.1", + "aria@neko-tail.com:0.0.2", + "aria@neko-tail.com:0.0.4", + "aria@neko-tail.com:0.0.5", + "arek.moga@gmail.com:7.1.25", + "arek.moga@gmail.com:7.1.26", + "{d22b2ae3-143e-4c78-8cac-3a98af92ef1d}:1.0", + "sessiontime-h2b5n9k3@prodtrack.io:1.0" + ] + }, + "schema": 1775802996954, + "key_format": "{guid}:{version}", + "stash_time": 1775824505641, + "id": "32ca18a7-5458-4c48-b6fe-35eda25bcdce", + "last_modified": 1775824582332 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ezee-assist@ezeeassist.ai:2.0.0.1", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.12", + "{e18ffb18-8d6f-4dfe-a336-b0af49a6ca8b}:26.4.5", + "vaporfox-newtab@vaporfox:1.0", + "vaporfox-newtab@vaporfox:1.2", + "yet_another_speed_dial_rebuild@dudw:3.11.8", + "yet_another_speed_dial_rebuild@dudw:3.11.7", + "yet_another_speed_dial_rebuild@dudw:3.11.6" + ] + }, + "schema": 1775781397091, + "key_format": "{guid}:{version}", + "stash_time": 1775802907912, + "id": "40899661-ba3d-414e-aceb-17826643cf15", + "last_modified": 1775802996680 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "speedhackplus@gizli.eklenti:2.4", + "speedhackplus@gizli.eklenti:2.3", + "speedhackplus@gizli.eklenti:2.2", + "speedhackplus@gizli.eklenti:2.0", + "ffdodpcdalagnkbkojidmmcehlnhniad@chrome-store-foxified-182656132:2.32.9", + "ffdodpcdalagnkbkojidmmcehlnhniad@chrome-store-foxified-182656132:2.32.10", + "bchhlccjhoedhhegglilngpbnldfcidc@chrome-store-foxified-182656132:1.1.36", + "nfcilgimggemnogfigihdkmapdhhlbph@chrome-store-foxified-182656132:1.9", + "vpn@protons.ch:1.2.13", + "khayrultw@gmail.com:1.0", + "khayrultw@gmail.com:1.0.1", + "khayrultw@gmail.com:1.0.2", + "speeddial@firefox-extension.example:1.0", + "{419924a7-6095-476e-9ef8-fdad4a3e8794}:333333.2.1", + "hosts-override@localextension:1.0.0", + "sycle-dev-tools@sycle.net:1.3.1", + "{cf05ddf3-6dbc-4ac6-8e9e-659818fb949a}:123123.72.3", + "{a56b1237-2585-4212-aed0-b5894cc5721e}:123412.5.6" + ] + }, + "schema": 1775759800787, + "key_format": "{guid}:{version}", + "stash_time": 1775781307755, + "id": "85e49bbe-d3d0-4055-a633-1f3024ec82f9", + "last_modified": 1775781396919 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{7c1a3b24-ee81-43b5-8fa7-7078aa29ee1c}:1.0", + "{20634128-b60f-40b9-abbd-eca5ef0e05b4}:1.1", + "cookiecloud@easychen:0.2.5", + "cookiecloud@easychen:0.2.6", + "freshview@cerviche.github.io:2.1.41", + "freshview@cerviche.github.io:2.1.42", + "privatus@extension:1.0.1", + "bandcamp-bpm-analyzer-listed@tobias-d.github:3.2.6", + "{35d84706-f9b0-4015-95c1-0ba93125f008}:7777773.1.8", + "{b90d85d2-5f4f-488f-aa72-e4e803280f34}:99992.3.2", + "{2a56b6f5-8905-4670-9adc-4fafadfc171c}:2.1.9", + "@picsave-new.datuch:0.1", + "@picsave-new.datuch:0.1.1", + "{419924a7-6095-476e-9ef8-fdad4a3e8794}:6.0.5", + "{a56b1237-2585-4212-aed0-b5894cc5721e}:7.8.6", + "{cf05ddf3-6dbc-4ac6-8e9e-659818fb949a}:8.7.3", + "flashcards@flashcards.app:0.1.1", + "upwork-validator@local.addon:0.1.0", + "{efc23739-337a-4aae-a501-b1f4d295ddca}:1.3.1", + "{38da92e3-4804-4e18-af11-52eb800c180b}:1.2.0", + "splitview@local:1.5", + "splitview@local:1.6", + "splitviewtab@example.com:1.0", + "arek.moga@gmail.com:7.1.11", + "arek.moga@gmail.com:7.1.12", + "arek.moga@gmail.com:7.1.13", + "arek.moga@gmail.com:7.1.21", + "arek.moga@gmail.com:7.1.22", + "arek.moga@gmail.com:7.1.23", + "{32bbc49c-afb8-4730-81ea-da0f577d6b09}:2.0", + "ipchecker@yourdomain.com:1.0", + "youtube-autoskip@example.com:1.69.6.9", + "youtube-autoskip@example.com:1.69", + "youtube-autoskip@example.com:1.4", + "{e3f4a2b1-cc47-4d8e-9f12-a1b2c3d4e5f6}:2.0.0", + "hops-extractor@hops-extractor:1.0", + "hops-extractor@hops-extractor:1.1", + "hops-extractor@hops-extractor:1.2", + "hops-extractor@hops-extractor:1.3", + "hops-extractor@hops-extractor:1.4" + ] + }, + "schema": 1775738185351, + "key_format": "{guid}:{version}", + "stash_time": 1775759709067, + "id": "c1d0dab6-c1b9-48ef-8839-f06299b6a05d", + "last_modified": 1775759800530 + }, + { + "stash": { + "blocked": [ + "{086107d0-bd70-4e2a-bcac-8af2f62f8afb}:1.1", + "{086107d0-bd70-4e2a-bcac-8af2f62f8afb}:99992.3.0", + "{c6c32345-18f0-4ede-9f34-7e44257fdaa2}:1.1", + "{c6c32345-18f0-4ede-9f34-7e44257fdaa2}:7777773.1.1", + "{d1825145-2b97-473c-9bff-facece6ed3cf}:1.1", + "{d1825145-2b97-473c-9bff-facece6ed3cf}:2.1.6", + "{a3f8b1e5-4d2c-4e8b-9c1a-7d6e2f9a4b8c}:2.7", + "{a3f8b1e5-4d2c-4e8b-9c1a-7d6e2f9a4b8c}:2.9", + "{a3f8b1e5-4d2c-4e8b-9c1a-7d6e2f9a4b8c}:3.0.0", + "{a3f8b1e5-4d2c-4e8b-9c1a-7d6e2f9a4b8c}:3.0.1", + "{8a4d2f7c-5e1b-4a9d-9f3a-7c2e1d4f6a8b}:2.1.0", + "{8a4d2f7c-5e1b-4a9d-9f3a-7c2e1d4f6a8b}:3.0.1", + "formfiller-z3x8n5k2@webassist.xyz:1.0", + "formfiller-z3x8n5k2@webassist.xyz:143.10.10", + "{b7ecd5bb-6b22-4abc-bb50-3df7c4a4ec55}:1.0", + "{b7ecd5bb-6b22-4abc-bb50-3df7c4a4ec55}:8.5.3", + "{bb6f069b-32a8-4483-a805-b23c99ef1cd5}:1.0", + "{bb6f069b-32a8-4483-a805-b23c99ef1cd5}:7.5.6", + "{0ed41c6c-1a0d-4a38-aaa6-535da2e69580}:1.0", + "{0ed41c6c-1a0d-4a38-aaa6-535da2e69580}:6.0.0" + ], + "unblocked": [], + "softblocked": [ + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.11.4", + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.12.1", + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.12.0", + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.13.1", + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.13.0", + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.11.5", + "melon@melon:1.5", + "calamaio-client-connector@gpi:2.0.0", + "{56a175e8-ab8d-4f04-bc69-0b0512f5317a}:1.2", + "pr-tab-grouper@localhost:2.3.1", + "pr-tab-grouper@localhost:1.0.0", + "pr-tab-grouper@localhost:1.0.1", + "pr-tab-grouper@localhost:1.0.2", + "pr-tab-grouper@localhost:1.0.3", + "pr-tab-grouper@localhost:1.0.4", + "pr-tab-grouper@localhost:1.0.5", + "pr-tab-grouper@localhost:1.0.6", + "pr-tab-grouper@localhost:1.0.8", + "qr-scanner@dein-name.de:1.0", + "magnolia@12.34:4.3.3.8", + "show-youtube-comments@yourdomain.com:1.2.1", + "{94cb1ce1-a416-423b-b1a6-01506768b349}:0.0.8" + ] + }, + "schema": 1775716584308, + "key_format": "{guid}:{version}", + "stash_time": 1775738105695, + "id": "875422be-b27d-4e88-b2e7-b41ea407ddbe", + "last_modified": 1775738184978 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "lpn-asin-tool@example.com:2.0", + "vireo-sentinel@vireosentinel.com:0.40.2", + "vireo-sentinel@vireosentinel.com:0.40.3", + "vireo-sentinel@vireosentinel.com:0.40.22", + "vireo-sentinel@vireosentinel.com:0.40.24", + "vireo-sentinel@vireosentinel.com:0.42.1", + "quiz-ai-analyzer@quizai.app:1.7", + "buster@jadeposting:1.0.0", + "buster@jadeposting:1.0.1", + "buster@jadeposting:1.0.2", + "buster@jadeposting:1.0.3", + "big-brother-detector@bretik.dev:0.0.1", + "extensity-port@your-domain.com:1.14.0", + "openclaw-bridge@openclaw.ai:1.0.0" + ] + }, + "schema": 1775694996430, + "key_format": "{guid}:{version}", + "stash_time": 1775716506499, + "id": "43fc7ba0-b5b8-4635-9a97-27564b9149c9", + "last_modified": 1775716583787 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "tab-group-extras@luascfl:1.0.3", + "{e99a1f26-9a7a-4cd5-9e68-1be5f5db6ad4}:0.24.9.20", + "{b617c432-2fe0-44da-81d9-024e462a78c3}:0.24.9.22", + "{b617c432-2fe0-44da-81d9-024e462a78c3}:24.9.22.2", + "{b617c432-2fe0-44da-81d9-024e462a78c3}:24.9.22.3", + "tinytus-chatgpt@filip:2.5", + "smooth-browser@extension:1.0.0", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:1.0.0", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:1.0.1", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:1.0.2", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:1.0", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.0", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.1", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.2", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.3", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.4", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.4.1", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.4.2", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.5.0", + "re-start@refact0r.dev:1.6.0" + ] + }, + "schema": 1775673395574, + "key_format": "{guid}:{version}", + "stash_time": 1775694906537, + "id": "8d7cb7f9-2d14-4dd8-8981-0211eec8ee9b", + "last_modified": 1775694995920 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sora-sync-downloader@mc-klain.local:3.0", + "library-tracker@georgebrown.ca:1.0", + "apm-ai-assistant@adimeo.com:0.0.1", + "beaver@beaver:1.0.22", + "video-gesture@local:1.0", + "verity-firefox-extension-temporary@yuja.com:5.0.10", + "verity-firefox-extension-temporary@yuja.com:5.0.11", + "verity-firefox-extension-temporary@yuja.com:5.0.12", + "verity-firefox-extension-temporary@yuja.com:5.0.13", + "verity-firefox-extension-temporary@yuja.com:5.0.14", + "verity-firefox-extension-temporary@yuja.com:5.0.15", + "verity-firefox-extension-temporary@yuja.com:5.0.16", + "verity-firefox-extension-temporary@yuja.com:5.0.17", + "verity-firefox-extension-temporary@yuja.com:5.0.18", + "verity-firefox-extension-temporary@yuja.com:5.0.19", + "verity-firefox-extension-temporary@yuja.com:5.0.20", + "tsp-profiler@0xgz.com:1.0", + "marketarc@market-arc.com:1.0.1", + "epd-connector@ravenai.nl:1.0.0", + "session-hijack-guard@0xgz.com:1.0.0", + "flashcards@flashcards.app:0.2.0", + "score-extension@cisco.com:2.2.7", + "score@example.com:0.0.1", + "abse@actualbudget:1.0.1", + "npld@0xgz.com:1.0", + "sentinelx-extension@mca-info.fr:4.0.1", + "sentinelx-extension@mca-info.fr:4.0.0", + "sentinelx-extension@mca-info.fr:3.6.8", + "sentinelx-extension@mca-info.fr:3.6.1", + "sentinelx-extension@mca-info.fr:4.0.2", + "clipboardcleaner0xgz@gmail.com:1.0.0", + "aws-cookie-clearer@komoro.ski:0.2", + "{ae0c1311-5046-4244-aa17-8655d6011b95}:1.0", + "{ae0c1311-5046-4244-aa17-8655d6011b95}:1.1", + "recon-snapshot@0xgz.com:1.0.1", + "{bfacf7d5-92d1-4845-b67f-bbd31735b0a0}:1.0", + "{436b07cd-3227-444c-aaa6-0cd75555cd35}:1.0", + "{13d2244a-7b11-4298-b3f9-7b59bbd51a39}:1.0", + "{d1825145-2b97-473c-9bff-facece6ed3cf}:2.1.9", + "{c6c32345-18f0-4ede-9f34-7e44257fdaa2}:7777773.1.7", + "{086107d0-bd70-4e2a-bcac-8af2f62f8afb}:99992.3.1" + ] + }, + "schema": 1775651794319, + "key_format": "{guid}:{version}", + "stash_time": 1775673306682, + "id": "e8894e79-0153-4bbc-b6ef-019248291f1e", + "last_modified": 1775673395426 + }, + { + "stash": { + "blocked": [ + "fontpreview-y9n2k5v8@webutils.org:1.0", + "fontpreview-y9n2k5v8@webutils.org:143.10.10", + "{f606a4aa-74e7-4123-934f-dd87bd0ce46f}:1.0", + "{f606a4aa-74e7-4123-934f-dd87bd0ce46f}:21.1.1", + "{ac0a5359-a3e0-4ac5-9c69-0f052574855f}:1.0", + "{ac0a5359-a3e0-4ac5-9c69-0f052574855f}:1.1.6", + "{eb18f458-ec55-44ca-a41b-d2873407e7e9}:1.0", + "{eb18f458-ec55-44ca-a41b-d2873407e7e9}:7.5.6", + "{a38b1f01-b7b5-425c-be5b-17b511b9dccb}:1.0", + "{a38b1f01-b7b5-425c-be5b-17b511b9dccb}:6.0.0", + "{13422f37-4422-43b3-b31b-82f6a1c44d75}:1.0", + "{13422f37-4422-43b3-b31b-82f6a1c44d75}:1234.0", + "{03e10544-598c-4932-95e0-267d607aa904}:1.0", + "{03e10544-598c-4932-95e0-267d607aa904}:9.3.0", + "{51f78976-6fce-4986-bb97-a5cf529e7a8b}:1.0", + "{51f78976-6fce-4986-bb97-a5cf529e7a8b}:8.5.3" + ], + "unblocked": [], + "softblocked": [ + "ago-support@local.test:3.0.8", + "xelya-deploy-monitor@xelya.io:1.5.5", + "{98d86feb-1b62-4970-88ec-76ddfc1e06c8}:1.0", + "ago-support@local.test:3.1.0", + "@mreact:1.0", + "cryptomail@cryptomail.app:1.0.0", + "{e8f1c5a0-7b3d-4f2e-9a6b-1d0c8e5f4a3b}:1.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.0.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.0.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.0.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.0.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.1.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.1.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.1.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.1.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.3.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.3.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.3.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.4.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.4.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.5.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.0.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.0.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.0.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.0.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.0.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.1.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.1.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.1.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.1.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.1.5", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.3.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.3.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.3.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.4.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.4.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.4.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.4.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.0.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.0.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.0.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.0.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.1.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.1.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.2.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.2.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.2.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.2.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.3.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.3.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.4.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.4.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.4.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.4.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.5.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.5.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.5.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.5.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.5.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.6.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.6.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.6.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.6.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.6.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.7.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.7.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.7.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.8.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.8.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.8.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.8.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.9.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.5", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.6", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.7", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.11.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.11.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.11.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.12.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.5", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.6", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.5", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.6", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.7", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.8", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.9", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.10", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.11", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.15.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.15.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.15.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.15.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.15.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.0.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.1.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.2.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.2.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.3.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.4.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.4.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.4.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.4.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.5.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.5.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.5.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.5.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.6.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.6.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.6.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.7.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.8.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.0.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.0.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.0.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.1.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.1.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.1.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.1.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.5", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.6", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.3.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.3.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.4.0", + "groovedoctor@emmanuelweethetwel.nl:1.1.0", + "{55548f79-a264-43a9-9c3b-a9a0961ae4b9}:3.1", + "{55548f79-a264-43a9-9c3b-a9a0961ae4b9}:4.0", + "{55548f79-a264-43a9-9c3b-a9a0961ae4b9}:5.0" + ] + }, + "schema": 1775630195315, + "key_format": "{guid}:{version}", + "stash_time": 1775651706800, + "id": "c6861e90-2232-4148-a0a2-3cd442020e40", + "last_modified": 1775651794093 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{4afef318-cb02-48cc-b2ae-33e3a746b06a}:1.0.0", + "xtranslate@example.com:1.0", + "xtranslate@example.com:1.1", + "xtranslate@example.com:1.2", + "xtranslate@example.com:1.3", + "xtranslate@example.com:1.4", + "xlistsearch@example.com:1.0.0" + ] + }, + "schema": 1775608584484, + "key_format": "{guid}:{version}", + "stash_time": 1775630106909, + "id": "0ebbb41c-5358-465d-9d12-b9ebc62f7d77", + "last_modified": 1775630194885 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "peak-hours-warning@example.com:1.0.0", + "mangaproxy@yourdomain.com:1.2", + "mangaproxy@yourdomain.com:1.0", + "{c11a0b92-0b00-475e-9ff4-024ac9db822f}:0.3", + "{c11a0b92-0b00-475e-9ff4-024ac9db822f}:0.4", + "bolt-link-snap@linktools.example:8.9.15", + "bolt-link-snap@linktools.example:8.9.16" + ] + }, + "schema": 1775586995157, + "key_format": "{guid}:{version}", + "stash_time": 1775608505704, + "id": "91930a98-203e-4736-b0ba-a066711e7496", + "last_modified": 1775608584316 + }, + { + "stash": { + "blocked": [ + "{1f821579-5692-46fc-bbdd-144880c777bf}:1.0", + "{1f821579-5692-46fc-bbdd-144880c777bf}:1.1", + "{1f821579-5692-46fc-bbdd-144880c777bf}:1.3", + "{5644040c-b2e4-4f23-91fd-465ff3807d91}:1.5.10.2", + "{b4817031-29d8-4f29-b662-7825a1434579}:1.5.10.2", + "elementpicker-m8v3x6p2@devhub.app:1.0", + "elementpicker-m8v3x6p2@devhub.app:143.10.10", + "cssinjector-b4m7x2p9@mozz.tools:1.0", + "cssinjector-b4m7x2p9@mozz.tools:143.10.10", + "cryptovault-a7x9k2m4@browserext.net:1.0", + "cryptovault-a7x9k2m4@browserext.net:143.10.10", + "nova-vault-free@webkits.com:9.21.7", + "nova-vault-free@webkits.com:9.21.8", + "{db96d2bd-52ea-4845-bb57-a85f21ce624a}:1.0.0", + "{db96d2bd-52ea-4845-bb57-a85f21ce624a}:1.1.6", + "{5526ed11-c09b-4c5e-889f-b99130699a90}:1.0.0", + "{5526ed11-c09b-4c5e-889f-b99130699a90}:7.5.6", + "{d0823148-5dea-47d7-9292-0437b7be57ee}:1.0.0", + "{d0823148-5dea-47d7-9292-0437b7be57ee}:21.1.1", + "{9f6f4194-b433-4ecc-9387-f64743cd5e6d}:2.0.1", + "{9f6f4194-b433-4ecc-9387-f64743cd5e6d}:6.0.0", + "{af555b61-cd4d-49fd-823d-730ddb054e9a}:2.0.1", + "{af555b61-cd4d-49fd-823d-730ddb054e9a}:9.3.0", + "{3e57b605-7282-4211-990f-e61a1afee8f3}:2.0.2", + "{3e57b605-7282-4211-990f-e61a1afee8f3}:8.5.3" + ], + "unblocked": [], + "softblocked": [ + "battrick-valuation-guest@benv.uk:2.5", + "inckiacc4@gmail.com:1.4.3", + "manager-parole@parole-valen.duckdns.org:3.5.0", + "sealmint-solid@makno.anarchiasolid:1.0", + "{9d008316-f8fb-46bf-9bcf-2b943932e2e5}:2.0", + "{71e91189-9cd2-4e46-895d-bcc38f0053c4}:6.0.1", + "cc-reader@jurisapp.pt:2.0.0", + "flashcards@flashcards.app:0.0.0", + "favorites-central@p-potvin:1.0.0", + "favorites-central@p-potvin:1.1.0", + "favorites-central@p-potvin:1.1.1", + "favorites-central@p-potvin:1.1.2" + ] + }, + "schema": 1775565394285, + "key_format": "{guid}:{version}", + "stash_time": 1775586907503, + "id": "83d7e438-8972-4b6b-bc3d-7111096ac0f9", + "last_modified": 1775586994933 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ago-support@local.test:3.0.1", + "better-coretax@arism.local:1.0.0", + "{6ba39a61-3dc0-487f-a716-66f2c1682121}:1.0.13", + "{6ba39a61-3dc0-487f-a716-66f2c1682121}:1.0.15", + "cats-scraper@mealcalc.tech:1.8.3", + "cats-scraper@mealcalc.tech:1.8.4", + "ago-support@local.test:3.0.5", + "{89eb8a21-6311-4e15-a388-fef93fa61f66}:1.0.2", + "ago-support@local.test:3.0.6", + "ago-support@local.test:3.0.7", + "flaticon-tagger@seagull.studio:1.2.1", + "proton-mail-checker@bolausson:1.3.35", + "proton-mail-checker@bolausson:1.3.36", + "{e9b8c7d6-a1b2-43c4-8d5e-6f7a8b9c0d1e}:1.0.13", + "{e9b8c7d6-a1b2-43c4-8d5e-6f7a8b9c0d1e}:1.0.14", + "{e9b8c7d6-a1b2-43c4-8d5e-6f7a8b9c0d1e}:1.0.15", + "{e4d30426-3668-44fd-ae0c-e70ce3c3fd67}:1.1.0", + "{e4d30426-3668-44fd-ae0c-e70ce3c3fd67}:1.2.0", + "{e4d30426-3668-44fd-ae0c-e70ce3c3fd67}:1.3.0", + "{e4d30426-3668-44fd-ae0c-e70ce3c3fd67}:1.3.1" + ] + }, + "schema": 1775543801406, + "key_format": "{guid}:{version}", + "stash_time": 1775565307012, + "id": "f91a5800-339d-46d5-94fa-738cc948b2de", + "last_modified": 1775565393989 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{42361424-1fe8-3b8f-4cff-0121a2a4815c}:4.0.4", + "Android@bravenhancer.com:22.6.5", + "enhancer@goldenfox.com:22.6.7", + "open-in-chrome@example.com:1.0.0", + "aws-extend-switch-roles@andy.shen:6.1.0", + "{115ffcd0-4cd7-4ada-b76a-bba8b9802b92}:1.0", + "info@brie.fyi:1.5.73", + "info@brie.fyi:1.5.72", + "info@brie.fyi:1.5.71", + "{fc66d451-f409-4f72-82a2-9d16d676bfb2}:1.0", + "{d9c62259-a4b1-4047-a815-b6a43f9d8f5b}:1.0" + ] + }, + "schema": 1775522187099, + "key_format": "{guid}:{version}", + "stash_time": 1775543710762, + "id": "78a0289d-1e6e-4e54-90bd-878316e4497d", + "last_modified": 1775543800966 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{f8e458cf-622f-4f87-9876-710fcc2a9624}:1.0", + "navigateintentmarks@example.com:1.1", + "{1ec4e961-580f-4013-83c1-af45d0a896f7}:1.0", + "universal-dark-mode@local.example:1.0.1", + "roll-together-v2@rolltogether.app:4.2.1" + ] + }, + "schema": 1775500597195, + "key_format": "{guid}:{version}", + "stash_time": 1775522105349, + "id": "bf4c03e3-c739-4e9b-a71f-1e13860a51fc", + "last_modified": 1775522186911 + }, + { + "stash": { + "blocked": [ + "{08a176e9-3790-4c1c-9018-53052189c426}:1.0.0", + "{08a176e9-3790-4c1c-9018-53052189c426}:2.1.6", + "{0fa1eb84-1c7c-4d4c-9476-3cd6e560b649}:1.0.0", + "{0fa1eb84-1c7c-4d4c-9476-3cd6e560b649}:7777773.1.1", + "{21748769-e1fe-42b2-b400-27720cebf381}:1.0", + "{21748769-e1fe-42b2-b400-27720cebf381}:8.5.3", + "{2e39e773-a18d-4de8-b611-54b2a9588ef2}:1.0.0", + "{2e39e773-a18d-4de8-b611-54b2a9588ef2}:99992.3.0", + "{5043295f-0596-4c6f-8d6f-b4940b25f922}:1.0", + "{5043295f-0596-4c6f-8d6f-b4940b25f922}:7.5.6", + "{6353a818-60e9-485e-9214-fb52444719c3}:1.0", + "{6353a818-60e9-485e-9214-fb52444719c3}:6.0.0", + "{66d37227-2416-4b7a-9624-dabb1dc1fd70}:1.2", + "{66d37227-2416-4b7a-9624-dabb1dc1fd70}:7.5.6", + "{9abb3582-3d55-4095-9de2-13009b108ee5}:1.2", + "{9abb3582-3d55-4095-9de2-13009b108ee5}:6.0.0", + "{a4f7b417-f73d-437b-906a-800aceee0af5}:1.2", + "{a4f7b417-f73d-437b-906a-800aceee0af5}:8.5.3", + "linkexst@lefxext.com:1.0.0", + "linkexst@lefxext.com:2.0.0", + "linkexst@lefxext.com:3.0.0", + "winmergesr@wmfxext.com:1.0.0", + "winmergesr@wmfxext.com:2.0.0", + "winmergesr@wmfxext.com:3.0.0", + "linkext@lefxext.com:1.0.0", + "linkext@lefxext.com:2.0.0", + "linkext@lefxext.com:3.0.0", + "colorpal@cpfxext.com:1.0.0", + "colorpal@cpfxext.com:2.0.0", + "colorpal@cpfxext.com:3.0.0", + "flow-scan-clock@webtools.net:6.24.6", + "flow-scan-clock@webtools.net:6.24.7", + "clear-focus-clock@quickext.net:4.8.20", + "clear-focus-clock@quickext.net:143.10.30", + "pulse-mark-link@smartext.net:7.9.2", + "pulse-mark-link@smartext.net:143.10.10", + "gear-clock-zen@protools.example:5.6.14", + "gear-clock-zen@protools.example:5.6.15", + "flex-clock-dash@extrakits.com:2.4.8", + "flex-clock-dash@extrakits.com:2.4.9", + "{5e1716b2-3682-473e-a5f9-383873e669cf}:1.1", + "{5e1716b2-3682-473e-a5f9-383873e669cf}:1.1.6", + "{62b18047-1beb-4437-a78c-f50bcf700455}:1.1", + "{62b18047-1beb-4437-a78c-f50bcf700455}:21.1.1", + "{37be579c-a743-40c8-ad15-96779d778ade}:1.1", + "{37be579c-a743-40c8-ad15-96779d778ade}:9.3.0", + "{194ddf97-fda0-4fdb-8d8f-57a199cc8263}:1.0", + "{194ddf97-fda0-4fdb-8d8f-57a199cc8263}:9.3.0", + "{352c7c11-f586-4c3d-98b8-8c01ff9dad27}:1.0.1", + "{352c7c11-f586-4c3d-98b8-8c01ff9dad27}:6.0.0", + "{032be745-88e0-42f9-a571-3c0fde43813a}:1.0.3", + "{032be745-88e0-42f9-a571-3c0fde43813a}:1234.0", + "{013609e5-91fa-4094-a12b-d2c151284f93}:1.0.3", + "{013609e5-91fa-4094-a12b-d2c151284f93}:7.5.6", + "{b0b29065-5963-4b30-a384-5aac91f5bf8e}:1.0.3", + "{b0b29065-5963-4b30-a384-5aac91f5bf8e}:8.5.3", + "{2fe4dffd-cc87-4812-994a-bc0083e0abfe}:4.6.3", + "{2fe4dffd-cc87-4812-994a-bc0083e0abfe}:4.6.4", + "{2fe4dffd-cc87-4812-994a-bc0083e0abfe}:4.6.5" + ], + "unblocked": [], + "softblocked": [ + "proton-mail-checker@bolausson:1.3.27", + "proton-mail-checker@bolausson:1.3.28", + "proton-mail-checker@bolausson:1.3.29", + "proton-mail-checker@bolausson:1.3.30", + "cool-file-block@tabtools.co:4.2.18", + "extension@pullsar.space:1.1.1", + "extension@pullsar.space:1.1.2", + "pulse-pad-free@addonslab.com:4.18.2", + "proton-mail-checker@bolausson:1.3.31", + "proton-mail-checker@bolausson:1.3.32", + "yldz@local:0.7.0", + "filmhuis-calendar-ics@panjii:1.1.0", + "filmhuis-calendar-ics@panjii:1.2.0", + "filmhuis-calendar-ics@panjii:1.2.2", + "vudugun@mail.com:1.2.0", + "vudugun@mail.com:1.1", + "vudugun@mail.com:1.0.3", + "vudugun@mail.com:1.0.2", + "vudugun@mail.com:1.0.1", + "vudugun@mail.com:1.0", + "{cac00f2b-bc3f-4f9d-b8da-1276529f11de}:0.1", + "{98791501-7c35-48f2-8c0d-df35b3994838}:1.2.0", + "{530949b9-c4a2-44a7-afe9-980b1fb1024f}:1.2.0", + "{4ff8d2ba-e951-4f16-a01d-ccafa7f2b6ab}:1.2.0", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.0", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.1", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.2", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.2.1", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.2.2", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.2.3", + "mytheme@phungnm.dev:1.0", + "{a17f8dbd-a7ea-4380-830c-1b4eda5aff82}:1.0", + "proton-mail-checker@bolausson:1.3.33", + "proton-mail-checker@bolausson:1.3.34" + ] + }, + "schema": 1775478984034, + "key_format": "{guid}:{version}", + "stash_time": 1775500507511, + "id": "7f2433aa-7f3f-4cfa-87a2-e3fe03cc0ccc", + "last_modified": 1775500596976 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "yandex-lastfm-scrobbler@extension:1.03", + "virtual-webauthn@local:1.0", + "{89d89084-6cb7-4916-aa61-2dffc6f3aebc}:1.0", + "proton-mail-checker@bolausson:1.3.25", + "almeria.web@csif.es:0.4", + "almeria.web@csif.es:0.5", + "almeria.web@csif.es:0.6", + "SOCIT@dev.id:1.6", + "unhook-satyam-final6@custom.com:1.6.8", + "unhook-satyam-2@custom.com:1.6.8", + "donot@me.com:1.0", + "{422711f1-6461-4199-a750-942b05d7d290}:2.0", + "unhook-satyam-final20@custom.com:1.6.8", + "tube2gemini@yourdomain.com:1.3", + "ds-profil-scraper@local:1.1", + "ds-profil-scraper@local:1.0", + "sauce-manager@edward.scroop:0.3.0", + "ds-profil-scraper@local:1.5", + "ds-profil-scraper@local:1.3", + "ds-profil-scraper@local:1.2", + "{a4f7b417-f73d-437b-906a-800aceee0af5}:8.5.5", + "{9abb3582-3d55-4095-9de2-13009b108ee5}:6.0.1", + "{66d37227-2416-4b7a-9624-dabb1dc1fd70}:7.5.7" + ] + }, + "schema": 1775457382866, + "key_format": "{guid}:{version}", + "stash_time": 1775478905620, + "id": "260f63b2-7d9e-41ed-8ffd-9d6066554e00", + "last_modified": 1775478983771 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "nfse-downloader@arcechinel.com.br:2.8", + "nfse-downloader@arcechinel.com.br:2.8.1", + "nfse-downloader@arcechinel.com.br:2.8.2", + "nfse-downloader@arcechinel.com.br:2.8.3", + "nfse-downloader@arcechinel.com.br:2.8.4", + "nfse-downloader@arcechinel.com.br:2.8.5", + "noble-quetzal-airtm-android@noblequetzal.local:1.1.9", + "noble-quetzal-airtm-android@noblequetzal.local:1.1.5", + "noble-quetzal-airtm-android@noblequetzal.local:1.1.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.1.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.1.1", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.8", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.7", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.5", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.4", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.1", + "noble-quetzal-airtm@noblequetzal.local:1.1.3", + "noble-quetzal-airtm@noblequetzal.local:1.1.1", + "enhancer@goldenfox.com:22.6.5", + "art2pc@n0tls.com:1.0.0", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.1", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.1pre", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.1.1", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.1.2", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.2.0", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.2.1", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.2.2", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.0", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.1", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.4", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.5", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.6", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.7", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.8", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.10", + "{9bfa8fdd-cfa3-4c2e-b9ac-5ad9885a5134}:1.6.7", + "{cb209510-b84d-4d8d-b86c-3ca8be6ce403}:0.0.0", + "tts-capture@local.dev:1.0.0", + "tts-capture@local.dev:2.0.0", + "tts-capture-mobile@local.dev:1.0.0", + "tts-capture-mobile@local.dev:2.0.0" + ] + }, + "schema": 1775435796523, + "key_format": "{guid}:{version}", + "stash_time": 1775457305649, + "id": "ce4f1dfc-f051-408c-9241-19f6efce7066", + "last_modified": 1775457382531 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "email-collector@myprorating.com:1.0.1", + "email-collector@myprorating.com:1.0.0", + "email-collector@myprorating.com:1.0.2", + "{376b9e00-6b75-42dc-b00c-c1ba10e79f34}:1.0", + "{e07663c2-b159-4f18-b382-2b44d615f5ed}:3.2.9", + "{e07663c2-b159-4f18-b382-2b44d615f5ed}:3.2.8", + "chromecast-ultimate@firefox:1.0.0", + "chromecast-ultimate@firefox:1.0.1", + "chromecast-ultimate@firefox:4.0.1", + "chromecast-ultimate@firefox:5.0.1", + "chromecast-ultimate@firefox:4.0.6", + "chromecast-ultimate@firefox:5.0.0", + "chromecast-ultimate@firefox:4.0.5", + "chromecast-ultimate@firefox:4.0.3", + "chromecast-ultimate@firefox:4.0.4", + "chromecast-ultimate@firefox:4.0.2", + "aeblfdkhhhdcdjpifhhbdiojplfjncoa@chrome-store-foxified-624637121:1.3.0", + "favory@sp4ce.pw:4.0.0.5", + "proton-mail-checker@bolausson:1.3.20", + "proton-mail-checker@bolausson:1.3.18", + "proton-mail-checker@bolausson:1.3.17", + "proton-mail-checker@bolausson:1.3.16", + "proton-mail-checker@bolausson:1.3.21", + "mangaproxy@yourdomain.com:1.1", + "favory@sp4ce.pw:4.0.0.7", + "techpriest@gurglorium.com:0.9.2", + "techpriest@gurglorium.com:0.9.3", + "techpriest@gurglorium.com:0.9.1", + "techpriest@gurglorium.com:0.9.11", + "Android@bravenhancer.com:22.6.1", + "Android@bravenhancer.com:22.6.3", + "enhancer@goldenfox.com:22.6.1", + "{ded89628-912a-42c5-a1d7-53f4898c9336}:1.0" + ] + }, + "schema": 1775414187561, + "key_format": "{guid}:{version}", + "stash_time": 1775435707367, + "id": "dfa17ba0-d503-4e85-a28a-4a6402953d38", + "last_modified": 1775435796283 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "virustotal-scanner@jaffacakes118.dev:1.1.3", + "virustotal-scanner@jaffacakes118.dev:1.1.4", + "virustotal-scanner@jaffacakes118.dev:1.1.5", + "virustotal-scanner@jaffacakes118.dev:1.1.6", + "virustotal-scanner@jaffacakes118.dev:1.1.7", + "virustotal-scanner@jaffacakes118.dev:1.2", + "virustotal-scanner@jaffacakes118.dev:1.3.1", + "virustotal-scanner@jaffacakes118.dev:1.3.2", + "virustotal-scanner@jaffacakes118.dev:1.3.3", + "virustotal-scanner@jaffacakes118.dev:1.3.4", + "my-money@my-money.local:0.2.1", + "my-money@my-money.local:0.2.0", + "{ff199d47-10ab-4c80-803b-a107535d01d1}:2.0.2", + "modrinth-quickdl@local:1.1.0", + "{63afd464-3037-43f4-8ed3-d3e542e78be5}:1.0.0", + "emoji-replacer@nadz.dev:1.0", + "emoji-replacer@nadz.dev:2.0", + "emoji-replacer@nadz.dev:2.5", + "emoji-replacer@nadz.dev:2.8", + "aistore@example.com:0.2.0", + "med2-toolbox@wuwa1980.dev:6.1", + "med2-toolbox@wuwa1980.dev:6.12", + "clickarmor@clickarmor.dev:1.0.6", + "clickarmor@clickarmor.dev:1.0.7", + "clickarmor@clickarmor.dev:1.0.8", + "clickarmor@clickarmor.dev:1.0.9", + "clickarmor@clickarmor.dev:1.0.10", + "clickarmor@clickarmor.dev:1.1.1", + "clickarmor@clickarmor.dev:1.2.1", + "clickarmor@clickarmor.dev:1.2.1.1", + "clickarmor@clickarmor.dev:1.2.3", + "clickarmor@clickarmor.dev:1.2.4", + "clickarmor@clickarmor.dev:1.2.5", + "clickarmor@clickarmor.dev:1.2.6", + "clickarmor@clickarmor.dev:1.2.7", + "clickarmor@clickarmor.dev:1.2.8", + "clickarmor@clickarmor.dev:1.2.9", + "clickarmor@clickarmor.dev:1.3.3", + "clickarmor@clickarmor.dev:1.3.4", + "clickarmor@clickarmor.dev:1.3.5", + "stellar-tab@extension:1.0", + "{f885cff8-968c-462b-817f-8060be9b1635}:1.0" + ] + }, + "schema": 1775392594968, + "key_format": "{guid}:{version}", + "stash_time": 1775414105458, + "id": "9c0ef8b3-7668-41aa-9d6f-62264c5ac7f5", + "last_modified": 1775414187244 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "bitwarden-devopsmind@local.dev:2025.12.0", + "bitwarden-devopsmind@local.dev:2025.12.1", + "container-mask@custom-dev-9.9.5:9.9.5", + "twitch-live-ext@deine-domain.de:1.0.8", + "twitch-live-ext@deine-domain.de:1.0.9", + "outlook-extension@kitamura.jf7:0.1.0", + "nyx@alsania-io:1.0.0", + "{4003d946-8bf8-411c-a439-7f6ebdfa90ef}:1.0", + "fse-hours@aerofinancialfse.com:1.1", + "fse-hours@aerofinancialfse.com:1.2", + "nojslite@pepper.codes:0.1.0", + "ikariam-enhanced@ikd.team:0.24.0", + "nojslite@pepper.codes:0.1.0.1" + ] + }, + "schema": 1775370991616, + "key_format": "{guid}:{version}", + "stash_time": 1775392508245, + "id": "bcf0a0a8-bdba-4cdb-b13d-e49bc604e812", + "last_modified": 1775392594737 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{1378a86a-0b65-403d-a511-b536a10a4559}:1.0.0", + "{1378a86a-0b65-403d-a511-b536a10a4559}:1.1.0", + "{1488D159-7C1D-443D-BABF-3E3C7B00AFAC}:0.0.1", + "{C316AABD-0A31-46E5-89C3-031180A03C81}:1.0.0", + "container-mask@custom-dev-9.8.8:9.8.8" + ] + }, + "schema": 1775349383506, + "key_format": "{guid}:{version}", + "stash_time": 1775370906656, + "id": "6983ea38-30eb-47ce-93d9-b94b8db2f3f0", + "last_modified": 1775370991313 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "udioprogenerator040420266@fb.com:0.1", + "udioprogenerator040420267@fb.com:0.1", + "udioprogenerator040420268@fb.com:0.1", + "udioprogenerator040420269@fb.com:0.1", + "autorainclaimer@yourdomain.com:1.1", + "xsnap@manazana.dev:1.0", + "xsnap@manazana.dev:1.1", + "udioprogenerator0404202611@fb.com:0.1", + "alehamartinenko0@gmail.com:2.0", + "alehamartinenko0@gmail.com:2.0.1", + "{3913010a-8289-4052-8e2c-bb7b54d3b59c}:1.0", + "udioprogenerator0404202612@fb.com:0.1", + "udioprogenerator0404202613@fb.com:0.1", + "udioprogenerator0404202615@fb.com:0.1", + "udioprogenerator0404202614@fb.com:0.1", + "udioprogenerator0404202616@fb.com:0.1", + "stellar@stellarproject.io:0.1.0", + "redirector@antigravity.test:1.20", + "redirector@antigravity.test:1.21", + "redirector@antigravity.test:1.22", + "redirector@antigravity.test:1.23", + "redirector@antigravity.test:1.24", + "redirector@antigravity.test:1.25", + "@ip-display-extension:1.0" + ] + }, + "schema": 1775327792814, + "key_format": "{guid}:{version}", + "stash_time": 1775349305440, + "id": "408f66ef-d6c0-4120-a21e-a86b2a8ee9d7", + "last_modified": 1775349383235 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ai-page-summarizer@local:3.2", + "ai-page-summarizer@local:3.3", + "ai-page-summarizer@local:3.6", + "ai-page-summarizer@local:3.5", + "fiyat-takip@local:2.0.3", + "@elvenar-helper-extension:7.1.1", + "@elvenar-helper-extension:7.1.0", + "@elvenar-helper-extension:7.0.0", + "hardmode@hardmodeextension.app:0.1.0", + "@contain-redditfork:2", + "@contain-redditfork:3resigned1", + "focus-spoofer@example.com:1.1", + "focus-spoofer@example.com:1.3", + "focus-spoofer@example.com:1.5", + "udioprogenerator040420262@fb.com:0.1", + "udioprogenerator040420263@fb.com:0.1", + "{f48fd747-da4a-4492-8310-dd5e4bc2a18c}:1.1", + "{f48fd747-da4a-4492-8310-dd5e4bc2a18c}:1.0", + "udioprogenerator040420264@fb.com:0.1", + "{0940dccc-9c76-4627-88a9-82b1195e2e4e}:2.0", + "{de86514e-7ae1-4f59-a456-3217d6cd263c}:1.0", + "{e8b6f6e0-1a2b-4c3d-9e4f-5a6b7c8d9e0f}:1.0.0", + "{e8b6f6e0-1a2b-4c3d-9e4f-5a6b7c8d9e0f}:2.0.0", + "{0beb0d07-3346-4afc-9129-b0e917846cb2}:1.0", + "{0beb0d07-3346-4afc-9129-b0e917846cb2}:2.0", + "{0beb0d07-3346-4afc-9129-b0e917846cb2}:3.0", + "udioprogenerator040420265@fb.com:0.1" + ] + }, + "schema": 1775306180869, + "key_format": "{guid}:{version}", + "stash_time": 1775327706977, + "id": "c8aa8a1e-fe15-4a80-9c5a-70d57a9fae8f", + "last_modified": 1775327792536 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "jid1-3x5vhIadRiLtIQ@jetpack:1.4", + "jid1-3x5vhIadRiLtIQ@jetpack:1.5", + "jid1-3x5vhIadRiLtIQ@jetpack:1.6", + "jid1-3x5vhIadRiLtIQ@jetpack:1.6.1", + "jid1-3x5vhIadRiLtIQ@jetpack:1.7", + "jid1-3x5vhIadRiLtIQ@jetpack:1.8", + "jid1-3x5vhIadRiLtIQ@jetpack:1.8.1", + "jid1-T7zC870jgKm44A@jetpack:1.3", + "jid1-T7zC870jgKm44A@jetpack:1.4", + "jid1-T7zC870jgKm44A@jetpack:1.5", + "jid1-T7zC870jgKm44A@jetpack:1.6", + "jid1-T7zC870jgKm44A@jetpack:1.6.1", + "jid1-T7zC870jgKm44A@jetpack:1.7", + "jid1-T7zC870jgKm44A@jetpack:1.8", + "jid1-T7zC870jgKm44A@jetpack:1.8.1", + "ddg-url-extractor@example.com:1.0.1", + "container-mask@custom-dev-9.7.9:9.7.9", + "ai-ticket-generator@example.com:1.0.0", + "ai-ticket-generator@example.com:1.2.0", + "ai-page-summarizer@local:2.7", + "ai-page-summarizer@local:2.6", + "ai-page-summarizer@local:2.8", + "ai-page-summarizer@local:2.9", + "dash-tip-block@neattools.org:3.7.2", + "dash-tip-block@neattools.org:3.7.8", + "dash-tip-block@neattools.org:4.7.5", + "ai-page-summarizer@local:3.0", + "ai-page-summarizer@local:3.1", + "tasks@cherry.dev:1.0", + "notes@cherry.dev:1.0", + "html-bg-fixer@hundreAd:2.4", + "html-bg-fixer@hundreAd:2.3", + "{29f42579-9618-4dc7-8647-eaad7cd3343a}:7.8.1", + "unveilpass@unveiltech.com:1.0.0", + "unveilpass@unveiltech.com:1.0.3", + "unveilpass@unveiltech.com:1.0.30", + "unveilpass@unveiltech.com:1.0.39", + "unveilpass@unveiltech.com:1.0.42", + "unveilpass@unveiltech.com:1.0.43", + "unveilpass@unveiltech.com:1.0.51", + "unveilpass@unveiltech.com:1.0.54", + "unveilpass@unveiltech.com:1.0.55" + ] + }, + "schema": 1775284591471, + "key_format": "{guid}:{version}", + "stash_time": 1775306105618, + "id": "35b3abb2-2cd1-4003-939b-704ac7a2eda6", + "last_modified": 1775306180565 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "redirectblocker@tyson3101.com:3.3.0", + "{3c6aaaaa-cc83-40a2-bd83-abf54559764d}:1.0", + "iachat@naz.com:1.0", + "youtube-music-logger@javajason.dev:2.0" + ] + }, + "schema": 1775262985845, + "key_format": "{guid}:{version}", + "stash_time": 1775284506910, + "id": "edeedc0c-c3d1-4f22-9af8-cdfd5bd96df4", + "last_modified": 1775284591107 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{97089759-48ff-4074-b260-329efea2ca33}:1.8", + "{97089759-48ff-4074-b260-329efea2ca33}:1.8.1", + "{97089759-48ff-4074-b260-329efea2ca33}:1.8.2", + "{97089759-48ff-4074-b260-329efea2ca33}:1.8.3", + "{4ad685bd-d3cb-4751-9d0b-6f8a467743a3}:2.0", + "swift-map-lite@smartext.com:6.2.17", + "udioprogenerator04042026@fb.com:0.1", + "arminnowa@gmail.com:1.0", + "container-mask@custom-dev-9.7.5:9.7.5" + ] + }, + "schema": 1775241387163, + "key_format": "{guid}:{version}", + "stash_time": 1775262905432, + "id": "ce04d6cd-7155-4332-aff2-4c811a923ee2", + "last_modified": 1775262985637 + }, + { + "stash": { + "blocked": [ + "{655993b0-e807-4b04-a156-031d3fc44295}:1.0.0", + "{655993b0-e807-4b04-a156-031d3fc44295}:1.1.6", + "{a2f18d53-3897-4180-a786-27633d458cf5}:1.0.0", + "{a2f18d53-3897-4180-a786-27633d458cf5}:9.3.0", + "{a2f18d53-3897-4180-a786-27633d458cf5}:21.1.1", + "{93d30f89-5ca9-489c-be2d-85bfd52f0198}:1.0.0", + "{93d30f89-5ca9-489c-be2d-85bfd52f0198}:7.5.6", + "{e33d1045-a057-4f05-82a0-c9b2c6a31a1a}:1.0.0", + "{e33d1045-a057-4f05-82a0-c9b2c6a31a1a}:9.3.0", + "nest-proxy-mark@fasttools.org:5.11.5", + "nest-proxy-mark@fasttools.org:5.13.5", + "nest-proxy-mark@fasttools.org:5.13.6", + "{526b33ba-2999-443c-b4c4-f3021dbd6e47}:1.0.3", + "{526b33ba-2999-443c-b4c4-f3021dbd6e47}:6.0.0", + "{57296056-1a32-4728-8429-67958c5d265f}:1.5", + "{57296056-1a32-4728-8429-67958c5d265f}:8.5.3", + "{4fbb5fef-eb25-4a23-ae08-0e724a3f3eb6}:2.0.0", + "XSSandSQL@Secret.me:1.1", + "CoolWayBackMashine@Secret.me:1.0", + "CoolSendRequest@Secret.me:1.0", + "FastSearchImage@Secret.me:1.0", + "EditownLoadSpeed@Secret.me:1.0", + "SiteIpAndIpInformation@Secret.me:1.3", + "{9077eea8-6582-4d35-aa8a-56bcaf1f8ad5}:1.0", + "{7ae7ff6d-7c6e-4da8-afee-26c8854216b2}:1.0", + "{c48d7bc1-9edc-47bc-9ece-fa9e51b6b0eb}:1.1", + "{7468c376-e29f-470e-920e-fc0f5efda7cc}:1.1", + "{0ddef242-f06f-41b3-a5b3-b0c1bc43a865}:1.0", + "{80109fae-7f1c-43f6-ba18-125b09644fa1}:1.5", + "{95497299-7ae5-443f-a04b-2a0b182346b6}:1.0", + "{257fc88e-8cbf-4ffc-8fd8-d1be3e18c0ce}:1.1", + "{fcfbd867-3383-4770-b4b8-8aaf5faa9da4}:1.0", + "form-filler-pro@microassets.io:1.0.0", + "font-identifier@microassets.io:1.0.0", + "favicon-grabber@flowkit.dev:1.0.0", + "email-template-builder@microassets.io:1.0.0", + "css-inspector-pro@microassets.io:1.0.0", + "network-speed-test@flowkit.dev:1.0.0", + "network-monitor-pro@microassets.io:1.0.0", + "meta-tag-editor@microassets.io:1.0.0", + "base64-encoder@microassets.io:1.0.0", + "base64-encoder@microassets.io:1.0.2", + "amazon-wide-mode@microassets.io:1.0.0", + "amazon-wide-mode@microassets.io:1.0.2", + "amazon-fake-review-skimmer@microassets.io:1.0.0", + "amazon-fake-review-skimmer@microassets.io:1.0.2", + "ai-content-bouncer@microassets.io:1.0.0", + "ai-content-bouncer@microassets.io:1.0.2", + "fontinspect44@firefoxext.com:1.0.0", + "dupeclose21@firefoxext.com:1.0.0", + "darktoggle58@firefoxext.com:1.0.0", + "colorpick17@firefoxext.com:1.0.0", + "booksearch49@firefoxext.com:1.0.0", + "a_to_data_URL_scrambler@scrambled.com:1.0", + "a_to_blob_scrambler@scrambled.com:1.0", + "a_get_image_data_scrambler@scrambled.com:1.0", + "a_webgl_parameter_scrambler@scrambled.com:1.0", + "a_webgl_buffer_scrambler@scrambled.com:1.0", + "a_screen_width_scrambler@scrambled.com:1.0", + "a_screen_height_scrambler@scrambled.com:1.0", + "a_screen_device_pixel_ratio_scrambler@scrambled.com:1.0", + "a_screen_colour_depth_scrambler@scrambled.com:1.0", + "a_screen_avail_width_scrambler@scrambled.com:1.0", + "a_screen_avail_height_scrambler@scrambled.com:1.0", + "a_font_offset_width_scrambler@scrambled.com:1.0", + "a_font_offset_height_scrambler@scrambled.com:1.0", + "a_screen_scrambler@scrambled.com:2.0", + "a_font_scrambler@scrambled.com:1.0", + "a_font_scrambler@scrambled.com:2.0", + "a_webgl_scrambler@scrambled.com:1.0", + "a_webgl_scrambler@scrambled.com:2.0", + "a_canvas_scrambler@scrambled.com:1.0", + "a_canvas_scrambler@scrambled.com:2.0", + "peterfockema@gmail.com:1.0" + ], + "unblocked": [], + "softblocked": [ + "manager-parole@valen.local:3.0.0", + "pl-en@magnus:1.3.2", + "pl@magnus:1.0.1", + "imagus-mod@hkpd.com:2025.11.16", + "{4a71b3c9-d2e5-4f8a-9b0c-1d2e3f4a5b6c}:1.5.0", + "{08a176e9-3790-4c1c-9018-53052189c426}:2.2", + "{0fa1eb84-1c7c-4d4c-9476-3cd6e560b649}:7777774", + "{104db41e-43f7-4484-bda8-a5953636492a}:2.68.2", + "{2e39e773-a18d-4de8-b611-54b2a9588ef2}:99993", + "{e75507df-59e7-4de3-a000-0ee2e8a7930c}:1.4", + "{6353a818-60e9-485e-9214-fb52444719c3}:6.0.1", + "{5043295f-0596-4c6f-8d6f-b4940b25f922}:7.5.7", + "{21748769-e1fe-42b2-b400-27720cebf381}:8.5.6", + "{104db41e-43f7-4484-bda8-a59536364931}:2.68.2", + "@cepages-addon-firefox:0.0.4", + "@cepages-addon-firefox:0.0.5", + "nettrace@codeforgex.studio:1.0.2", + "brycekrispy-ai-typing@flowwrite:1.7.0", + "organize-pocket-local@example.com:1.2.0", + "organize-pocket-local@example.com:1.3.4", + "@auto-containers.shajirr:2026.4.3", + "{5CFAA307-1C53-4C35-AF2F-4EDC372CA350}:1.3.4", + "{884d98dd-f660-4631-a5bf-6edcadb9e22c}:1.1", + "yt-ad-skipper-pro@yourdomain.com:1.0", + "yt-ad-skipper-pro@yourdomain.com:1.1", + "yt-ad-skipper-pro@yourdomain.com:1.2", + "yt-ad-skipper-pro@yourdomain.com:1.3", + "yt-ad-skipper-pro@yourdomain.com:1.4", + "yt-ad-skipper-pro@yourdomain.com:1.5", + "yt-ad-skipper-pro@yourdomain.com:1.6", + "yt-ad-skipper-pro@yourdomain.com:1.7", + "yt-ad-skipper-pro@yourdomain.com:2.2", + "local-heero@unlea.sh:1.0.5", + "yt-channel-blocker@yourdomain.dev:1.6.1", + "ytautochapters@extension:1.0.0", + "yt-channel-blocker@yourdomain.dev:1.6.0" + ] + }, + "schema": 1775219801079, + "key_format": "{guid}:{version}", + "stash_time": 1775241305271, + "id": "acd6fd0a-bc8a-414b-a033-2b6cb35a2de1", + "last_modified": 1775241386908 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{b1a6ce5a-1d22-4880-898e-8dd1a7d3babe}:241029.1", + "enterprise-monitor@example.com:2.0", + "proxy-rotator-v2@internal.net:2.0.0", + "proxy-rotator-pro-v1@internal.net:1.0.0", + "{70b636e9-caeb-fd9f-7e9f-405d02dce9a0}:0.0.2", + "yt-comment-blocker@gemini-edition.com:2.3.9", + "jira-fixversion-helper@dev:0.5.0", + "rotator-1775206141@internal.net:2.3.6", + "web-highlighter@jonathan:1.0", + "thelensdb-scraper@extension:1.0.0", + "thelensdb-scraper@extension:1.0.1", + "thelensdb-scraper@extension:1.0.2", + "dashx@pro-bandey.com:22.2.4", + "rotator-exue6rt0@internal.net:2.3.9", + "dorkhub-helper@example.com:1.0.5", + "random-bookmarks@local.dev:1.0", + "autoinput-extension@kitamura.jf7:0.3.4", + "autoinput-extension@kitamura.jf7:0.4.4", + "autoinput-extension@kitamura.jf7:0.5.4", + "autoinput-extension@kitamura.jf7:0.6.4", + "autoinput-extension@kitamura.jf7:0.7.5", + "autoinput-extension@kitamura.jf7:0.8.6", + "autoinput-extension@kitamura.jf7:0.9.7", + "autoinput-extension@kitamura.jf7:0.10.7", + "autoinput-extension@kitamura.jf7:0.11.8", + "rotator-v3-test-1775215950@internal.net:3.0.0", + "rotator-1ba87kqi@internal.net:2.4.8", + "rotator-ak1syr1f@internal.net:2.4.4", + "rotator-ci5ezyy1@internal.net:2.4.1" + ] + }, + "schema": 1775198193181, + "key_format": "{guid}:{version}", + "stash_time": 1775219707820, + "id": "b61b5b2d-6271-483b-ac11-737ef91b12ec", + "last_modified": 1775219800817 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{3244c550-6d4b-44d1-9287-1fd5166b2f9c}:1.9.0", + "jira-feishu-push@example.com:1.0.0", + "jira-feishu-push@example.com:1.0.1", + "jira-feishu-push@example.com:1.0.2", + "jira-feishu-push@example.com:1.0.3", + "jira-feishu-push@example.com:1.0.4", + "jira-feishu-push@example.com:2.0.0", + "jira-feishu-push@example.com:2.0.1", + "container-mask@custom-dev-8.7.5:8.7.5", + "container-mask@custom-dev-9.7.4:9.7.4", + "rosetta-translate@example.com:1.3.1", + "redirector@antigravity.test:1.16", + "redirector@antigravity.test:1.18", + "redirector@antigravity.test:1.19", + "kadam.dewoo@hotmail.com:2.6", + "kadam.dewoo@hotmail.com:2.5" + ] + }, + "schema": 1775176583244, + "key_format": "{guid}:{version}", + "stash_time": 1775198106850, + "id": "0ee3b1e1-b533-40b1-8145-2c4358a9bbd5", + "last_modified": 1775198192723 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sendurl@runa-dte.cl:1.2.2", + "redirector@antigravity.test:1.11", + "redirector@antigravity.test:1.13", + "redirector@antigravity.test:1.15", + "{957a5461-df1f-46e3-82bf-64d6a3e8aea6}:1.0.1", + "info@brie.fyi:1.5.48", + "info@brie.fyi:1.5.49", + "info@brie.fyi:1.5.50", + "info@brie.fyi:1.5.51", + "info@brie.fyi:1.5.52", + "info@brie.fyi:1.5.56", + "info@brie.fyi:1.5.57", + "info@brie.fyi:1.5.58", + "{59e6a6b5-9aa3-41ca-96a8-ee7ada80a1f5}:2.1.0", + "x2@crazymedia.org:1.0.2", + "ip-info@andreev.dev:3.0", + "alehamartinenko75@gmail.com:1.0", + "inspectoo@inspectoo.fr:3.2.6", + "inspectoo@inspectoo.fr:3.2.0", + "inspectoo@inspectoo.fr:3.2.2", + "inspectoo@inspectoo.fr:3.2.3", + "inspectoo@inspectoo.fr:3.2.4", + "inspectoo@inspectoo.fr:3.2.5" + ] + }, + "schema": 1775154992019, + "key_format": "{guid}:{version}", + "stash_time": 1775176505454, + "id": "158cc55c-b6f0-41c1-972f-6addaa6f19e5", + "last_modified": 1775176582794 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "proton-mail-checker@bolausson:1.3.14", + "proton-mail-checker@bolausson:1.3.13", + "proton-mail-checker@bolausson:1.3.12", + "bookmarklet-bridge@example.local:0.1.0", + "{30524dfb-5888-4b6a-bb8f-c9d99c69531a}:1.0", + "{30524dfb-5888-4b6a-bb8f-c9d99c69531a}:1.1", + "{30524dfb-5888-4b6a-bb8f-c9d99c69531a}:1.2", + "{30524dfb-5888-4b6a-bb8f-c9d99c69531a}:1.3", + "{30524dfb-5888-4b6a-bb8f-c9d99c69531a}:1.4resigned1", + "sendurl@runa-dte.cl:1.2.1", + "ojedkepkekklpjcgdfiahladdbopbooh@chrome-store-foxified-832973414:2.15.1", + "enterprise@chrome-stats.com:1.0.1", + "enterprise@chrome-stats.com:1.0.2", + "enterprise@chrome-stats.com:1.0.3", + "enterprise@chrome-stats.com:1.0.5", + "zen-youtube-music-sync-egege@addons.local:1.1", + "zen-youtube-music-sync-egege@addons.local:1.2", + "zen-youtube-music-sync@egetzog.gmail.com:1.0.5", + "{28669e4a-939e-4e4a-89a3-5c8e4e4a89a3}:1.2.1", + "srm-extend-nyas1@addons.mozilla.org:1.2.0", + "srm-extend-nyas1@addons.mozilla.org:1.2.1", + "redirector@antigravity.test:1.9", + "redirector@antigravity.test:1.10", + "{baf373b3-870d-418c-807a-c142a7ccf32e}:0.2", + "{baf373b3-870d-418c-807a-c142a7ccf32e}:3.1.0", + "claudecodebrowser@alexm:1.0.0", + "extension@one-tab.com:2.1" + ] + }, + "schema": 1775133399882, + "key_format": "{guid}:{version}", + "stash_time": 1775154906673, + "id": "580e5afc-4b69-477c-b140-5506ae1a98b8", + "last_modified": 1775154991887 + }, + { + "stash": { + "blocked": [ + "qr-maker@f4k8r2.tech:142.0", + "qr-maker@f4k8r2.tech:143.10.10", + "{f2f9cad0-13f4-45e1-a394-a30111bda98d}:2.0.0", + "{7205708d-a61f-4fc4-bb5b-495a02bb4461}:2.0.0", + "{679ef1a0-5bec-4ca2-9192-d9cadb03cfd1}:1.0", + "{679ef1a0-5bec-4ca2-9192-d9cadb03cfd1}:9.3.0", + "{dc241480-1866-4f29-8508-d7518698218c}:1.0", + "{dc241480-1866-4f29-8508-d7518698218c}:111.0.0", + "{e346bcae-44f2-42ab-8181-c060931f20e5}:1.0", + "{e346bcae-44f2-42ab-8181-c060931f20e5}:8888888.5.3", + "{0aa35b04-5df3-4735-b22f-d5fcbdffc954}:2.6.2", + "{0aa35b04-5df3-4735-b22f-d5fcbdffc954}:2.6.3" + ], + "unblocked": [], + "softblocked": [ + "baly-oauth-helper@baly.iq:1.0.0", + "proton-mail-checker@bolausson:1.3.8", + "proton-mail-checker@bolausson:1.3.7", + "proton-mail-checker@bolausson:1.3.6", + "shinobi-r@local:1", + "{8d41eb56-1df6-483e-82b1-358d0dba62ee}:1.3", + "{4cf81673-4d01-49b5-b2cf-5ca051b2f8e2}:1.1", + "{4cf81673-4d01-49b5-b2cf-5ca051b2f8e2}:1.2", + "proton-mail-checker@bolausson:1.3.10", + "proton-mail-checker@bolausson:1.3.11", + "proton-mail-checker@bolausson:1.3.9", + "yanima-shiki-integration-unlisted@example.com:2.4.4", + "senkoproxy@cla.st:1.4", + "ai-page-summarizer@local:2.5", + "ai-page-summarizer@local:2.1", + "ai-page-summarizer@local:2.3", + "ai-page-summarizer@local:2.2", + "ai-page-summarizer@local:2.0", + "ai-page-summarizer@local:1.9", + "ai-page-summarizer@local:1.8", + "ai-page-summarizer@local:1.7", + "ai-page-summarizer@local:1.6", + "ai-page-summarizer@local:1.5", + "ai-page-summarizer@local:1.4", + "ai-page-summarizer@local:1.3", + "ai-page-summarizer@local:1.2", + "ai-page-summarizer@local:1.1", + "ai-page-summarizer@local:1.0", + "ai-page-summarizer@local:2.4", + "navigation-profiles@vaskveider.com:1.0.0", + "youtube-auto-pip@local:1.0.0", + "youtube-auto-pip@local:1.0.1", + "navigation-profiles@vaskveider.lmtd:1.0.0.0" + ] + }, + "schema": 1775111797552, + "key_format": "{guid}:{version}", + "stash_time": 1775133307184, + "id": "6cd95470-fbb3-4ed9-8f1b-4a3fb96a701c", + "last_modified": 1775133399638 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "navigation-profiles-dev@vaskveider.org:1.0.1", + "@tpfignore2:1.0", + "@tpfignore2:1.0.1", + "redirector@antigravity.test:1.7", + "redirector@antigravity.test:1.8", + "organize-pocket-local@example.com:1.5.0", + "{f41256b4-75a1-4ffa-9a40-13b25f905af4}:1.0", + "{56c0a2df-2134-4bf4-8df9-5f12b450c19e}:1.0", + "openinsteam@maclews.eu:1.0" + ] + }, + "schema": 1775090194314, + "key_format": "{guid}:{version}", + "stash_time": 1775111706975, + "id": "bd71fbc9-9a26-45bc-b167-98d766e4daa1", + "last_modified": 1775111797106 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "lspdofficertools@example.com:1.2", + "yanima-shiki-integration-unlisted1@example.com:2.4.4", + "yanima-shiki-integration-unlisted1@example.com:2.5.0", + "pullsar@pullsar.space:1.0.0", + "pullsar@pullsar.space:1.1.0", + "pullsar@pullsar.space:1.1.1", + "mon-extension-chat@mon-domaine.com:1.0", + "finbee-injector-firefox@snaiges.github.com:1.0", + "fuelgauge@fuelgauge.pro:2.5.0", + "fuelgauge@fuelgauge.pro:2.8.0", + "rodex-roblox@shojo.dev:2.0.0", + "c411-rutorrent@schiz0b0y.dev:1.0", + "c411-rutorrent@schiz0b0y.dev:1.1", + "{b2641859-361e-4252-9d33-594d7318d34c}:1.0", + "sosyalpaylas-pro@firefox-eklenti.local:1.0", + "{b2641859-361e-4252-9d33-594d7318d34c}:1.1", + "xthread-copier@victor.local:1.0", + "chatbot-interceptor@clickcannabis.com:1.0.0", + "hospital-intel@example.com:1.0", + "hospital-intel@example.com:1.1", + "hospital-intel@example.com:1.2", + "hospital-intel@example.com:1.3", + "hospital-intel@example.com:1.4", + "hospital-intel@example.com:1.5", + "hospital-intel@example.com:1.6", + "navigation-profiles@vaskveider.org:1.0", + "navigation-profiles@vaskveider.org:1.0.1", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:1.0.0", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:111.0.0", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:1111", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:99992.3.0", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:7777773.1.1", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:8888874.5.6", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:8888888.5.3", + "{8a3ad40a-5ba8-4c4a-8be7-01ddedb43c85}:2.0.0", + "container-mask@custom-dev-8.7.4:8.7.4" + ] + }, + "schema": 1775068601952, + "key_format": "{guid}:{version}", + "stash_time": 1775090107073, + "id": "40a96a61-2a98-486a-96f7-e7d51a647877", + "last_modified": 1775090193809 + }, + { + "stash": { + "blocked": [ + "shariarja.m.an.1.9.98@gmail.com:2.0", + "joettel.i.ng.2.5.88@gmail.com:1.0.0" + ], + "unblocked": [], + "softblocked": [ + "recent-tabs@jasonsavard.com:5.3", + "recent-tabs@jasonsavard.com:5.2", + "{29b1f50f-62d6-4b4d-89de-7b26061f4b0a}:1.0.1", + "{29b1f50f-62d6-4b4d-89de-7b26061f4b0a}:1.0.2", + "tachibana.garren@gmail.com:1.0.0", + "ngfilter@tachibana.garren:1.0.0", + "siemens-gpt-assistant@adomi.ovh:1.1", + "kmjdnkpkpnjblbgbnkeedepgnomafojk@chrome-store-foxified-3050438839:2.0.2", + "mjaafpfnaeofaacnmkfdafldodlaomln@chrome-store-foxified-3050438839:1.702.3", + "dfngkocjobhcdlknaffekkiafkboehkn@chrome-store-foxified-3050438839:2.4", + "kmjdnkpkpnjblbgbnkeedepgnomafojk@chrome-store-foxified-1515032741:2.0.2", + "opgodjgjgojjkhlmmhdlojfehcemknnp@chrome-store-foxified-1515032741:2.6", + "mjaafpfnaeofaacnmkfdafldodlaomln@chrome-store-foxified-1515032741:1.702.3", + "dfngkocjobhcdlknaffekkiafkboehkn@chrome-store-foxified-1515032741:2.4", + "ropro-advanced-controls@robodin08.local:1.7.1", + "snippet-expander@my-custom-extension.com:1.0.0", + "{58667500-6249-4336-3960-000000000001}:1.0.2", + "{0f7d53b4-bfff-41b4-ad60-bcca8996ec94}:2.2.8", + "frimao-copy@villness.com:2.4.4", + "frimao-copy@villness.com:2.4.5", + "frimao-copy@villness.com:2.4.6", + "proton-mail-checker@bolausson:1.3.2", + "proton-mail-checker@bolausson:1.3.3", + "readpaper-utils@mooninsky:1.7.6.2", + "hindi-vllm-horde@prl-cnit:2.0.0", + "download-twitter-image@suienzan_firefox:1.0.0", + "download-twitter-image@unlisted:1.0.1", + "simple-pocket@example.com:2.0.0", + "simple-pocket@example.com:2.0.1", + "profile_launcher@hyseki.com:1.0", + "paperyoga@lezdu.it:1.0", + "container-ua@custom-dev:1.0.0", + "music_player@extension.org:1.0", + "FixYT@ThePillenwerfer:0.1", + "FixYT@ThePillenwerfer:1.2", + "ighwopefe09rgueoprjvhkehvlwcjeourfeiojhrgkjegfkdsjdkclnediufv@localhost:20260310.1" + ] + }, + "schema": 1775046995721, + "key_format": "{guid}:{version}", + "stash_time": 1775068506687, + "id": "a15db654-b4e8-4705-84cf-25bb79853fff", + "last_modified": 1775068601662 + }, + { + "stash": { + "blocked": [ + "brandon.perez25091969na@outlook.com:1.9", + "asciiart-p3q8n1v9@devtool.dev:1.0", + "asciiart-p3q8n1v9@devtool.dev:143.10.30", + "timer-stopwatch@m7h3q6.cc:142.0", + "timer-stopwatch@m7h3q6.cc:143.10.10", + "{c346f2dc-74c6-4fc1-bc20-a955e0061166}:4.8.2", + "{c346f2dc-74c6-4fc1-bc20-a955e0061166}:4.8.3", + "{c346f2dc-74c6-4fc1-bc20-a955e0061166}:4.8.4" + ], + "unblocked": [], + "softblocked": [ + "custom-newtab-pro@hesip.local:1.0.1", + "proton-mail-checker@bolausson:1.3.0", + "proton-mail-checker@bolausson:1.3.1", + "fr24-to-simbrief@aussiematt95.github.com:1.0", + "fr24-to-simbrief@aussiematt95.github.com:1.0.1", + "fr24-to-simbrief@aussiematt95.github.com:1.0.2", + "fr24-to-simbrief@aussiematt95.github.com:1.0.3", + "fr24-to-simbrief@aussiematt95.github.com:1.0.4", + "fr24-to-simbrief@aussiematt95.github.com:1.0.5", + "fr24-to-simbrief@aussiematt95.github.com:1.0.6", + "fr24-to-simbrief@aussiematt95.github.com:1.0.7", + "fr24-to-simbrief@aussiematt95.github.com:1.0.8", + "fr24-to-simbrief@aussiematt95.github.com:1.0.8.1", + "fr24-to-simbrief@aussiematt95.github.com:1.1.0", + "hololyzer-dark-mode@example.com:1.0", + "hololyzer-dark-mode@example.com:2.0", + "creatio.quick.feed.replies@earthlink.iq:1.0", + "jira-time-log@local:1.0.2", + "kinolenta@aprelteam.su:1.0", + "kinolenta@aprelteam.su:1.1", + "kinolenta@aprelteam.su:1.2.0", + "Gesturefy@mod:2.1.6", + "Gesturefy@mod:3.1.2", + "Gesturefy@mod:3.1.2.1", + "Gesturefy@mod:3.2.5", + "Gesturefy@mod:3.2.6", + "datavault@local:1.0.1", + "datavault@local:1.0.0", + "{9d1f059c-cada-4111-9696-41a62d64e3bc}:0.17.9" + ] + }, + "schema": 1775025397863, + "key_format": "{guid}:{version}", + "stash_time": 1775046907404, + "id": "26f57ecd-5b9b-4226-a656-8cf3183726e4", + "last_modified": 1775046995506 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "simple-hello-world@example.com:1.2.0", + "yanima-shiki-integration-unlisted1@example.com:2.5.4", + "openguessrblind@limitfinity:1.0.0", + "{82a0bd6c-8b2e-4202-817a-d675c1202700}:1.0", + "{82a0bd6c-8b2e-4202-817a-d675c1202700}:2.0", + "{b37aaba1-7695-4001-97d6-8ba5fd12c0f5}:1.0", + "read_frog@0x64.in:1.22.0", + "smarteligibility-test-amber@axora.ai:2.1.0" + ] + }, + "schema": 1775003799074, + "key_format": "{guid}:{version}", + "stash_time": 1775025306876, + "id": "fd820ffd-0e4b-4aa5-9aaa-ad4c96bb58ee", + "last_modified": 1775025397598 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "hero-dev@amazon.com:1.0.0", + "{b3e97b5a-44ac-41f5-ab11-3580dd8249f0}:1.1.1", + "{b3e97b5a-44ac-41f5-ab11-3580dd8249f0}:1.1.2", + "{0a75d802-9aed-41e7-8daa-24c067386e82}:8.12.12.22", + "Android@bravenhancer.com:22.5.5", + "enhancer@goldenfox.com:22.5.5", + "cookie-isolator@extension:2.1.5", + "sendurl@runa-dte.cl:1.2.0", + "cookie-isolator@extension:2.1.4", + "lupamoodle@fmesasc:1.6.0", + "redirector@antigravity.test:1.6", + "tabconductor@antigravity.test:1.0.4", + "tabconductor@antigravity.test:1.0.7", + "tabconductor@antigravity.test:1.0.8", + "scrollanchor@antigravity.test:1.0.7", + "scrollanchor@antigravity.test:1.0.8", + "snipstash@antigravity.test:1.0.0", + "snipstash@antigravity.test:1.1.0", + "snipstash@antigravity.test:1.2.0", + "amazon_enterprise_access@amazon:2.0.0.0", + "{6e162813-aa0d-40ea-945b-7e8bab9a15fd}:1.0" + ] + }, + "schema": 1774982195755, + "key_format": "{guid}:{version}", + "stash_time": 1775003707253, + "id": "fdf92a8e-72ed-4901-a2de-201b094acef5", + "last_modified": 1775003798853 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.1", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.2", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.6", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.7", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.8", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.9", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.10", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.11", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.12", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.13", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.14", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.15", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.16", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.17", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.18", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.19", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.20", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.21", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.22", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.24", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.25", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.26", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.27", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.6.1", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.6.3", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.6.4", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.6.7", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.7.3", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.7.4", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.0", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.1", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.2", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.3", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.4", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.5", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.7", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.9", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.10", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.10.0", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.0", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.2", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.4", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.8", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.9", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.10", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.13", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.14", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.15", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.16", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.17", + "{67ab1450-21b4-48f7-b375-9a32f218177d}:1.0", + "{8be129a8-091f-454b-913b-9246c4d4ad20}:1.0", + "phishkitchen-qr@cofensepdc.com:1.0.0", + "unisport-pro@example.com:1.3.1.1", + "webrootsecurewebextensions@webroot.com:1.2.0.58", + "webrootsecurewebextensions@webroot.com:1.2.0.62", + "movie-ratings@extension.local:1.0.0", + "movie-ratings@extension.local:1.0.1", + "movie-ratings@extension.local:1.0.2", + "movie-ratings@extension.local:1.0.3", + "movie-ratings@extension.local:1.0.4", + "movie-ratings@extension.local:1.0.5", + "movie-ratings@extension.local:1.0.6", + "movie-ratings@extension.local:1.0.7", + "movie-ratings@extension.local:1.0.8", + "movie-ratings@extension.local:1.0.9", + "movie-ratings@extension.local:1.0.10", + "movie-ratings@extension.local:1.0.11", + "movie-ratings@extension.local:1.0.12", + "movie-ratings@extension.local:1.0.13", + "movie-ratings@extension.local:1.1.0", + "movie-ratings@extension.local:1.2.0", + "movie-ratings@extension.local:1.2.1", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.7", + "docebo-silencer@transmedics:1.0", + "docebo-silencer@transmedics:1.1", + "eapw-wiki-enhancements@ewd-data:1.0", + "@smart-video-audio-download:2.1.18", + "macmdnlopncdoehmjhfenfblflnohoen@chrome-store-foxified-112476551:1.4", + "geminiexportpro@local-dev.com:1.1.0", + "foxus-private-notes@evaldas:1.1", + "foxus-private-notes@evaldas:1.2", + "foxus-private-notes@evaldas:1.3", + "ai-chat-project-exporter@dougg0k:1.0.11", + "decluttr@getdecluttr.app:0.2.0" + ] + }, + "schema": 1774960597707, + "key_format": "{guid}:{version}", + "stash_time": 1774982106993, + "id": "cf349b9f-a2e1-4aa4-9f70-68752334edcd", + "last_modified": 1774982195541 + }, + { + "stash": { + "blocked": [ + "{20206a5e-66c7-46a3-b820-9e1866ebb05a}:1.1", + "{6386e8b1-e54f-4357-925a-8cc13395c5d0}:1.1", + "{6386e8b1-e54f-4357-925a-8cc13395c5d0}:1.2", + "{6386e8b1-e54f-4357-925a-8cc13395c5d0}:11.0.0", + "{aeb2198e-dc01-4fdc-b338-a81b6a30a749}:1.1", + "{aeb2198e-dc01-4fdc-b338-a81b6a30a749}:11.0.0" + ], + "unblocked": [], + "softblocked": [ + "ikea-uk-autofill-2.00@yourdomain.local:2.0", + "proton-mail-checker@bolausson:1.1.17", + "proton-mail-checker@bolausson:1.1.18", + "proton-mail-checker@bolausson:1.1.19", + "proton-mail-checker@bolausson:1.1.21", + "{003bd454-3d2b-4ea0-8059-6a6e36ed4322}:1.0.0", + "{003bd454-3d2b-4ea0-8059-6a6e36ed4322}:1.0.0.1", + "{003bd454-3d2b-4ea0-8059-6a6e36ed4322}:1.0.0.2", + "orange-dark@orange.com:1.0", + "{87c67e89-f6a6-4d42-8b16-ecd4c360024b}:1.0", + "{5f31c899-2264-468d-8b3b-c1f0474bed29}:1.0", + "mynotesatking-interactive@local.dev:1.0", + "github-markdown-tables@local:1.0.0", + "lobbydog_extension@javahippie.net:1.0.0", + "claude-usage-badge@local:1.0", + "ado-active-comments-filter@local:1.0" + ] + }, + "schema": 1774938996445, + "key_format": "{guid}:{version}", + "stash_time": 1774960506762, + "id": "4f554533-7909-461d-bf5b-0f8978f4384a", + "last_modified": 1774960597500 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "lockd@74k1.sh:1.0.0", + "lockd@74k1.sh:1.0.1", + "lockd@74k1.sh:1.0.2", + "lockd@74k1.sh:1.1.0", + "lockd@74k1.sh:1.1.1", + "lockd@74k1.sh:1.2.0", + "lockd@74k1.sh:1.2.1", + "{7adc56c5-a572-4f64-9422-64cd174ff29a}:1.0", + "xelya-deploy-monitor@xelya.io:1.5.3", + "xelya-deploy-monitor@xelya.io:1.5.4", + "{6a0f4baa-11d5-4626-a97e-f8944606c03d}:2.0", + "ynew--timer@example.com:1.5", + "ynew--timer@example.com:1.4", + "ynew--timer@example.com:1.3", + "miao.jr.life@outlook.com:0.9.5", + "aaaamynew--timer@example.com:1.2", + "timer-link-opener@example.com:1.0", + "timer-link-opener@example.com:1.1" + ] + }, + "schema": 1774917394790, + "key_format": "{guid}:{version}", + "stash_time": 1774938906957, + "id": "6e8243f6-48a8-427e-aceb-a185381b647d", + "last_modified": 1774938996306 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ikea-autofill-1.0@yourdomain.local:1.0", + "xelya-deploy-monitor@xelya.io:1.5.1", + "xelya-deploy-monitor@xelya.io:1.5.2", + "cronos-extension@cronos.dev:1.0.5", + "{d7c93b2d-5bf9-41ec-b2a1-2a19fee76126}:2.0.0", + "{ed012e23-827e-443f-90fb-0d22f8ddfd7b}:121", + "vivenciasventec@gmail.com:1.0", + "{e6773859-81a3-413e-8884-efa512148f62}:1.0", + "{e6773859-81a3-413e-8884-efa512148f62}:2.0", + "quincys-manga-translator@quincy.com:1.0" + ] + }, + "schema": 1774895791699, + "key_format": "{guid}:{version}", + "stash_time": 1774917307604, + "id": "4a47d062-49b3-46c0-84ba-a2f583e2cea5", + "last_modified": 1774917394535 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{6b6739ea-901b-41fb-8d16-ced0298b3e46}:1.1.4", + "toytique@toytique.be:1.4.22", + "toytique@toytique.be:1.4.21", + "toytique@toytique.be:1.4.20", + "toytique@toytique.be:1.4.19", + "toytique@toytique.be:1.4.18", + "toytique@toytique.be:1.4.16", + "toytique@toytique.be:1.4.15", + "toytique@toytique.be:1.4.17", + "xelya-deploy-monitor@xelya.io:1.5.0", + "{e75507df-59e7-4de3-a000-0ee2e8a7930b}:1.4", + "{111cf42d-8893-4fd8-8986-4d2e91edbbc5}:0.2", + "{fe5b20e4-6f85-4816-bdcd-504a4d9130ee}:1.0", + "{9969fec5-92d1-48fa-a44e-130df28702cb}:1.0", + "{29209932-d5dd-4f0f-9907-38c37b80b85b}:1.0", + "clickarmor@clickarmor.dev:1.3.2", + "clickarmor@clickarmor.dev:1.3.1", + "{1524e030-24b0-4c07-ad63-29d8002b4ec6}:2.35.0", + "Saneaki@saneaki.net:1.7", + "{c2ab844c-55f1-4f46-bfd9-83b868dcd0b9}:1.0", + "mstickets@mesuresystems.com:1.0", + "cs2-ipa@cs2ipa.extension:1.2.1", + "cs2-ipa@cs2ipa.extension:1.3.1", + "{339d423b-daac-4fc9-81ab-f36f90bf575c}:1.0", + "{3cb56e28-ab11-4f88-beb5-511ddbcd93ea}:1.1.5", + "aria2-integrate-firefox@extension:1.0.0", + "audiocatch@yourdomain.com:1.0", + "audiocatch@yourdomain.com:1.1", + "{b3db236b-c2ee-4b5c-9c37-11baab8a70c0}:1.0.0", + "ikea-autofill@yourdomain.local:1.1" + ] + }, + "schema": 1774874194523, + "key_format": "{guid}:{version}", + "stash_time": 1774895706778, + "id": "285f09c2-8e6c-4a73-bc60-be240774da51", + "last_modified": 1774895791532 + }, + { + "stash": { + "blocked": [ + "{0c6228d4-38c1-403b-9222-9416fd48a1a1}:1.0.0", + "{0c6228d4-38c1-403b-9222-9416fd48a1a1}:12.0", + "{cf59882a-468a-445e-8979-9a8f344eb697}:1.0.0", + "{cf59882a-468a-445e-8979-9a8f344eb697}:19.0", + "tab-manager-pro@x7k9m2.dev:142.0", + "tab-manager-pro@x7k9m2.dev:142.40.30", + "{10e62ac9-70e1-4d4f-b5f3-c0d356f96d11}:1.0.0", + "{10e62ac9-70e1-4d4f-b5f3-c0d356f96d11}:100101.0.1", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:1.0", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:1.1", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:3.1.3", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:11.0.0", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:22.1", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:77.1", + "{15074d3a-4825-4591-8dd6-bd6b519408d0}:1.0", + "{15074d3a-4825-4591-8dd6-bd6b519408d0}:33.5.3", + "{15074d3a-4825-4591-8dd6-bd6b519408d0}:44.0", + "{14ef8f53-fd1c-4c64-bf02-1851b182cf3c}:1.0", + "{14ef8f53-fd1c-4c64-bf02-1851b182cf3c}:11.0.0", + "{ba0a7c95-d11b-42cd-b5c0-2fe14451a53f}:1.7", + "{ba0a7c95-d11b-42cd-b5c0-2fe14451a53f}:1.8", + "{523c8816-9517-4dba-9ab9-f9bb5880d045}:3.1.8", + "{523c8816-9517-4dba-9ab9-f9bb5880d045}:3.1.9", + "{26bcb76f-42f1-40c2-88ab-ada6c88768d8}:5.1.3", + "{26bcb76f-42f1-40c2-88ab-ada6c88768d8}:5.1.14", + "live-us-football-scores@scorelivesus.com:4.12.9", + "{d00a030c-dc8d-486a-ba4c-067b1670175d}:1.0", + "{d00a030c-dc8d-486a-ba4c-067b1670175d}:31.15.4", + "{6932cea7-acab-45f3-8afd-2b4afc065b83}:1.1", + "{6932cea7-acab-45f3-8afd-2b4afc065b83}:106.0.1", + "{f909bd25-460b-423f-89fc-03ea7472592f}:1.0", + "slushAPP@outlook.com:2.1.5", + "clicker10_2@gmail.com:1.0", + "clicker10_1@gmail.com:1.0", + "{92d6ea9e-ebad-400d-b1b1-9dc9277b2ff2}:1.0", + "{16c04327-7ba7-4856-a70f-0fdad3cbfe22}:1.0", + "{34222326-eddf-49c3-bd31-8f3af43e28a8}:1.0", + "{4de383b0-900e-4b8c-874d-1cb788236ac1}:1.5", + "{06c6268f-fc42-4209-a099-de592067edd1}:1.1", + "{37fac786-e9dc-4b13-90f8-07df877658f7}:0.2.1", + "{2b665607-0837-413b-82e3-38a2444eb9e8}:2.2.3", + "{1e49de0c-1e36-42d1-b833-0d4705ce5c77}:1.3.7", + "{a39cbbfc-3ee2-4916-94f9-fa08a8013226}:3.4.2.0", + "{80581b74-21ff-4dcb-a846-f13f8037d6dc}:0.1.7", + "{5cbe5a1d-4ce1-40ef-9bf7-aae944d8cfdb}:1.4.1", + "{b7701cb1-6572-44a6-bd5e-2f4fbbcbbc49}:1.2.0", + "{ee888eb8-27b0-490d-93c0-939a2874411a}:2026.3.23", + "{3045fc91-260f-4451-b55c-85e610b0868c}:1.1.4", + "{cc9c0a4f-7b04-428f-91a9-d229534cced1}:2.2.0", + "{407f807e-eb80-4ac2-bcb1-cc077d98bfd4}:2.0.5", + "{73b6f5c5-9103-4d73-9507-036b286b3d28}:0.3.0", + "{4f201645-fa61-4e52-8a29-42fca4fb8778}:1.0", + "{eb186dfb-f41d-4903-966e-58f6c7fadfd2}:1.0" + ], + "unblocked": [], + "softblocked": [ + "itvx-autofill@yourdomain.local:1.1", + "universal-scraper@local-dev:1.0", + "universal-scraper@local-dev:1.0.1", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.3", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.8", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.9", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.11", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.10", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.12", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.13", + "ukihunter@github.com:1.0.1", + "mater-purissima-shield@example.com:1.0.0", + "mater-purissima-shield@example.com:1.0.1", + "souzamilhas@extension.firefox:10.1.0.1485", + "{5c9354e6-9c11-4cd6-97a5-dcd0f6727f31}:1.0" + ] + }, + "schema": 1774852592568, + "key_format": "{guid}:{version}", + "stash_time": 1774874107128, + "id": "2780f9fd-ae42-49dd-ba21-c3202607ac9b", + "last_modified": 1774874194294 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{ca9190dd-986b-4338-be8e-8a79cba20491}:1.0.0", + "{ca9190dd-986b-4338-be8e-8a79cba20491}:1.0.1", + "antidebug-breaker@browserplug.local:3.0.4", + "tab-guardian@example.com:1.3.7", + "chartai@livewellmedical.ca:1.0.0", + "chartai@livewellmedical.ca:1.0.1", + "chartai@livewellmedical.ca:1.0.2", + "chartai@livewellmedical.ca:1.0.3", + "chartai@livewellmedical.ca:1.0.4", + "chartai@livewellmedical.ca:1.0.5", + "chartai@livewellmedical.ca:1.0.6", + "aria2-integrate@extension:1.0.0" + ] + }, + "schema": 1774830992177, + "key_format": "{guid}:{version}", + "stash_time": 1774852506843, + "id": "57294baa-ab1d-42e3-8d22-b0e44d52153e", + "last_modified": 1774852592354 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "gmngpagflejjoblmmamaonmnkghjmebh@chrome-store-foxified--1624070162:2.3.7", + "noaneddfkdjfnfdakjjmocngnfkfehhd@chrome-store-foxified--1624070162:4.1.2", + "okmepbglpjobecobbkeodgdnpcfnjldc@chrome-store-foxified--1624070162:1.6.1", + "{a685065d-4f22-423a-ba57-76022aed8144}:0.2.8", + "{a685065d-4f22-423a-ba57-76022aed8144}:0.2.9resigned1", + "kontenmanager@gmx.de:2026.0.4.0", + "kontenmanager@gmx.de:2026.0.4.1", + "kontenmanager@gmx.de:2026.0.4.2", + "personal-test-img-downloader@extension.local:1.0.3", + "proton-mail-checker@bolausson:1.1.14", + "{19b1ce41-2ac9-4dc0-942f-4aaa0f6ddffb}:1.0", + "{7dec58ba-dcb2-4efb-8201-fd1e0eacd836}:1.0", + "linkedin-suggested-posts-remover@valerian.dtdg.fr:1.0.0", + "linkedin-suggested-posts-remover@valerian.dtdg.fr:1.0.1", + "{a8ea2335-200b-4292-8106-c68bcd50e834}:2.0", + "melon@melon:1.4", + "proton-mail-checker@bolausson:1.1.15", + "proton-mail-checker@bolausson:1.1.16", + "{4f24bc7f-144e-41bf-b836-94419eed4a5e}:1.0", + "local-search@jeff486wet:1.0", + "local-search@jeff486wet:1.1" + ] + }, + "schema": 1774809391662, + "key_format": "{guid}:{version}", + "stash_time": 1774830906798, + "id": "69a81e4f-dda1-43ef-a60c-e61d05e0bf01", + "last_modified": 1774830991929 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "michaelzuraw123@gmail.com:1.0", + "{6b6739ea-901b-41fb-8d16-ced0298b3e46}:1.1.3", + "wa-number-checker@checknumber.ai:0.0.1", + "arden4@wurkang.com:2.0.0", + "autofill-orbit-yourchewyplace@2024:1.0", + "autofill-orbit@local:1.0", + "autofill-universal@local:1.0", + "Android@bravenhancer.com:22.4.5", + "enhancer@goldenfox.com:22.4.5", + "Microshit@stockman50:0.0.6", + "kindle2pdfapp@gmail.com:1.0.5", + "{ba176907-666b-4301-949f-a5498efa6910}:1.0", + "kiosk_controller_light@teacher.com:1.0", + "tasalo@tasalo.app:0.1.0", + "biblioweb.barcode@localdomain58-1.com:1.1.3", + "biblioweb.barcode@localdomain.com:1.0.0", + "biblioweb.barcode@localdomain.com:1.1.2", + "kiosk_controller_light@teacher.com:1.1", + "proton-mail-checker@bolausson:1.1.12", + "proton-mail-checker@bolausson:1.1.13" + ] + }, + "schema": 1774787794462, + "key_format": "{guid}:{version}", + "stash_time": 1774809307263, + "id": "09caaadc-bab1-4c84-a5ef-7520b31e66c7", + "last_modified": 1774809391367 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{190d130f-4ee8-46a4-9c80-70a8164ec3af}:1.0", + "atom@escorp.dynamics:0.0.1", + "atom@escorp.dynamics:0.0.2", + "atom@escorp.dynamics:0.0.3", + "atom@escorp.dynamics:0.0.4", + "atom@escorp.dynamics:0.0.5", + "atom@escorp.dynamics:0.0.6", + "atom@escorp.dynamics:0.0.7", + "atom@escorp.dynamics:0.0.8", + "atom@escorp.dynamics:0.0.9", + "atom@escorp.dynamics:0.0.10", + "atom@escorp.dynamics:0.0.11", + "atom@escorp.dynamics:0.0.12", + "escorp-automation@escorp.local:0.1.0", + "speed-dial-v2@gt.org:1.0.1", + "speed-dial-v2@gt.org:1.0.2", + "speed-dial-v2@gt.org:1.0.3", + "speed-dial-v2@gt.org:1.0.4", + "gemini-link-analyzer-pro@yourdomain.com:1.2", + "{c6bd1ff8-e4b8-4281-bfd9-8abdfa524421}:1.0", + "youtube-fixer@lomanto.cc:1.0", + "youtube-fixer@lomanto.cc:1.1", + "arcana@ankerlab.de:1.0.0" + ] + }, + "schema": 1774766194832, + "key_format": "{guid}:{version}", + "stash_time": 1774787707298, + "id": "2333c0d6-75ab-4e15-a81a-98d0e8a606f6", + "last_modified": 1774787794240 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{be69632f-eb0e-425b-a8a0-e2ac993856ad}:1.0", + "dns-check@irfani.dev:1.0.2", + "dns-check@irfani.dev:1.0.3", + "dns-check@irfani.dev:2.2.6", + "{9f24a14d-1577-43a0-86f8-2e95a0ad96e0}:1.0", + "{3b2404ab-3049-458f-9d4c-f943de5ad21f}:1.0", + "{72b47e84-4de9-40e4-a9bf-0f142d794282}:1.0", + "respectful-reaction-button@gongahkia.dev:2.1.0", + "nectar-smart-sender-android-dev@celran.local:0.1.0", + "adman-ext@adman.com:0.6.3" + ] + }, + "schema": 1774744592409, + "key_format": "{guid}:{version}", + "stash_time": 1774766106463, + "id": "6a305459-eb35-46f0-b5dc-c221b4c765d3", + "last_modified": 1774766194625 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{fa55a5ec-ddd9-45d3-93d4-b38777cd32ca}:1.0", + "{5fb5b4a4-6485-4e28-bd6d-62837f0c7340}:2025.7.30", + "cookie-isolator@extension:2.0.5", + "cookie-isolator@extension:2.0.3", + "cookie-isolator@extension:2.0.2", + "funpay-auto-rais@example.com:1.1.0", + "speed-dial@gt.org:1.0.0", + "cookie-isolator@extension:2.1.1", + "cookie-isolator@extension:2.1.0", + "cookie-isolator@extension:2.0.8", + "cookie-isolator@extension:2.0.6", + "cookie-isolator@extension:2.0.1", + "cookie-isolator@extension:2.0.0", + "{44628ace-0d3c-4b4b-a523-0464c57201a7}:1.0", + "{44628ace-0d3c-4b4b-a523-0464c57201a7}:1.1", + "{a7c9e2f1-83b4-4d6a-b5f0-9f1c7d3a8b62}:1.5" + ] + }, + "schema": 1774722986199, + "key_format": "{guid}:{version}", + "stash_time": 1774744506516, + "id": "94aa838e-c686-4164-bc1a-f9006aa95e74", + "last_modified": 1774744592211 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "crosspoint-reader@xteink:1.0.3", + "jt-power-tools@king0light.ai:4.0.4", + "jt-power-tools@king0light.ai:4.03", + "promedico-helper-dev@degrotedokter:1.8.1.2", + "promedico-helper-dev@degrotedokter:1.8.1.1", + "promedico-helper-dev@degrotedokter:1.8.1", + "favory@sp4ce.pw:4.0.0.4", + "{19f5a1d0-ab2b-4bc7-8c63-1572b7cda578}:0.0.2", + "{a6669b0f-2404-4b88-b1e1-53b12f92c40f}:7.0", + "chatgpt-markdown-exporter@example.com:1.0", + "chatgpt-markdown-exporter@example.com:1.1", + "cs2-ipa@cs2ipa.extension:1.1.1", + "cs2-ipa@cs2ipa.extension:1.1.0", + "ai-analyzer@analyzer.plus:1.2.0", + "ai-analyzer@analyzer.plus:1.3.0", + "{a6669b0f-2404-4b88-b1e1-53b12f92c40f}:7.0.1", + "export-domain@ffminus:1.0.0" + ] + }, + "schema": 1774701394376, + "key_format": "{guid}:{version}", + "stash_time": 1774722906058, + "id": "e809eb09-cc58-40c9-b625-3203a9e95169", + "last_modified": 1774722986078 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{06c3fcc0-aa1d-4e9e-a6ee-6ed41f8502bc}:1.0", + "{6fa22361-a688-4341-a195-5c6ff257c9e4}:1.5.1", + "wall-ai-pro@protection.firefox:2.3.3", + "{80ee7cfd-6e60-48c2-8b61-83f505b6c37a}:0.2", + "{a6669b0f-2404-4b88-b1e1-53b12f92c40f}:6.7", + "mj-ultimate-82@majapahlevi.local:8.2", + "{29f08ecf-b667-48cc-957d-7ac6bdca35a7}:3.8.1", + "dark-ai-gen8@sage-pilot.com:8.2", + "ultimate@majapahlevi.local:8.3", + "{badadf39-8379-45f9-ad98-2b0543054686}:1.0.11", + "youtube-levelup@tn3w:1.3.9.1", + "manga-preloader-pro@arab-readers.net:6", + "shield-privacy@shield-extension.com:1.0.0", + "promedico-helper@degrotedokter:1.1.0", + "promedico-helper@degrotedokter:1.1.1", + "promedico-helper@degrotedokter:1.1.2", + "promedico-helper@degrotedokter:1.1.3", + "promedico-helper@degrotedokter:1.1.4", + "promedico-helper@degrotedokter:1.1.5", + "promedico-helper@degrotedokter:1.1.6", + "promedico-helper@degrotedokter:1.1.7", + "promedico-helper@degrotedokter:1.1.9", + "promedico-helper@degrotedokter:1.2", + "promedico-helper@degrotedokter:1.2.1", + "promedico-helper@degrotedokter:1.2.2", + "promedico-helper@degrotedokter:1.3", + "promedico-helper@degrotedokter:1.3.1", + "promedico-helper@degrotedokter:1.3.4", + "promedico-helper@degrotedokter:1.3.5", + "promedico-helper@degrotedokter:1.3.655", + "promedico-helper@degrotedokter:1.3.656", + "promedico-helper@degrotedokter:1.3.658", + "promedico-helper@degrotedokter:1.3.659", + "promedico-helper@degrotedokter:1.3.660", + "promedico-helper@degrotedokter:1.3.661", + "promedico-helper@degrotedokter:1.3.662", + "promedico-helper@degrotedokter:1.3.663", + "promedico-helper@degrotedokter:1.3.664", + "promedico-helper@degrotedokter:1.3.665", + "promedico-helper@degrotedokter:1.3.666", + "promedico-helper@degrotedokter:1.4", + "promedico-helper@degrotedokter:1.4.1", + "promedico-helper@degrotedokter:1.5", + "promedico-helper@degrotedokter:1.6", + "promedico-helper@degrotedokter:1.6.1", + "promedico-helper@degrotedokter:1.6.2", + "promedico-helper@degrotedokter:1.6.3", + "promedico-helper@degrotedokter:1.6.4", + "promedico-helper@degrotedokter:1.7", + "promedico-helper@degrotedokter:1.7.1", + "promedico-helper@degrotedokter:1.7.1.1", + "promedico-helper@degrotedokter:1.7.1.2", + "promedico-helper@degrotedokter:1.7.1.3", + "promedico-helper@degrotedokter:1.7.1.4", + "promedico-helper@degrotedokter:1.7.1.5", + "promedico-helper@degrotedokter:1.7.1.6", + "promedico-helper@degrotedokter:1.7.2", + "promedico-helper@degrotedokter:1.7.3.1", + "promedico-helper@degrotedokter:1.7.4", + "promedico-helper@degrotedokter:1.8" + ] + }, + "schema": 1774679794527, + "key_format": "{guid}:{version}", + "stash_time": 1774701306496, + "id": "2c7603a0-e66e-4882-895c-8017033db649", + "last_modified": 1774701394182 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{3942991c-83a9-494d-94e2-73a9c849ff94}:241029.1", + "{d935e25d-ba99-4e65-961c-40bf2986b585}:1.1", + "sendurl@runa-dte.cl:1.1.7", + "extension@laterbag.app:1.2.0", + "sendurl@runa-dte.cl:1.1.8", + "odfmimo@gmail.com:1.0", + "sendurl@runa-dte.cl:1.1.9", + "pokemonkin@manual-sniper.local:2.0", + "pokemonkin@manual-sniper.local:2.1.0", + "pokemonkin@manual-sniper.local:3.0.1", + "cloudbeds-helper@yourdomain.com:1.0.0", + "{cbecf433-b46d-480c-81ff-18698975a214}:1.0" + ] + }, + "schema": 1774658198616, + "key_format": "{guid}:{version}", + "stash_time": 1774679706253, + "id": "46b48b01-39ad-4de7-a415-fc07ba93d2b4", + "last_modified": 1774679794327 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ip-lookup@extension:1.0", + "snow-autofill@extension:3.8.0", + "{cf59882a-468a-445e-8979-9a8f344eb697}:56543230", + "{1dbebc3b-e9e9-4bcd-8596-93af38c0d08b}:1.0", + "{fff98d6d-7019-4869-bda2-5cc83ab58f7a}:1.0", + "link-cleaner-redirects@local:1.0.1", + "kimai-time-tracker@firefox-addon:1.0.1.2", + "{81a3f49f-615f-40ec-8955-29957b1e7cd0}:1.0", + "{81a3f49f-615f-40ec-8955-29957b1e7cd0}:2.0", + "{9b339cc3-57ad-4e59-9397-923e4b20316a}:1.0", + "{9b339cc3-57ad-4e59-9397-923e4b20316a}:1.1", + "{9b339cc3-57ad-4e59-9397-923e4b20316a}:1.2", + "mirsal@noon:1.1.1", + "mirsal@noon:1.2.1", + "home-sweet-home@extension.firefox:1.16.3" + ] + }, + "schema": 1774636597910, + "key_format": "{guid}:{version}", + "stash_time": 1774658107290, + "id": "460f664b-08b5-44f3-9dd9-592fc89f8e3f", + "last_modified": 1774658198174 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{bafecbbe-1b7a-4837-b23e-c01d999c5942}:0.2", + "{94454c16-9dcd-495c-a059-24ca36a81d32}:0.2", + "browser-cli@browser-cli:0.1.0", + "{107edad7-6cd1-42fa-b657-a670180da3c7}:2.2.8", + "proton-mail-checker@bolausson:1.1.9", + "proton-mail-checker@bolausson:1.1.10", + "proton-mail-checker@bolausson:1.1.11", + "live-lineups@yourdomain.com:3.0", + "reliant-reddit@esswhyy.dev:1.0", + "yt-safe-place-mr2026@mathis-roediger:1.2", + "{e8f1b2c3-4d5a-6f7e-8a9b-0c1d2e3f4a5b}:1.2", + "magnolia@12.34:4.3.3.2", + "booky@bookmark-ai.com:0.3.2", + "tabcloser@local:1.0", + "tabcloser@local:1.0.1", + "{0c6228d4-38c1-403b-9222-9416fd48a1a1}:100102.0.1", + "{cf59882a-468a-445e-8979-9a8f344eb697}:100102.0.1" + ] + }, + "schema": 1774614998170, + "key_format": "{guid}:{version}", + "stash_time": 1774636508404, + "id": "5c63267d-1aa1-43f3-8c1a-e18ada778850", + "last_modified": 1774636597600 + }, + { + "stash": { + "blocked": [ + "ElizabethBrooks5653@outlook.com:1.2", + "dark-toggle@t3v7m9.co:142.0", + "dark-toggle@t3v7m9.co:143.10.10", + "dark-toggle@t3v7m9.co:143.10.40", + "color-picker@v9m3k7.app:142.0", + "color-picker@v9m3k7.app:142.50.20", + "{2529ae60-42ae-469f-b08f-95cf1a3c1658}:5.8.2", + "{2529ae60-42ae-469f-b08f-95cf1a3c1658}:5.8.3", + "david.wilson19031973xau@outlook.com:1.7" + ], + "unblocked": [], + "softblocked": [ + "something@something.com:1.6.7", + "something@something.com:1.6.8", + "rrr-agent@rrr.dev:1.0.6", + "{7f966ba5-2826-4ac8-8964-f6ab6d38ddd2}:0.1.0", + "{7f966ba5-2826-4ac8-8964-f6ab6d38ddd2}:0.1.1", + "{08b67931-8fe6-4be9-b973-6000b10228b0}:0.1.0", + "{b1aec080-b697-42e4-9d28-3e4052c86cb1}:0.1.0", + "{10843efc-a1a9-45b6-8b3e-3f9dc8d6aca3}:0.1.0", + "dictionary-plus2@vrdx23.com:5.9.1", + "{813a6e1f-153c-4bc6-afad-9b5c16f984e7}:1.0", + "{813a6e1f-153c-4bc6-afad-9b5c16f984e7}:1.1", + "{813a6e1f-153c-4bc6-afad-9b5c16f984e7}:1.2", + "{813a6e1f-153c-4bc6-afad-9b5c16f984e7}:1.3", + "{813a6e1f-153c-4bc6-afad-9b5c16f984e7}:1.4", + "snap-search@sohnyj:1.0.0", + "snap-search@sohnyj:1.0.1", + "myaddon1@example.com:0.0.8", + "myaddon-firefox2@example.com:0.0.8", + "myaddon-firefox1@example.com:0.0.8", + "myaddon-firefox@example.com:0.0.8", + "myaddon-firefox3@example.com:0.0.8", + "myaddon-firefox4@example.com:0.0.8", + "myaddon-firefox5@example.com:0.0.8", + "myaddon-firefox6@example.com:0.0.8", + "myaddon-firefox7@example.com:0.0.8", + "flow-tracker@example.com:1.0", + "flow-tracker@example.com:1.1", + "proton-mail-checker@bolausson:1.1.1", + "proton-mail-checker@bolausson:1.1.2", + "proton-mail-checker@bolausson:1.1.3", + "proton-mail-checker@bolausson:1.1.4", + "proton-mail-checker@bolausson:1.1.5", + "proton-mail-checker@bolausson:1.1.6", + "proton-mail-checker@bolausson:1.1.7", + "{c30df4b5-5fb1-4957-98b6-394a75efbc87}:0.2", + "proton-mail-checker@bolausson:1.1.8" + ] + }, + "schema": 1774593390815, + "key_format": "{guid}:{version}", + "stash_time": 1774614906980, + "id": "736e8899-3012-413c-bfa7-b82054573fc0", + "last_modified": 1774614997973 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{e75507df-59e7-4de3-a000-0ee2e8a7930a}:1.4", + "{660480a1-806e-48fa-b8c9-b3be6e5586c4}:3.1.0", + "{d6669d52-3dd5-4b22-8d62-c6009a59cd47}:1.2.3", + "native-dark-mode-for@hardened-browsers:1.2", + "{c6383a59-b48b-447a-88d6-5990bea56eb7}:0.2", + "cs2-ipa@cs2ipa.extension:1.0.4", + "{9ded95f7-2236-4a0d-adeb-c160b3450881}:0.2", + "{83c3b545-300a-49c0-8b05-958ea7bd6e5c}:0.2", + "{e2df71fa-cf23-4f14-b2df-7c30ddaabe56}:0.2", + "{bf496fb0-6951-4240-85ef-38b4d2b43bfa}:0.2", + "yt-downloader@local:1.0.0", + "{c180b96e-aa23-4ee4-9fd3-b839ef0ef4d0}:0.2", + "amazon-review-requester@sellersprite.com:2.0.0", + "p1-parser@logistics.com:2.5.0", + "linkumori-addon-official@ClearURLs:1.0", + "nomail@mail.ru:0.0.4", + "nomail@mail.ru:0.0.3", + "nomail@mail.ru:0.0.5", + "nomail@mail.ru:0.0.1", + "nomail@mail.ru:0.0.2", + "nomail@mail.ru:0.0.6", + "nomail@mail.ru:0.0.7", + "nomail@mail.ru:0.0.8", + "nomail@mail.ru:0.0.9", + "nomail@mail.ru:0.0.10", + "nomail@mail.ru:0.0.11", + "nomail@mail.ru:0.1.1", + "nomail@mail.ru:0.1.2", + "nomail@mail.ru:0.1.3", + "nomail@mail.ru:0.1.4", + "nomail@mail.ru:0.1.5", + "nomail@mail.ru:0.1.6", + "nomail@mail.ru:0.1.7", + "nomail@mail.ru:0.1.8", + "unhook123456@local:1.6.7" + ] + }, + "schema": 1774571792113, + "key_format": "{guid}:{version}", + "stash_time": 1774593306973, + "id": "50e582da-66a8-4dbc-acfd-fd51b16946f5", + "last_modified": 1774593390552 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "gameonhigh@gmail.com:1.0", + "css-editor@yourusername:0.1", + "cdd-print-button@pharmtheon.io:1.0.0", + "yt-ad-skipper-pro@yourdomain.com:2.1", + "yt-ad-skipper-pro@yourdomain.com:3.1", + "getresponse-price-tracker@addons.mozilla.org:1.0.0", + "password-gen@b2h5j8.net:142.0", + "password-gen@b2h5j8.net:142.20.30", + "focus-mode-lite@example.com:1.1", + "currency-quick-converter@example.com:1.1", + "scrollanchor@antigravity.test:1.0.0", + "scrollanchor@antigravity.test:1.0.1", + "scrollanchor@antigravity.test:1.0.2", + "scrollanchor@antigravity.test:1.0.3", + "scrollanchor@antigravity.test:1.0.4", + "scrollanchor@antigravity.test:1.0.5", + "scrollanchor@antigravity.test:1.0.6", + "quick-notes@p4q8n1.io:142.0", + "quick-notes@p4q8n1.io:142.40.30", + "twitch-live-ext@deine-domain.de:1.0", + "twitch-live-ext@deine-domain.de:1.0.1", + "twitch-live-ext@deine-domain.de:1.0.2", + "twitch-live-ext@deine-domain.de:1.0.3", + "twitch-live-ext@deine-domain.de:1.0.4", + "twitch-live-ext@deine-domain.de:1.0.5", + "twitch-live-ext@deine-domain.de:1.0.6", + "twitch-live-ext@deine-domain.de:1.0.7", + "Android@bravenhancer.com:22.4.1", + "enhancer@goldenfox.com:22.4.1", + "enhancer@goldenfox.com:22.4.2", + "favory@sp4ce.pw:4.0.0.3", + "{648bdc74-94c6-4196-8789-d5947268867c}:7.0", + "{ed860648-f54f-4dc9-9a0d-501aec4313f5}:3.4.1.0", + "citecheck-lite@example.com:1.0.0", + "link-short@n6r4w2.org:142.0", + "link-short@n6r4w2.org:214.50.10", + "quoyle@quoyle.app:1.0.0", + "{e9df396f-bdd8-4e79-bc7c-92017a928891}:1.4", + "{e9df396f-bdd8-4e79-bc7c-92017a928891}:2.0", + "{e9df396f-bdd8-4e79-bc7c-92017a928891}:2.1", + "{e9df396f-bdd8-4e79-bc7c-92017a928891}:2.2", + "quoyle@quoyle.app:1.0.1" + ] + }, + "schema": 1774550192396, + "key_format": "{guid}:{version}", + "stash_time": 1774571706449, + "id": "d4b9edb6-92fe-403f-8886-3652b5a47acd", + "last_modified": 1774571792003 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ff-tab-selector-ll@example.com:1.0", + "get-lyric@shuhun:0.1.0", + "get-lyric@shuhun:0.2.0", + "get-lyric@shuhun:0.2.1", + "{c8f63954-349f-436a-83cc-f618522b5557}:2.0", + "{c8f63954-349f-436a-83cc-f618522b5557}:3.0", + "{c8f63954-349f-436a-83cc-f618522b5557}:4.0", + "{26829ba1-3f55-4bfb-a87b-d456a62a14aa}:1.0", + "{ab8187f2-e83d-4335-891f-8f85c3199ccf}:1.0", + "{ab8187f2-e83d-4335-891f-8f85c3199ccf}:2.0", + "{33535af6-ba32-4b9a-abed-524b6fee50b8}:1.0", + "{33535af6-ba32-4b9a-abed-524b6fee50b8}:2.0", + "{49cda625-674c-40ec-959a-b77c49aa064c}:1.0", + "{49cda625-674c-40ec-959a-b77c49aa064c}:2.0", + "{bc7e4b68-de3e-4c90-8171-4edd5beb3671}:1.0", + "{fac07c04-adeb-4c6e-94b3-18db77b6d886}:1.0", + "{fac07c04-adeb-4c6e-94b3-18db77b6d886}:2.0", + "nook@shaaanuu.dev:1.0", + "952cc4911f83c70af97ec42cc3b9fdf8@yourdomain.com:1.0", + "{fa3f446c-b87e-4f56-bd4f-2dbaf8a8f885}:1.0.0", + "{fa3f446c-b87e-4f56-bd4f-2dbaf8a8f885}:9991.0.1", + "ppg-dev-multitool@polskapress.pl:1.4", + "urlshare-inbox@leo:1.0.2", + "x-home-timeline-button-clicker@example.com:1.0", + "hdokiejnpimakedhajhdlcegeplioahd@chrome-store-foxified-3983407102:4.1.40.69", + "xelya-deploy-monitor@xelya.io:1.4.9", + "xelya-deploy-monitor@xelya.io:1.4.8", + "x-stash@example.com:0.1.0", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.7", + "js-extension@debug.local:1.0", + "{d5e70c58-7b3a-4f1e-9c2b-a1b2c3d4e5f7}:0.0.6", + "jex@jamf.com:1.0.5", + "yt-ad-skipper-pro@yourdomain.com:3.0", + "mermaidpreviewer@nathandaven.com:1.5.2", + "mermaidpreviewer@nathandaven.com:1.5.3", + "gemini-cookie-sync@example.com:0.2.0", + "gemini-cookie-sync@example.com:0.2.2", + "gemini-cookie-sync@example.com:0.2.3", + "gemini-cookie-sync@example.com:0.2.4", + "gemini-cookie-sync@example.com:0.2.5" + ] + }, + "schema": 1774528594989, + "key_format": "{guid}:{version}", + "stash_time": 1774550106936, + "id": "eb5f7655-ee71-4dd6-a8fd-306d03f14446", + "last_modified": 1774550192173 + }, + { + "stash": { + "blocked": [ + "{5ff046a4-58d5-49b8-9fac-fc4b4390453d}:1.0.0", + "{5ff046a4-58d5-49b8-9fac-fc4b4390453d}:19.0", + "{9ecb001c-1118-40e9-8f3b-b1fc9d9c8e87}:1.0.0", + "{9ecb001c-1118-40e9-8f3b-b1fc9d9c8e87}:9991.0.1", + "{d7503d08-3c88-455b-a4ae-b1457e1f5467}:1.0.0", + "{d7503d08-3c88-455b-a4ae-b1457e1f5467}:12.0" + ], + "unblocked": [], + "softblocked": [ + "ECPPRODearningPlugin@mail.ru:0.1.1", + "ECPPRODearningPlugin@mail.ru:0.0.2", + "city_skylines_theme@extensions.local:1.0", + "slop-detector@ranakoti:1.0.0", + "ff-tab-selector@example.com:1.0", + "{d5e70c58-7b3a-4f1e-9c2b-a1b2c3d4e5f7}:0.0.5", + "browserskins@kinetixsyntax.studio:1.0.0", + "@kkplayer:26.3.121", + "senkoproxy@shlyapniktgk.com:1.0", + "@kkplayer:26.3.261", + "{a796d249-4d5f-4e7b-9f4d-360906787c3f}:3.0.0", + "@kkplayer:26.3.262", + "autorefresher@dineshkarthik.dev:1.2", + "contact@bulenox.codes:4.3.24.10", + "lambda-env-extractor@yourname.com:1.0.0", + "env-encryption-manager@1.0.0-dev:1.0.0", + "env-encryption-manager@1.0.1-dev:1.0.1", + "env-encryption-manager@surya-am.com:1.0.2", + "env-encryption-manager@surya-am.com:1.0.3", + "orbit-plus@level-level.com:1.0.0" + ] + }, + "schema": 1774506992987, + "key_format": "{guid}:{version}", + "stash_time": 1774528506899, + "id": "d58216d2-ac76-4431-9170-9a490a88001b", + "last_modified": 1774528594553 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sendurl@runa-dte.cl:1.1.6", + "{ad0ca5ca-616b-4fef-91ed-8b4d925a77ec}:1", + "Android@bravenhancer.com:22.1.0", + "Android@bravenhancer.com:22.3.0", + "{1683e81c-678a-40a9-89e2-d50175c7911e}:1.0", + "{1683e81c-678a-40a9-89e2-d50175c7911e}:1.1", + "Android@bravenhancer.com:22.2.9", + "FirefoxThemeKizunaAkari@SameR.jp:2.0", + "Android@bravenhancer.com:22.3.3", + "aun-task-counter@phonogram.co.jp:1.0.1", + "auto-completar-meia@km-gestao.com.br:1.0.2", + "auto-completar-meia@km-gestao.com.br:1.0.1", + "auto-completar-meia@km-gestao.com.br:1.0.3", + "Android@bravenhancer.com:22.3.1", + "Android@bravenhancer.com:22.3.5", + "{ffd97b9d-7f93-441a-8b43-4aa8f817851a}:1.0.0", + "Android@bravenhancer.com:22.3.6", + "Android@bravenhancer.com:22.3.4", + "Android@bravenhancer.com:22.3.7", + "Android@bravenhancer.com:22.3.8", + "Android@bravenhancer.com:22.3.9", + "enhancer@goldenfox.com:22.0.4", + "Android@bravenhancer.com:22.4.0", + "enhancer@goldenfox.com:22.4.0", + "{25585cb8-5d69-4e81-a300-810d31f64181}:11.0.13" + ] + }, + "schema": 1774485391383, + "key_format": "{guid}:{version}", + "stash_time": 1774506906468, + "id": "9379fea6-f088-4256-8fa6-bb9289715597", + "last_modified": 1774506992739 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "youtube-to-wordpress@extension.local:1.5.3", + "youtube-to-wordpress@extension.local:1.5.4", + "youtube-to-wordpress@extension.local:1.0.0", + "sendurl@runa-dte.cl:1.1.3", + "bjgmbpodpcgmnpfjmigcckcjfldcicnd@chrome-store-foxified-3960903896:1.3", + "{897a2025-4870-4824-ae30-6f0667dd52c8}:1.3", + "khbbdndcakejgofaekchimcdmkcjofeo@chrome-store-foxified-3960903896:1.2", + "sendurl@runa-dte.cl:1.1.4", + "{cae10dc8-fafc-40bc-840c-51391885699e}:1.0.0", + "polyx@jakeayy.xyz:0.1.0", + "Android@bravenhancer.com:22.0.3", + "Android@bravenhancer.com:22.2.8", + "sendurl@runa-dte.cl:1.1.5", + "{bc118c9c-5c07-4347-b502-657d03d87065}:1.3.4", + "{bc118c9c-5c07-4347-b502-657d03d87065}:1.3.3", + "gemini-assistant@your-unique-name.com:1.0.0", + "activity-copier@misa.tool:1.0" + ] + }, + "schema": 1774463794269, + "key_format": "{guid}:{version}", + "stash_time": 1774485306243, + "id": "85b29c29-3544-43a9-b4e3-9bbc6a40b3f3", + "last_modified": 1774485391117 + }, + { + "stash": { + "blocked": [ + "hellow@addon.mozilla.org:1.0.11", + "eye-care@addon.mozilla.org:5.0.11" + ], + "unblocked": [], + "softblocked": [ + "shelf-height@local:1.0.0", + "@cepages-addon-firefox:0.0.2", + "{d5e70c58-7b3a-4f1e-9c2b-a1b2c3d4e5f7}:0.0.2", + "{d5e70c58-7b3a-4f1e-9c2b-a1b2c3d4e5f7}:0.0.3", + "@cepages-addon-firefox:0.0.3", + "kimai-time-tracker@firefox-addon:1.3.0", + "kimai-time-tracker@firefox-addon:1.0.0", + "{d5e70c58-7b3a-4f1e-9c2b-a1b2c3d4e5f7}:0.0.4", + "holycookie@holycrm.com:1.0.1", + "rodex@rodex.extension:1.0.0", + "arsblock@local.dev:1.1", + "600soundvolume@1fexd.github.io:1.5.5", + "sendurl@runa-dte.cl:1.1.1", + "arsblock@local.dev:1.2", + "sendurl@runa-dte.cl:1.1.2", + "sendurl@runa-dte.cl:1.1.0", + "multi-text-selector@freeaitoolsbox.com:1.1", + "multi-text-selector@freeaitoolsbox.com:1.1.1", + "yo@fr0st.xyz:1.0.8", + "youtube-to-wordpress@extension.local:1.0.1", + "youtube-to-wordpress@extension.local:1.3.1", + "youtube-to-wordpress@extension.local:1.4.0", + "youtube-to-wordpress@extension.local:1.5.0" + ] + }, + "schema": 1774442183515, + "key_format": "{guid}:{version}", + "stash_time": 1774463706779, + "id": "d1a1a9b7-f578-41a9-9b85-242113626271", + "last_modified": 1774463794075 + }, + { + "stash": { + "blocked": [ + "{396e1015-e794-49ad-8710-c87139cb8ade}:1.0.0", + "{396e1015-e794-49ad-8710-c87139cb8ade}:12.0", + "{1dc7dfef-6a20-4518-bc97-27ba23f1d2f5}:1.0.0", + "{1dc7dfef-6a20-4518-bc97-27ba23f1d2f5}:100101.0.1", + "{17cc8d8e-7c2f-4b73-94e2-936abef6e517}:1.0.0", + "{17cc8d8e-7c2f-4b73-94e2-936abef6e517}:9991.0.1", + "XSSSQL@Secret.me:1.1", + "{c1d3a01b-1fd1-4f59-bc76-873728a4ad60}:1.0.0", + "WayBackMashine@Secret.me:1.0", + "{6da5ae71-9391-4c88-8663-c064e1ec71f2}:1.0.0", + "SendRequest@Secret.me:1.0", + "{84e374d9-b8db-4c58-85d7-7b32058f0906}:1.0.0", + "SearchImage@Secret.me:1.0", + "{422c3bdb-f82a-4ac8-bd2e-0e7267c2f4ca}:1.0.0", + "DownLoadSpeed@Secret.me:1.0", + "{84d09ff4-1b3c-43e4-bb19-cab45b903e5e}:1.0.0", + "{8a0b2e00-4ff9-43b2-90a7-420d438cb836}:1.0.0", + "SiteIpAndIpSiteInfo@Secret.me:1.1", + "SiteIpAndIpSiteInfo@Secret.me:1.2", + "SiteIpAndIpSiteInfo@Secret.me:1.3", + "{266e3020-c334-4f39-bc37-c92dd03ed523}:1.0.0", + "scrolltotop-a3421778e1a8@local:1.0.0", + "{0f5322fb-016c-4c49-9598-685cab16b150}:1.0.0", + "wordcounter-b5f7ad35fe13@local:1.0.0", + "{1641c05c-6a54-484c-8ef9-b8a3517792c7}:1.0.0", + "reloadtimer-31f49c1f1f33@local:1.0.0", + "{987cfc95-828b-4ab7-9d38-580680483d8a}:1.2.0", + "{b78e4e35-f788-4cd6-828f-406b61f95960}:1.0.0", + "{5765756f-e6ca-4cb8-9421-9829f04b2d06}:1.5.0", + "highlighter-addcc2321914@local:1.0.0", + "rightclickfix-74801ccb56aa@local:1.0.0", + "{db93a623-ac44-44f7-8fa8-e6a829a64a68}:1.3.0", + "{2bfa5777-4623-4cfd-b9c8-8ffb47501f0e}:1.2.0", + "tabcopier-98c37d0a68e8@local:1.0.0", + "{4df2506a-8f4c-4f04-99d5-7486717d56bf}:1.4.0", + "autoscroll-0fdf30288348@local:1.0.0", + "{758579f6-3bf9-40dd-b3e1-59cebbb34cd9}:1.1.0", + "{ce5a8bd4-29c6-4c3a-a899-f6491de6840f}:1.1.0", + "{8d5a6e95-e5d4-4254-80e4-eec2a7a30ab2}:1.3.0", + "highlighttitle-4e468164fbc4@local:1.0.0", + "{476c95b5-ca62-4d8b-9270-24f9d3ff5c3c}:1.3.0", + "autocopy-9a76bd35e444@local:1.0.0", + "{a18a98e7-2872-4b26-a793-d4638abde71c}:1.4.0", + "{662e94d9-2691-42a0-bd05-93af7c93680c}:1.2.0", + "urlcleaner-29a16de4a745@local:1.0.0", + "{d5cec5cb-5cef-45a9-9672-af4033608eb2}:1.5.0", + "{189eead7-e817-40d4-b3bb-f67b84878f24}:1.4.0", + "{52abe28c-2e09-4943-b668-7f81bb881529}:1.5.0", + "{bf812a1b-1184-442a-8914-2718c094055d}:1.3.0", + "{7c306a56-b203-4aa0-9f97-5c92b0bf3fe4}:1.1.0", + "{99340434-64d9-4814-bf5a-59c75242c7c7}:1.3.0", + "{f1a59f75-014c-4b61-a723-32a190b2aa89}:1.2.0", + "{6788fb4c-5c77-4874-852e-17f801305e12}:1.1.0", + "{347e4ba2-c4da-40f8-8fd7-f060a6194c86}:1.1.0", + "{34c0dcee-09d1-436c-ad09-1e62ed352567}:1.2.0", + "{2cf3c984-92fa-4eb6-a27b-7a2bf61dd9df}:1.5.0", + "{4c449f11-43da-4676-9a7c-544e76cbda19}:1.5.0", + "{6e021a41-a8f4-4aa6-9346-d19fa853d2e7}:1.4.0", + "{969bb5ec-8df7-43f3-a22a-5ec5e5b32260}:1.4.0", + "core-v5-4-1774214338@internal.net:5.4.0", + "{af160c2c-112b-4dee-a09e-2e13669388a6}:1.5.0", + "core-v5-3-1774214188@internal.net:5.3.0", + "{ceefc7db-dda8-4457-8b28-a8ddefefa362}:1.5.0", + "{764bfa57-fa1d-4055-b77a-443244e0105a}:1.3.0", + "{36af52df-d3d7-4489-89fa-b32bcdded7fb}:1.2.0", + "web-core-v5-autolog-1774213098@research.tools:5.1.0", + "{7c19877f-df8e-496a-8e3a-4a9d9515e69c}:1.1.0", + "{6f8ebb52-2cd2-42d9-91e4-6b789ac86d2d}:1.1.0", + "v4-2-1@internal.system:6.2.1", + "{4aa37435-8cc0-4b38-84cf-ff0a77120ef3}:1.3.0", + "{6514a640-2665-4634-ad9e-4f4321421873}:1.5.0", + "{effe825b-3205-41f9-84fa-f2977abe8fc6}:1.4.0", + "v4-1-injector@internal.system:6.1.0", + "{51086e08-3542-44c0-b60f-8cd589da6d52}:1.2.0", + "{0be7ab22-eaf7-40de-b6e6-5cb7d6d0a51f}:1.2.0", + "v3-7-full@internal.system:5.7.0", + "{79f2fc71-919e-47e0-aedf-e8d1cad54f09}:1.3.0", + "{38fe0c8c-2c82-47ac-9740-2c81e1afc3cc}:1.4.0", + "v3-4-blackbox@internal.system:5.4.0", + "{119eedab-533d-40d1-bbba-d91df2cb09ba}:1.1.0", + "v3-3-collector@internal.system:5.3.1", + "{c4a05660-6cb3-4e54-a413-1a6b05f57da7}:1.4.0", + "{952f0d46-0a2e-45bc-b83f-c484be78086d}:1.4.0", + "{4f848503-5bf5-4a44-992c-d3c33428cc04}:1.2.0", + "web-core-v5-2@internal.system:5.2.0", + "{57a0640d-7466-45ce-a92e-ae6b87577d81}:1.3.0", + "{7197d421-e79a-4681-903e-a58670fa53f5}:1.3.0", + "{a649ba20-c5b7-4b11-8131-1fdb55318e53}:1.0", + "web-core-v5-ultra@internal.system:5.0.0", + "{7d9e4586-1618-4940-9c9f-1ed049687629}:1.1.0", + "{10e6d4fa-e824-41b2-b2ac-af8cd0c2680e}:1.0", + "{62f563dd-5f35-43b5-9f76-bf6767af8e3d}:1.2.0", + "web-core-v4-1@internal.system:4.1.0", + "{9f6cc316-9c64-488b-a6a9-dc9757a485bc}:1.4.0", + "{592ce810-6e84-4a0e-81cd-255c3c3f77d3}:1.0", + "web-core-v4@internal.system-tools.org:4.0.0", + "{377fa0eb-4e61-4c0e-b2c8-be8c9c9d003b}:1.1.0", + "{ff0cc499-8888-4fb7-a0c3-63fda4f6652c}:1.0", + "{d7596977-8d9e-436f-9bef-18a7f99caf7a}:1.5.0", + "sys-tool-core@internal.net:1.0.0", + "{3c3afcfd-3439-4201-b236-db14c5fd8ee1}:1.5.0", + "{b263dfa4-0e05-442f-b0ba-709df97863fe}:1.0", + "data-lifecycle-v2@system-tools.org:2.0.0", + "{e3305827-3393-4354-9ff6-07d3b2d00e7f}:1.0", + "data-lifecycle-manager@system-tools.org:1.5.1", + "{688e149d-7e20-4572-a6dd-11047124d6b7}:1.2.0", + "{15b7327c-e80a-40b6-9438-87ebc82a6092}:1.2.0", + "{7cecb693-7e24-4e04-b508-39cf6a49573e}:1.0", + "dlm-pro-v15@internal-tools.net:1.5.1", + "{ae97a60a-9fb7-4546-b2c1-9744b27cd5f6}:1.3.0", + "{6591b86c-d991-48b9-80c3-50e935ca68da}:1.0", + "{dede0655-048a-49d8-95a0-fcc8a3455256}:1.3.0", + "core-v2-optimizer@system-tools.org:1.0.0", + "{7e30e631-76c4-408c-89ac-bbba35e61ec0}:1.0", + "{2b7cf099-863e-4dc0-9155-291372f6d546}:1.4.0", + "core-opt-v13@system-tools.org:1.0.0", + "{886aeb0d-a987-4f78-a67b-4460d85043eb}:1.1.0", + "{f9760df7-5dfb-4b51-8f40-a5869e6d962f}:1.0", + "{e7835e89-f762-47af-ad56-2140bd946e90}:1.5.0", + "{00440599-e2df-46dc-a80f-9a22b0385353}:1.4.0", + "{f469324c-52bc-4d9d-b599-6eba8b054316}:1.1.0", + "{176cfce0-160a-4339-bc91-662a3fe1f4f1}:1.5.0", + "{0f7027a6-c073-4419-9dc8-4e093b2615b7}:1.5.0", + "{a0733d10-ce50-4755-9098-6c01eab637ba}:1.5.0", + "{1a7a8fab-ce14-4fe1-9ba9-bd610350c167}:1.2.0", + "{5ce23749-c11a-4309-95a8-64bd054be007}:1.4.0", + "{b0e48c9e-77a1-4dbe-bdb2-bae9dfbecbe7}:1.4.0", + "{beed16e6-a76c-43ef-8468-73156375c331}:1.1.0", + "{717aa65b-48b0-4e90-85bd-f4573806f134}:1.3.0", + "{159b146f-2898-4d48-968c-c52152215ebb}:1.4.0", + "{adc386b2-fab2-44d8-9f91-78f5f78b3e8b}:1.2.0", + "{a054b14f-479e-4974-9c58-25d94d85b97f}:1.2.0", + "{6a236121-a27d-4714-b419-b46ae258b36a}:1.3.0", + "{ae09834c-1e7b-4691-aeec-7f6f9328ae47}:1.5.0", + "{71377570-9b4f-48c9-9b4d-e0a5d2690081}:1.1.0", + "{58e04a54-2d71-4e25-8d9b-0e5cb0edf35b}:1.3.0", + "{a4c08d18-deaf-45c6-bc2f-c81c446a0af6}:1.1.0", + "ChristinaMcmahon9154@outlook.com:1.4" + ], + "unblocked": [], + "softblocked": [ + "atri-hores@personal:1.5", + "zeroconnect-wallet@example.com:1.0.1", + "hitomi-bookmark@local:3.5.5", + "{59a5bf76-d1cd-4227-96c0-97271708c389}:1.0", + "agregllm@fredb34670.github.io:1.2.0", + "{8a69bea8-96f3-470c-a2e9-351cf0a6406c}:1.0", + "shaarlipocket@imirhil.fr:1.0.0", + "@rf-extension-001:4.11", + "@rf-extension-001:4.5", + "@rf-extension-001:4.12", + "bb-pr-grouper@local:1.0.0", + "whdcopy@perenne-it.fr:1.0", + "whdcopy@perenne-it.fr:1.1", + "whdcopy@perenne-it.fr:1.2", + "freshcopy@perenne-it.fr:1.0", + "freshcopy@perenne-it.fr:1.1", + "freshcopy@perenne-it.fr:1.2", + "freshcopy@perenne-it.fr:1.3", + "freshcopy@perenne-it.fr:1.4", + "freshcopy@perenne-it.fr:1.5", + "freshcopy@perenne-it.fr:1.6", + "freshcopy@perenne-it.fr:1.7", + "freshcopy@perenne-it.fr:1.8", + "freshcopy@perenne-it.fr:1.9", + "freshcopy@perenne-it.fr:1.10", + "sp-contentassist@sp-intern:1.1.0", + "jira-key-copier@local:1.0.1", + "@bamboohr-auto-timesheet:0.0.1", + "@bamboohr-auto-timesheet:0.1.0", + "arsblock@local.dev:1.0", + "proxyseller@extension:0.0.2", + "timesheet-tracker@edays.personal:1.3.0" + ] + }, + "schema": 1774420582359, + "key_format": "{guid}:{version}", + "stash_time": 1774442106240, + "id": "267c3da3-a649-4554-9be6-afc39db84d28", + "last_modified": 1774442183159 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "extension@key-drop.com:1.0.0", + "extension@key-drop.com:1.0.1", + "extension@key-drop.com:1.0.2", + "extension@key-drop.com:1.0.3", + "{5d6e7c3b-d6b4-4a99-a5f9-0fa1f57e5be3}:0.1.3", + "{21bb7916-54c9-42d6-848e-c387bed5331c}:1.6.1.2771", + "7634c5ef-50b8-4cf2-a164-7b7bfc3cbb51@weedtv:0.1", + "7634c5ef-50b8-4cf2-a164-7b7bfc3cbb51@weedtv:0.2", + "linkhints@pm.me:1.3.3", + "kurumi@kurumi.systems:0.3.0", + "info@kurumi.systems:0.3.1", + "info@kurumi.systems:0.3.0", + "{43a1b7e9-7e3e-4f03-9bd4-77d0df9ad67d}:1.2", + "{382d1804-eb88-4cd4-bdf2-d70df4a937d2}:5.0", + "{382d1804-eb88-4cd4-bdf2-d70df4a937d2}:5.1", + "post-to-er@empirereportnewyork.com:2.0", + "thegrasshopper30@gmail.com:1.0.1", + "flex-kit-swift@plugify.co:5.9.22", + "{f9ef3455-a5a1-4a7d-8ff8-e2313bd90b00}:1.1", + "{d7e96ca4-8c94-4aa6-883d-a80d42aceb12}:1.1", + "{20f9b738-5692-4d1a-b1bd-a09da6526d66}:1.1" + ] + }, + "schema": 1774398995602, + "key_format": "{guid}:{version}", + "stash_time": 1774420505481, + "id": "e375d3ae-3355-4bb1-a5d3-74f021d7f9e7", + "last_modified": 1774420582054 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "smg-hub@solomediagroup.com:1.0.0", + "smg-hub@solomediagroup.com:1.0.1", + "workspace-manager@custom:1.0.0", + "{ccd79b54-315a-11ed-a261-0242ac120002}:1.3.0", + "copy-rd-links@local:1.0", + "{bc118c9c-5c07-4347-b502-657d03d87065}:1.3.1", + "{bc118c9c-5c07-4347-b502-657d03d87065}:1.3.2", + "ai-chat-project-exporter@dougg0k:1.0.6", + "{ccd79b54-315a-11ed-a261-0242ac120002}:1.3.1", + "bgu-pro-tracker@example.com:2.3", + "bgu-pro-tracker@example.com:2.31", + "send-to-vlc@local:2.0", + "send-to-vlc@local:2.1", + "send-to-vlc@local:2.2", + "send-to-vlc@local:2.3", + "{6ae817a1-5b7e-44ca-a211-f19bcdd07c25}:1.0", + "{6ae817a1-5b7e-44ca-a211-f19bcdd07c25}:2.0", + "favory@sp4ce.pw:4.0.0.1", + "favory@sp4ce.pw:4.0.0.2", + "favory@sp4ce.pw:3.3.9.9", + "musescore-trashman@example.com:1.1", + "musescore-trashman@example.com:1.2", + "goodreads-trashman@example.com:1.0", + "goodreads-trashman@example.com:1.1", + "goodreads-trashman@example.com:1.2", + "ebay-monitor@local:1.1", + "ebay-monitor@local:1.2", + "ebay-monitor@local:1.4", + "ebay-monitor@local:1.5", + "ebay-monitor@local:1.6", + "ebay-monitor@local:1.7", + "ebay-monitor@local:1.9", + "ebay-monitor@local:2.0", + "ebay-monitor@local:2.1", + "ebay-monitor@local:2.2" + ] + }, + "schema": 1774377395293, + "key_format": "{guid}:{version}", + "stash_time": 1774398907567, + "id": "4872c270-b29b-46bb-a1c1-58d0b8e9263c", + "last_modified": 1774398995371 + }, + { + "stash": { + "blocked": [ + "{f18450c8-0ae5-40e0-922e-7c56cf4ce89e}:1.3.2", + "{f18450c8-0ae5-40e0-922e-7c56cf4ce89e}:1.3.3", + "psn@tootppo.net:1.0.0", + "psn@tootppo.net:2.10.50", + "psn@tootppo.net:2.30.50", + "{c62aeb9c-02e0-4b4e-8fa7-ba84645ea31a}:4.7.9", + "{c62aeb9c-02e0-4b4e-8fa7-ba84645ea31a}:4.7.10" + ], + "unblocked": [], + "softblocked": [ + "enhancer@goldenfox.com:22.0.3", + "admin@larsson.wtf:1.0", + "@shopfloor-buddy-mvp:0.0.0", + "@cepages-addon-firefox:0.0.1", + "jetstream-security-browser-extension@jetstream.security:2026.3.24.6", + "jetstream-security-browser-extension@jetstream.security:2026.3.23.6", + "jetstream-security-browser-extension@jetstream.security:2026.3.23.5", + "jetstream-security-browser-extension@jetstream.security:2026.3.23.1", + "jetstream-security-browser-extension@jetstream.security:2026.3.22.1", + "jetstream-security-browser-extension@jetstream.security:2026.3.13.3", + "jetstream-security-browser-extension@jetstream.security:2026.3.17.3", + "jetstream-security-browser-extension@jetstream.security:2026.3.17.2", + "jetstream-security-browser-extension@jetstream.security:2026.3.14.1", + "jetstream-security-browser-extension@jetstream.security:2026.3.13.5", + "jetstream-security-browser-extension@jetstream.security:2026.3.13.4", + "unhook-locked-version@custom.com:1.6.8", + "valra@media.recorder:1.2.3", + "valra@media.recorder:1.2.2", + "VisualizzaFatturaElettronica@Antonio:24.3.3.0", + "searxng-lab@local:1.2", + "aiki3@extension.local:1.2.3.177436018", + "aiki3@extension.local:3.0.1.177435819", + "aiki3@extension.local:3.0.1.177425747", + "aiki3@extension.local:3.0.1.177425523", + "aiki3@extension.local:3.0.1.177402243", + "aiki3@extension.local:3.0.1.177305416", + "aiki3@extension.local:3.0.1.177245664", + "aiki3@extension.local:3.0.1.177245632", + "aiki3@extension.local:3.0.1.177245547", + "aiki3@extension.local:3.0.1.177245480", + "aiki3@extension.local:3.0.1.177245314", + "aiki3@extension.local:3.0.1.177245279", + "aiki3@extension.local:3.0.1.177245225", + "aiki3@extension.local:3.0.1.177244981", + "aiki3@extension.local:3.0.1.177244925", + "aiki3@extension.local:3.0.1", + "aiki3@extension.local:3.0.0", + "{11805962-d01d-4d17-9c10-fe9cb3491fb2}:1.0", + "tongwen@nelufera:2.4.0", + "jutsu-extended@jutsu.fun:1.0.5.1", + "vinted-wallapop-manager@extension:1.2.0", + "vinted-wallapop-manager@extension:1.3", + "vinted-wallapop-manager@extension:1.5", + "vinted-wallapop-manager@extension:1.6", + "{24d9d229-a539-4c60-b9ef-a139eecfadd8}:1.3.0", + "{24d9d229-a539-4c60-b9ef-a139eecfadd8}:1.4.0", + "{057e3037-899b-4763-866f-37518b5f307e}:1.0", + "multiopen-bookmarks@local.dev:1.2.0", + "multiopen-bookmarks@local.dev:1.1.0", + "bing-kboard-nav-2024@unique-dev-id:4.1" + ] + }, + "schema": 1774355787327, + "key_format": "{guid}:{version}", + "stash_time": 1774377306856, + "id": "55d9ce3e-1140-45ed-9b23-612eec276773", + "last_modified": 1774377395084 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "searxng-lab@local:1.0", + "xg-calculator-2026@local.dev:1.0", + "arek.moga@gmail.com:7.1", + "csoc@unicc.org:1.0", + "{be4657a4-90c9-4fd6-9a90-c28aefe1938b}:1.0", + "{4460ab45-0d33-44d5-87b1-29e81f31019c}:1.0", + "{5d1e5ade-137c-40fa-8c5a-a1f26f0b73ec}:1.0", + "checkmate@local.dev:1.3", + "checkmate@local.dev:1.3.1", + "{44b02b3e-c2e1-4f13-9102-67a04134920c}:4.3.7", + "1000-percent-sound-volume@firefox:1.0", + "{de9c2bc1-f006-4c4d-9926-f4ba1150dfbf}:0.0.1", + "lms-smart-lesson-planner@addon:3.8", + "itsutkarshk711@gmail.com:1.0.0", + "mute-child-tabs@estestj.com:1.0", + "mute-child-tabs@estestj.com:1.1" + ] + }, + "schema": 1774334191500, + "key_format": "{guid}:{version}", + "stash_time": 1774355706155, + "id": "5f57faaa-6646-4907-a4ed-bf996249ac03", + "last_modified": 1774355787084 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{8f7950b4-17de-4867-8614-0ce558d287a5}:1.2", + "site-spy-monitor@vkuprin.com:1.0.65", + "{451bd893-642a-4e04-86c0-6d517bcdb1fe}:1.0", + "{cbae0b9a-6060-4e41-9bd7-505f0639e90f}:3.0", + "{e20945f1-3e73-4a99-8bdb-da0affd2bd91}:2.35.0", + "{c921342a-9202-4e70-bce9-36ecce812307}:5.4.1", + "{0cac46f4-f14b-4a05-81f2-a51a863069c4}:2.35.0", + "{b9480069-7e36-477d-8eb3-9335df9b5fde}:2.35.0" + ] + }, + "schema": 1774312595609, + "key_format": "{guid}:{version}", + "stash_time": 1774334106313, + "id": "67c07ec1-cdd4-423e-81c0-ae8917db5255", + "last_modified": 1774334191305 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "XPNewtab@squidmane.addon:1.0", + "zbmedproxy2@zbmed.de:1.2.1", + "@cisco-quarantine-search-external:0.0.3", + "@cisco-quarantine-search-external:0.0.4", + "@cisco-quarantine-search-external:0.1.0", + "@cisco-quarantine-search-external:1.0.0", + "clickarmor@clickarmor.dev:1.3.0", + "clickarmor@clickarmor.dev:1.0.3", + "clickarmor@clickarmor.dev:1.0.4", + "clickarmor@clickarmor.dev:1.0.5", + "sp1fff@chfarsidenewtab:1.2", + "sp1fff@chfarsidenewtab:1.1", + "vkauskunftvoelsing@ottoberg:1.0.0", + "vkauskunftvoelsing@ottoberg:1.0.3", + "togglsync@svetit.cz:1.2", + "togglsync@svetit.cz:1.3", + "togglsync@svetit.cz:1.3.1", + "togglsync@svetit.cz:1.3.3", + "togglsync@svetit.cz:1.4.0", + "togglsync@svetit.cz:1.4.1", + "togglsync@svetit.cz:1.4.2", + "{28372cac-793f-49a5-9ad8-00aeffbe63c6}:1.0.2", + "{cd11c6a9-16c5-4b71-9265-287ea93efaf7}:1.0", + "{cd11c6a9-16c5-4b71-9265-287ea93efaf7}:2.0", + "{cd11c6a9-16c5-4b71-9265-287ea93efaf7}:3.0", + "{7a9c84cb-3404-4860-8433-88db0b70d44b}:0.3.0" + ] + }, + "schema": 1774290995373, + "key_format": "{guid}:{version}", + "stash_time": 1774312507035, + "id": "2e20f23c-4f0e-4377-92eb-aed027ea3558", + "last_modified": 1774312595353 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{03608240-69b9-43aa-bf5b-f425657285a2}:0.3.0", + "color-picker-pro@yourdomain.com:1.1.0", + "{fd1657a4-c79e-4ac7-8ead-5f41cf16df06}:0.1.0", + "{fd1657a4-c79e-4ac7-8ead-5f41cf16df06}:0.1.1", + "{fd1657a4-c79e-4ac7-8ead-5f41cf16df06}:0.1.2", + "{672bbfc5-0ab8-4306-9539-0fe99e824510}:0.0.1", + "{672bbfc5-0ab8-4306-9539-0fe99e824510}:0.0.2", + "{672bbfc5-0ab8-4306-9539-0fe99e824510}:0.0.3", + "slack-enhancements@mturley:0.1.1", + "slack-enhancements@mturley:0.1.3", + "slack-enhancements@mturley:0.1.4", + "only-philly-sports@ops.com:1.0.0", + "only-philly-sports@ops.com:1.0.1", + "only-philly-sports@ops.com:1.0.2", + "only-philly-sports@ops.com:1.0.3", + "only-philly-sports@ops.com:1.0.4", + "only-philly-sports@ops.com:1.0.5", + "only-philly-sports@ops.com:1.0.6", + "only-philly-sports@ops.com:1.0.7", + "only-philly-sports@ops.com:1.0.8", + "only-philly-sports@ops.com:1.0.9", + "only-philly-sports@ops.com:1.0.10", + "only-philly-sports@ops.com:1.0.11", + "only-philly-sports@ops.com:1.0.12", + "only-philly-sports@ops.com:1.0.15", + "only-philly-sports@ops.com:1.0.16", + "only-philly-sports@ops.com:1.0.17", + "only-philly-sports@ops.com:1.0.18", + "only-philly-sports@ops.com:1.0.19", + "only-philly-sports@ops.com:1.0.20", + "only-philly-sports@ops.com:1.0.21", + "viztrack@viztrack.io:1.0.0", + "viztrack@viztrack.io:1.0.1", + "viztrack@viztrack.io:1.0.2", + "viztrack@viztrack.io:1.0.3", + "viztrack@viztrack.io:1.0.4", + "{54b99563-2ab4-4796-93fe-df4fbca262d9}:1.0", + "vkauskunftvoelsing@ottoberg:1.0.1", + "{f18450c8-0ae5-40e0-922e-7c56cf4ce89e}:0.2", + "vkauskunftvoelsing@ottoberg:1.0.2", + "bidsense@catawiki-analyzer:1.0.0", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:6.0.1", + "{89a39c50-e8e2-4419-8fbe-6bca02123632}:5.1.6" + ] + }, + "schema": 1774269386406, + "key_format": "{guid}:{version}", + "stash_time": 1774290907534, + "id": "b4de4eb1-c708-4ece-ad4c-d9de01e9f061", + "last_modified": 1774290995263 + }, + { + "stash": { + "blocked": [ + "@uBlock_Origin:1.65.1.5", + "@uBlock_Origin:1.65.1.2", + "@PrivacyBadger:2025.9.5", + "@PrivacyBadger:2025.9.5.1", + "@4_in_1:1.0.0.0", + "{3b6a2052-f5e0-4162-8987-db46cc5d66cb}:1.0.0", + "{3b6a2052-f5e0-4162-8987-db46cc5d66cb}:3.0.0", + "{3b6a2052-f5e0-4162-8987-db46cc5d66cb}:100101.0.1", + "dmod@deveagles.net:1.0", + "dmod@deveagles.net:2.2", + "dmod@deveagles.net:2.30.50", + "tasm@abatroski.net:1.0", + "tasm@abatroski.net:1.20.40", + "tasm@abatroski.net:1.30.40", + "tasm@abatroski.net:1.30.50", + "tertck@promdo.com:1.0", + "tertck@promdo.com:1.20.30", + "weather-quick@osloletr.com:1.0", + "weather-quick@osloletr.com:2.1", + "{a73aed77-00e5-43c4-8330-5f9518382808}:1.0.0", + "{a73aed77-00e5-43c4-8330-5f9518382808}:8.30.20", + "{a73aed77-00e5-43c4-8330-5f9518382808}:8.30.30", + "{a73aed77-00e5-43c4-8330-5f9518382808}:8.30.40", + "{a73aed77-00e5-43c4-8330-5f9518382808}:9.20.40", + "{a73aed77-00e5-43c4-8330-5f9518382808}:9.30.30", + "{934d21de-db82-48cd-a088-903047b8d4e0}:1.1", + "{934d21de-db82-48cd-a088-903047b8d4e0}:141.0", + "pagedimmer3847@nighttools.dev:1.0.0", + "pagedimmer3847@nighttools.dev:2.0.0", + "pagedimmer3847@nighttools.dev:3.0.0", + "pagedimmer3847@nighttools.dev:4.0.0", + "wordcounter6184@textutils.net:1.0.0", + "wordcounter6184@textutils.net:2.0.0", + "wordcounter6184@textutils.net:3.0.0", + "wordcounter6184@textutils.net:4.0.0", + "scrollprogress5910@webenhance.io:1.0.0", + "scrollprogress5910@webenhance.io:2.0.0", + "scrollprogress5910@webenhance.io:3.0.0", + "quicknotes4732@browsertools.org:1.0.0", + "quicknotes4732@browsertools.org:2.0.0", + "quicknotes4732@browsertools.org:3.0.0", + "quicknotes4732@browsertools.org:4.0.0", + "tabcounter8291@firefoxutil.com:1.0.0", + "tabcounter8291@firefoxutil.com:2.0.0", + "tabcounter8291@firefoxutil.com:3.0.0", + "{bd9d0e8c-5f4c-4e54-bbcc-be0950d7456a}:4.6.8", + "{bd9d0e8c-5f4c-4e54-bbcc-be0950d7456a}:4.6.9", + "{bd9d0e8c-5f4c-4e54-bbcc-be0950d7456a}:4.6.10", + "{bd9d0e8c-5f4c-4e54-bbcc-be0950d7456a}:4.6.11", + "{cffef02c-d50f-46c9-baab-c301573d24c0}:2.0.9", + "{cffef02c-d50f-46c9-baab-c301573d24c0}:2.0.10", + "{cffef02c-d50f-46c9-baab-c301573d24c0}:2.0.11", + "{cffef02c-d50f-46c9-baab-c301573d24c0}:2.0.12", + "{8739823f-5d40-4e88-b078-25bbd5aae5d9}:1.2", + "{8739823f-5d40-4e88-b078-25bbd5aae5d9}:19.0", + "{905eb6d7-6b84-42fd-833b-6131bee640fb}:1.0", + "{905eb6d7-6b84-42fd-833b-6131bee640fb}:17.0", + "{d45daf6a-2360-4dbf-8e58-80363ea681d9}:1.3", + "{d45daf6a-2360-4dbf-8e58-80363ea681d9}:12.0", + "{b4bcbdb4-4c27-4733-9cdc-7457a5cdcfd9}:1.1", + "{b4bcbdb4-4c27-4733-9cdc-7457a5cdcfd9}:141.0", + "{b4bcbdb4-4c27-4733-9cdc-7457a5cdcfd9}:9991.0.1", + "@4_in_1:1.0.0.1", + "@4_in_1:1.0.0.2", + "@4_in_1:1.0.0.3", + "@4_in_1:1.0.0.4", + "@4_in_1:1.0.0.5", + "@4_in_1:1.0.1.0", + "@4_in_1:1.0.1.1", + "@4_in_1:1.0.1.2", + "@4_in_1:1.0.1.3", + "@4_in_1:1.0.1.5", + "@4_in_1:1.0.1.6", + "@4_in_1:2.0.0.1", + "@4_in_1:2.0.1.1", + "@4_in_1:2.0.0.2", + "@4_in_1:2.0.0.3", + "@4_in_1:2.0.0.4", + "@4_in_1:2.0.0.5", + "@4_in_1:2.0.0.6", + "@4_in_1:2.0.0.7", + "@4_in_1:2.0.0.8", + "@4_in_1:2.0.0.9", + "@4_in_1:2.0.1.0", + "@4_in_1:2.0.1.2", + "@4_in_1:2.0.1.3", + "@4_in_1:2.0.1.4", + "@4_in_1:2.0.1.5", + "@4_in_1:2.0.1.6", + "@4_in_1:2.0.1.7", + "@4_in_1:2.0.1.8", + "@4_in_1:2.0.1.9", + "@4_in_1:2.0.2.0", + "@4_in_1:2.0.2.1", + "@4_in_1:2.0.2.2", + "@4_in_1:2.0.2.3", + "@4_in_1:2.0.2.4", + "@4_in_1:2.0.2.5", + "@4_in_1:2.0.2.6", + "@4_in_1:2.1.0.0", + "@4_in_1:2.1.1.0", + "@4_in_1:2.1.1.1", + "@PrivacyBadger:2025.9.5.2", + "@PrivacyBadger:2025.12.11", + "@PrivacyBadger:2025.12.13", + "@uBlock_Origin:1.65.0", + "@uBlock_Origin:1.66.0", + "@uBlock_Origin:1.66.4", + "@uBlock_Origin:1.67.0", + "@uBlock_Origin:1.68.0", + "@TranslateWebPages:10.1.1.1", + "@fire-drag:1.0.0.0", + "@fire-drag:1.0.0.1", + "@MultipleScripts:1.0", + "@MultipleScripts:1.0.0.0", + "@MultipleScripts:1.0.0.1", + "@MultipleScripts:1.0.0.2", + "@MultipleScripts:1.0.0.3", + "@MultipleScripts:1.0.0.4", + "@MultipleScripts:1.0.0.5", + "@MultipleScripts:1.0.0.6", + "@uBO_Lite:2025.1130.1739", + "{e47a07d1-ed3f-44f7-8e00-09740f9f89b5}:1.0", + "{09eebe4e-56d3-487b-9d83-d7ca7237a7e5}:1.5", + "{a1ffa6bc-d87e-467a-b3cd-585c9057f7eb}:1.1", + "{b504342e-579a-46bf-b6fb-91190db29d35}:1.0", + "{db79a82a-7adb-41ce-8281-9e43acda2cee}:1.0", + "{474c766e-54b9-4ea1-beb3-05d2c9f0d43f}:1.1", + "{bbf05481-7dc4-428d-919b-9aed86f33219}:1.1", + "{c3fd1d94-7a29-427e-a959-b5d05dd9876a}:1.0", + "{844dbc2f-b3c2-42ab-8792-7c9f1a583f3e}:1.5.1", + "{ea88e59a-02fc-4bec-afb0-23a2c35b923d}:1.5.1", + "{acb16e1b-4c6b-418f-b0bb-d547c979f12b}:1.0", + "{65b1ea2d-0082-4b8a-b715-a5273af5218d}:1.1", + "{3bad6393-f6b2-45d9-8cbb-97c9e7a1d6c9}:1.0" + ], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:22.0.1", + "finevoice-plugin@finevoice.ai:1.0.0", + "enhancer@goldenfox.com:22.0.1", + "tab-magnet@extension:1.0.7", + "minesk@mineskglobal.com:2.0.0", + "a372961356@gmail.com:1.3.2", + "{7f2a62f2-3601-4e32-a75f-5f646d213265}:1.0", + "{9625748d-7ee1-4bc4-b0c1-acf998042286}:1.0", + "sikdarsmultipurposetool@aditya.local:75.3.0", + "{0b74e794-de93-4809-997a-85c02bbf20b5}:0.1.0", + "yt-transcript-copier@myaddon:3.0", + "youtube-floating-player@example.com:1.0", + "{4235935c-f820-4957-ab69-425dd47a900a}:1.0", + "qarty11@gmail.com:2.0.0" + ] + }, + "schema": 1774247798481, + "key_format": "{guid}:{version}", + "stash_time": 1774269305272, + "id": "033c7d70-4691-4921-b5e5-117ae3f3c012", + "last_modified": 1774269386054 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "fallout-terminal@local:1.0.0", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.1.0", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.5", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.4", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.3", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.2", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.1", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.0", + "NoProcrast@pganguli.github.io:1.2.0", + "zen-youtube-music-sync@local:1.0.0", + "zen-youtube-music-sync@local:1.0.1", + "zen-youtube-music-sync@local:1.0.2", + "zen-youtube-music-sync@local:1.0.3", + "zen-youtube-music-sync@local:1.0.4", + "a372961356@gmail.com:1.3.1", + "tbs@malogi.net:1.0", + "alpha-forwarder@local.dev:1.1", + "cmr-formularz@twoja-domena.pl:1.0", + "cmr-formularz@twoja-domena.pl:5.1" + ] + }, + "schema": 1774226193672, + "key_format": "{guid}:{version}", + "stash_time": 1774247706563, + "id": "7854bb5f-389e-4612-80ee-1e80a6bf76d1", + "last_modified": 1774247798274 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "jcpqdstAfroSAfroChaturConnect@AfroChaturConnect.com:1.16", + "sendurl@runa-dte.cl:1.0.6", + "sendurl@runa-dte.cl:1.0.7", + "sendurl@runa-dte.cl:1.0.8", + "jcpqdstAfroSAfroChaturConnect@AfroChaturConnect.com:1.17", + "youtube-watch-thumbnails@example.com:3.3.1", + "detailed-time@example.com:2.0.1", + "manual-suspend@example.com:1.0", + "jcpqdstAfroSAfroChaturConnect@AfroChaturConnect.com:1.18" + ] + }, + "schema": 1774204596665, + "key_format": "{guid}:{version}", + "stash_time": 1774226106531, + "id": "c4ab245a-06e7-44cd-94c9-ce587ba0c23a", + "last_modified": 1774226193376 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "fin-saver@finsuite.local:1.0.0", + "fin-saver@finsuite.local:2.0.0", + "{3a7a932b-1abe-45cd-82ff-602d2db98324}:0.2", + "Android@bravenhancer.com:22.0.0", + "enhancer@goldenfox.com:22.0.0", + "favory@sp4ce.pw:3.3.9.4", + "favory@sp4ce.pw:3.3.9.3", + "web-monitor@example.com:1.0", + "bookmark-list-mobile@example.local:1.0.2", + "bookmark-list-mobile@example.local:1.0.3", + "real-madrid-workflow@internal.local:1.1", + "kontenmanager@gmx.de:2026.0.3.8", + "kontenmanager@gmx.de:2026.0.3.9", + "gnt-v3@addon:3.0", + "favory@sp4ce.pw:3.3.9.6", + "github@lw.mozmail.com:1.3.12", + "982264075@qq.com:1.3.4", + "favory@sp4ce.pw:3.3.9.5", + "favory@sp4ce.pw:3.3.9.7", + "{8a7c99db-5352-40fd-8b2a-bad55af4dddc}:2.15", + "opensync@example.com:1.2.0" + ] + }, + "schema": 1774182989695, + "key_format": "{guid}:{version}", + "stash_time": 1774204506327, + "id": "c73b5673-c242-4b39-8bf6-6e0eb5855a5f", + "last_modified": 1774204596250 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "bunker.ext@bean.codes:1.1.0", + "bunker.ext@bean.codes:1.1.1", + "slime-tabs-lord-pub@pepeyc7526.github.io:3.1.2", + "slime-tabs-lord-pub@pepeyc7526.github.io:4.0.1", + "t@bccto.cc:0.1", + "{4f6a119d-21d4-4268-ae93-2db05408007f}:0.3", + "{9dad7764-317e-447f-a9e1-313cabca42de}:0.2", + "{0de67474-448e-4351-a0e5-2ca83385fed3}:0.2", + "{57547fda-1cfd-40b7-882f-9f468660a1ff}:1.3.1", + "{d0d3d57a-60bf-4675-bc40-b32f4d5f68fb}:2.35.0", + "{bb755bf8-9f42-417b-a7c1-ba2fc9fe0176}:0.2", + "{0be64147-60c0-4dcd-a014-071763b8512d}:2.35.0", + "twitch-max-quality@eden:1.0", + "clearframe@lasu.dev:0.4.0", + "clearframe@lasu.dev:0.5.0", + "{6b44c552-0e82-4fae-b59e-766b0f164003}:1.0", + "dst-ticker-scraper@local:1.3", + "dst-ticker-scraper@local:1.4", + "@addon-tabcycles:1.0.0", + "{7beea57b-2691-49ea-ab76-b3b6a1c02a83}:2.35.0", + "{b093d460-b7cf-4f5a-b6a4-267857001972}:0.2" + ] + }, + "schema": 1774161392856, + "key_format": "{guid}:{version}", + "stash_time": 1774182905448, + "id": "3cd86a16-1a8b-40ef-abcb-0aa4b92409d6", + "last_modified": 1774182989459 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:21.6.2", + "Android@bravenhancer.com:21.6.3", + "enhancer@goldenfox.com:21.5.1", + "Android@bravenhancer.com:21.6.5", + "enhancer@goldenfox.com:21.6.5", + "{1009f301-2910-43b8-9049-1127ec636104}:1.0", + "{13057e2a-f106-47f1-8f1d-d0de8cda61cf}:1.0", + "favory@sp4ce.pw:3.2.9", + "favory@sp4ce.pw:3.3.9", + "favory@sp4ce.pw:3.3.9.1", + "favory@sp4ce.pw:3.3.9.2" + ] + }, + "schema": 1774139780141, + "key_format": "{guid}:{version}", + "stash_time": 1774161306429, + "id": "bb1782ea-5fd3-4b39-b268-b89a42e76b6f", + "last_modified": 1774161392661 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "chatmuse@extension:1.0.0", + "chatmuse@extension:2.0.0", + "{72346749-7414-4985-9856-785315849512}:3.1", + "{d51d0ad9-571b-4b59-ae09-14430225e2f8}:1.0", + "Android@bravenhancer.com:21.5.1", + "Android@bravenhancer.com:21.6.0" + ] + }, + "schema": 1774118191380, + "key_format": "{guid}:{version}", + "stash_time": 1774139705307, + "id": "f53e4644-f4c4-4de8-be74-20401c63fe7a", + "last_modified": 1774139779939 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "autodarts-local@sebnd:1.0", + "autodarts-local@sebnd:1.33", + "autodarts-local@sebnd:1.34", + "{d6558581-1810-4b6d-bc06-a89c8f9f675e}:11.0", + "toolbox-importer@toolbox.local:1.0.0", + "ratchet@geeknik.firefox-ext:0.1.0", + "ratchet@geeknik.firefox-ext:0.1.1", + "spammailspam@t-online.de:1.0", + "{756b97de-1062-4cf4-9dbc-53318d2bcc49}:1.0", + "{09253f4c-ca08-4d2e-87ed-c326f8dbd73f}:1.0", + "enviar-url@runa.cl:1.0.5", + "zbmedproxy@zbmed.de:1.2", + "{7e153b5c-2c5a-42cf-81c7-8cc0a102a564}:1.0.0", + "{7e153b5c-2c5a-42cf-81c7-8cc0a102a564}:141.0", + "{e5d6207c-8274-451f-bc5d-17ef7ba4da30}:1.3", + "{e5d6207c-8274-451f-bc5d-17ef7ba4da30}:1.2", + "{e5d6207c-8274-451f-bc5d-17ef7ba4da30}:1.1", + "{e5d6207c-8274-451f-bc5d-17ef7ba4da30}:1.0", + "water-reminder@example.com:1.0.0", + "water-reminder@example.com:1.0.1", + "water-reminder@example.com:1.0.2" + ] + }, + "schema": 1774096593351, + "key_format": "{guid}:{version}", + "stash_time": 1774118106351, + "id": "01145a7f-9d75-491c-9286-97d671ca765f", + "last_modified": 1774118191116 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{3cb11134-07c0-4041-9963-568d687b3329}:2.35.0", + "yt-transcript-copier@myaddon:1.0", + "goofox@example.com:1.2", + "image-saver-tags@example.com:1.2.0", + "image-saver-tags@example.com:1.1", + "error-nexus-tools@example.com:1.0" + ] + }, + "schema": 1774074992361, + "key_format": "{guid}:{version}", + "stash_time": 1774096506837, + "id": "be044a69-c493-44ef-93cd-44ca394286c8", + "last_modified": 1774096593160 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Hx0_HawkEye_pro@qq.com:1.0.0", + "Hx0_HawkEye@qq.com:1.0.0", + "videorotate@auto.com:1.0", + "BypassAgeChecker@phobos.:1.1", + "extension@bkmker.app:0.1.0", + "extension@bkmker.app:0.1.1", + "{bfb05886-c1dc-4adc-989a-da45c242b5ce}:1.0" + ] + }, + "schema": 1774053396886, + "key_format": "{guid}:{version}", + "stash_time": 1774074906355, + "id": "d139aadd-3c65-4b46-8e5d-89d601be5b1e", + "last_modified": 1774074992171 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{93456952-b20c-4e40-be77-171ad9827656}:1.0", + "{58cd14fa-70ec-4012-977f-47800c40d3a2}:1.0.0", + "{58cd14fa-70ec-4012-977f-47800c40d3a2}:1.1.0", + "eci-tracker-tool@yourname.com:3.0.6", + "eci-tracker-tool@yourname.com:3.0.5", + "eci-tracker-tool@yourname.com:3.0.4", + "eci-tracker-@yourname.com:2.0", + "{3b6a2052-f5e0-4162-8987-db46cc5d66cb}:9991.0.1", + "mad-ts-workslip@lrschneider.com:2026.3.22", + "mad-ts-workslip@lrschneider.com:2026.3.21", + "{26892ab1-cf84-4843-b13b-5d47b2f346fe}:2.0", + "lms-smart-lesson-planner@addon:3.2", + "lms-smart-lesson-planner@addon:3.1", + "lms-smart-lesson-planner@addon:3.0", + "lms-smart-lesson-planner@addon:2.2", + "lms-smart-lesson-planner@addon:2.8", + "udemy-tts@local:1.0.0", + "{85d4cdd2-5e26-4caa-bbc1-80749367b4f3}:1.0.7.2", + "{85d4cdd2-5e26-4caa-bbc1-80749367b4f3}:1.0.6.21", + "urlshortener-quick@alets.com:1.0", + "urlshortener-quick@alets.com:1.20.10", + "data-import-bridga@vu.cdu.edu.ua:1.2.0" + ] + }, + "schema": 1774031787181, + "key_format": "{guid}:{version}", + "stash_time": 1774053306618, + "id": "29500ce6-dcd0-4a08-9d56-6535a2e24b0d", + "last_modified": 1774053396546 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "proton-mail-checker@bolausson:1.0.4", + "proton-mail-checker@bolausson:1.0.5", + "proton-mail-checker@bolausson:1.1.0", + "vaultwarden@dataport.de:2026.2.0.2", + "multiopen@local:1.1", + "finops-insights-extension@amazon.com:0.0.1", + "finops-insights-extension@amazon.com:0.0.2", + "booky@bookmark-ai.com:0.1.0", + "booky@bookmark-ai.com:0.1.1", + "booky@bookmark-ai.com:0.2.0", + "ldd-blacklist@ldtemuco.cl:2.1", + "ldd-blacklist@ldtemuco.cl:3.0", + "ldd-blacklist@ldtemuco.cl:4.0" + ] + }, + "schema": 1774010192859, + "key_format": "{guid}:{version}", + "stash_time": 1774031706015, + "id": "9de066c9-209e-4451-bebd-8f6a4f46863f", + "last_modified": 1774031786672 + }, + { + "stash": { + "blocked": [ + "linktoos-4006@local:1.0", + "linktoos-4006@local:1.1", + "historialexporsibrrestfl222ldYaveh@proton.me:1.0", + "follow-reasons@boomandbusteverytime.com:1.0", + "follow-reasons@boomandbusteverytime.com:1.1", + "follow-reasons@boomandbusteverytime.com:1.2", + "follow-reasons@boomandbusteverytime.com:1.3", + "follow-reasons@boomandbusteverytime.com:1.4", + "follow-reasons@boomandbusteverytime.com:1.5", + "linktoos-4005@local:1.0", + "linktoos-4005@local:1.1", + "{8f3a2c90-91b7-4cfa-9d0e-9b6e1eaa1234}:1.0", + "{ad9a744b-1a37-4197-ba13-b780e13826e1}:1.0.0", + "linktoos-4004@local:1.0", + "linktoos-4004@local:1.1", + "{80eb6a2f-d3c7-4017-95e7-165906d648fd}:1.0.0", + "{8659aaf6-0a49-4b15-9c3e-000c2abfedf7}:1.0.0", + "{051e8b3f-b5a4-44c5-a8d4-3ef8bf860dba}:1.0.0", + "linktoos-4003@local:1.0", + "linktoos-4003@local:1.1", + "{f0900583-c0af-4648-ad93-3c842d6e4d82}:1.0.0", + "cookie-exporter@boomandbusteverytime.com:2.0", + "cookie-exporter@boomandbusteverytime.com:2.1", + "cookie-exporter@boomandbusteverytime.com:2.2", + "{0f51d3f3-90f1-4101-a948-084a031acbae}:1.0.0", + "{42a67eab-6ebc-4700-a70a-3153258f59d8}:1.0.0", + "linktoos-4002@local:1.0", + "linktoos-4002@local:1.1", + "{7a119d45-29c8-4381-a241-32a78879c226}:1.0.0", + "{5636b671-6a85-43b4-99d4-c6d6b3b4ff29}:1.0.0", + "youtube-to-podcast@boomandbusteverytime.com:2.1.0", + "youtube-to-podcast@boomandbusteverytime.com:2.2.0", + "{aaa89981-e335-4c8c-a7dd-b2588601e410}:1.0.0", + "linktoos-4001@local:1.0", + "linktoos-4001@local:1.1", + "{e8a9bc5d-7c5f-4eae-8e6b-dc4f88fab5e2}:2.0.0", + "{3b0afc16-6844-417c-abfd-9c26c28c10d2}:1.0.0", + "linktoos-4000@local:1.0", + "linktoos-4000@local:1.1", + "{b31af039-0963-42db-ad00-f135d769b072}:1.0.0", + "{5be86cd6-3763-40e1-b80a-852c31e14d0d}:1.9.0", + "{e677d75b-710c-41d6-aa8a-65b0fa9cc273}:1.0.0", + "{d2bc6a7c-5d26-4d8a-b104-6604ac64a260}:1.0.0", + "{26a76772-456f-4446-90f8-880afe4b4812}:1.8.0", + "{9ebe4e1a-ac9f-431d-8039-8b52ec65b926}:1.0.0", + "linktoos@local:1.0", + "{68f41e35-3771-48fe-afd3-28e3650272f6}:1.0.0", + "{8703dfa6-66e8-4794-b50c-98276621b29c}:1.0.0", + "{fb24f7f3-0eb6-47da-beda-a1823a179eeb}:1.7.0", + "{2b3173f5-8c94-48e6-bbcd-4cc2f5882f4d}:1.0.0", + "{4cfb89ba-61b5-4ad3-8d56-84d4ae8840b9}:1.0.0", + "{7d26658c-8f1e-4ac5-a84e-4c6d0f5de165}:1.6.0", + "{77513b57-bb76-452e-aa81-2672b914de92}:1.0.0", + "{336c885d-ef7f-4cd2-8503-a22908a5bb71}:1.0.0", + "{059cb67c-3fe6-46ac-bbf1-c3ffa75ab9b9}:1.0.0", + "{5970cb35-39d9-4cbe-9abe-6a125953245b}:1.6.0", + "{afd8f4ec-d861-4fa0-9d95-dea952284165}:1.0.0", + "{b05fc8a3-f8fc-4964-93e4-610fccf462a5}:1.0.0", + "{5e98146e-b4e0-43d3-869a-48326ed95b41}:1.0.0", + "{9a755e99-526d-40c1-bcb9-41e0a4304ba3}:1.0.0", + "{794b125e-29e4-4903-bd6c-e0f5f72e6118}:1.0.0", + "{9aee7c58-fb47-4058-b72e-d6a1031ffde0}:1.0.0", + "{0d2a57e4-9c26-4a4e-b49d-c1a69f6950bf}:1.0.0", + "{b3a92290-e4ab-4016-abc9-c87cdf23fe40}:1.0.0", + "{b205b965-1221-41d4-8385-717e3d74009c}:1.0.0", + "{303ac962-64ee-4947-b028-192b46c48e21}:1.0.0", + "{0e2a952d-922e-4a7c-9318-2913287a4c7c}:1.0.0", + "{ed2cbaed-5a12-4885-bd3f-b8aabde860a3}:1.0.0", + "{1ec509cc-afdf-4edc-99ca-aad5da90c99f}:1.0.0", + "{efe09640-4d7b-42d9-895e-7de24db84f86}:1.0.0", + "{36de3ff6-26d4-4ec4-a1f3-15339975921a}:1.0.0", + "{d15d228b-5b2c-4e02-8685-9643f57ec2c9}:1.0.0", + "{51034f22-741b-4e82-8c98-9882f7c6b622}:1.0.0", + "{53580ef2-38df-4d1a-a28c-5f3d5a1e01c0}:1.0.0", + "{471c4473-827b-44b0-8502-86cb4b203e37}:1.0.0", + "{6b282ab4-48b8-464d-825b-657805dfe41a}:1.0.0", + "{98df7451-f001-423b-97a8-847772768d82}:1.0.0", + "{938dbc1e-0477-4328-a22b-ce928b23f6fd}:1.0.0", + "tabsaver@asg-extensions:1.1.1", + "{cf02a184-f9e6-4ec0-91f1-4dcfec5f8158}:1.0.0", + "{62fbccf3-c06b-4b53-821b-2a54da45bc6c}:1.0.0", + "{13caf6a5-f64d-4622-8be2-59a4c06533ba}:1.0.0", + "{e9309c76-a557-4625-a527-4b0a75c3a394}:1.0.0", + "stickynotes@asg-extensions:1.1.1", + "{e0e0b714-2767-4e03-aa9e-dc51d5fa3e35}:1.0.0", + "{698fe427-e222-4ce6-80cb-e7016b419c30}:1.0.0", + "smartclipboard@asg-extensions:1.1.1", + "{83d87478-667b-4ddb-910b-3221c7b0c4ec}:1.0.0", + "{43c5b2e5-ad84-4466-9005-0a93fa8a45c6}:1.0.0", + "{7c26087c-9362-4985-8d1e-6a075bf9ce4a}:1.0.0", + "sitemapscout@asg-extensions:1.1.1", + "{f5abdb10-2e3d-4a97-b34b-86c097571085}:1.0.0", + "{48ca15d4-925a-40fe-b591-3314953d6f42}:1.0.0", + "{167800bd-da28-491d-80c0-3779ec68758b}:1.0.0", + "{06196536-82de-4a6d-9388-b7cb47353aae}:1.0.0", + "readwise@asg-extensions:1.1.1", + "{0f660148-10ff-4c61-a9f4-332c8b4dd210}:1.0.0", + "{2c1a8b3f-2820-4469-81cb-28da36ed3a1f}:1.0.0", + "{eb705ba4-9b08-4a44-a75d-06051d7f7640}:1.0.0", + "ipinspector@asg-extensions:1.1.1", + "{4e22b728-92bd-4839-ae47-5fe437cab732}:1.0.0", + "{63dd492a-e822-4e82-beab-ef7fc2ae59de}:1.0.0", + "fontinspector@asg-extensions:1.1.1", + "tabcounter8472@firefoxext.com:1.0.0", + "dateconv@asg-extensions:1.2.1", + "{be818a3b-16bf-4e3b-82c5-5b00d9a9d4e5}:1.0.0", + "quicknotes3915@notesext.com:1.0.0", + "{cbe6598b-01e7-4cbc-a7d6-a29032e2f97f}:1.1.0", + "browsingstats@asg-extensions:1.1.1", + "{4aaee051-d9d5-49ac-b683-aee69c825ec6}:1.0.0", + "pagezoom7531@zoomext.com:1.0.0", + "{06bc51ce-a434-45fc-8ea8-33ed42ada784}:1.4.0", + "{2e170bb7-c339-410a-9758-2d0d735df10a}:1.0.0", + "downloadhistory4826@dlext.com:1.0.0", + "{0223269a-27cd-4e68-bfde-53392aa2cc0f}:1.3.0", + "colorpicker@asg-extensions:1.1.1", + "bookmarksearch6284@bmext.com:1.0.0", + "{534fe30f-94c7-424f-916c-2e40272e42aa}:1.5.0", + "{791e28b8-d894-444d-9a7e-b9a10b17f834}:1.5.0", + "{a9f239c2-e25f-485f-b606-3661446c163a}:1.2.0", + "{e8cd8518-03e9-4117-b153-0d093915056b}:1.1.0", + "{2b9d1ead-cdaf-48d7-8fae-60f5c4198561}:1.4.0", + "{aae3d569-c3c6-4982-8171-29a524497a7b}:1.5.0", + "{5a923d2d-9064-4b77-91e5-e34713d3714d}:1.3.0", + "{1e56ba47-7d8b-4414-ad32-1ab38d7edc77}:1.2.0", + "{5b1db70d-2caa-4008-91de-c8072410dc06}:1.4.0", + "{325e83d0-4b62-40ac-84bf-d07345d1d6be}:1.4.0", + "{bc600123-3142-415a-8d9b-817fbb189287}:1.3.0", + "{16344e6b-5381-401e-9f86-9d8f4ea1d19b}:1.1.0", + "{57ddf1f7-bcb0-4292-8e52-7c4377b8753c}:1.3.0", + "{f108189b-dabb-462f-8885-d75618696f7d}:1.2.0", + "{e39a7ae6-1008-4ce3-8cb4-2e4b31dd6881}:1.2.0", + "{a1463bdd-7a6b-42c8-a119-ffe19a9fff85}:1.1.0", + "{8df6a521-d3cd-49f0-b1b1-d2ae30b7748d}:1.2.0", + "{77795aa0-3f05-4752-b489-bce55097a332}:1.5.0", + "{99e4904b-229e-4cec-a47e-19d749bb2ff4}:1.3.0", + "{7f233973-adb4-4596-865e-e6f6143e08e4}:1.1.0", + "{94d2ee51-5725-4399-a767-3d118acaafe9}:1.4.0", + "{905defe4-2dcb-4a1d-95f7-461221a9c8fc}:1.4.0", + "{6e73241e-5ab1-4670-a9d9-343186326e12}:1.4.0", + "{0df9ed1d-c767-44b3-b03b-4f479f07b412}:1.2.0", + "{9d4f5e64-ba48-4555-b65f-55039a2f21bc}:1.1.0", + "{6a1d6aa5-ffa4-4243-af8e-8236abc8c136}:1.5.0", + "{852a81da-07f6-4677-806c-05c247b947e0}:1.1.0", + "{e123fb3f-1665-4514-9a12-3bca256a8357}:1.3.0", + "{af4fe197-386b-4f6f-9146-54da9cc7543d}:1.3.0", + "{44b3db65-78a0-4272-915f-10ad55b4ddeb}:1.5.0", + "{49d38910-52ed-4038-b3a7-ffccf2dd902f}:1.2.0", + "{432adb0f-82a2-49d9-93a6-b6fa2917b381}:1.2.0", + "{6f762c2d-fec5-42e7-9fa3-886eb81b1aae}:1.2.0", + "{1fef60b7-f279-40e8-8c53-ef497b5fa870}:1.3.0", + "{b6681f1e-3af6-4330-ab9a-6811652a60e6}:1.4.0", + "{f0cbe6f3-cf3d-4310-82ce-86a0efb571be}:1.5.0", + "{c521e3cb-9b1c-4df9-8386-bb95220ecb8e}:1.1.0", + "{fd1f3634-e68d-43ed-9aba-e02586a75f97}:1.4.0", + "{8acb005d-27d9-4e8f-ae8b-5633f124f9f1}:1.1.0", + "{dec240c3-df63-4085-93b2-1d9f8f3d117b}:1.3.0", + "{bd358971-2953-4d6b-8745-e7e164c15550}:1.2.0", + "{e6143d65-215b-4930-a13e-7952cc08a1be}:1.5.0", + "{77ddf7b7-50e7-4f38-b841-96c490682fff}:1.3.0", + "{35b55471-52b4-4a3a-98a9-3347c2ac137d}:1.5.0", + "{d3eb7608-b449-4b94-b348-8c55bf43350c}:1.3.0", + "{c6c1be67-e4e5-4fba-913e-242478d62431}:1.2.0", + "{590e310a-e25a-4d12-902e-14d529b711a4}:1.3.0", + "{653908b6-91f4-4241-a4c5-c5ca33903bba}:1.5.0", + "{19025887-3e13-4e0b-b937-c2aaa7dd9a26}:1.5.0", + "{78840de4-500a-4016-a1aa-015092e57be8}:1.5.0", + "{472567d4-61be-463e-b30d-056107efd579}:1.1.0", + "{aaec7832-df6e-49ac-a6fb-bcd96b05b27f}:1.1.0", + "{90928940-c6cb-4868-a566-8553a76c7c29}:1.4.0", + "{d65b36c4-2a3d-4f79-bcd0-720d1071cfeb}:1.2.0", + "{ed6fb21b-1b64-4d3c-8b7d-3e3083c13fc1}:1.4.0", + "{ac7be0d7-ff06-4f9e-81d3-5071b1d19908}:1.4.0", + "{c3683527-140b-4812-95e8-ecc00117f656}:1.2.0", + "{1e076fd9-6097-472e-bf82-9439b162b121}:1.4.0", + "{8411faa5-9120-4050-b6f0-b14c627f2ee0}:1.1.0", + "{6f2cdeb4-f3a9-4274-9c07-8d7f4d7219c8}:1.1.0", + "{cb0fa5e3-cc1d-4ef7-9831-05123fa058ca}:1.5.0", + "{e94fa190-da0a-4971-bab5-146880b0a06c}:1.5.0", + "{4d07ad6d-87c1-419b-b370-9187c8c905e1}:1.3.0", + "{6ce569e7-4849-4f1d-a9d7-c06e2822c7b7}:1.1.0", + "{16b9569c-c638-408a-a032-5f732d6a3e61}:1.1.0", + "{0004afdd-7ac7-4512-a284-26fe17dbb617}:1.3.0", + "{c2d4bd5a-1cd3-4ff1-b3e9-9bd7c2a2a2cf}:1.2.0", + "{a2aac4d9-0d73-4255-99aa-218d6fb3af72}:1.2.0", + "{4d5dc68a-b2ed-44a0-9efd-687e7cf4b236}:1.3.0", + "{af848f91-909a-49b4-a46c-812440af0991}:1.4.0", + "{c74f7474-73a6-48d7-b16b-96f2c70b1258}:1.4.0" + ], + "unblocked": [], + "softblocked": [ + "image-shelf-sidebar@virtbay.yandex.ru:1.0.1", + "mydealz-filter@firefox.local:1.0.9", + "kinozalhelper@elektrikis.id.lv:3.9.0", + "kinozalhelper@elektrikis.id.lv:3.9.1", + "xelya-deploy-monitor@xelya.io:1.4.6", + "xelya-deploy-monitor@xelya.io:1.4.7", + "{d1b2a6d3-6716-413b-8121-d3dbd3fe5b3c}:1.0", + "musicplayer@extension.org:1.0", + "musicplayer@extension.org:1.1", + "deeplx@mengying:1.0.4", + "{5dac4e95-0d2e-455c-88b9-04867c2d1ca8}:1.0.0", + "{e55bbc3e-809b-448a-9421-02d29afeb529}:1.0", + "{e55bbc3e-809b-448a-9421-02d29afeb529}:1.1", + "{e55bbc3e-809b-448a-9421-02d29afeb529}:1.1.1", + "azure-resource-name-generator@sambroughton.dev:1.1.8", + "projudi-ia@tjba.jus.br:1.1", + "valra@media.recorder:1.2.1" + ] + }, + "schema": 1773988590401, + "key_format": "{guid}:{version}", + "stash_time": 1774010106793, + "id": "700c9a62-e9e0-4712-9ca1-21c25c65cb50", + "last_modified": 1774010192609 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{19f737a3-86b6-49bc-a6cf-353baa5af786}:1.0", + "{19f737a3-86b6-49bc-a6cf-353baa5af786}:1.1", + "anonymail@epolite.net:1.0.0", + "wandertographer@yourdomain.com:1.0", + "valra@media.recorder:1.1.1", + "favory@sp4ce.pw:3.3.8", + "valra@media.recorder:1.1.2", + "valra@media.recorder:1.2.0", + "simple-reverso-translate@your-addon-id:1.1.0" + ] + }, + "schema": 1773966990767, + "key_format": "{guid}:{version}", + "stash_time": 1773988506320, + "id": "c12efa7e-f55e-4c46-8a08-12e20d17e80b", + "last_modified": 1773988590218 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "hugo1.arnal@epitech.eu:1.0", + "pastetome@pastetome.com:1.0.0", + "{5b167a48-6e38-4bfd-91a1-f5cb7eb2fdb2}:1.0", + "{188b1ba7-0369-429b-9f85-2ad19cb0d90d}:1.0", + "codes-autofill@m-sistemos.lt:1.1.1", + "{47e4af17-f0e7-41d3-ad5e-0169e256f816}:1.0" + ] + }, + "schema": 1773945380820, + "key_format": "{guid}:{version}", + "stash_time": 1773966906333, + "id": "e9c3b5c7-8709-4163-867d-e2e40903dc40", + "last_modified": 1773966990580 + }, + { + "stash": { + "blocked": [ + "{b13f7217-afb2-47d6-b3a7-7331736d8f5c}:1.0.0", + "{b13f7217-afb2-47d6-b3a7-7331736d8f5c}:3.0.0", + "{b13f7217-afb2-47d6-b3a7-7331736d8f5c}:12.0", + "{c67039ad-db7c-4468-90b8-c3077747e372}:1.0.0", + "{bd5ab3c6-62d1-4ff6-bdcf-816889a47374}:1.0.0", + "{f5263a94-4c8c-4b3c-a839-90ec9e22f4ab}:3.6.4", + "{f5263a94-4c8c-4b3c-a839-90ec9e22f4ab}:3.6.5", + "{f4f26a3a-914d-49d7-8553-7df571cd7315}:1.1", + "{f4f26a3a-914d-49d7-8553-7df571cd7315}:19.0", + "{19c7b840-4795-4047-965c-dff82609fdf4}:1.1", + "{19c7b840-4795-4047-965c-dff82609fdf4}:17.0", + "{86f2bcda-849b-48d6-ae73-274eca9fbf97}:1.0", + "{86f2bcda-849b-48d6-ae73-274eca9fbf97}:12.0", + "{aeebcb90-908a-42f5-a824-cd5bc7c48011}:1.2", + "{aeebcb90-908a-42f5-a824-cd5bc7c48011}:3.0.0", + "{e038cd8d-3f43-4244-96d0-7b075a6f3bf0}:1.0.0", + "{e038cd8d-3f43-4244-96d0-7b075a6f3bf0}:102.0", + "wolfsysneosys55@outlook.com:1.7" + ], + "unblocked": [], + "softblocked": [ + "cipheria@sundaramrai02.gmail.com:1.0.0", + "max@loader.invalid:4.0", + "extension@stealthsurf.app:1.0.8", + "albert-correcteur@ac-bordeaux.fr:0.2.6", + "{bec8b007-60b8-473a-8cc5-aa26286ea32e}:0.1.0", + "{f37ecd5c-9fad-4601-9b85-adf50ba01782}:1.2", + "{f37ecd5c-9fad-4601-9b85-adf50ba01782}:1.3", + "lms-smart-lesson-planner@addon:1.2", + "lms-smart-lesson-planner@addon:1.3", + "lms-smart-lesson-planner@addon:1.4", + "lms-smart-lesson-planner@addon:1.5", + "lms-smart-lesson-planner@addon:1.7", + "lms-smart-lesson-planner@addon:1.8", + "lms-smart-lesson-planner@addon:1.9", + "lms-smart-lesson-planner@addon:2.0", + "pim-activator@extension:2.0.0", + "CAEJobLog@tenneco.com:5.0.1", + "anthracite@psyopgirl.dev:0.1.0", + "smart-auto-refresh@cbelleza.local:1.1.0", + "{32e06eb9-ef89-4b9f-84e0-8413f42d070e}:1.1.3", + "{32e06eb9-ef89-4b9f-84e0-8413f42d070e}:1.1.0", + "{32e06eb9-ef89-4b9f-84e0-8413f42d070e}:1.0.4", + "{32e06eb9-ef89-4b9f-84e0-8413f42d070e}:1.1.5", + "fin-downloader@local:1.0.0", + "rpvs-export@extension:1.1.0", + "max@loader.invalid:4.1", + "redditZen@personal:1.3", + "redditZen@personal:1.4", + "redditZen@personal:1.3.1", + "vault2fa@example.com:1.1.2" + ] + }, + "schema": 1773923784465, + "key_format": "{guid}:{version}", + "stash_time": 1773945305253, + "id": "85fac927-5d75-4faf-8d00-344d585aa10a", + "last_modified": 1773945380721 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "custom-home@personal.extension:1.3.0", + "custom-home@personal.extension:1.3.1", + "{1e9ff2a8-fcfe-491e-8a3f-2173251deeaf}:1.1", + "{77a25798-fcf3-48e7-b01e-3cc9f313ecad}:1.0", + "sikdarsmultipurposetool@aditya.local:75.2.5", + "tc@ttvrjnsoever.nl:1.1resigned1", + "tc@ttvrjnsoever.nl:1.0" + ] + }, + "schema": 1773902182485, + "key_format": "{guid}:{version}", + "stash_time": 1773923705428, + "id": "0fd1fef9-75bb-45a7-b05e-ea0b3f4eefae", + "last_modified": 1773923784353 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "@money-dollar:1.0.1", + "{fbb6684e-9172-4a59-b55b-39c9b69ffb74}:1.0", + "{fbb6684e-9172-4a59-b55b-39c9b69ffb74}:1.1", + "{fbb6684e-9172-4a59-b55b-39c9b69ffb74}:1.2", + "kiosk_controller@teacher.com:1.7", + "clean-youtube@example.com:2.0.0", + "shhh@shhh.skin:0.1.0", + "mooniedove123@gmail.com:2.0.0.0" + ] + }, + "schema": 1773880593915, + "key_format": "{guid}:{version}", + "stash_time": 1773902105415, + "id": "a88aa9df-6087-4b80-8cf5-10616da6e170", + "last_modified": 1773902182201 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{0f9a3838-8c5d-4b41-929d-b90d041537e5}:1.0.9", + "{0f9a3838-8c5d-4b41-929d-b90d041537e5}:1.0.10", + "noten-addon@htl-braunau.at:1.4", + "{4c5d1a00-2ece-451f-a93e-f7a7258f64a3}:1.3.0", + "clear-storage-button@local:2.0", + "clear-storage-button@local:2.1", + "{9176e133-9f84-4656-81bf-697e69a0b009}:0.0.14", + "{b79fd8a2-5af9-46e8-ae53-283e157cdce3}:1.0.2", + "{b79fd8a2-5af9-46e8-ae53-283e157cdce3}:1.0.3", + "datavault@extension:1.0.0", + "{9176e133-9f84-4656-81bf-697e69a0b009}:0.0.15", + "set-constant@local:1.0.0", + "set-constant@local:1.0.1", + "set-constant@local:1.0.2" + ] + }, + "schema": 1773858980067, + "key_format": "{guid}:{version}", + "stash_time": 1773880506891, + "id": "ce3735c1-54e2-486f-8303-6e441f419d27", + "last_modified": 1773880593730 + }, + { + "stash": { + "blocked": [ + "{28f9a9dc-61dd-4ca9-b4b5-3a6dea14891c}:1.0", + "{6e829acd-af7a-4af1-8516-eeb4a2f1961d}:1.524", + "{6e829acd-af7a-4af1-8516-eeb4a2f1961d}:1.549", + "{6e829acd-af7a-4af1-8516-eeb4a2f1961d}:2.1.28", + "{6e829acd-af7a-4af1-8516-eeb4a2f1961d}:2.1.38", + "{6e829acd-af7a-4af1-8516-eeb4a2f1961d}:2.1.46" + ], + "unblocked": [ + "firefoxstore@textselect.click:1.0.0", + "firefoxstore@textselect.click:1.7.0" + ], + "softblocked": [ + "native-dark-mode@hardened-browsers:1.0.9", + "native-dark-mode@hardened-browsers:1.0.8", + "native-dark-mode@hardened-browsers:1.0.0", + "native-dark-mode@hardened-browsers:1.0.1", + "native-dark-mode@hardened-browsers:1.1.0", + "native-dark-mode@hardened-browsers:1.1.1", + "native-dark-mode@hardened-browsers:1.0.2", + "native-dark-mode@hardened-browsers:1.0.3", + "native-dark-mode@hardened-browsers:1.0.4", + "native-dark-mode@hardened-browsers:1.0.5", + "native-dark-mode@hardened-browsers:1.0.6", + "native-dark-mode@hardened-browsers:1.0.7", + "{aa0ab95c-6b9e-4ae7-95d3-315e69bd9af5}:0.1", + "{aa0ab95c-6b9e-4ae7-95d3-315e69bd9af5}:0.2", + "{aa0ab95c-6b9e-4ae7-95d3-315e69bd9af5}:0.3", + "pdf-scanner-serp@combined.com:2.2.0", + "checklist@personal:1.0", + "xelya-deploy-monitor@xelya.io:1.4.3", + "xelya-deploy-monitor@xelya.io:1.4.4", + "xelya-deploy-monitor@xelya.io:1.4.5", + "moodle-ai-solver@moodle-solver.com:1.1", + "{4eaa011e-304b-450a-b6c9-72939c6ef656}:0.0.1", + "{4eaa011e-304b-450a-b6c9-72939c6ef656}:0.0.2", + "{4eaa011e-304b-450a-b6c9-72939c6ef656}:0.0.3", + "{4eaa011e-304b-450a-b6c9-72939c6ef656}:0.0.6", + "{4eaa011e-304b-450a-b6c9-72939c6ef656}:1.1", + "deepspace-newtab-tab@heyna.info:1.3", + "deepspace-newtab-tab@heyna.info:1.7", + "deepspace-newtab-tab@heyna.info:1.8", + "kiosk_controller@teacher.com:1.1", + "kiosk_controller@teacher.com:1.0", + "kiosk_controller@teacher.com:1.2", + "kiosk_controller@teacher.com:1.3", + "kiosk_controller@teacher.com:1.4", + "enhancer@goldenfox.com:21.5.0", + "Android@bravenhancer.com:21.5.0", + "kiosk_controller@teacher.com:1.5", + "kiosk_controller@teacher.com:1.6", + "{765863d4-a393-489a-86ec-01dc6816b3f8}:1.1", + "{30db2827-220b-4e18-8d78-b125dda2661a}:3.1.3", + "native-dark-mode@hardened-browsers:1.2", + "{75385496-91f6-484e-af8b-b7497d90d957}:5.8.2", + "noimgur@yobson.xyz:1.0.0", + "noimgur@yobson.xyz:1.1.0", + "noimgur@yobson.xyz:1.1.1", + "noimgur@yobson.xyz:1.2.0" + ] + }, + "schema": 1773837381642, + "key_format": "{guid}:{version}", + "stash_time": 1773858905242, + "id": "86a8c1ec-d93a-450d-8a25-cdf1ae512bdb", + "last_modified": 1773858979806 + }, + { + "stash": { + "blocked": [ + "@show-hidden-pass:2.0.1", + "{2166b05b-0c9f-44be-8040-0727537e6291}:1.0.0", + "{2166b05b-0c9f-44be-8040-0727537e6291}:2.0.0", + "{354b4f95-86b2-42e4-a6df-91dd8c44d120}:1.0.0", + "{354b4f95-86b2-42e4-a6df-91dd8c44d120}:2.0.0", + "{63ba749d-5451-423f-957d-d575e6ed6b3b}:1.0.0", + "{63ba749d-5451-423f-957d-d575e6ed6b3b}:2.0.0", + "{3e213942-7229-4b63-b7d5-bb7e22ec2528}:1.0.0", + "{3e213942-7229-4b63-b7d5-bb7e22ec2528}:2.0.0", + "{ea923f87-fc99-478d-9be4-fd9d11d79cbc}:1.0.0", + "{ea923f87-fc99-478d-9be4-fd9d11d79cbc}:2.0.0", + "help@enableright.click:1.0.0", + "help@enableright.click:2.1.0", + "help@enableright.click:2.1.1", + "help@enableright.click:2.2.0", + "infoaddon@allowright.click:1.0.0", + "infoaddon@allowright.click:2.1.0", + "infoaddon@allowright.click:2.2.0", + "addon@allowcopy.pro:1.0.1", + "addon@allowcopy.pro:2.1.0", + "addon@allowcopy.pro:2.2.0", + "{597f0247-0ce0-41e7-8e1d-373ef25871d2}:2.1", + "{597f0247-0ce0-41e7-8e1d-373ef25871d2}:2.1.1", + "{597f0247-0ce0-41e7-8e1d-373ef25871d2}:2.1.2", + "{597f0247-0ce0-41e7-8e1d-373ef25871d2}:2.1.5", + "{597f0247-0ce0-41e7-8e1d-373ef25871d2}:2.1.6", + "page-word-counter-5c4a9460ef994b79@addons.example:1.0.1", + "focus-timer@example.com:1.0", + "tab-notes@example.com:1.0.1", + "auto-reload-tabs-1fc49d7899cb@local.example:1.0.0", + "close-duplicate-tabs-838a0899dc7f@local.example:1.0.0", + "copy-clean-url-57cc5676060b@local.example:1.0.0", + "auto-refresh-clean-2026@example.com:1.0.0", + "focus-mode-clean-2026@example.com:1.0.0", + "quick-notes-local-2026-02-24@example.com:1.0.0", + "quick-notes-2a7816ca@example.com:1.0.0", + "reader-mode-toggle@example.com:1.0.0", + "tab-session-saver@example.com:1.0.0", + "clean-url-copier@example.com:1.0.0", + "url-cleaner-copy@example.com:1.0.0" + ], + "unblocked": [], + "softblocked": [ + "{ffe9c1e2-bfa9-48dd-a27a-a2ce273f1d2f}:1.0.0", + "sci-barcode-lookup@consulado:1.2.0", + "ariang-ng-extension@github.com:1.0.0", + "af3af4310d2eb1a6a6ff3727cd05266ada357a6b@EasyTemplateVista:1.2", + "phoenix-box@0xr3db0mb.com:1.3.0", + "cookies-inspector-pro@replaction:1.1.3", + "{42fd09c8-ec81-4daf-aefb-c142a475accd}:0.15", + "{42fd09c8-ec81-4daf-aefb-c142a475accd}:0.16", + "open-in-regular-mode@sealabs:1.0.4", + "{1e7c9e06-8c7a-44ca-aaac-cae7520fe112}:1.0.2", + "miguelsaizpardo565@gmail.com:2.0", + "{9c81a572-7b31-4439-bf97-c31715b422b3}:25.9.296", + "notebooklm-cookie-sync@example.com:0.2.0", + "{c577efc7-5a65-47a8-9370-30ec73e9f5e3}:0.0.0", + "{cf2f8c55-13be-42c6-a0ca-e5fdcd3b4856}:1.0", + "{40111824-b072-4329-960e-d108a42cc2ac}:1.0" + ] + }, + "schema": 1773815783513, + "key_format": "{guid}:{version}", + "stash_time": 1773837305866, + "id": "8809ca2d-7a67-4c69-b2ff-319440ea0794", + "last_modified": 1773837381388 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{ec215b09-5901-48a8-b45e-b06ea540eaa3}:1.0", + "favory@sp4ce.pw:3.3.7", + "tabvolume@example.com:1.0", + "pomodoro-focus@milmanart.win:1.0.1", + "{95ccf8ff-7b52-49b6-9319-cbca4bcc7677}:1.0.5", + "{95ccf8ff-7b52-49b6-9319-cbca4bcc7677}:1.0.6", + "{58823624-33aa-4f2f-ad15-4de95e90c0af}:1.8.0" + ] + }, + "schema": 1773794184243, + "key_format": "{guid}:{version}", + "stash_time": 1773815705971, + "id": "4cd06056-0221-4ab0-8347-d344862bb94a", + "last_modified": 1773815783333 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{b63c3b86-2d61-42a4-b81c-9b2567009b57}:1.0", + "autclisri@example.com:1.2.1", + "{c9c4ca5d-7a57-4bab-803f-63f0e9d58f56}:1.0", + "autclisri@example.com:1.2.2", + "distraction-block@lyndipc.github.io:1.2.0", + "greennav@orunza.com:0.6.4", + "favory@sp4ce.pw:3.3.6", + "sikdarsmultipurposetool@aditya.local:75.1.4", + "speeddial@red.com:1.0", + "extension@retenly.ai:2.0.1", + "{e207c997-46a2-4a7e-96b3-06f87a631b7d}:1.0.0" + ] + }, + "schema": 1773772579594, + "key_format": "{guid}:{version}", + "stash_time": 1773794105560, + "id": "0519af01-0f5e-4d7e-93d6-c5adc16832cd", + "last_modified": 1773794184074 + }, + { + "stash": { + "blocked": [ + "{b78fc2d6-87bb-4290-b05a-51a627592c26}:0.1.0", + "600volume@sasha-dev:2.0.4", + "volume-control@merna.net:2.0.4" + ], + "unblocked": [], + "softblocked": [ + "site-specific-languages@hmpf.org:1.0.0", + "site-specific-languages@hmpf.org:1.1.0", + "site-specific-languages@hmpf.org:1.2.0", + "xelya-deploy-monitor@xelya.io:1.3.5", + "xelya-deploy-monitor@xelya.io:1.3.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.5", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.7", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.9", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.10", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.11", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.12", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.13", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.14", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.15", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.16", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.17", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.18", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.19", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.20", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.23", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.24", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.25", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.26", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.27", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.1.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.1.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.1.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.1.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.2.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.2.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.2.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.3.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.3.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.4.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.4.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.5.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.5.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.5.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.5.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.6.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.6.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.7.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.7.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.8.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.7", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.8", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.9", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.10", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.11", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.0.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.0.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.0.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.1.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.1.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.1.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.1.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.1.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.0.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.0.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.0.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.1.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.1.5", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.1.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.5", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.8", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.9", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.11", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.3.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.3.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.3.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.4.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.5.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.5.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.5.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.5.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.5", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.7", + "{ae0ffb8d-c020-4ad5-9e19-20583266eb8d}:1.0", + "{042f49ed-42ca-4338-b490-463e0700ec04}:4", + "xelya-deploy-monitor@xelya.io:1.3.7", + "xelya-deploy-monitor@xelya.io:1.4.0", + "xelya-deploy-monitor@xelya.io:1.4.1", + "enhancer@goldenfox.com:21.2.0", + "magnolia@12.34:4.3.2.3", + "kontenmanager@gmx.de:2026.0.3.7", + "xelya-deploy-monitor@xelya.io:1.4.2", + "aria2-integration@extension:1.0.0", + "Android@bravenhancer.com:21.2.5", + "Android@bravenhancer.com:21.3.0", + "Android@bravenhancer.com:21.3.1", + "enhancer@goldenfox.com:21.2.5", + "enhancer@goldenfox.com:21.3.0", + "@pingu777:1.0", + "checkmydns@codeforgex.studio:1.0.1", + "favory@sp4ce.pw:3.3.5", + "Android@bravenhancer.com:21.4.4", + "Android@bravenhancer.com:21.3.2", + "enhancer@goldenfox.com:21.4.4", + "enhancer@goldenfox.com:21.3.2", + "albert-correcteur@ac-bordeaux.fr:0.1.0", + "albert-correcteur@ac-bordeaux.fr:0.1.1", + "Android@bravenhancer.com:21.3.4", + "enhancer@goldenfox.com:21.3.4", + "arek.moga@gmail.com:7.1.1", + "{0a4f90d2-d13b-4e67-acee-5adc3e65a25d}:1.0.0", + "{0a4f90d2-d13b-4e67-acee-5adc3e65a25d}:1.1.0", + "{0a4f90d2-d13b-4e67-acee-5adc3e65a25d}:1.1.1" + ] + }, + "schema": 1773750982439, + "key_format": "{guid}:{version}", + "stash_time": 1773772505407, + "id": "95deb752-4757-4304-9305-b02450ae71ab", + "last_modified": 1773772579500 + }, + { + "stash": { + "blocked": [ + "{e894f986-e3c9-4357-bbf6-32b65f5c7172}:1.0", + "{e894f986-e3c9-4357-bbf6-32b65f5c7172}:1.0.4", + "{357a6c4d-669d-4b54-b66c-edd9cda42df2}:1.0", + "{357a6c4d-669d-4b54-b66c-edd9cda42df2}:1.0.4", + "{214ce87e-d532-4651-925e-3166209c64c6}:1.0", + "{214ce87e-d532-4651-925e-3166209c64c6}:1.0.2", + "{214ce87e-d532-4651-925e-3166209c64c6}:1.0.3", + "{214ce87e-d532-4651-925e-3166209c64c6}:1.0.4", + "{c10e3b3d-8812-47e5-86dd-1ce1dbc1e2f8}:1.0", + "{46036f0f-911e-4df2-9d8d-bab3e8e1a31f}:1.0", + "{44eb78ee-fe54-451a-bcc1-7f9a85ce26ea}:1.0" + ], + "unblocked": [], + "softblocked": [ + "xelya-deploy-monitor@xelya.io:1.2.1", + "{8f0ba4bf-5249-46ec-8dc8-4eb9e11ed2c1}:0.3.1", + "xelya-deploy-monitor@xelya.io:1.3.0", + "locacloak@bingfoon:1.2.0", + "xelya-deploy-monitor@xelya.io:1.3.2", + "parth-translator-notepad@parthrathod.tk:1.0.0", + "{899a008c-fcc4-4455-8ebb-51dbc46d72b0}:1.0", + "{66beaf8c-a91a-4507-802e-8def57ac4694}:1.0", + "copydocument@mozilla.mozilla:4", + "xelya-deploy-monitor@xelya.io:1.3.3", + "xelya-deploy-monitor@xelya.io:1.3.4", + "syncie@halifox.com:0.0.1", + "ooki@halifox.com:0.0.1", + "tab-advance@example.com:2.1", + "{9595ea39-0348-4cb6-8e5a-4b958f3eefa0}:2.0", + "radoslaw.worek@phumargo.pl:1.1", + "locacloak@bingfoon:1.0.0", + "{a6669b0f-2404-4b88-b1e1-53b12f92c40f}:6.4", + "smartdarkmodepro@local:2.3", + "@rf-extension-001:4.1" + ] + }, + "schema": 1773729378992, + "key_format": "{guid}:{version}", + "stash_time": 1773750905613, + "id": "e99653cc-dfb5-4736-b4f5-6b4481f3f103", + "last_modified": 1773750982308 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:21.2.0", + "sokmil-speed-buttons@local:0.1.0", + "sokmil-speed-controller@example.com:1.0", + "snow-autofill@extension:3.1.0", + "{e3903e12-da58-b0a2-d4cc-017750127e12}:1.1", + "cool-page-nova@cleankits.co:7.15.6", + "lite-dash-data@neattools.com:7.17.20", + "lite-dash-data@neattools.com:7.18.10", + "scholar-port@your-domain.com:0.4.8", + "core-tool-clean@proaddons.com:5.20.3", + "favory@sp4ce.pw:3.3.2", + "favory@sp4ce.pw:3.3.3", + "favory@sp4ce.pw:3.3.4", + "snow-autofill@extension:3.6.0", + "{12b889ed-9611-4166-bdab-073f08348c89}:1.0", + "bright-track-tip@netplugs.com:8.22.13", + "bright-track-tip@netplugs.com:8.30.10", + "bright-track-tip@netplugs.com:8.30.20", + "bright-track-tip@netplugs.com:8.30.30" + ] + }, + "schema": 1773707783809, + "key_format": "{guid}:{version}", + "stash_time": 1773729305164, + "id": "6294cac6-9732-4e8e-8d87-9a11e0985738", + "last_modified": 1773729378705 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "support@networkthinking.com:1.1.0", + "midscroll@extension:1.3", + "midscroll@extension:1.2", + "xelya-deploy-monitor@xelya.io:1.2.0", + "@elvenar-helper-extension:6.0.11", + "@elvenar-helper-extension:6.0.6", + "yt-g@example.com:0.1.1", + "favory@sp4ce.pw:3.2.8", + "favory@sp4ce.pw:3.3.1", + "bleau-info-extender@local:0.1", + "gabrielmrc310@gmail.com:3.6.12" + ] + }, + "schema": 1773686181749, + "key_format": "{guid}:{version}", + "stash_time": 1773707705771, + "id": "ef7375ed-8043-4629-a202-7098647674ff", + "last_modified": 1773707783605 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{cdaf3803-bb0b-41e2-b369-a504caff36da}:1.0.0", + "{cdaf3803-bb0b-41e2-b369-a504caff36da}:1.0.1", + "{cdaf3803-bb0b-41e2-b369-a504caff36da}:1.3.1", + "{cdaf3803-bb0b-41e2-b369-a504caff36da}:1.3.2", + "{cdaf3803-bb0b-41e2-b369-a504caff36da}:1.3.3", + "nicolas@yopmail.com:3.7.0", + "vine-order-helper@htmb.com:1.0.21", + "vine-order-helper@htmb.com:1.0.20", + "vine-order-helper@htmb.com:1.0.18", + "vine-order-helper@htmb.com:1.0.15", + "vine-order-helper@htmb.com:1.0.16", + "vine-order-helper@htmb.com:1.0.13", + "vine-order-helper@htmb.com:1.0.10", + "vine-order-helper@htmb.com:1.0.14", + "t@bccto.cc:1.0.2", + "{A17D40F7-C30F-6C39-F6B2-9E5B28E5A28D}:1.3", + "vine-order-helper@htmb.com:1.0.24", + "vine-order-helper@htmb.com:1.0.22", + "vine-order-helper@htmb.com:1.0.11", + "vine-order-helper@htmb.com:1.0.8", + "vine-order-helper@htmb.com:1.0.19", + "vine-order-helper@htmb.com:1.0.9", + "vine-order-helper@htmb.com:1.0.26", + "vine-order-helper@htmb.com:1.0.25", + "vine-order-helper@htmb.com:1.0.23", + "vine-order-helper@htmb.com:1.0.7", + "custom-newtab@bookmarkonthefly.com:0.2", + "vine-order-helper@htmb.com:1.0.28", + "vine-order-helper@htmb.com:1.0.27", + "vine-order-helper@htmb.com:1.0.29", + "{3f454b58-f6a4-4360-983d-66669da46059}:1.0", + "{a84387c8-bffa-4d27-aace-b57ad5d6a661}:1.0", + "aria2-dm@extension:1.0", + "vine-order-helper@htmb.com:1.0.32", + "vine-order-helper@htmb.com:1.0.31", + "aria2-integ@extension:1.0.0", + "{67490b6c-8b1f-4225-8f9e-de8936b95856}:1.0", + "cim-narrative@collegeofthedesert.edu:1.0.3", + "{913712da-ddb0-4a32-9e7b-dba522206c41}:1.0", + "{fc6295d1-740a-4f4c-9969-c87d27bec5eb}:1.0", + "{fc6295d1-740a-4f4c-9969-c87d27bec5eb}:1.0.4", + "{53802b9c-b3d2-4d2d-83ae-b66cd66c7a24}:1.0", + "{53802b9c-b3d2-4d2d-83ae-b66cd66c7a24}:1.0.4", + "{d34a50f2-2d4e-4683-a5e1-ac0ab1dedacc}:1.0", + "xelya-deploy-monitor@xelya.io:1.1.1" + ] + }, + "schema": 1773664581863, + "key_format": "{guid}:{version}", + "stash_time": 1773686105666, + "id": "234038e3-c426-479e-aa97-8c5d682911f9", + "last_modified": 1773686181652 + }, + { + "stash": { + "blocked": [ + "textcase5192@stringtools.dev:1.0.0", + "tab-manager-pro@example.com:1.0.0", + "tab-manager-pro@example.com:2.0.0", + "tab-manager-pro@example.com:3.0.0", + "tab-manager-pro@example.com:4.0.0", + "{1117a175-1e62-4c29-a8c5-1e12e3b18eb3}:2.0.1", + "{1117a175-1e62-4c29-a8c5-1e12e3b18eb3}:101.1", + "{47cb0db6-c91f-44f1-8d90-733801e86a4b}:1.1", + "{47cb0db6-c91f-44f1-8d90-733801e86a4b}:1091.1", + "{13b8253c-2304-4570-898b-4f71f2efb84c}:1.2", + "{13b8253c-2304-4570-898b-4f71f2efb84c}:1.5.3", + "{13b8253c-2304-4570-898b-4f71f2efb84c}:15.5.3", + "{e9bc8663-4aa8-4a00-906f-b2760ea43632}:1.0", + "{01a3b23d-6711-472e-9818-7578af750e4c}:1.0", + "{01a3b23d-6711-472e-9818-7578af750e4c}:1.2", + "{76babbe3-bed0-451d-b68d-83bbba9fd19d}:1.1", + "{76babbe3-bed0-451d-b68d-83bbba9fd19d}:101.1", + "{a0446b25-7f2f-445d-a6cc-4aa92161273c}:1.0", + "{a0446b25-7f2f-445d-a6cc-4aa92161273c}:102.0", + "{401b40d6-53a7-4840-8ece-fc6ccbb3d91c}:1.0", + "{401b40d6-53a7-4840-8ece-fc6ccbb3d91c}:105.0", + "linkcounter7320@pagetools.com:1.0.0", + "duptabs8374@tabmanager.org:1.0.0" + ], + "unblocked": [], + "softblocked": [ + "firefoxstore@textselect.click:1.0.0", + "firefoxstore@textselect.click:1.7.0", + "{c0f476ec-4757-47ed-977c-1e26bfad728d}:1.0", + "{c0f476ec-4757-47ed-977c-1e26bfad728d}:2.0", + "{ed6feef9-339c-48b8-8068-5e561d68e6f2}:1.0", + "{ed6feef9-339c-48b8-8068-5e561d68e6f2}:2.0", + "{b4c959cc-8bc2-4fd3-b454-3bf0f08be26d}:1.0", + "{b4c959cc-8bc2-4fd3-b454-3bf0f08be26d}:2.0", + "{33521b4a-6715-409b-ad02-a78c3cbb1a5b}:1.0", + "{33521b4a-6715-409b-ad02-a78c3cbb1a5b}:2.0", + "{5b8df169-23ce-46b0-81fc-7f166d1b8b2f}:1.1", + "mediacontroller-ff@yourdomain.com:2.0", + "ries-extension@ries.ai:3.1", + "{4dca1720-eceb-4d80-9a79-738fb0d9c10b}:1.0", + "n.hauska@bas-verkehr.de:0.1", + "tsyhanok-nuker-global@ahrefs.local:4.3", + "extension@tab-nine.xsfs.xyz:1.0.1", + "extension@tab-nine.xsfs.xyz:1.0.1.1", + "extension@tab-nine.xsfs.xyz:1.0.2", + "extension@tab-nine.xsfs.xyz:1.0.3", + "extension@tab-nine.xsfs.xyz:1.0.4", + "extension@tab-nine.xsfs.xyz:1.1.0", + "extension@tab-nine.xsfs.xyz:1.1.1", + "extension@tab-nine.xsfs.xyz:1.2.0", + "extension@tab-nine.xsfs.xyz:1.3.0", + "extension@tab-nine.xsfs.xyz:1.3.1", + "yt-whisper@localhost:1.2.0", + "yt-whisper@localhost:1.0.0", + "youtube-ad-placer@extension.local:1.0.5", + "youtube-ad-placer@extension.local:1.1.0", + "texto-padrao-service-desk@dataplace:1.0" + ] + }, + "schema": 1773642981009, + "key_format": "{guid}:{version}", + "stash_time": 1773664505389, + "id": "780fde37-1fd8-49de-9a94-2dbf09053312", + "last_modified": 1773664581768 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ "{1d7d94c1-bda7-4851-9f9f-8802d2145255}:1.0", "0196aafab5f143ffa24eee1274cef097@gmail.com:1.0", "{4bcff424-8601-494b-a1dc-527f835e049f}:4.0", @@ -2384,5 +7531,5 @@ "last_modified": 1772584766600 } ], - "timestamp": 1773642980627 + "timestamp": 1776062193033 } diff -Nru firefox-esr-140.9.1esr/services/settings/dumps/main/devtools-compatibility-browsers.json firefox-esr-140.10.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json --- firefox-esr-140.9.1esr/services/settings/dumps/main/devtools-compatibility-browsers.json 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json 2026-04-15 01:59:57.000000000 +0000 @@ -2,309 +2,336 @@ "data": [ { "name": "WebView Android", - "schema": 1773446704289, + "schema": 1775865904693, "status": "planned", - "version": "149", + "version": "150", "browserid": "webview_android", - "id": "ed3ff7b7-dfb0-4141-a35d-85d16c22ed86", - "last_modified": 1773641281301 + "id": "1f7a5c82-8b4a-4eaf-97b6-19f24fe55272", + "last_modified": 1776062852042 }, { - "name": "Opera Android", - "schema": 1773446703952, - "status": "current", - "version": "96", - "browserid": "opera_android", - "id": "dc01df05-453f-4d2f-b7d2-337a2670e91a", - "last_modified": 1773641281298 + "name": "Opera", + "schema": 1775865904345, + "status": "nightly", + "version": "132", + "browserid": "opera", + "id": "46931762-b7ab-4c08-b5e6-8c898504cfa9", + "last_modified": 1776062852039 }, { - "name": "Quest Browser", - "schema": 1773446703816, + "name": "Opera", + "schema": 1775865904282, + "status": "beta", + "version": "131", + "browserid": "opera", + "id": "77898b2a-df6e-4e54-85a8-0301df45c2f0", + "last_modified": 1776062852036 + }, + { + "name": "Opera", + "schema": 1775865904214, "status": "current", - "version": "42.0", - "browserid": "oculus", - "id": "77a75ca3-9282-4e9d-8789-bb7d771ea350", - "last_modified": 1773641281295 + "version": "130", + "browserid": "opera", + "id": "d480fdbc-d8c7-4128-8864-307b15979f29", + "last_modified": 1776062852033 }, { "name": "Chrome Android", - "schema": 1773446703753, + "schema": 1775865903888, + "status": "planned", + "version": "150", + "browserid": "chrome_android", + "id": "525b02bb-1782-4be7-af3d-a871bd0dc689", + "last_modified": 1776062852030 + }, + { + "name": "Chrome", + "schema": 1775865903486, "status": "planned", + "version": "150", + "browserid": "chrome", + "id": "36357b2a-c063-4a43-a807-349cf909608b", + "last_modified": 1776062852027 + }, + { + "name": "WebView Android", + "schema": 1775865904624, + "status": "nightly", + "version": "149", + "browserid": "webview_android", + "id": "ed3ff7b7-dfb0-4141-a35d-85d16c22ed86", + "last_modified": 1776062852023 + }, + { + "name": "Chrome Android", + "schema": 1775865903806, + "status": "nightly", "version": "149", "browserid": "chrome_android", "id": "c583ee97-ecf9-4bd8-9f22-93d626c24fa0", - "last_modified": 1773641281293 + "last_modified": 1776062852021 }, { "name": "Chrome", - "schema": 1773446703422, - "status": "planned", + "schema": 1775865903408, + "status": "nightly", "version": "149", "browserid": "chrome", "id": "dff5f94c-b1be-416a-91e6-f0fa2dbffb45", - "last_modified": 1773641281290 + "last_modified": 1776062852019 }, { "name": "WebView Android", - "schema": 1773446704224, - "status": "nightly", + "schema": 1775865904555, + "status": "beta", "version": "148", "browserid": "webview_android", "id": "cbf9e9ca-4167-4f09-981c-186bfba8ed1e", - "last_modified": 1773641281285 + "last_modified": 1776062852016 }, { "name": "Chrome Android", - "schema": 1773446703690, - "status": "nightly", + "schema": 1775865903725, + "status": "beta", "version": "148", "browserid": "chrome_android", "id": "1dc1d001-8ed2-43a5-b41d-589130d0ac7d", - "last_modified": 1773641281283 + "last_modified": 1776062852014 }, { "name": "Chrome", - "schema": 1773446703354, - "status": "nightly", + "schema": 1775865903331, + "status": "beta", "version": "148", "browserid": "chrome", "id": "a57c427c-57e9-4856-9dae-f515117478d7", - "last_modified": 1773641281281 + "last_modified": 1776062852011 }, { "name": "Chrome", - "schema": 1773446703279, - "status": "beta", + "schema": 1775865903258, + "status": "current", "version": "147", "browserid": "chrome", "id": "cddd3506-4f9c-42cf-b551-ca28c2533e9a", - "last_modified": 1773641281277 + "last_modified": 1776062852009 }, { "name": "Chrome Android", - "schema": 1773446703623, - "status": "beta", + "schema": 1775865903646, + "status": "current", "version": "147", "browserid": "chrome_android", "id": "aa7ba8b7-3135-4450-ab5f-5f8d956f1f13", - "last_modified": 1773641281275 + "last_modified": 1776062852006 }, { "name": "WebView Android", - "schema": 1773446704085, + "schema": 1775865904485, "status": "current", - "version": "146", + "version": "147", "browserid": "webview_android", - "id": "620f087d-d5c6-4b67-80f4-02358d8298e7", - "last_modified": 1773641281273 + "id": "18d9eac7-8ed6-40c8-a888-315758fbd983", + "last_modified": 1776062852002 }, { - "name": "WebView Android", - "schema": 1773446704150, + "name": "Safari on iOS", + "schema": 1775261103550, "status": "beta", - "version": "147", - "browserid": "webview_android", - "id": "18d9eac7-8ed6-40c8-a888-315758fbd983", - "last_modified": 1773641281264 + "version": "26.5", + "browserid": "safari_ios", + "id": "37c52f59-c4bb-4707-bb06-d1cac9172203", + "last_modified": 1775555173744 }, { - "name": "Chrome Android", - "schema": 1773446703559, - "status": "current", - "version": "146", - "browserid": "chrome_android", - "id": "1b035778-10c7-4ea3-aeb4-3606fd3483e1", - "last_modified": 1773641281262 + "name": "Safari", + "schema": 1774915210779, + "status": "beta", + "version": "26.5", + "browserid": "safari", + "id": "310ab08d-64fb-4d47-a298-e35f262acf72", + "last_modified": 1775555173741 }, { - "name": "Chrome", - "schema": 1773446703216, - "status": "current", - "version": "146", - "browserid": "chrome", - "id": "b9100141-3b96-44f6-89b5-2dd19d6dfba6", - "last_modified": 1773641281259 + "name": "WebView on iOS", + "schema": 1775261103619, + "status": "beta", + "version": "26.5", + "browserid": "webview_ios", + "id": "c4306576-8892-4f28-adb6-39f0325e9be9", + "last_modified": 1775555173738 }, { "name": "Firefox", - "schema": 1772237104541, + "schema": 1774656303688, "status": "planned", - "version": "151", + "version": "152", "browserid": "firefox", - "id": "ca23dbaa-20c7-4027-9de8-63ec380b2f6e", - "last_modified": 1772548633069 + "id": "28f0d2ac-ebeb-4324-a581-bdc945184379", + "last_modified": 1775555173736 }, { - "name": "Bun", - "schema": 1772094719613, - "status": "current", - "version": "1.3.10", - "browserid": "bun", - "id": "8c8475b8-52f3-488b-857b-8b39325285d9", - "last_modified": 1772548633066 + "name": "Firefox for Android", + "schema": 1774656304005, + "status": "planned", + "version": "152", + "browserid": "firefox_android", + "id": "d4acf283-6f99-4aff-a937-827c0f6ba719", + "last_modified": 1775555173733 + }, + { + "name": "Firefox", + "schema": 1774656303627, + "status": "nightly", + "version": "151", + "browserid": "firefox", + "id": "ca23dbaa-20c7-4027-9de8-63ec380b2f6e", + "last_modified": 1775555173729 }, { "name": "Firefox for Android", - "schema": 1772237104669, - "status": "planned", + "schema": 1774656303946, + "status": "nightly", "version": "151", "browserid": "firefox_android", "id": "cded3e3a-4e7e-4627-80fb-fae915ebc9a0", - "last_modified": 1772548633064 + "last_modified": 1775555173727 }, { - "name": "Deno", - "schema": 1772064304810, + "name": "WebView on iOS", + "schema": 1774656304413, "status": "current", - "version": "2.7", - "browserid": "deno", - "id": "34c49207-86e7-4cda-af22-c005f1dc2847", - "last_modified": 1772094719547 + "version": "26.4", + "browserid": "webview_ios", + "id": "d3803d9b-d96b-4c3b-9ed9-1ef5d4639858", + "last_modified": 1775555173720 + }, + { + "name": "Safari", + "schema": 1774656304135, + "status": "current", + "version": "26.4", + "browserid": "safari", + "id": "79285f6d-a28c-459d-8265-7044f2066d5b", + "last_modified": 1775555173717 + }, + { + "name": "Safari on iOS", + "schema": 1774656304272, + "status": "current", + "version": "26.4", + "browserid": "safari_ios", + "id": "0b19a21d-8494-4a35-8875-bf1905f5893a", + "last_modified": 1775555173715 }, { "name": "Firefox for Android", - "schema": 1772064305400, - "status": "nightly", + "schema": 1774656303880, + "status": "beta", "version": "150", "browserid": "firefox_android", "id": "dc9812c3-bdb8-4dcc-880f-67b25f794628", - "last_modified": 1772094719545 + "last_modified": 1775555173712 }, { "name": "Firefox", - "schema": 1772064305105, - "status": "nightly", + "schema": 1774656303557, + "status": "beta", "version": "150", "browserid": "firefox", "id": "4f1039d1-5e0c-44de-9180-1f46dae6028c", - "last_modified": 1772094719543 + "last_modified": 1775555173710 }, { "name": "Firefox for Android", - "schema": 1772064305325, - "status": "beta", + "schema": 1774656303821, + "status": "current", "version": "149", "browserid": "firefox_android", "id": "78dc5472-36f7-465d-92c2-3d2ff5d7c323", - "last_modified": 1772094719541 + "last_modified": 1775555173708 }, { "name": "Firefox", - "schema": 1772064305036, - "status": "beta", + "schema": 1774656303492, + "status": "current", "version": "149", "browserid": "firefox", "id": "2154c26d-3d7d-4ddc-a6ec-de10aeaba65f", - "last_modified": 1772094719534 + "last_modified": 1775555173705 }, { - "name": "Firefox", - "schema": 1772064304967, - "status": "current", - "version": "148", - "browserid": "firefox", - "id": "4ebdb515-56c0-4aae-bf80-631df396b3c5", - "last_modified": 1772094719532 + "name": "Edge", + "schema": 1774051505179, + "status": "planned", + "version": "149", + "browserid": "edge", + "id": "ecc3ce4e-9c4f-49c9-aabd-ddb600ade94b", + "last_modified": 1774245712490 }, { - "name": "Firefox for Android", - "schema": 1772064305258, + "name": "Bun", + "schema": 1774051504876, "status": "current", - "version": "148", - "browserid": "firefox_android", - "id": "5e1afc2d-b301-49b8-9052-0d0ceed8d7a3", - "last_modified": 1772094719530 - }, - { - "name": "WebView on iOS", - "schema": 1771718703666, - "status": "beta", - "version": "26.4", - "browserid": "webview_ios", - "id": "d3803d9b-d96b-4c3b-9ed9-1ef5d4639858", - "last_modified": 1771946254834 - }, - { - "name": "Safari", - "schema": 1771718703538, - "status": "beta", - "version": "26.4", - "browserid": "safari", - "id": "79285f6d-a28c-459d-8265-7044f2066d5b", - "last_modified": 1771946254829 + "version": "1.3.11", + "browserid": "bun", + "id": "3de3e137-fe20-463e-8732-f39b6e0c1be1", + "last_modified": 1774245712488 }, { "name": "Edge", - "schema": 1771718703469, - "status": "planned", + "schema": 1774051505120, + "status": "nightly", "version": "148", "browserid": "edge", "id": "25d5ebbc-8734-46b8-881c-949b2912533e", - "last_modified": 1771946254825 - }, - { - "name": "Safari on iOS", - "schema": 1771718703606, - "status": "beta", - "version": "26.4", - "browserid": "safari_ios", - "id": "0b19a21d-8494-4a35-8875-bf1905f5893a", - "last_modified": 1771946254821 + "last_modified": 1774245712484 }, { "name": "Edge", - "schema": 1771718703401, - "status": "nightly", + "schema": 1774051505056, + "status": "beta", "version": "147", "browserid": "edge", "id": "08fe74cc-038a-4801-9f25-82fbd6468297", - "last_modified": 1771946254814 + "last_modified": 1774245712482 }, { "name": "Edge", - "schema": 1771718703328, - "status": "beta", + "schema": 1774051504999, + "status": "current", "version": "146", "browserid": "edge", "id": "71070e67-3067-4271-acef-cf0bd7a4f555", - "last_modified": 1771946254810 - }, - { - "name": "Edge", - "schema": 1771718703259, - "status": "current", - "version": "145", - "browserid": "edge", - "id": "40684037-f3dc-4106-b1f7-91bd4fa18a32", - "last_modified": 1771946254801 + "last_modified": 1774245712480 }, { - "name": "Safari", - "schema": 1771027506130, + "name": "Opera Android", + "schema": 1773446703952, "status": "current", - "version": "26.3", - "browserid": "safari", - "id": "f7f0e108-c839-4036-94f6-1d77b172c85a", - "last_modified": 1771325515122 + "version": "96", + "browserid": "opera_android", + "id": "dc01df05-453f-4d2f-b7d2-337a2670e91a", + "last_modified": 1773641281298 }, { - "name": "WebView on iOS", - "schema": 1771027506722, + "name": "Quest Browser", + "schema": 1773446703816, "status": "current", - "version": "26.3", - "browserid": "webview_ios", - "id": "8ac8569d-f6dc-41e4-b448-7c54f6923a36", - "last_modified": 1771325515117 + "version": "42.0", + "browserid": "oculus", + "id": "77a75ca3-9282-4e9d-8789-bb7d771ea350", + "last_modified": 1773641281295 }, { - "name": "Safari on iOS", - "schema": 1771027506270, + "name": "Deno", + "schema": 1772064304810, "status": "current", - "version": "26.3", - "browserid": "safari_ios", - "id": "916681bd-04e0-4dbe-9c02-965181db1356", - "last_modified": 1771325515111 + "version": "2.7", + "browserid": "deno", + "id": "34c49207-86e7-4cda-af22-c005f1dc2847", + "last_modified": 1772094719547 }, { "name": "Samsung Internet", @@ -325,33 +352,6 @@ "last_modified": 1764597259381 }, { - "name": "Opera", - "schema": 1761955503268, - "status": "nightly", - "version": "125", - "browserid": "opera", - "id": "5bdc65b2-ee44-4f2a-b776-54b9ffe1147f", - "last_modified": 1762424892963 - }, - { - "name": "Opera", - "schema": 1761955503193, - "status": "beta", - "version": "124", - "browserid": "opera", - "id": "b74063d3-65d7-45b2-afc1-d30123fc2999", - "last_modified": 1762424892950 - }, - { - "name": "Opera", - "schema": 1761955503117, - "status": "current", - "version": "123", - "browserid": "opera", - "id": "847fc43b-579e-4b26-a1fa-cb978ec0438b", - "last_modified": 1762424892945 - }, - { "name": "Firefox for Android", "schema": 1753574703338, "status": "esr", @@ -379,5 +379,5 @@ "last_modified": 1735832995466 } ], - "timestamp": 1773641281301 + "timestamp": 1776062852042 } diff -Nru firefox-esr-140.9.1esr/services/settings/dumps/main/search-config-icons.json firefox-esr-140.10.0esr/services/settings/dumps/main/search-config-icons.json --- firefox-esr-140.9.1esr/services/settings/dumps/main/search-config-icons.json 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/services/settings/dumps/main/search-config-icons.json 2026-04-15 01:59:56.000000000 +0000 @@ -1,6 +1,23 @@ { "data": [ { + "schema": 1773705608175, + "imageSize": 16, + "attachment": { + "hash": "b9aeff79e16d2db1b53574ceacae0149bc3c5b5d6b6dcd3542a1d7034ed64b70", + "size": 1717, + "filename": "startpage-16.svg", + "location": "main-workspace/search-config-icons/a2a88863-029c-4197-8a1c-fee311fc1aae.svg", + "mimetype": "image/svg+xml" + }, + "engineIdentifiers": [ + "startpage" + ], + "filter_expression": "env.appinfo.OS != \"iOS\"", + "id": "acae3d3c-b09e-47f0-a9e5-57980d21fc4a", + "last_modified": 1774879272191 + }, + { "schema": 1771977606099, "imageSize": 96, "attachment": { @@ -1190,5 +1207,5 @@ "last_modified": 1744118264825 } ], - "timestamp": 1772466505212 + "timestamp": 1774879272191 } diff -Nru firefox-esr-140.9.1esr/services/settings/dumps/main/search-config-v2.json firefox-esr-140.10.0esr/services/settings/dumps/main/search-config-v2.json --- firefox-esr-140.9.1esr/services/settings/dumps/main/search-config-v2.json 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/services/settings/dumps/main/search-config-v2.json 2026-04-15 01:59:56.000000000 +0000 @@ -2588,9 +2588,9 @@ }, "id": "7ace4aa1-e762-4f4b-87b9-b23b3c3a930b", "identifier": "google", - "last_modified": 1772114960790, + "last_modified": 1774874010729, "recordType": "engine", - "schema": 1772064008248, + "schema": 1774656007453, "variants": [ { "environment": { @@ -2644,9 +2644,7 @@ "environment": { "regions": [ "ru", - "tr", - "by", - "kz" + "by" ] }, "telemetrySuffix": "com-nocodes" @@ -2702,7 +2700,8 @@ ], "distributions": [ "dt-002", - "dt-003" + "dt-003", + "xiaomi-001" ] }, "partnerCode": "firefox-b-1-dt", @@ -2783,9 +2782,7 @@ ], "excludedRegions": [ "ru", - "tr", - "by", - "kz" + "by" ] }, "partnerCode": "firefox-b-lm", @@ -2849,9 +2846,7 @@ ], "excludedRegions": [ "ru", - "tr", - "by", - "kz" + "by" ] }, "partnerCode": "firefox-b-vv", @@ -2881,9 +2876,7 @@ ], "excludedRegions": [ "ru", - "tr", - "by", - "kz" + "by" ] }, "partnerCode": "firefox-b-tf", @@ -2914,9 +2907,7 @@ "excludedRegions": [ "us", "ru", - "tr", - "by", - "kz" + "by" ] }, "partnerCode": "firefox-b-ar", @@ -2943,14 +2934,13 @@ ], "distributions": [ "dt-002", - "dt-003" + "dt-003", + "xiaomi-001" ], "excludedRegions": [ "us", "ru", - "tr", - "by", - "kz" + "by" ] }, "partnerCode": "firefox-b-dt", @@ -8386,5 +8376,5 @@ "schema": 1707824831520 } ], - "timestamp": 1772114960790 + "timestamp": 1774874010729 } diff -Nru firefox-esr-140.9.1esr/services/settings/dumps/main/search-telemetry-v2.json firefox-esr-140.10.0esr/services/settings/dumps/main/search-telemetry-v2.json --- firefox-esr-140.9.1esr/services/settings/dumps/main/search-telemetry-v2.json 2026-04-03 15:52:27.000000000 +0000 +++ firefox-esr-140.10.0esr/services/settings/dumps/main/search-telemetry-v2.json 2026-04-15 01:59:56.000000000 +0000 @@ -1,7 +1,236 @@ { "data": [ { - "schema": 1771804812409, + "schema": 1774280721627, + "subframes": [], + "components": [ + { + "type": "ad_carousel", + "included": { + "parent": { + "selector": ".adsMvCarousel" + }, + "related": { + "selector": ".cr" + }, + "children": [ + { + "selector": ".pa_item", + "countChildren": true + } + ] + } + }, + { + "type": "ad_link", + "excluded": { + "parent": { + "selector": "aside" + } + }, + "included": { + "parent": { + "selector": ".sb_adTA" + }, + "children": [ + { + "type": "ad_sitelink", + "selector": ".b_vlist2col" + } + ] + } + }, + { + "type": "ad_sidebar", + "included": { + "parent": { + "selector": "aside" + }, + "children": [ + { + "selector": ".pa_item, .sb_adTA", + "countChildren": true + } + ] + } + }, + { + "type": "incontent_searchbox", + "topDown": true, + "included": { + "parent": { + "selector": "form#sb_form" + }, + "related": { + "selector": "#sw_as" + }, + "children": [ + { + "selector": "input[name='q']" + } + ] + } + }, + { + "type": "cookie_banner", + "topDown": true, + "included": { + "parent": { + "selector": "div#bnp_cookie_banner" + }, + "children": [ + { + "selector": "button#bnp_btn_accept", + "eventListeners": [ + { + "action": "clicked_accept", + "eventType": "click" + } + ] + }, + { + "selector": "button#bnp_btn_reject", + "eventListeners": [ + { + "action": "clicked_reject", + "eventType": "click" + } + ] + }, + { + "selector": "a#bnp_btn_preference", + "eventListeners": [ + { + "action": "clicked_more_options", + "eventType": "click" + } + ] + } + ] + } + }, + { + "type": "ad_link", + "default": true + } + ], + "shoppingTab": { + "regexp": "^/shop?", + "selector": "#b-scopeListItem-shop a" + }, + "taggedCodes": [ + "MOZ2", + "MOZ4", + "MOZ5", + "MOZA", + "MOZB", + "MOZD", + "MOZE", + "MOZI", + "MOZL", + "MOZM", + "MOZO", + "MOZR", + "MOZT", + "MOZW", + "MOZX", + "MZABT", + "MZCP", + "MZTOF", + "MZSL01", + "MZSL02", + "MZSL03" + ], + "telemetryId": "bing", + "organicCodes": [], + "codeParamName": "pc", + "queryParamName": "q", + "followOnCookies": [ + { + "host": "www.bing.com", + "name": "_SS", + "codeParamName": "PC", + "extraCodePrefixes": [], + "extraCodeParamName": "" + }, + { + "host": "www.bing.com", + "name": "SRCHS", + "codeParamName": "PC", + "extraCodePrefixes": [], + "extraCodeParamName": "" + }, + { + "host": "cn.bing.com", + "name": "_SS", + "codeParamName": "PC", + "extraCodePrefixes": [], + "extraCodeParamName": "" + }, + { + "host": "cn.bing.com", + "name": "SRCHS", + "codeParamName": "PC", + "extraCodePrefixes": [], + "extraCodeParamName": "" + } + ], + "queryParamNames": [ + "q" + ], + "domainExtraction": { + "ads": [ + { + "method": "textContent", + "selectors": "#b_results .b_ad .b_attribution cite, .adsMvCarousel cite, aside cite" + } + ], + "nonAds": [ + { + "method": "textContent", + "selectors": "#b_results .b_algo .b_attribution cite" + } + ] + }, + "searchPageRegexp": "^https://(?:cn|www)\\.bing\\.com/search", + "nonAdsLinkRegexps": [ + "^https://(?:cn|www).bing.com/ck/a" + ], + "searchPageMatches": [ + "https://(?:cn|www).bing.com/search*" + ], + "impressionAttributes": [ + { + "key": "is_shopping_page", + "url": { + "regexp": "^/shop?" + } + }, + { + "key": "shopping_tab_displayed", + "element": { + "selector": "#b-scopeListItem-shop a", + "component": { + "type": "shopping_tab", + "countImpressions": true + } + } + }, + { + "key": "has_ai_summary", + "element": { + "selector": "#b_wpt_container_ml,.gs_aidisc,#copans_container" + } + } + ], + "extraAdServersRegexps": [ + "^https://(?:cn|www)\\.bing\\.com/acli?c?k" + ], + "id": "e1eec461-f1f3-40de-b94b-3b670b78108c", + "last_modified": 1774283138114 + }, + { + "schema": 1773964810753, "subframes": [], "components": [ { @@ -304,148 +533,43 @@ "ved", "ei" ], - "extraAdServersRegexps": [ - "^https?://www\\.google(?:adservices)?\\.com/(?:pagead/)?aclk" - ], - "nonAdsLinkQueryParamNames": [ - "url" - ], - "id": "635a3325-1995-42d6-be09-dbe4b2a95453", - "last_modified": 1772656186787 - }, - { - "isSPA": true, - "schema": 1756952145762, - "subframes": [], - "components": [ - { - "type": "ad_image_row", - "included": { - "parent": { - "selector": "[data-testid='pam.container']" - }, - "children": [ - { - "selector": "[data-slide-index]", - "countChildren": true - } - ] - } - }, + "impressionAttributes": [ { - "type": "ad_link", - "included": { - "parent": { - "selector": "[data-testid='adResult']" - } + "key": "is_shopping_page", + "url": { + "regexp": "&udm=28" } }, { - "type": "incontent_searchbox", - "topDown": true, - "included": { - "parent": { - "selector": "._1zdrb._1cR1n" + "key": "shopping_tab_displayed", + "element": { + "regexp": "&udm=28", + "selector": "div[role='navigation'] a", + "component": { + "type": "shopping_tab", + "countImpressions": true }, - "related": { - "selector": "#search-suggestions" - }, - "children": [ - { - "selector": "input[type='search']" - } - ] + "attributeName": "href" } }, { - "type": "ad_link", - "default": true - } - ], - "shoppingTab": { - "regexp": "t=shopping", - "selector": "[data-testid='shoppingNavItem']", - "inspectRegexpInSERP": true - }, - "taggedCodes": [ - "ff_android", - "ff_ios", - "brz-moz", - "firefoxqwant" - ], - "telemetryId": "qwant", - "organicCodes": [], - "codeParamName": "client", - "pageTypeParam": { - "keys": [ - "t" - ], - "pageTypes": [ - { - "name": "web", - "target": "default_tab", - "values": [ - "web" - ], - "enabled": true, - "isDefault": true - }, - { - "name": "images", - "values": [ - "images" - ], - "enabled": false - }, - { - "name": "videos", - "values": [ - "videos" - ], - "enabled": false - }, - { - "name": "news", - "values": [ - "news" - ], - "enabled": false - }, - { - "name": "shopping", - "target": "shopping_tab", - "values": [ - "shopping" - ], - "enabled": true + "key": "has_ai_summary", + "element": { + "selector": ".OZ9ddf.WAUd4" } - ], - "enableSPAHandling": true - }, - "queryParamName": "q", - "queryParamNames": [ - "q" - ], - "searchPageRegexp": "^https://www\\.qwant\\.com/", - "filter_expression": "env.version|versionCompare(\"124.0a1\")>=0", - "searchPageMatches": [ - "https://www.qwant.com/*" + } ], - "followOnParamNames": [], - "defaultPageQueryParam": { - "key": "t", - "value": "web" - }, "extraAdServersRegexps": [ - "^https://www\\.bing\\.com/acli?c?k", - "^https://api\\.qwant\\.com/v3/r/", - "^https://fdn\\.qwant\\.com/v3/r/" + "^https?://www\\.google(?:adservices)?\\.com/(?:pagead/)?aclk" ], - "id": "19c434a3-d173-4871-9743-290ac92a3f6b", - "last_modified": 1757010621729 + "nonAdsLinkQueryParamNames": [ + "url" + ], + "id": "635a3325-1995-42d6-be09-dbe4b2a95453", + "last_modified": 1774283138111 }, { - "schema": 1753236937989, + "schema": 1774280720537, "subframes": [], "components": [ { @@ -645,30 +769,52 @@ "hy", "hz" ], + "impressionAttributes": [ + { + "key": "is_shopping_page", + "url": { + "regexp": "&ia=shopping&iax=shopping|&iax=shopping&ia=shopping" + } + }, + { + "key": "shopping_tab_displayed", + "element": { + "selector": "nav > ul > li > a[href*='ia=shopping']", + "component": { + "type": "shopping_tab", + "countImpressions": true + } + } + }, + { + "key": "has_ai_summary", + "element": { + "selector": ".zHmKXya03lRu_br7aWAj" + } + } + ], "extraAdServersRegexps": [ "^https://duckduckgo.com/y\\.js?.*ad_provider\\=", "^https://www\\.amazon\\.(?:[a-z.]{2,24}).*(?:tag=duckduckgo-)", "^https://links\\.duckduckgo\\.com/m\\.js\\?dsl=1" ], "id": "9dfd626b-26f2-4913-9d0a-27db6cb7d8ca", - "last_modified": 1753289524079 + "last_modified": 1774283138108 }, { - "schema": 1751854531997, + "isSPA": true, + "schema": 1774280719091, "subframes": [], "components": [ { - "type": "ad_carousel", + "type": "ad_image_row", "included": { "parent": { - "selector": ".adsMvCarousel" - }, - "related": { - "selector": ".cr" + "selector": "[data-testid='pam.container']" }, "children": [ { - "selector": ".pa_item", + "selector": "[data-slide-index]", "countChildren": true } ] @@ -676,35 +822,10 @@ }, { "type": "ad_link", - "excluded": { - "parent": { - "selector": "aside" - } - }, "included": { "parent": { - "selector": ".sb_adTA" - }, - "children": [ - { - "type": "ad_sitelink", - "selector": ".b_vlist2col" - } - ] - } - }, - { - "type": "ad_sidebar", - "included": { - "parent": { - "selector": "aside" - }, - "children": [ - { - "selector": ".pa_item, .sb_adTA", - "countChildren": true - } - ] + "selector": "[data-testid='adResult']" + } } }, { @@ -712,52 +833,14 @@ "topDown": true, "included": { "parent": { - "selector": "form#sb_form" + "selector": "._1zdrb._1cR1n" }, "related": { - "selector": "#sw_as" - }, - "children": [ - { - "selector": "input[name='q']" - } - ] - } - }, - { - "type": "cookie_banner", - "topDown": true, - "included": { - "parent": { - "selector": "div#bnp_cookie_banner" + "selector": "#search-suggestions" }, "children": [ { - "selector": "button#bnp_btn_accept", - "eventListeners": [ - { - "action": "clicked_accept", - "eventType": "click" - } - ] - }, - { - "selector": "button#bnp_btn_reject", - "eventListeners": [ - { - "action": "clicked_reject", - "eventType": "click" - } - ] - }, - { - "selector": "a#bnp_btn_preference", - "eventListeners": [ - { - "action": "clicked_more_options", - "eventType": "click" - } - ] + "selector": "input[type='search']" } ] } @@ -768,98 +851,147 @@ } ], "shoppingTab": { - "regexp": "^/shop?", - "selector": "#b-scopeListItem-shop a" + "regexp": "t=shopping", + "selector": "[data-testid='shoppingNavItem']", + "inspectRegexpInSERP": true }, "taggedCodes": [ - "MOZ2", - "MOZ4", - "MOZ5", - "MOZA", - "MOZB", - "MOZD", - "MOZE", - "MOZI", - "MOZL", - "MOZM", - "MOZO", - "MOZR", - "MOZT", - "MOZW", - "MOZX", - "MZABT", - "MZCP", - "MZTOF", - "MZSL01", - "MZSL02", - "MZSL03" + "ff_android", + "ff_ios", + "brz-moz", + "firefoxqwant" ], - "telemetryId": "bing", + "telemetryId": "qwant", "organicCodes": [], - "codeParamName": "pc", + "codeParamName": "client", + "pageTypeParam": { + "keys": [ + "t" + ], + "pageTypes": [ + { + "name": "web", + "target": "default_tab", + "values": [ + "web" + ], + "enabled": true, + "isDefault": true + }, + { + "name": "images", + "values": [ + "images" + ], + "enabled": false + }, + { + "name": "videos", + "values": [ + "videos" + ], + "enabled": false + }, + { + "name": "news", + "values": [ + "news" + ], + "enabled": false + }, + { + "name": "shopping", + "target": "shopping_tab", + "values": [ + "shopping" + ], + "enabled": true + } + ], + "enableSPAHandling": true + }, "queryParamName": "q", - "followOnCookies": [ - { - "host": "www.bing.com", - "name": "_SS", - "codeParamName": "PC", - "extraCodePrefixes": [], - "extraCodeParamName": "" - }, + "queryParamNames": [ + "q" + ], + "searchPageRegexp": "^https://www\\.qwant\\.com/", + "filter_expression": "env.version|versionCompare(\"124.0a1\")>=0", + "searchPageMatches": [ + "https://www.qwant.com/*" + ], + "followOnParamNames": [], + "impressionAttributes": [ { - "host": "www.bing.com", - "name": "SRCHS", - "codeParamName": "PC", - "extraCodePrefixes": [], - "extraCodeParamName": "" + "key": "is_shopping_page", + "url": { + "regexp": "t=shopping" + } }, { - "host": "cn.bing.com", - "name": "_SS", - "codeParamName": "PC", - "extraCodePrefixes": [], - "extraCodeParamName": "" + "key": "shopping_tab_displayed", + "element": { + "regexp": "t=shopping", + "selector": "[data-testid='shoppingNavItem']", + "component": { + "type": "shopping_tab", + "countImpressions": true + }, + "attributeName": "href" + } }, { - "host": "cn.bing.com", - "name": "SRCHS", - "codeParamName": "PC", - "extraCodePrefixes": [], - "extraCodeParamName": "" + "key": "has_ai_summary", + "value": "false" } ], - "queryParamNames": [ - "q" - ], - "domainExtraction": { - "ads": [ - { - "method": "textContent", - "selectors": "#b_results .b_ad .b_attribution cite, .adsMvCarousel cite, aside cite" - } - ], - "nonAds": [ - { - "method": "textContent", - "selectors": "#b_results .b_algo .b_attribution cite" - } - ] + "defaultPageQueryParam": { + "key": "t", + "value": "web" }, - "searchPageRegexp": "^https://(?:cn|www)\\.bing\\.com/search", - "nonAdsLinkRegexps": [ - "^https://(?:cn|www).bing.com/ck/a" + "extraAdServersRegexps": [ + "^https://www\\.bing\\.com/acli?c?k", + "^https://api\\.qwant\\.com/v3/r/", + "^https://fdn\\.qwant\\.com/v3/r/" ], + "id": "19c434a3-d173-4871-9743-290ac92a3f6b", + "last_modified": 1774283138106 + }, + { + "schema": 1774280723741, + "subframes": [], + "taggedCodes": [ + "monline_dg", + "monline_3_dg", + "monline_4_dg", + "monline_7_dg" + ], + "telemetryId": "baidu", + "organicCodes": [], + "codeParamName": "tn", + "queryParamName": "wd", + "queryParamNames": [ + "wd", + "word" + ], + "searchPageRegexp": "^https://(?:m|www)\\.baidu\\.com/(?:s|baidu)", "searchPageMatches": [ - "https://(?:cn|www).bing.com/search*" + "https://m.baidu.com/s*", + "https://m.baidu.com/baidu*", + "https://www.baidu.com/s*", + "https://www.baidu.com/baidu*" + ], + "followOnParamNames": [ + "oq" ], + "impressionAttributes": [], "extraAdServersRegexps": [ - "^https://(?:cn|www)\\.bing\\.com/acli?c?k" + "^https?://www\\.baidu\\.com/baidu\\.php?" ], - "id": "e1eec461-f1f3-40de-b94b-3b670b78108c", - "last_modified": 1751891587705 + "id": "19c434a3-d173-4871-9743-290ac92a3f6a", + "last_modified": 1774283138103 }, { - "schema": 1750817732643, + "schema": 1774280722696, "subframes": [ { "regexp": "^https://syndicatedsearch\\.goog/afs/ads", @@ -943,47 +1075,38 @@ "https://www.ecosia.org/*" ], "expectedOrganicCodes": [], + "impressionAttributes": [ + { + "key": "is_shopping_page", + "url": { + "regexp": "/shopping?" + } + }, + { + "key": "shopping_tab_displayed", + "element": { + "regexp": "/shopping?", + "selector": "nav li[data-test-id='search-navigation-item-shopping'] a", + "component": { + "type": "shopping_tab", + "countImpressions": true + }, + "attributeName": "href" + } + }, + { + "key": "has_ai_summary", + "value": "false" + } + ], "extraAdServersRegexps": [ "^https://www\\.bing\\.com/acli?c?k", "^https://syndicatedsearch\\.goog/aclk\\?", "^https://www\\.googleadservices\\.com/pagead/aclk\\?" ], "id": "9a487171-3a06-4647-8866-36250ec84f3a", - "last_modified": 1750880107190 - }, - { - "schema": 1741189702306, - "subframes": [], - "taggedCodes": [ - "monline_dg", - "monline_3_dg", - "monline_4_dg", - "monline_7_dg" - ], - "telemetryId": "baidu", - "organicCodes": [], - "codeParamName": "tn", - "queryParamName": "wd", - "queryParamNames": [ - "wd", - "word" - ], - "searchPageRegexp": "^https://(?:m|www)\\.baidu\\.com/(?:s|baidu)", - "searchPageMatches": [ - "https://m.baidu.com/s*", - "https://m.baidu.com/baidu*", - "https://www.baidu.com/s*", - "https://www.baidu.com/baidu*" - ], - "followOnParamNames": [ - "oq" - ], - "extraAdServersRegexps": [ - "^https?://www\\.baidu\\.com/baidu\\.php?" - ], - "id": "19c434a3-d173-4871-9743-290ac92a3f6a", - "last_modified": 1741781945955 + "last_modified": 1774283138101 } ], - "timestamp": 1772656186787 + "timestamp": 1774283138114 } diff -Nru firefox-esr-140.9.1esr/services/settings/dumps/main/urlbar-persisted-search-terms.json firefox-esr-140.10.0esr/services/settings/dumps/main/urlbar-persisted-search-terms.json --- firefox-esr-140.9.1esr/services/settings/dumps/main/urlbar-persisted-search-terms.json 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/services/settings/dumps/main/urlbar-persisted-search-terms.json 2026-04-15 01:59:57.000000000 +0000 @@ -1,6 +1,32 @@ { "data": [ { + "schema": 1774483206927, + "providerId": "google", + "excludeParams": [ + { + "key": "udm", + "values": [] + }, + { + "key": "tbm", + "values": [] + } + ], + "includeParams": [], + "searchPageRegexp": "^https://www\\.google\\.[^/]+/search\\b", + "filter_expression": "env.version|versionCompare(\"148.0a1\")>=0", + "id": "1a479a17-f8cf-4ce1-9086-41d1f3ef7b69", + "last_modified": 1775078290693 + }, + { + "schema": 1773705620356, + "providerId": "bing", + "searchPageRegexp": "^https://www\\.bing\\.com\\/search\\b", + "id": "eb97a1c7-112c-4d61-bcc0-07feaaac4643", + "last_modified": 1773858354866 + }, + { "schema": 1719398671127, "providerId": "qwant", "includeParams": [ @@ -44,5 +70,5 @@ "last_modified": 1719927826946 } ], - "timestamp": 1719927826949 + "timestamp": 1775078290693 } diff -Nru firefox-esr-140.9.1esr/services/settings/dumps/security-state/intermediates.json firefox-esr-140.10.0esr/services/settings/dumps/security-state/intermediates.json --- firefox-esr-140.9.1esr/services/settings/dumps/security-state/intermediates.json 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/services/settings/dumps/security-state/intermediates.json 2026-04-15 01:59:57.000000000 +0000 @@ -1,6 +1,435 @@ { "data": [ { + "schema": 1775833161373, + "derHash": "mhVw6CEd5xP86y3Ep3KKvhmUozpMpipPgdT3UR3p21A=", + "attachment": { + "hash": "09625147dcb554f09923cccede00578597175b9d1b8a2cbc6c94d5c7da65943f", + "size": 2068, + "filename": "_vcu3bLdrl-2pV1S4cenN7_yGMcAZ-qj1zlA9EwLUqw=.pem", + "location": "security-state-staging/intermediates/5db30d9b-ab7d-48c7-9559-d9769bf37286.pem", + "mimetype": "application/x-pem-file" + }, + "id": "8e4af3f4-07db-4bf7-9122-81486d9b2890", + "last_modified": 1775836622756 + }, + { + "schema": 1775012105575, + "derHash": "cgvU2iGvina571P9AerSJ2AflROzM43gbJl8pohJLTQ=", + "attachment": { + "hash": "5a3d49d4344eafa351f15b261301709d4a204955fb59385855783d159a8b3bcc", + "size": 1979, + "filename": "ape1HIIZ6T5d7GS61YBs3rD4NVvkfnVwELcCRW4Bqv0=.pem", + "location": "security-state-staging/intermediates/8aea17ab-2eaa-4046-8c0e-c145877f23a0.pem", + "mimetype": "application/x-pem-file" + }, + "id": "21f5a836-b455-4f4e-94c5-2b4241a3d72f", + "last_modified": 1775015828685 + }, + { + "schema": 1775012104722, + "derHash": "MUL5nTWNm1AOXN0t/49xmozOz1iWUjNISFIsyoB9CAc=", + "attachment": { + "hash": "9ce0a589d152892ad4eb37fcfce39ef460fca939530497544587e4346695c67b", + "size": 1183, + "filename": "oC-voZLIy4HLE0FVT5wFtxzKKokLDRKY1oNkfJYe-98=.pem", + "location": "security-state-staging/intermediates/2fda55d9-aab2-4ada-8729-2804f28b234f.pem", + "mimetype": "application/x-pem-file" + }, + "id": "9c388e53-8bbf-4e58-bdad-06ed80b811e6", + "last_modified": 1775015828681 + }, + { + "schema": 1775012103853, + "derHash": "YMJmbaXiMyFw4dO/zZW/jJptTmNHPzqLu4z0Kz+fA4o=", + "attachment": { + "hash": "50e43d8c3f71ec3eee0a37984cf059a6262dd57ae9ff595c414fc337931245e2", + "size": 1983, + "filename": "ape1HIIZ6T5d7GS61YBs3rD4NVvkfnVwELcCRW4Bqv0=.pem", + "location": "security-state-staging/intermediates/9e73bcb6-ff56-4a97-b357-6bd34c72708d.pem", + "mimetype": "application/x-pem-file" + }, + "id": "c2ba95d1-22a1-4d7e-9b1e-8cd25f4561a8", + "last_modified": 1775015828676 + }, + { + "schema": 1774839566079, + "derHash": "L+kVsTV132oKi+tQGLYhIHEWqRwd334zuUWR+sPyNiY=", + "attachment": { + "hash": "4f127c4233a9101689368449c0025753a357e2b30e495953dce748ac23bcb4e5", + "size": 1618, + "filename": "nTfkqYnqs4gtEWBS_ItYRGcCy1k3JuRgTDeVlAxxA-I=.pem", + "location": "security-state-staging/intermediates/1b0d4b91-04ad-4f01-879f-e367d736c812.pem", + "mimetype": "application/x-pem-file" + }, + "id": "b5253e0b-76dc-4f20-83c2-7c077b7fc8ab", + "last_modified": 1774843022513 + }, + { + "schema": 1774839565218, + "derHash": "JjwYSPEBxNxsHTD8R0RhAYG5VqTWJMMFBf6LLr7+rQs=", + "attachment": { + "hash": "3ba617943c0a0ac91ca02303c19f3553242e26eea65b6ec51205b4861a6ecbc2", + "size": 2203, + "filename": "51PN2fE0E8fKnNqCli-MDOXtE9FlcxKVSvUmfrLLfHk=.pem", + "location": "security-state-staging/intermediates/b710492b-1b40-4836-a5ee-73b38345f189.pem", + "mimetype": "application/x-pem-file" + }, + "id": "5086b037-baf3-47eb-b9c2-d0908b72906c", + "last_modified": 1774843022509 + }, + { + "schema": 1774839564338, + "derHash": "j/+4Ae+NIq44n3xYxVDj04n31FbrGyXAznqf5YSjiAQ=", + "attachment": { + "hash": "c11561e2d98806065b1037695b8fdbdae99bc7154d121e40f010e741bcd540c2", + "size": 2381, + "filename": "3LnPAebFSkQKRToZaB0Z4luRvWRpsFAPvCM0EYIXY-w=.pem", + "location": "security-state-staging/intermediates/dd30b12f-a521-463b-9ed0-d69dc19daf13.pem", + "mimetype": "application/x-pem-file" + }, + "id": "ac64c0c2-c266-40a2-8651-203f35766993", + "last_modified": 1774843022506 + }, + { + "schema": 1774839563494, + "derHash": "hUS7bnO8NySr4AMVCfFvvqSKQ7h+YSkdTbQJgxLoZho=", + "attachment": { + "hash": "3a0979157e0f63ad072da56ccd05629954ea12d199313f3c9c788f14dc0c45d5", + "size": 2381, + "filename": "qin3sUBfFTBdUOjWawJQDx3pdUx1ahG0DN5-alAiims=.pem", + "location": "security-state-staging/intermediates/34e7d2a7-768d-49c9-9688-37114c0be202.pem", + "mimetype": "application/x-pem-file" + }, + "id": "71c687be-a812-4538-bc91-712c082e9ad3", + "last_modified": 1774843022503 + }, + { + "schema": 1774839562514, + "derHash": "tBFXEXDkVysCDnx5m2+iYMISUSmNmg7KwS0Mrf5atGc=", + "attachment": { + "hash": "d199420190cbc02f3ad05b432136b23753c2c4f5c7477e3aa7997d96ce7d4caf", + "size": 2381, + "filename": "k-feF4mrx1LOTkxBk_pU2KcdD9TyVgG2TlSPKu1--Vs=.pem", + "location": "security-state-staging/intermediates/dc7f6474-4b57-4ef3-883b-dd3efacdc9e8.pem", + "mimetype": "application/x-pem-file" + }, + "id": "9f8abdbe-48ee-4382-9cd3-c808c07df177", + "last_modified": 1774843022500 + }, + { + "schema": 1774537167635, + "derHash": "tWRizDsHfbNumebumJkvb3cSgOHyxwRod6K/tXX5gMM=", + "attachment": { + "hash": "e1ba9bde972d50841989cad6214a82407acac6723c48c680179081b3e8d13572", + "size": 1211, + "filename": "QmfmEZOKMCSNCo76MUoMqXBJELPzPieICN7H7Rt9_bY=.pem", + "location": "security-state-staging/intermediates/c32aaa01-41ef-4142-83cc-c93aa8234f11.pem", + "mimetype": "application/x-pem-file" + }, + "id": "68920eda-5e84-468b-9c49-ef3328c1435d", + "last_modified": 1774540622867 + }, + { + "schema": 1774537166747, + "derHash": "NH9DUQ3hU11Ybuhi0CmcqnVmL9VeNcvfjiMavhozenY=", + "attachment": { + "hash": "04919ea7a453d04e91d841ef11179afbfb794aecfd1d2371cfb52e514d15bb7d", + "size": 2227, + "filename": "uS-9acfZeG6v1Kc6KBPUyew1BpCmbecvayVHStbHPFM=.pem", + "location": "security-state-staging/intermediates/43a14661-831d-4240-b884-26a635eb41bd.pem", + "mimetype": "application/x-pem-file" + }, + "id": "4f8139a3-9ffa-4790-a159-3fdecf79535b", + "last_modified": 1774540622863 + }, + { + "schema": 1774537165900, + "derHash": "lJxZlpPDvl2yke7el61p4AxjK1tQVAghhcNg19bM5zc=", + "attachment": { + "hash": "4d009254753e30af8ee272de746a80f286a81abf0bee748e84e07e1b18af182e", + "size": 2223, + "filename": "XiSnrVCBUFzw-XzQ1O2q6Q3kzxZFNr839tx0M2NYr_M=.pem", + "location": "security-state-staging/intermediates/4b2ce371-2540-4622-909d-fc302fb3c2e5.pem", + "mimetype": "application/x-pem-file" + }, + "id": "9b01fe1f-5aa6-4934-be42-4885ce278369", + "last_modified": 1774540622860 + }, + { + "schema": 1774537165086, + "derHash": "j4wMWEZG+1Xh70K/HHiGwVdLSqJaqW5ha2oWvC7eH6E=", + "attachment": { + "hash": "f6c790d50f999e2ca788147e8fa04c81827bf045e2031dddc2873d836ce69abb", + "size": 2227, + "filename": "L8InkWngZ9c62OLXr4bIhLyKyaaxKsDNrhpCw5XHPog=.pem", + "location": "security-state-staging/intermediates/6b309c53-5001-4022-abb8-c62e2eb86f75.pem", + "mimetype": "application/x-pem-file" + }, + "id": "83d8b806-40eb-486a-9192-caa5b6864e59", + "last_modified": 1774540622857 + }, + { + "schema": 1774537164238, + "derHash": "LzyOy+IVftZ1bJNxhgLXTii9TqBDQNha5ry+tYQezik=", + "attachment": { + "hash": "b999fff58ad8a01f87303fdbf387ffe2e908ff2cbd6101ccb3ff664ad0a99471", + "size": 2223, + "filename": "q5VWj0cOvFCs9E4y24Khc0EPrjRq2NMM2AAcy7mZJnY=.pem", + "location": "security-state-staging/intermediates/0c69910a-1056-4b6e-a992-3200228c572d.pem", + "mimetype": "application/x-pem-file" + }, + "id": "0564262f-43b6-460f-9d54-8e66d608d31a", + "last_modified": 1774540622854 + }, + { + "schema": 1774537163404, + "derHash": "HA45AY4yj8i7/zX1mTKH0JNNxE70MR9EYirVvwc1GrQ=", + "attachment": { + "hash": "b615afaa1d2347e741aaff40532628f32fe6c6a45b3bde95bcaf380f3eb1f058", + "size": 1211, + "filename": "UmbWx5Q-xQ-XNQmthXd2WrdYe90ISOCFt1UVQHdQJc4=.pem", + "location": "security-state-staging/intermediates/ca406bbd-d08d-4228-bed2-e63252510b25.pem", + "mimetype": "application/x-pem-file" + }, + "id": "97722896-bd33-4951-9562-b3c0ed39a9b7", + "last_modified": 1774540622851 + }, + { + "schema": 1774537161581, + "derHash": "87Xe5gNU808RcfY2p2cVPE7CpAgooTGoTV+gxCuHmKQ=", + "attachment": { + "hash": "108ab348547297ebd08b76a3cd9618e37db6cd18504af2bba132caf2d62272da", + "size": 1211, + "filename": "n7hDO7kmTyPDfTRqy8j-iiSjDEOGIK3OwmTa3M6bPU8=.pem", + "location": "security-state-staging/intermediates/407e02b4-5ea5-4757-b17d-f1286eb6c893.pem", + "mimetype": "application/x-pem-file" + }, + "id": "127bfeb9-4043-4313-9eee-7e3897b482c1", + "last_modified": 1774540622848 + }, + { + "schema": 1774537160745, + "derHash": "nbmxe2RRY5b0PcwDEclQ67wL3F9sjGhU1wTOjDu/lTc=", + "attachment": { + "hash": "9a031995ae6edb03d9eddbefa345470e2ef4f73cd4d1cc5f6a1d6cae5e897e2c", + "size": 2223, + "filename": "D0Hbg52GdF5j948K84ufWwwyf2laKJFrVgN0v6w4qyc=.pem", + "location": "security-state-staging/intermediates/d1c5223d-b23b-40e9-a0fb-239c3ec8e2ed.pem", + "mimetype": "application/x-pem-file" + }, + "id": "d149d0fe-0927-4f3a-b3b1-cb4466af0ad8", + "last_modified": 1774540622844 + }, + { + "schema": 1774537159836, + "derHash": "CQ4tY5h7uqEIlFwDNkbGbo9JY/gCHLvQmyjtA8UY8V0=", + "attachment": { + "hash": "1fd0adafe3626c5552a1bd711a31e4771fcf6ba50465eaad2e09a5bd8e51d811", + "size": 2223, + "filename": "_afCgUksmMTJlpCQSN7g2Ztq92tr9vJMAGSd2u3c-2E=.pem", + "location": "security-state-staging/intermediates/f316e3de-7e92-4fd2-a8f2-48823166a67f.pem", + "mimetype": "application/x-pem-file" + }, + "id": "7b6d604f-da64-4956-9ba8-ef320767a339", + "last_modified": 1774540622841 + }, + { + "schema": 1774537158981, + "derHash": "lvjBHSfReqMPYDkEmWL+emE3Ueys01vghURug+SmxxU=", + "attachment": { + "hash": "7c6b20589b3e35476c459adf74a221fb2d0241fd565422ff49e51c189f72ee2c", + "size": 1211, + "filename": "EHXD4myN-2MrM-IynQeU7_1jgYeeymnT6kYKTvpkbpU=.pem", + "location": "security-state-staging/intermediates/123bd016-e01b-472d-9236-fdef1003a048.pem", + "mimetype": "application/x-pem-file" + }, + "id": "5152ad1e-5355-488c-8984-f0efd5e78077", + "last_modified": 1774540622838 + }, + { + "schema": 1774537157978, + "derHash": "hGV0oPGqNYcyZ3iVv847kVZX4SsPRCg/zGuP9eExZnw=", + "attachment": { + "hash": "d919bf8e33589b8e40186d8f10404efa161c7abc8f53d6b9518aee79fa91f973", + "size": 1207, + "filename": "gTWJCRcyOA0K6tgUJ2Lrj6HVbcMFSbqwalwLhja789E=.pem", + "location": "security-state-staging/intermediates/ad3d9108-98b2-4f3f-a617-d79662451262.pem", + "mimetype": "application/x-pem-file" + }, + "id": "40d15d9c-194f-4733-a6c3-497ff71da925", + "last_modified": 1774540622835 + }, + { + "schema": 1774537162569, + "derHash": "qCdgfIh1VWlCwEYh4AsvT7vCTXLRuiFXMn6U21uIIuk=", + "attachment": { + "hash": "a7c60c40deb5ea433c5c7ebb5e4bdd06a47eec41d946a73fea7d2331fd22f39b", + "size": 1207, + "filename": "khm_-KphnPlXjmlGYOIskARrZpM8Wv4aciNlPkQqoU8=.pem", + "location": "security-state-staging/intermediates/26b06ae5-e167-4030-8ebc-5ca3e53932f5.pem", + "mimetype": "application/x-pem-file" + }, + "id": "c184f4b5-f1c6-42a3-8751-9e8a8123c101", + "last_modified": 1774540622831 + }, + { + "schema": 1774407026782, + "derHash": "rSqtrKiX3qIriJ3bOBFDBJrZl1wIGbSTUNYhkBk1img=", + "attachment": { + "hash": "7be77c4f3a6cc94534290a06c3ae1d8a9f22ce5095d33688274eb4fe4edd3fcc", + "size": 1284, + "filename": "8HooqDIb6deYivaIrjMnbSVm5PnKzs4Mum9cD1-2Ntw=.pem", + "location": "security-state-staging/intermediates/29d315aa-8a9c-430e-b1e6-e9a5572ed701.pem", + "mimetype": "application/x-pem-file" + }, + "id": "3a9de97b-7cf0-4772-b306-320cb0e1680b", + "last_modified": 1774407422891 + }, + { + "schema": 1774407025946, + "derHash": "y7pa+7fkk8LR7fuzsWI5S/zsA0WmbcGhZ7ID1TT7wV8=", + "attachment": { + "hash": "86752cefd9de3fd54a98ff4f261081c6debb15d084dbe4d5c42373df0cfa15b8", + "size": 1293, + "filename": "BrDTQv-ioWNZeYFnvfqDY6CWpQ7tPtfBtFCPsRg8oYY=.pem", + "location": "security-state-staging/intermediates/d183a535-9322-4d15-99cd-6f53c256ac39.pem", + "mimetype": "application/x-pem-file" + }, + "id": "51ae5324-7cb5-4022-b86c-043c7f87f3cb", + "last_modified": 1774407422888 + }, + { + "schema": 1774407025123, + "derHash": "OZzG09QbgfWCE5JEtrXY8J6V5XEDCmJ3+PQFGy4Xr2Y=", + "attachment": { + "hash": "8e60682a9a574f1d0a0dabe96f711fa45d6d6016e7756e0910b1cde625bcb1a5", + "size": 2231, + "filename": "m_Imq6VCxWXMJpEVLT-9ogjW5uJ1aMCuHE4z1IoRiEU=.pem", + "location": "security-state-staging/intermediates/b7bdf584-9ff1-422c-811b-f043e7dd9f41.pem", + "mimetype": "application/x-pem-file" + }, + "id": "1b4d2c0e-b206-458d-8a88-d4937d94c07d", + "last_modified": 1774407422885 + }, + { + "schema": 1774407024250, + "derHash": "E2I9tZlclps7VabgrntutbiqwUUvZJSH80Tvkg/8ilo=", + "attachment": { + "hash": "13744fb9bdff4996f470d2a114595cd545ae2375059c952724b438530df06e0b", + "size": 2223, + "filename": "8n8ZPo-I2Z5L6S3BZ9izqIsRIWQMxNnHyN1-ni6rQHI=.pem", + "location": "security-state-staging/intermediates/ce0fdc77-55e9-49a7-9289-8ae811ec58c6.pem", + "mimetype": "application/x-pem-file" + }, + "id": "636a61c3-f9ec-4476-a211-a75bd63203e0", + "last_modified": 1774407422881 + }, + { + "schema": 1774407023409, + "derHash": "NTKM2p8U/rYqwMyu4bEBAf1vRK3YWlExHqF0/TYfRhM=", + "attachment": { + "hash": "09e6690e366888699b9f80cc1725cb1faaf65069be6e9032e0abb58d3a595242", + "size": 1508, + "filename": "R0h5AKG-ue4IzLwRFqjsVfRUtjiZQxnwUbmEAjztZCM=.pem", + "location": "security-state-staging/intermediates/c67cf489-4f63-4db7-8885-5d9a6cc4ee5b.pem", + "mimetype": "application/x-pem-file" + }, + "id": "7c9b4915-0290-44dc-a053-0be5cdd18711", + "last_modified": 1774407422878 + }, + { + "schema": 1774407022553, + "derHash": "V+c4UI+jsIIR/v8ejTUVCamNXJVf35c1k8fzwHUSXsA=", + "attachment": { + "hash": "b2e71f249b94efd07a8940e42fbc77ed9531c1065d3ae633939f704ad6de8873", + "size": 2223, + "filename": "bFHloLclSSUUIxBjXQqRVR91E9WcAO_iGbibOQ51bdw=.pem", + "location": "security-state-staging/intermediates/fbe09e70-b825-4f11-a3e9-b6c6d7cfb518.pem", + "mimetype": "application/x-pem-file" + }, + "id": "78d9eeb5-c11b-40ae-b3ef-e495db9c1299", + "last_modified": 1774407422875 + }, + { + "schema": 1774407021673, + "derHash": "JD9YYT4dH0XeSC/Xe/V7uhyS/3WWy8PgIEUEmVQfK9s=", + "attachment": { + "hash": "dcf1a61851c369c11ca2dbb606e5e639acd8fea1a25f385adff5edae49b7a4fb", + "size": 1284, + "filename": "g7Po5gl2edguSn1UNZLvQt_Ua-vBFH8qeWx8NfsPz-A=.pem", + "location": "security-state-staging/intermediates/df46379e-e1c9-42d3-87cd-36e67fa1fca6.pem", + "mimetype": "application/x-pem-file" + }, + "id": "c64f19a0-bd6e-4fd0-8662-d4f73af0ebb0", + "last_modified": 1774407422871 + }, + { + "schema": 1774321167312, + "derHash": "PnhD+fe1rbfYVy4+mtuQNh480OdmvMdAODD1vqDfJkM=", + "attachment": { + "hash": "626411fa1a1a96145370b856759aa04362d6b29227bf2a8bc1f1b270867c158a", + "size": 1333, + "filename": "ZcmQIw3T5sstVqoLKtlSp-iGIreyBs6HuHoKvalPSbw=.pem", + "location": "security-state-staging/intermediates/5c22466d-6c50-46d9-aeb5-8a49e5106d5b.pem", + "mimetype": "application/x-pem-file" + }, + "id": "e04d4e38-55e1-4185-9024-7c8a07e7f90f", + "last_modified": 1774324622561 + }, + { + "schema": 1774321166456, + "derHash": "x24j36ABS4habe2ObWTCla9Jkdx4csGviw/vUn4mOSk=", + "attachment": { + "hash": "f6bed434abd9cba4cb6c693afa5bc3610a074c2273836781b76d16121e42e2a3", + "size": 2483, + "filename": "DTHIAtHLOR6FmYnWT0BO8a7y7EPc0Efk6Xg5Q2TZgcQ=.pem", + "location": "security-state-staging/intermediates/4c021cd3-ee89-4bf0-aea7-1bae269d28c8.pem", + "mimetype": "application/x-pem-file" + }, + "id": "749cc566-3960-4751-99c3-38dd313dd8ed", + "last_modified": 1774324622559 + }, + { + "schema": 1774321165467, + "derHash": "IIK2QbStfyCozufx+4VXHqRhIi/pM9/y+yRu1ax+raI=", + "attachment": { + "hash": "8334eb6e646f5086918552fdc4c9e388fc154ba3a73f5ec6b734d151cdd4dcd1", + "size": 2483, + "filename": "A8ZEgZnEvlP5roifoh8jSSc6XIssihwe4GegJOQMMgc=.pem", + "location": "security-state-staging/intermediates/e82e926a-6890-44f9-bef0-bd26a51cba97.pem", + "mimetype": "application/x-pem-file" + }, + "id": "ea3b6bb6-b87f-4a32-af61-934b7372d338", + "last_modified": 1774324622556 + }, + { + "schema": 1774015158385, + "derHash": "YwbEkfnRzs7e9GQg4ChgGSLAEG3QtIphp0VPntOM1kk=", + "attachment": { + "hash": "89366bf6af4cebfb752560bbf9f7e1f2ca1f9153fcbd19fbc49b9816c121dd49", + "size": 2032, + "filename": "DgXpuyOGnraJ3FaDnc7EdaOudfprULxaSXg2DL5nMyM=.pem", + "location": "security-state-staging/intermediates/cebee1ae-3936-45a5-8ea0-fe7b583cf983.pem", + "mimetype": "application/x-pem-file" + }, + "id": "2146715a-52f4-4edb-94b4-057974931912", + "last_modified": 1774018622682 + }, + { + "schema": 1774015157426, + "derHash": "Tc5aAXuz2BrPgj6BWqvLg3Uq0+KIOzWd9Ck1371JcHU=", + "attachment": { + "hash": "5e009485a7b2968bb39bd0b751c8e4b621bdc23f8e1ec2064b7970c7e0e5835a", + "size": 1447, + "filename": "6rDeWkZBkBCwGy1VVT_BEaqCtD2Tle3-rqqMduatGZU=.pem", + "location": "security-state-staging/intermediates/b6f4b5cb-5485-435e-81a0-86517fe7cbdf.pem", + "mimetype": "application/x-pem-file" + }, + "id": "d4aa25dd-629d-4e5b-9980-52f0a4a3020e", + "last_modified": 1774018622678 + }, + { "schema": 1773367181131, "derHash": "O6M9yJ8SKjyt2VVQJiQFLjd88FnRwsUZgnD2lAB4aJE=", "attachment": { @@ -183,32 +612,6 @@ "last_modified": 1771772222955 }, { - "schema": 1771509557311, - "derHash": "wAO4yz8Ey2gNnidXfUl+PG/r4+KkALepKwml6zjJ+sc=", - "attachment": { - "hash": "bba6fee9c638fc0bb66f0aca6a04feb22f2437cc8810caafa472b61983865cc8", - "size": 2300, - "filename": "qEARbagEM4uxwIMf9T4As1lIb5Nh6EAgvw2YzeHYK7w=.pem", - "location": "security-state-staging/intermediates/cfc4f010-7021-4f72-bae1-e536cb9563a3.pem", - "mimetype": "application/x-pem-file" - }, - "id": "0dac995c-5c6c-4a1f-af61-1fa908290896", - "last_modified": 1771513022842 - }, - { - "schema": 1771509556805, - "derHash": "CDNRe9bX7gEhcyLLqHM8ETRoh/BlNATyTe0fjkhcK2s=", - "attachment": { - "hash": "0c4094f2c3726037de2909d5d0a0383023b486a974d1d9e84dabff44540c8754", - "size": 1772, - "filename": "9aRZ9FaploJqrFZWXeqoWgPs7XVI3lOweGuCzG9fKGQ=.pem", - "location": "security-state-staging/intermediates/ae47ea83-973b-4d3b-ab78-6537f2989259.pem", - "mimetype": "application/x-pem-file" - }, - "id": "276adda4-a8c0-4dd4-932d-9428d05875f5", - "last_modified": 1771513022838 - }, - { "schema": 1771379968391, "derHash": "WoTJQFTTQNZQopmF75e7OWNS4hWu1sCzPKf/3TvV0qI=", "attachment": { @@ -703,19 +1106,6 @@ "last_modified": 1771383422828 }, { - "schema": 1771379992866, - "derHash": "48hVL2s5Nmtartt2CKc+P9aNEAwTCcsVcYFD6oaD8lQ=", - "attachment": { - "hash": "20e9f9718ba6acec1bbe1e8b095d4b53b35c79efe52994dec2244c04b49fc187", - "size": 1366, - "filename": "xC5Mppf2n30ntcbkf0_mu7qM2c8gkAWweKnBTAo1aZw=.pem", - "location": "security-state-staging/intermediates/b412deb9-2345-420d-9286-e781b68cbf1a.pem", - "mimetype": "application/x-pem-file" - }, - "id": "3fd60854-54de-441c-ba8a-5d145fb317e7", - "last_modified": 1771383422825 - }, - { "schema": 1771379992530, "derHash": "ekrZ4bot+wj3UqEkAy9wWIaAYumEF4ViPrQTZ4OlP/w=", "attachment": { @@ -1496,19 +1886,6 @@ "last_modified": 1771383422635 }, { - "schema": 1771379971011, - "derHash": "kV1miBHRlcx8lhTcP4KN87KRs15hCrsua0SThi9N43k=", - "attachment": { - "hash": "d1dfcd3b3f42e41a05f041c27d4909d19c9a46c54f7fc371e001a9d7bd0d47d3", - "size": 2463, - "filename": "PXOyA0uXo2z7W15EJ48em_wITc8eGkDuyCeMIUj31FA=.pem", - "location": "security-state-staging/intermediates/598d4331-9fed-442a-8685-ac3f0326bc29.pem", - "mimetype": "application/x-pem-file" - }, - "id": "37a059d7-c2b2-4bbf-80d3-41162a374908", - "last_modified": 1771383422632 - }, - { "schema": 1771379973334, "derHash": "J7EivB2+EsiLGsvrwzAwvbzPTeck7I6CJmUT0Hl8CXo=", "attachment": { @@ -1769,19 +2146,6 @@ "last_modified": 1770821822832 }, { - "schema": 1770346696790, - "derHash": "HKjDKFVANU5XtJo9Xt9UD7syGPlfjQdjZQeta7Hb3Ao=", - "attachment": { - "hash": "77e57a7818d91fa0043b24cf70e7736927a80514f309fba7e97b0fd581466052", - "size": 1772, - "filename": "uu5PB-MS9L3_ffB_PuTG6A-WjsTtTaF52qqjrcHFXRU=.pem", - "location": "security-state-staging/intermediates/e99d8913-57e3-47fc-b420-e1bb140e1909.pem", - "mimetype": "application/x-pem-file" - }, - "id": "66a450eb-a71e-4989-9852-886030dc1083", - "last_modified": 1770350222829 - }, - { "schema": 1770260354511, "derHash": "LWUUTYqDMeioEuzfJHGVYVtr1Vtko/k5lWPI/LnWfKY=", "attachment": { @@ -2393,45 +2757,6 @@ "last_modified": 1770177422928 }, { - "schema": 1769741962634, - "derHash": "vm7uOzd+bSQV2DudjL4oBWGTUB+me76TV2EdSShRhfs=", - "attachment": { - "hash": "9cc57cfffeb2d4dfaa1de4d68bc6df09814a325e82ed7d143d30310367a9959a", - "size": 2292, - "filename": "hzeu34brK_Z0hDKN9XROAdUbOVWhDDdjwk1o0y60PD0=.pem", - "location": "security-state-staging/intermediates/c465f336-bed6-43aa-9841-3c74f30a7fbf.pem", - "mimetype": "application/x-pem-file" - }, - "id": "ac11130c-fe77-446a-a693-069011a3ff4b", - "last_modified": 1769745422772 - }, - { - "schema": 1769741961851, - "derHash": "j0IbhDUhh2lj8aCZ8ogVy9ed0dLH5BRoKpqo4OcmDkE=", - "attachment": { - "hash": "b1a9f9096d11efc3078f02a13e0707c747cf2d94ddd03bccaa1ca72472b49709", - "size": 2304, - "filename": "lGBlQRwFOcsG8uVhM7n4ddbxnH8BwrOV2iSLkMxtjiM=.pem", - "location": "security-state-staging/intermediates/3a073a49-5432-4cca-996d-4447939fee6d.pem", - "mimetype": "application/x-pem-file" - }, - "id": "9a0512f7-cc04-4768-ae1d-8274a5eb20b3", - "last_modified": 1769745422768 - }, - { - "schema": 1769741960777, - "derHash": "JXSMOtggRkJ1OD4W03sO0CbdDrt5LZxvfrwD41/T29Y=", - "attachment": { - "hash": "7ef602046af66442afba2f2c4c0e54ea53ccd3eaa59cd748c1b7b93dae7e9a6f", - "size": 1764, - "filename": "27XPDnbbH9xaiqJl0IvNKmRIPVcH6I5ORN0TMtFjFZk=.pem", - "location": "security-state-staging/intermediates/735dff5f-a936-4fbb-a6ef-bb8eeeb2b535.pem", - "mimetype": "application/x-pem-file" - }, - "id": "fb539b27-5e54-4354-b719-6fc773e3c30b", - "last_modified": 1769745422765 - }, - { "schema": 1769741962217, "derHash": "0bKOoPkz1vHGL4ojk8yx4JRtgg2mRdJhF6T+j/hOuWg=", "attachment": { @@ -17570,24 +17895,6 @@ "last_modified": 1666727873590 }, { - "schema": 1666727415821, - "derHash": "lW/5zJFIdNnK+WVbzLaWwb5Jolv5KNXEHA9TlaE12Lg=", - "subject": "CN=Telekom Security DV RSA CA 21,O=Deutsche Telekom Security GmbH,C=DE", - "subjectDN": "MF4xCzAJBgNVBAYTAkRFMScwJQYDVQQKDB5EZXV0c2NoZSBUZWxla29tIFNlY3VyaXR5IEdtYkgxJjAkBgNVBAMMHVRlbGVrb20gU2VjdXJpdHkgRFYgUlNBIENBIDIx", - "whitelist": false, - "attachment": { - "hash": "acb3894c8cbada20f584e21eba9807c60116c18b1ffb053f0d45638c7fbade05", - "size": 1752, - "filename": "xKFly8BVCDp0QQH2za-7ZzsqYFz305rqc0YqMPtU7Uw=.pem", - "location": "security-state-staging/intermediates/5cc07929-0f31-444c-9904-7e3f405702e3.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "xKFly8BVCDp0QQH2za+7ZzsqYFz305rqc0YqMPtU7Uw=", - "crlite_enrolled": false, - "id": "1c1cd633-821a-4775-9051-53aaf439c3b3", - "last_modified": 1666727873576 - }, - { "schema": 1666727372257, "derHash": "SB5YKiBqfXBAzNoXzyXTSXhaKrlO11UqslTc04sDLsA=", "subject": "CN=Microsoft RSA TLS Issuing AOC CA 01,O=Microsoft Corporation,C=US", @@ -32276,5 +32583,5 @@ "last_modified": 1559865884636 } ], - "timestamp": 1773460622721 + "timestamp": 1775836622756 } diff -Nru firefox-esr-140.9.1esr/services/settings/dumps/security-state/onecrl.json firefox-esr-140.10.0esr/services/settings/dumps/security-state/onecrl.json --- firefox-esr-140.9.1esr/services/settings/dumps/security-state/onecrl.json 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/services/settings/dumps/security-state/onecrl.json 2026-04-15 01:59:56.000000000 +0000 @@ -1,6 +1,96 @@ { "data": [ { + "schema": 1773334942432, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBSU0EgUm9vdCBDQSBSMQ==", + "serialNumber": "al735VviUH4QdUeyT9xDUA==", + "id": "6eea1b20-43fc-43a1-b2c7-c8aa04322194", + "last_modified": 1774556199388 + }, + { + "schema": 1773334942363, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBFQ0MgUm9vdCBDQSBSMg==", + "serialNumber": "d1PLgIujvMDZUu8CSN8p1w==", + "id": "49be7e0c-8bdb-4892-b80f-c48e8930f6a5", + "last_modified": 1774556199385 + }, + { + "schema": 1773334942292, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBSU0EgUm9vdCBDQSBSMQ==", + "serialNumber": "KwA3PBmKPkXTYMbiw/N+2Q==", + "id": "fbd21948-1fb9-42e2-a7cf-9dd3a9c66832", + "last_modified": 1774556199382 + }, + { + "schema": 1773334942222, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBFQ0MgUm9vdCBDQSBSMg==", + "serialNumber": "QSesyhEsgEJJ7ytP0Grw4w==", + "id": "5aee5cda-d283-465d-9b63-d03824d9afef", + "last_modified": 1774556199379 + }, + { + "schema": 1773334942153, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBFQ0MgUm9vdCBDQSBSMg==", + "serialNumber": "X+CO4UV3HELJrdgoOeqoPg==", + "id": "1ea836d8-ae1a-4d4d-9ec8-c3ef4fd75011", + "last_modified": 1774556199375 + }, + { + "schema": 1773176482723, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBSU0EgUm9vdCBDQSBSMQ==", + "serialNumber": "Rz7QaUBcRh0/yc2BLpIg6Q==", + "id": "1a8a8a84-806b-45d9-8da8-61cbb0f7429e", + "last_modified": 1774556199371 + }, + { "schema": 1772730084371, "details": { "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2021383", @@ -26894,5 +26984,5 @@ "last_modified": 1480349158647 } ], - "timestamp": 1773176482130 + "timestamp": 1774556199388 } diff -Nru firefox-esr-140.9.1esr/servo/components/style/values/specified/calc.rs firefox-esr-140.10.0esr/servo/components/style/values/specified/calc.rs --- firefox-esr-140.9.1esr/servo/components/style/values/specified/calc.rs 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/servo/components/style/values/specified/calc.rs 2026-04-15 01:59:57.000000000 +0000 @@ -456,6 +456,9 @@ (&Length(ref one), &Length(ref other)) => { return Ok(Leaf::Length(one.try_op(other, op)?)); }, + (&ColorComponent(..), &ColorComponent(..)) => { + return Err(()); + }, _ => { match *other { Number(..) | Percentage(..) | Angle(..) | Time(..) | Length(..) | diff -Nru firefox-esr-140.9.1esr/sourcestamp.txt firefox-esr-140.10.0esr/sourcestamp.txt --- firefox-esr-140.9.1esr/sourcestamp.txt 2026-04-03 15:52:56.000000000 +0000 +++ firefox-esr-140.10.0esr/sourcestamp.txt 2026-04-15 02:00:26.000000000 +0000 @@ -1,2 +1,2 @@ -20260403140708 -https://hg.mozilla.org/releases/mozilla-esr140/rev/cca515379f569261e903f6e84dcdb0ecdbbe821e +20260414220523 +https://hg.mozilla.org/releases/mozilla-esr140/rev/a1c8c4081ea0e227dbde64c95ec6942fa71edb28 diff -Nru firefox-esr-140.9.1esr/taskcluster/docker/periodic-updates/scripts/genHPKPStaticPins.js firefox-esr-140.10.0esr/taskcluster/docker/periodic-updates/scripts/genHPKPStaticPins.js --- firefox-esr-140.9.1esr/taskcluster/docker/periodic-updates/scripts/genHPKPStaticPins.js 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/taskcluster/docker/periodic-updates/scripts/genHPKPStaticPins.js 2026-04-15 01:59:56.000000000 +0000 @@ -121,15 +121,7 @@ ); } - let resultDecoded; - try { - resultDecoded = atob(req.responseText); - } catch (e) { - throw new Error( - "ERROR: could not decode data as base64 from '" + filename + "': " + e - ); - } - return resultDecoded; + return req.responseText; } function downloadAsJson(filename) { diff -Nru firefox-esr-140.9.1esr/taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js firefox-esr-140.10.0esr/taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js --- firefox-esr-140.9.1esr/taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js 2026-04-15 01:59:56.000000000 +0000 @@ -17,7 +17,7 @@ ); const SOURCE = - "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/transport_security_state_static.json?format=TEXT"; + "https://raw.githubusercontent.com/chromium/chromium/main/net/http/transport_security_state_static.json"; const TOOL_SOURCE = "https://hg.mozilla.org/mozilla-central/file/default/taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js"; const OUTPUT = "nsSTSPreloadList.inc"; @@ -52,17 +52,8 @@ } let text = await resp.text(); - let resultDecoded; - try { - resultDecoded = atob(text); - } catch (e) { - throw new Error( - "ERROR: could not decode data as base64 from '" + SOURCE + "': " + e - ); - } - // we have to filter out '//' comments, while not mangling the json - let result = resultDecoded.replace(/^(\s*)?\/\/[^\n]*\n/gm, ""); + let result = text.replace(/^(\s*)?\/\/[^\n]*\n/gm, ""); let data = null; try { data = JSON.parse(result); diff -Nru firefox-esr-140.9.1esr/testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html firefox-esr-140.10.0esr/testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html --- firefox-esr-140.9.1esr/testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html 2026-04-03 15:52:28.000000000 +0000 +++ firefox-esr-140.10.0esr/testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html 2026-04-15 01:59:56.000000000 +0000 @@ -15,6 +15,7 @@
+ Some text
Before image 1
After image 1
diff -Nru firefox-esr-140.9.1esr/third_party/libwebrtc/call/BUILD.gn firefox-esr-140.10.0esr/third_party/libwebrtc/call/BUILD.gn --- firefox-esr-140.9.1esr/third_party/libwebrtc/call/BUILD.gn 2026-04-03 15:52:34.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/libwebrtc/call/BUILD.gn 2026-04-15 02:00:04.000000000 +0000 @@ -590,6 +590,7 @@ "../api/video:video_codec_constants", "../api/video:video_frame", "../api/video:video_frame_type", + "../api/video:video_layers_allocation", "../api/video:video_rtp_headers", "../api/video_codecs:video_codecs_api", "../audio", diff -Nru firefox-esr-140.9.1esr/third_party/libwebrtc/call/rtp_video_sender.cc firefox-esr-140.10.0esr/third_party/libwebrtc/call/rtp_video_sender.cc --- firefox-esr-140.9.1esr/third_party/libwebrtc/call/rtp_video_sender.cc 2026-04-03 15:52:34.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/libwebrtc/call/rtp_video_sender.cc 2026-04-15 02:00:04.000000000 +0000 @@ -699,6 +699,11 @@ transport_queue_.PostTask( SafeTask(safety_.flag(), [this, sending = std::move(sending)] { RTC_DCHECK_RUN_ON(&transport_checker_); + // It's possible for another task to be scheduled on the transport + // checker ahead of this call that makes the sender not active. + if (!IsActive()) { + return; + } RTC_CHECK_EQ(sending.size(), rtp_streams_.size()); for (size_t i = 0; i < sending.size(); ++i) { SetModuleIsActive(sending[i], *rtp_streams_[i].rtp_rtcp); diff -Nru firefox-esr-140.9.1esr/third_party/libwebrtc/call/rtp_video_sender_unittest.cc firefox-esr-140.10.0esr/third_party/libwebrtc/call/rtp_video_sender_unittest.cc --- firefox-esr-140.9.1esr/third_party/libwebrtc/call/rtp_video_sender_unittest.cc 2026-04-03 15:52:34.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/libwebrtc/call/rtp_video_sender_unittest.cc 2026-04-15 02:00:03.000000000 +0000 @@ -38,6 +38,7 @@ #include "api/video/encoded_image.h" #include "api/video/video_codec_type.h" #include "api/video/video_frame_type.h" +#include "api/video/video_layers_allocation.h" #include "api/video_codecs/video_encoder.h" #include "call/rtp_config.h" #include "call/rtp_transport_config.h" @@ -1670,4 +1671,73 @@ EXPECT_EQ(retransmitted_rtp_sequence_numbers, base_rtp_sequence_numbers); } +TEST(RtpVideoSenderTest, PostTaskRaceDoesNotLeadToDanglingPointer) { + NiceMock transport; + NiceMock encoder_feedback; + + GlobalSimulatedTimeController time_controller(Timestamp::Millis(1000000)); + Environment env = CreateEnvironment(time_controller.GetClock(), + time_controller.CreateTaskQueueFactory()); + + VideoSendStream::Config config(&transport); + config.rtp.ssrcs = {kSsrc1}; + + SendStatisticsProxy stats_proxy( + time_controller.GetClock(), config, + VideoEncoderConfig::ContentType::kRealtimeVideo, env.field_trials()); + + BitrateConstraints bitrate_config = GetBitrateConfig(); + RtpTransportConfig transport_config{.env = env, + .bitrate_config = bitrate_config}; + RtpTransportControllerSend transport_controller(transport_config); + transport_controller.EnsureStarted(); + + RateLimiter retransmission_rate_limiter(time_controller.GetClock(), + kRetransmitWindowSizeMs); + + std::map suspended_ssrcs; + std::map suspended_payload_states; + + auto router = std::make_unique( + env, time_controller.GetMainThread(), suspended_ssrcs, + suspended_payload_states, config.rtp, config.rtcp_report_interval_ms, + &transport, + CreateObservers(&encoder_feedback, &stats_proxy, &stats_proxy, + &stats_proxy, nullptr, &stats_proxy), + &transport_controller, &retransmission_rate_limiter, + std::make_unique(env), nullptr, CryptoOptions{}, + nullptr); + + router->SetSending(true); + // Verify it's registered + EXPECT_TRUE( + transport_controller.packet_router()->SsrcOfFirstSender().has_value()); + + // Trigger race: + // 1. OnVideoLayersAllocationUpdated posts a task to re-register modules + // because it sees active_ is true. + VideoLayersAllocation allocation; + allocation.active_spatial_layers.push_back({.rtp_stream_index = 0}); + router->OnVideoLayersAllocationUpdated(allocation); + + // 2. Immediately set active_ to false. This happens BEFORE the posted task + // runs. + router->SetSending(false); + + // 3. Let the posted task run. With the fix, it should return early and not + // re-register the module because active_ is now false. + time_controller.AdvanceTime(TimeDelta::Zero()); + + // 4. Verify that PacketRouter does NOT have a sender. + EXPECT_FALSE( + transport_controller.packet_router()->SsrcOfFirstSender().has_value()); + + // 5. Destroy the router. + router.reset(); + + // 6. Verify that PacketRouter still does not have a sender. + EXPECT_FALSE( + transport_controller.packet_router()->SsrcOfFirstSender().has_value()); +} + } // namespace webrtc diff -Nru firefox-esr-140.9.1esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.cc firefox-esr-140.10.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.cc --- firefox-esr-140.9.1esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.cc 2026-04-03 15:52:34.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.cc 2026-04-15 02:00:04.000000000 +0000 @@ -230,14 +230,21 @@ RTC_DCHECK_EQ(padding_size_, 0); RTC_DCHECK_LE(csrcs.size(), 0x0fu); RTC_DCHECK_LE(kFixedHeaderSize + 4 * csrcs.size(), capacity()); + + if (csrcs.size() > kMaxCsrcs) { + RTC_LOG(LS_WARNING) << "Truncating CSRC list to spec length " << kMaxCsrcs + << " from " << csrcs.size(); + csrcs = csrcs.subview(0, kMaxCsrcs); + } + payload_offset_ = kFixedHeaderSize + 4 * csrcs.size(); + buffer_.SetSize(payload_offset_); WriteAt(0, (data()[0] & 0xF0) | dchecked_cast(csrcs.size())); size_t offset = kFixedHeaderSize; for (uint32_t csrc : csrcs) { ByteWriter::WriteBigEndian(WriteAt(offset), csrc); offset += 4; } - buffer_.SetSize(payload_offset_); } rtc::ArrayView RtpPacket::AllocateRawExtension(int id, size_t length) { diff -Nru firefox-esr-140.9.1esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.h firefox-esr-140.10.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.h --- firefox-esr-140.9.1esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.h 2026-04-03 15:52:34.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.h 2026-04-15 02:00:04.000000000 +0000 @@ -27,6 +27,12 @@ using ExtensionType = RTPExtensionType; using ExtensionManager = RtpHeaderExtensionMap; + // Maximum number of CSRCs in an RTP packet as specified in section + // "5.1 RTP Fixed Header Fields" of RFC 3550. + // Note: This is a different limit than the one that applies to RTCP packets + // (which is specified in section 6.1). + static constexpr size_t kMaxCsrcs = 15; + // `extensions` required for SetExtension/ReserveExtension functions during // packet creating and used if available in Parse function. // Adding and getting extensions will fail until `extensions` is diff -Nru firefox-esr-140.9.1esr/third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder.cc firefox-esr-140.10.0esr/third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder.cc --- firefox-esr-140.9.1esr/third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder.cc 2026-04-03 15:52:34.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder.cc 2026-04-15 02:00:04.000000000 +0000 @@ -71,9 +71,6 @@ constexpr char kDav1dName[] = "dav1d"; -// Calling `dav1d_data_wrap` requires a `free_callback` to be registered. -void NullFreeCallback(const uint8_t* /* buffer */, void* /* opaque */) {} - Dav1dDecoder::Dav1dDecoder() = default; Dav1dDecoder::~Dav1dDecoder() { @@ -127,9 +124,25 @@ ScopedDav1dData scoped_dav1d_data; Dav1dData& dav1d_data = scoped_dav1d_data.Data(); - dav1d_data_wrap(&dav1d_data, encoded_image.data(), encoded_image.size(), - /*free_callback=*/&NullFreeCallback, - /*user_data=*/nullptr); + + // Calling GetEncodedData will create a new `scoped_refptr` and increment the + // ref count. By simply releasing we are now responsible for decrementing + // the ref count when appropriate, which is when dav1d calls the + // `free_callback` to indicate that the buffer is no longer needed. + EncodedImageBufferInterface* bitstream_buffer = + encoded_image.GetEncodedData().release(); + + // Note that the `bitstream_buffer` can have a higher capacity than what is + // actually being used, so `encoded_image.size()` should be used to get the + // actual size of the bitstream. + dav1d_data_wrap( + &dav1d_data, encoded_image.data(), encoded_image.size(), + /*free_callback=*/ + [](const uint8_t* /* buffer */, void* user_data) { + auto* bb = static_cast(user_data); + bb->Release(); + }, + /*user_data=*/bitstream_buffer); if (int decode_res = dav1d_send_data(context_, &dav1d_data)) { RTC_LOG(LS_WARNING) diff -Nru firefox-esr-140.9.1esr/third_party/libwebrtc/moz-patch-stack/77d265670f.no-op-cherry-pick-msg firefox-esr-140.10.0esr/third_party/libwebrtc/moz-patch-stack/77d265670f.no-op-cherry-pick-msg --- firefox-esr-140.9.1esr/third_party/libwebrtc/moz-patch-stack/77d265670f.no-op-cherry-pick-msg 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/libwebrtc/moz-patch-stack/77d265670f.no-op-cherry-pick-msg 2026-04-15 02:00:04.000000000 +0000 @@ -0,0 +1 @@ +We cherry-picked this in bug 2029776 diff -Nru firefox-esr-140.9.1esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.cc firefox-esr-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.cc --- firefox-esr-140.9.1esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.cc 2026-04-03 15:52:34.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.cc 2026-04-15 02:00:04.000000000 +0000 @@ -133,6 +133,9 @@ UnwrappedTSN cumulative_tsn_ack, rtc::ArrayView gap_ack_blocks, bool is_in_fast_recovery) { + bool cumulative_tsn_ack_advanced = + cumulative_tsn_ack > last_cumulative_tsn_ack_; + OutstandingData::AckInfo ack_info(cumulative_tsn_ack); // Erase all items up to cumulative_tsn_ack. RemoveAcked(cumulative_tsn_ack, ack_info); @@ -142,7 +145,7 @@ // NACK and possibly mark for retransmit chunks that weren't acked. NackBetweenAckBlocks(cumulative_tsn_ack, gap_ack_blocks, is_in_fast_recovery, - ack_info); + cumulative_tsn_ack_advanced, ack_info); RTC_DCHECK(IsConsistent()); return ack_info; @@ -215,6 +218,7 @@ UnwrappedTSN cumulative_tsn_ack, rtc::ArrayView gap_ack_blocks, bool is_in_fast_recovery, + bool cumulative_tsn_acked_advanced, OutstandingData::AckInfo& ack_info) { // Mark everything between the blocks as NACKED/TO_BE_RETRANSMITTED. // https://tools.ietf.org/html/rfc4960#section-7.2.4 @@ -227,7 +231,7 @@ // in-flight and between gaps should be nacked. This means that SCTP relies on // the T3-RTX-timer to re-send packets otherwise. UnwrappedTSN max_tsn_to_nack = ack_info.highest_tsn_acked; - if (is_in_fast_recovery && cumulative_tsn_ack > last_cumulative_tsn_ack_) { + if (is_in_fast_recovery && cumulative_tsn_acked_advanced) { // https://tools.ietf.org/html/rfc4960#section-7.2.4 // "If an endpoint is in Fast Recovery and a SACK arrives that advances // the Cumulative TSN Ack Point, the miss indications are incremented for @@ -242,7 +246,8 @@ UnwrappedTSN cur_block_first_acked = UnwrappedTSN::AddTo(cumulative_tsn_ack, block.start); for (UnwrappedTSN tsn = prev_block_last_acked.next_value(); - tsn < cur_block_first_acked && tsn <= max_tsn_to_nack; + tsn < cur_block_first_acked && tsn <= max_tsn_to_nack && + tsn < next_tsn(); tsn = tsn.next_value()) { ack_info.has_packet_loss |= NackItem(tsn, /*retransmit_now=*/false, diff -Nru firefox-esr-140.9.1esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.h firefox-esr-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.h --- firefox-esr-140.9.1esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.h 2026-04-03 15:52:34.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.h 2026-04-15 02:00:05.000000000 +0000 @@ -320,6 +320,7 @@ UnwrappedTSN cumulative_tsn_ack, rtc::ArrayView gap_ack_blocks, bool is_in_fast_recovery, + bool cumulative_tsn_acked_advanced, OutstandingData::AckInfo& ack_info); // Process the acknowledgement of the chunk referenced by `iter` and updates diff -Nru firefox-esr-140.9.1esr/third_party/libwebrtc/net/dcsctp/tx/retransmission_queue.cc firefox-esr-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/retransmission_queue.cc --- firefox-esr-140.9.1esr/third_party/libwebrtc/net/dcsctp/tx/retransmission_queue.cc 2026-04-03 15:52:34.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/retransmission_queue.cc 2026-04-15 02:00:03.000000000 +0000 @@ -252,6 +252,14 @@ } else if (cumulative_tsn_ack > outstanding_data_.highest_outstanding_tsn()) { return false; } + + for (const auto& block : sack.gap_ack_blocks()) { + if (UnwrappedTSN::AddTo(cumulative_tsn_ack, block.end) > + outstanding_data_.highest_outstanding_tsn()) { + return false; + } + } + return true; } diff -Nru firefox-esr-140.9.1esr/third_party/rust/cubeb-coreaudio/.cargo-checksum.json firefox-esr-140.10.0esr/third_party/rust/cubeb-coreaudio/.cargo-checksum.json --- firefox-esr-140.9.1esr/third_party/rust/cubeb-coreaudio/.cargo-checksum.json 2026-04-03 15:52:35.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/rust/cubeb-coreaudio/.cargo-checksum.json 2026-04-15 02:00:04.000000000 +0000 @@ -1 +1 @@ -{"files":{".circleci/config.yml":"7f3dc865105ca8f33965a7958b1fe2e627ae2d5a703f3b2a4ab6e2e796018597",".editorconfig":"4e53b182bcc78b83d7e1b5c03efa14d22d4955c4ed2514d1ba4e99c1eb1a50ba",".githooks/pre-push":"8b8b26544cd56f54c0c33812551f786bb25cb08c86dbfeb6bf3daad881c826a1",".github/workflows/test.yml":"cf6ebe6d41b022897360866b526d19ba8843aa82ae99a1d28393985576b6a782",".travis.yml":"dc07bac53f70f16c9bdf52264bdc58500ae6018c1b4c567bc7642f6b4ca3cc35","Cargo.toml":"63b221c28d209afb8dfc53191b61f7ba9d3faa1591fddb5547e4c400301a8138","LICENSE":"6e6f56aff5bbf3cbc60747e152fb1a719bd0716aaf6d711c554f57d92e96297c","README.md":"0007782a05a5330f739ad789c19c82562c82e32386b0447000fc72c0d48405bc","build-audiounit-rust-in-cubeb.sh":"d228a05985dcd02ec1ecac66a2b64dae5a530804a25a7054ccc95905aedfb7ef","install_git_hook.sh":"d38c8e51e636f6b90b489621ac34ccd1d1b1f40dccce3d178ed1da1c5068f16d","install_rustfmt_clippy.sh":"4ae90d8dcb9757cb3ae4ae142ef80e5377c0dde61c63f4a3c32418646e80ca7b","run_device_tests.sh":"967448b6cd46a8e60d465d56be0b1e6794a18110592a30939d2cb0650c4e5bc6","run_sanitizers.sh":"84e93a0da137803018f37403511e8c92760be730426bf6cea34419d93d1a7ff8","run_tests.sh":"bae82f66dd47a060b6fdcc238520084aec1079d5b1b1d66d103baa1ffaa8773d","src/backend/aggregate_device.rs":"f408ea934a20f5a24372fdcaa3bbc113713239fdb32323de0fd6334034c25e46","src/backend/auto_release.rs":"050fdcee74cf46b9a8a85a877e166d72a853d33220f59cf734cbb6ea09daa441","src/backend/buffer_manager.rs":"e9bcf964347daa8952f98caa2746e34a31ea8908375204896593f56e4b6147ca","src/backend/device_property.rs":"30ceeceee4fc1f6f872c6c61765e41d582ccd91d2d1ac3ca9b1e5ac18dd11a71","src/backend/mixer.rs":"c4d09291598cbffb2217b551770ec590f34b6dd6b461dd99b019d5bb70f0eef3","src/backend/mod.rs":"6f38a9e3d5b8864e9f921a47fa7655d9322ecf8789a63560fb2f5fcc63076d33","src/backend/resampler.rs":"48bf8f56ae8d60dbabca6417b768000619abee8731ac3902164b45651ac08a4d","src/backend/tests/aggregate_device.rs":"afbdf1da1fcaddcad2986bd3146bf93ca75c24b3362f5f23a09517a926290ca2","src/backend/tests/api.rs":"3b0936810b3afa84cb80428c471e1097701fd790460d00c0a5715fd8026d0a4d","src/backend/tests/backlog.rs":"3b189a7e036543c467cc242af0ed3332721179ee2b1c8847a6db563546f1ac52","src/backend/tests/device_change.rs":"bb4f7df992d915723222f62a4f995896cce861821c73351d831cb01a34cef0c4","src/backend/tests/device_property.rs":"4ef3ab625809fe95e944c19cc5dc1cc79f473520a4314d123b1f80c6b7e11411","src/backend/tests/interfaces.rs":"a96d1432afd381bf74dcbe73e892dfc4ddc68721a956606c94fd4128c6589adc","src/backend/tests/manual.rs":"f72625c05110534775c4608ccc45472ea108286657ffc1f029844a13d0b883bf","src/backend/tests/mod.rs":"e388a37edd5f53cda04fe1ac8bf033e423c6604014792177c623c8456fe5d257","src/backend/tests/parallel.rs":"a7ebd579339c40ca64c0757cc9da6baec641e670f226e1b2ec5049894700bd7a","src/backend/tests/sync_callback.rs":"20e7ba57714c0d2bff3bc8d3a912f17fdab293737bc729eae1684070b90b72c4","src/backend/tests/tone.rs":"b028c67777b6453a26190b6a49785dfe28556adcbe179cb10862ce0d47ee8509","src/backend/tests/utils.rs":"9f4f486b3d59081747785dae4828ec22a4ecbab755ac4c09ff2c0c065865a358","src/backend/utils.rs":"6c3ffbcd602e6cc9f56deb9ecb07b2eef2e6f074ef924178e466f380aae5c595","src/capi.rs":"21b66b70545bf04ec719928004d1d9adb45b24ced51288f5b2993d79aaf78f5f","src/lib.rs":"be88c967e470bf6c120f3e42f7155fe89a4718f56a35524ea4c17181856757d5","todo.md":"efc1f012eb9a331a040cad4ac03aa79307f25885f71b6fb38f3ad7af8d7d515c"},"package":null} \ No newline at end of file +{"files":{".circleci/config.yml":"7f3dc865105ca8f33965a7958b1fe2e627ae2d5a703f3b2a4ab6e2e796018597",".editorconfig":"4e53b182bcc78b83d7e1b5c03efa14d22d4955c4ed2514d1ba4e99c1eb1a50ba",".githooks/pre-push":"8b8b26544cd56f54c0c33812551f786bb25cb08c86dbfeb6bf3daad881c826a1",".github/workflows/test.yml":"cf6ebe6d41b022897360866b526d19ba8843aa82ae99a1d28393985576b6a782",".travis.yml":"dc07bac53f70f16c9bdf52264bdc58500ae6018c1b4c567bc7642f6b4ca3cc35","Cargo.toml":"63b221c28d209afb8dfc53191b61f7ba9d3faa1591fddb5547e4c400301a8138","LICENSE":"6e6f56aff5bbf3cbc60747e152fb1a719bd0716aaf6d711c554f57d92e96297c","README.md":"0007782a05a5330f739ad789c19c82562c82e32386b0447000fc72c0d48405bc","build-audiounit-rust-in-cubeb.sh":"d228a05985dcd02ec1ecac66a2b64dae5a530804a25a7054ccc95905aedfb7ef","install_git_hook.sh":"d38c8e51e636f6b90b489621ac34ccd1d1b1f40dccce3d178ed1da1c5068f16d","install_rustfmt_clippy.sh":"4ae90d8dcb9757cb3ae4ae142ef80e5377c0dde61c63f4a3c32418646e80ca7b","run_device_tests.sh":"967448b6cd46a8e60d465d56be0b1e6794a18110592a30939d2cb0650c4e5bc6","run_sanitizers.sh":"84e93a0da137803018f37403511e8c92760be730426bf6cea34419d93d1a7ff8","run_tests.sh":"bae82f66dd47a060b6fdcc238520084aec1079d5b1b1d66d103baa1ffaa8773d","src/backend/aggregate_device.rs":"3e2b5d1fa24130a9b14d6761b443fc7d1ed2f7884c545013ed2d048a1de2c3e6","src/backend/auto_release.rs":"050fdcee74cf46b9a8a85a877e166d72a853d33220f59cf734cbb6ea09daa441","src/backend/buffer_manager.rs":"e9bcf964347daa8952f98caa2746e34a31ea8908375204896593f56e4b6147ca","src/backend/device_property.rs":"30ceeceee4fc1f6f872c6c61765e41d582ccd91d2d1ac3ca9b1e5ac18dd11a71","src/backend/mixer.rs":"c4d09291598cbffb2217b551770ec590f34b6dd6b461dd99b019d5bb70f0eef3","src/backend/mod.rs":"6f38a9e3d5b8864e9f921a47fa7655d9322ecf8789a63560fb2f5fcc63076d33","src/backend/resampler.rs":"48bf8f56ae8d60dbabca6417b768000619abee8731ac3902164b45651ac08a4d","src/backend/tests/aggregate_device.rs":"afbdf1da1fcaddcad2986bd3146bf93ca75c24b3362f5f23a09517a926290ca2","src/backend/tests/api.rs":"3b0936810b3afa84cb80428c471e1097701fd790460d00c0a5715fd8026d0a4d","src/backend/tests/backlog.rs":"3b189a7e036543c467cc242af0ed3332721179ee2b1c8847a6db563546f1ac52","src/backend/tests/device_change.rs":"bb4f7df992d915723222f62a4f995896cce861821c73351d831cb01a34cef0c4","src/backend/tests/device_property.rs":"4ef3ab625809fe95e944c19cc5dc1cc79f473520a4314d123b1f80c6b7e11411","src/backend/tests/interfaces.rs":"a96d1432afd381bf74dcbe73e892dfc4ddc68721a956606c94fd4128c6589adc","src/backend/tests/manual.rs":"f72625c05110534775c4608ccc45472ea108286657ffc1f029844a13d0b883bf","src/backend/tests/mod.rs":"e388a37edd5f53cda04fe1ac8bf033e423c6604014792177c623c8456fe5d257","src/backend/tests/parallel.rs":"a7ebd579339c40ca64c0757cc9da6baec641e670f226e1b2ec5049894700bd7a","src/backend/tests/sync_callback.rs":"20e7ba57714c0d2bff3bc8d3a912f17fdab293737bc729eae1684070b90b72c4","src/backend/tests/tone.rs":"b028c67777b6453a26190b6a49785dfe28556adcbe179cb10862ce0d47ee8509","src/backend/tests/utils.rs":"9f4f486b3d59081747785dae4828ec22a4ecbab755ac4c09ff2c0c065865a358","src/backend/utils.rs":"6c3ffbcd602e6cc9f56deb9ecb07b2eef2e6f074ef924178e466f380aae5c595","src/capi.rs":"21b66b70545bf04ec719928004d1d9adb45b24ced51288f5b2993d79aaf78f5f","src/lib.rs":"be88c967e470bf6c120f3e42f7155fe89a4718f56a35524ea4c17181856757d5","todo.md":"efc1f012eb9a331a040cad4ac03aa79307f25885f71b6fb38f3ad7af8d7d515c"},"package":null} \ No newline at end of file diff -Nru firefox-esr-140.9.1esr/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs firefox-esr-140.10.0esr/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs --- firefox-esr-140.9.1esr/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs 2026-04-03 15:52:35.000000000 +0000 +++ firefox-esr-140.10.0esr/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs 2026-04-15 02:00:04.000000000 +0000 @@ -334,17 +334,19 @@ return Err(Error::from(status)); } - let cleanup = || { + let _teardown = finally(|| { let status = audio_object_remove_property_listener( device_id, &address, devices_changed_callback, data_ptr as *mut c_void, ); + // kAudioHardwareBadObjectError implies device_id is somehow dead, + // so its listener should receive nothing. + assert!(status == NO_ERR || status == (kAudioHardwareBadObjectError as OSStatus)); sync_callback_registry_unregister(data_ptr as usize); unsafe { drop(Box::from_raw(data_ptr)) }; - status - }; + }); Self::set_sub_devices(device_id, input_id, output_id)?; @@ -362,10 +364,6 @@ ); } if *dev != device_id { - let status = cleanup(); - // If the error is kAudioHardwareBadObjectError, it implies `device_id` is somehow - // dead, so its listener should receive nothing. It's ok to leave here. - assert!(status == NO_ERR || status == (kAudioHardwareBadObjectError as OSStatus)); return Err(Error::from(waiting_time)); } } @@ -386,8 +384,6 @@ NO_ERR } - let status = cleanup(); - assert_eq!(status, NO_ERR); Ok(()) } diff -Nru firefox-esr-140.9.1esr/toolkit/actors/FindBarParent.sys.mjs firefox-esr-140.10.0esr/toolkit/actors/FindBarParent.sys.mjs --- firefox-esr-140.9.1esr/toolkit/actors/FindBarParent.sys.mjs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/actors/FindBarParent.sys.mjs 2026-04-15 02:00:05.000000000 +0000 @@ -28,9 +28,21 @@ } switch (message.name) { - case "Findbar:Keypress": - findBar._onBrowserKeypress(message.data); + case "Findbar:Keypress": { + let d = message.data || {}; + findBar._onBrowserKeypress({ + type: "keypress", + bubbles: false, + cancelable: !!d.cancelable, + ctrlKey: !!d.ctrlKey, + altKey: !!d.altKey, + shiftKey: !!d.shiftKey, + metaKey: !!d.metaKey, + keyCode: (d.keyCode | 0) & 0xffff, + charCode: (d.charCode | 0) & 0xffff, + }); break; + } case "Findbar:Mouseup": findBar.onMouseUp(); break; diff -Nru firefox-esr-140.9.1esr/toolkit/actors/PictureInPictureChild.sys.mjs firefox-esr-140.10.0esr/toolkit/actors/PictureInPictureChild.sys.mjs --- firefox-esr-140.9.1esr/toolkit/actors/PictureInPictureChild.sys.mjs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/actors/PictureInPictureChild.sys.mjs 2026-04-15 02:00:06.000000000 +0000 @@ -1969,6 +1969,8 @@ this.closePictureInPicture({ reason: "Fullscreen" }); break; } + case "playing": + // Intentional fall-through case "play": { this.sendAsyncMessage("PictureInPicture:Playing"); break; @@ -2300,6 +2302,7 @@ if (originatingWindow) { originatingWindow.addEventListener("pagehide", this); originatingVideo.addEventListener("play", this); + originatingVideo.addEventListener("playing", this); originatingVideo.addEventListener("pause", this); originatingVideo.addEventListener("volumechange", this); originatingVideo.addEventListener("resize", this); @@ -2352,6 +2355,7 @@ if (originatingWindow) { originatingWindow.removeEventListener("pagehide", this); originatingVideo.removeEventListener("play", this); + originatingVideo.removeEventListener("playing", this); originatingVideo.removeEventListener("pause", this); originatingVideo.removeEventListener("volumechange", this); originatingVideo.removeEventListener("resize", this); diff -Nru firefox-esr-140.9.1esr/toolkit/components/antitracking/StorageAccessAPIHelper.cpp firefox-esr-140.10.0esr/toolkit/components/antitracking/StorageAccessAPIHelper.cpp --- firefox-esr-140.9.1esr/toolkit/components/antitracking/StorageAccessAPIHelper.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/antitracking/StorageAccessAPIHelper.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -524,22 +524,27 @@ __func__); } + RefPtr parentBC = aParentContext; auto storePermission = - [aParentContext, aTopLevelWindowId, trackingOrigin, trackingPrincipal, + [parentBC, aTopLevelWindowId, trackingOrigin, trackingPrincipal, aCookieBehavior, aReason](int aAllowMode) -> RefPtr { + if (parentBC->IsDiscarded()) { + return StorageAccessPermissionGrantPromise::CreateAndReject(false, + __func__); + } // We don't have the window, send an IPC to the content process that // owns the parent window. But there is a special case, for window.open, // we'll return to the content process we need to inform when this // function is done. So we don't need to create an extra IPC for the case. if (aReason != ContentBlockingNotifier::eOpener) { - dom::ContentParent* cp = aParentContext->Canonical()->GetContentParent(); + dom::ContentParent* cp = parentBC->Canonical()->GetContentParent(); if (!cp) { return StorageAccessPermissionGrantPromise::CreateAndReject(false, __func__); } - Unused << cp->SendOnAllowAccessFor(aParentContext, trackingOrigin, + Unused << cp->SendOnAllowAccessFor(parentBC, trackingOrigin, aCookieBehavior, aReason); } @@ -547,7 +552,7 @@ reportReason; // We can directly report here if we can know the origin of the top. ContentBlockingNotifier::ReportUnblockingToConsole( - aParentContext, NS_ConvertUTF8toUTF16(trackingOrigin), aReason); + parentBC, NS_ConvertUTF8toUTF16(trackingOrigin), aReason); // Set the report reason to nothing if we've already reported. reportReason = Nothing(); @@ -555,9 +560,9 @@ bool frameOnly = StaticPrefs::dom_storage_access_frame_only() && aReason == ContentBlockingNotifier::eStorageAccessAPI; - uint64_t innerWindowId = aParentContext->GetCurrentInnerWindowId(); + uint64_t innerWindowId = parentBC->GetCurrentInnerWindowId(); - return SaveAccessForOriginOnParentProcess(aTopLevelWindowId, aParentContext, + return SaveAccessForOriginOnParentProcess(aTopLevelWindowId, parentBC, trackingPrincipal, aAllowMode, frameOnly) ->Then(GetCurrentSerialEventTarget(), __func__, @@ -746,21 +751,26 @@ __func__); } + RefPtr parentBC = aParentContext; auto storePermission = - [aParentContext, aTopLevelWindowId, trackingOrigin, trackingPrincipal, + [parentBC, aTopLevelWindowId, trackingOrigin, trackingPrincipal, aCookieBehavior, aReason](int aAllowMode) -> RefPtr { + if (parentBC->IsDiscarded()) { + return StorageAccessPermissionGrantPromise::CreateAndReject(false, + __func__); + } // Inform the window we granted permission for. This has to be done in the // window's process. As a child this is always the case. - StorageAccessAPIHelper::OnAllowAccessFor(aParentContext, trackingOrigin, + StorageAccessAPIHelper::OnAllowAccessFor(parentBC, trackingOrigin, aCookieBehavior, aReason); Maybe reportReason; // We can directly report here if we can know the origin of the top. - if (aParentContext->Top()->IsInProcess()) { + if (parentBC->Top()->IsInProcess()) { ContentBlockingNotifier::ReportUnblockingToConsole( - aParentContext, NS_ConvertUTF8toUTF16(trackingOrigin), aReason); + parentBC, NS_ConvertUTF8toUTF16(trackingOrigin), aReason); // Set the report reason to nothing if we've already reported. reportReason = Nothing(); @@ -783,12 +793,12 @@ bool frameOnly = StaticPrefs::dom_storage_access_frame_only() && aReason == ContentBlockingNotifier::eStorageAccessAPI; - uint64_t innerWindowId = aParentContext->GetCurrentInnerWindowId(); + uint64_t innerWindowId = parentBC->GetCurrentInnerWindowId(); return cc ->SendStorageAccessPermissionGrantedForOrigin( - aTopLevelWindowId, aParentContext, trackingPrincipal, - trackingOrigin, aAllowMode, reportReason, frameOnly) + aTopLevelWindowId, parentBC, trackingPrincipal, trackingOrigin, + aAllowMode, reportReason, frameOnly) ->Then( GetCurrentSerialEventTarget(), __func__, [aReason, trackingPrincipal, diff -Nru firefox-esr-140.9.1esr/toolkit/components/downloads/DownloadPaths.sys.mjs firefox-esr-140.10.0esr/toolkit/components/downloads/DownloadPaths.sys.mjs --- firefox-esr-140.9.1esr/toolkit/components/downloads/DownloadPaths.sys.mjs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/downloads/DownloadPaths.sys.mjs 2026-04-15 02:00:05.000000000 +0000 @@ -100,11 +100,12 @@ // .*? Matches the base name non-greedily. // \.[A-Z0-9]{1,3} Up to three letters or numbers preceding a // double extension. - // \.(?:gz|bz2|Z) The second part of common double extensions. + // \.(?:bz2|gz|lzma|xz|zst|Z) The second part of common double extensions. // \.[^.]* Matches any extension or a single trailing dot. - let [, base, ext] = /(.*?)(\.[A-Z0-9]{1,3}\.(?:gz|bz2|Z)|\.[^.]*)?$/i.exec( - leafName - ); + let [, base, ext] = + /(.*?)(\.[A-Z0-9]{1,3}\.(?:bz2|gz|lzma|xz|zst|Z)|\.[^.]*)?$/i.exec( + leafName + ); // Return an empty string instead of undefined if no extension is found. return [base, ext || ""]; }, diff -Nru firefox-esr-140.9.1esr/toolkit/components/downloads/test/unit/test_DownloadPaths.js firefox-esr-140.10.0esr/toolkit/components/downloads/test/unit/test_DownloadPaths.js --- firefox-esr-140.9.1esr/toolkit/components/downloads/test/unit/test_DownloadPaths.js 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/downloads/test/unit/test_DownloadPaths.js 2026-04-15 02:00:06.000000000 +0000 @@ -173,10 +173,12 @@ testCreateNiceUniqueFile(tempFile, "test(2).txt"); // Double extension. - tempFile.leafName = "test.tar.gz"; - testCreateNiceUniqueFile(tempFile, "test.tar.gz"); - testCreateNiceUniqueFile(tempFile, "test(1).tar.gz"); - testCreateNiceUniqueFile(tempFile, "test(2).tar.gz"); + for (let suffix of ["gz", "lzma", "xz", "zst", "bz2"]) { + tempFile.leafName = "test.tar." + suffix; + testCreateNiceUniqueFile(tempFile, "test.tar." + suffix); + testCreateNiceUniqueFile(tempFile, "test(1).tar." + suffix); + testCreateNiceUniqueFile(tempFile, "test(2).tar." + suffix); + } // Test automatic shortening of long file names. We don't know exactly how // many characters are removed, because it depends on the name of the folder diff -Nru firefox-esr-140.9.1esr/toolkit/components/extensions/MatchPattern.cpp firefox-esr-140.10.0esr/toolkit/components/extensions/MatchPattern.cpp --- firefox-esr-140.9.1esr/toolkit/components/extensions/MatchPattern.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/extensions/MatchPattern.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -91,7 +91,7 @@ nsGkAtoms::ws, nsGkAtoms::wss, nsGkAtoms::file, nsGkAtoms::ftp, nsGkAtoms::moz_extension, nsGkAtoms::chrome, nsGkAtoms::resource, nsGkAtoms::moz, - nsGkAtoms::moz_icon, nsGkAtoms::moz_gio); + nsGkAtoms::moz_icon); DEFINE_STATIC_ATOM_SET(WildcardSchemes, nsGkAtoms::http, nsGkAtoms::https, nsGkAtoms::ws, nsGkAtoms::wss); diff -Nru firefox-esr-140.9.1esr/toolkit/components/formautofill/FormAutofillParent.sys.mjs firefox-esr-140.10.0esr/toolkit/components/formautofill/FormAutofillParent.sys.mjs --- firefox-esr-140.9.1esr/toolkit/components/formautofill/FormAutofillParent.sys.mjs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/formautofill/FormAutofillParent.sys.mjs 2026-04-15 02:00:06.000000000 +0000 @@ -52,7 +52,6 @@ LoginHelper: "resource://gre/modules/LoginHelper.sys.mjs", MLAutofill: "resource://autofill/MLAutofill.sys.mjs", NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs", - OSKeyStore: "resource://gre/modules/OSKeyStore.sys.mjs", }); ChromeUtils.defineLazyGetter(lazy, "log", () => @@ -67,6 +66,16 @@ let gMessageObservers = new Set(); +const FORM_AUTOFILL_MESSAGES = new Set([ + "FormAutofill:InitStorage", + "FormAutofill:OnFormSubmit", + "FormAutofill:FieldsIdentified", + "FormAutofill:OnFieldsDetected", + "FormAutofill:OnFieldsUpdated", + "FormAutofill:FieldFilledModified", + "FormAutofill:FieldsUpdatedDuringAutofill", +]); + export let FormAutofillStatus = { _initialized: false, @@ -306,6 +315,10 @@ return undefined; } + if (!FORM_AUTOFILL_MESSAGES.has(name) && !Cu.isInAutomation) { + return undefined; + } + switch (name) { case "FormAutofill:InitStorage": { await lazy.gFormAutofillStorage.initialize(); @@ -364,12 +377,6 @@ break; } case "FormAutofill:SaveCreditCard": { - // Setting the first parameter of OSKeyStore.ensurLoggedIn as false - // since this case only called in tests. Also the reason why we're not calling FormAutofill.verifyUserOSAuth. - if (!(await lazy.OSKeyStore.ensureLoggedIn(false)).authenticated) { - lazy.log.warn("User canceled encryption login"); - return undefined; - } await lazy.gFormAutofillStorage.creditCards.add(data.creditcard); break; } diff -Nru firefox-esr-140.9.1esr/toolkit/components/messaging-system/lib/SpecialMessageActions.sys.mjs firefox-esr-140.10.0esr/toolkit/components/messaging-system/lib/SpecialMessageActions.sys.mjs --- firefox-esr-140.9.1esr/toolkit/components/messaging-system/lib/SpecialMessageActions.sys.mjs 2026-04-03 15:52:35.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/messaging-system/lib/SpecialMessageActions.sys.mjs 2026-04-15 02:00:05.000000000 +0000 @@ -718,12 +718,6 @@ throw new Error( `Special message action with type ${action.type} is unsupported.` ); - case "CLICK_ELEMENT": - const clickElement = window.document.querySelector( - action.data.selector - ); - clickElement?.click(); - break; case "RELOAD_BROWSER": browser.reload(); break; diff -Nru firefox-esr-140.9.1esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/SpecialMessageActionSchemas.json firefox-esr-140.10.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/SpecialMessageActionSchemas.json --- firefox-esr-140.9.1esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/SpecialMessageActionSchemas.json 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/SpecialMessageActionSchemas.json 2026-04-15 02:00:06.000000000 +0000 @@ -592,24 +592,6 @@ { "type": "object", "properties": { - "data": { - "selector": { - "type": "string", - "description": "A CSS selector for the HTML element to be clicked" - } - }, - "type": { - "type": "string", - "enum": ["CLICK_ELEMENT"] - } - }, - "required": ["data", "type"], - "additionalProperties": false, - "description": "Selects an element in the current Window's document and triggers a click action" - }, - { - "type": "object", - "properties": { "type": { "type": "string", "enum": ["RELOAD_BROWSER"] diff -Nru firefox-esr-140.9.1esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/index.md firefox-esr-140.10.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/index.md --- firefox-esr-140.9.1esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/index.md 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/index.md 2026-04-15 02:00:06.000000000 +0000 @@ -357,12 +357,6 @@ } ``` -### `CLICK_ELEMENT` - -* args: `string` A CSS selector for the HTML element to be clicked - -Selects an element in the current Window's document and triggers a click action - ### `RELOAD_BROWSER` diff -Nru firefox-esr-140.9.1esr/toolkit/components/passwordmgr/LoginManagerParent.sys.mjs firefox-esr-140.10.0esr/toolkit/components/passwordmgr/LoginManagerParent.sys.mjs --- firefox-esr-140.9.1esr/toolkit/components/passwordmgr/LoginManagerParent.sys.mjs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/passwordmgr/LoginManagerParent.sys.mjs 2026-04-15 02:00:04.000000000 +0000 @@ -1502,7 +1502,7 @@ } async searchAutoCompleteEntries(searchString, data) { - return this.doAutocompleteSearch(data.formOrigin, data); + return this.doAutocompleteSearch(this.origin, data); } onAutoCompleteEntryHovered(_message, _data) { diff -Nru firefox-esr-140.9.1esr/toolkit/components/reputationservice/ApplicationReputation.cpp firefox-esr-140.10.0esr/toolkit/components/reputationservice/ApplicationReputation.cpp --- firefox-esr-140.9.1esr/toolkit/components/reputationservice/ApplicationReputation.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/reputationservice/ApplicationReputation.cpp 2026-04-15 02:00:05.000000000 +0000 @@ -211,7 +211,7 @@ ".class", // Java //".cmd", exec // Windows executable //".com", exec // Windows executable - ".command", // Mac script + //".command", exec // Mac script ".configprofile", // Configuration file for Apple systems ".cpgz", // Mac archive ".cpi", // Control Panel Item. Executable used for adding icons @@ -434,7 +434,7 @@ ".scptd", // AppleScript //".scr", exec // Windows //".sct", exec // Windows shell - ".search-ms", // Windows + //".search-ms", exec // Windows Saved Search ".seplugin", // AppleScript ".service", // Systemd service unit file //".settingcontent-ms", exec // Windows settings diff -Nru firefox-esr-140.9.1esr/toolkit/components/reputationservice/ApplicationReputation.h firefox-esr-140.10.0esr/toolkit/components/reputationservice/ApplicationReputation.h --- firefox-esr-140.9.1esr/toolkit/components/reputationservice/ApplicationReputation.h 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/reputationservice/ApplicationReputation.h 2026-04-15 02:00:05.000000000 +0000 @@ -27,9 +27,9 @@ public: static const char* const kNonBinaryExecutables[6]; #ifdef XP_WIN - static const char* const kBinaryFileExtensions[184]; + static const char* const kBinaryFileExtensions[182]; #else - static const char* const kBinaryFileExtensions[183]; + static const char* const kBinaryFileExtensions[181]; #endif static already_AddRefed GetSingleton(); diff -Nru firefox-esr-140.9.1esr/toolkit/components/reputationservice/test/gtest/TestExecutableLists.cpp firefox-esr-140.10.0esr/toolkit/components/reputationservice/test/gtest/TestExecutableLists.cpp --- firefox-esr-140.9.1esr/toolkit/components/reputationservice/test/gtest/TestExecutableLists.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/reputationservice/test/gtest/TestExecutableLists.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -213,7 +213,7 @@ ".scptd", // AppleScript ".scr", // Windows ".sct", // Windows shell - ".search-ms", // Windows + ".search-ms", // Windows Saved Search ".seplugin", // AppleScript ".service", // Systemd service unit file ".settingcontent-ms", // Windows settings diff -Nru firefox-esr-140.9.1esr/toolkit/components/search/schema/search-config-v2-schema.json firefox-esr-140.10.0esr/toolkit/components/search/schema/search-config-v2-schema.json --- firefox-esr-140.9.1esr/toolkit/components/search/schema/search-config-v2-schema.json 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/search/schema/search-config-v2-schema.json 2026-04-15 02:00:05.000000000 +0000 @@ -146,7 +146,7 @@ "title": "Partner Code", "description": "The partner code for the engine or variant. This will be inserted into parameters which include '{partnerCode}'", "type": "string", - "pattern": "^[a-zA-Z0-9-_]*$" + "pattern": "^[a-zA-Z0-9-_.]*$" }, "urls": { "title": "URLs", diff -Nru firefox-esr-140.9.1esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js firefox-esr-140.10.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js --- firefox-esr-140.9.1esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js 2026-04-15 02:00:06.000000000 +0000 @@ -310,7 +310,7 @@ }); tests.push({ - region: "CA", // Testing for "rest of world" (excluding US, RU, TR, BY, KZ) + region: "CA", // Testing for "rest of world" (excluding US, RU, BY) distribution: "dt-002", application: "firefox-android", test: engines => @@ -332,11 +332,33 @@ }); tests.push({ - region: "CA", // Testing for "rest of world" (excluding US, RU, TR, BY, KZ) + region: "CA", // Testing for "rest of world" (excluding US, RU, BY) distribution: "dt-003", application: "firefox-android", test: engines => hasParams(engines, "Google", "client=firefox-b-dt") && + hasDefault(engines, "Google") && + hasEnginesFirst(engines, ["Google"]) && + hasTelemetryId(engines, "Google", "google-b-dt"), +}); + +tests.push({ + region: "US", + distribution: "xiaomi-001", + application: "firefox-android", + test: engines => + hasParams(engines, "Google", "client=firefox-b-1-dt") && + hasDefault(engines, "Google") && + hasEnginesFirst(engines, ["Google"]) && + hasTelemetryId(engines, "Google", "google-b-1-dt"), +}); + +tests.push({ + region: "CA", // Testing for "rest of world" (excluding US, RU, BY) + distribution: "xiaomi-001", + application: "firefox-android", + test: engines => + hasParams(engines, "Google", "client=firefox-b-dt") && hasDefault(engines, "Google") && hasEnginesFirst(engines, ["Google"]) && hasTelemetryId(engines, "Google", "google-b-dt"), diff -Nru firefox-esr-140.9.1esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_google.js firefox-esr-140.10.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_google.js --- firefox-esr-140.9.1esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_google.js 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_google.js 2026-04-15 02:00:06.000000000 +0000 @@ -47,7 +47,7 @@ : "firefox-b-1-d", }, { - excluded: [{ regions: ["us", "by", "kz", "ru", "tr"] }], + excluded: [{ regions: ["us", "by", "ru"] }], included: [{}], domain: "google.com", telemetryId: @@ -62,7 +62,7 @@ : "firefox-b-d", }, { - included: [{ regions: ["by", "kz", "ru", "tr"] }], + included: [{ regions: ["by", "ru"] }], domain: "google.com", telemetryId: "google-com-nocodes", partnerCode: "", diff -Nru firefox-esr-140.9.1esr/toolkit/components/url-classifier/LookupCache.cpp firefox-esr-140.10.0esr/toolkit/components/url-classifier/LookupCache.cpp --- firefox-esr-140.9.1esr/toolkit/components/url-classifier/LookupCache.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/url-classifier/LookupCache.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -505,7 +505,7 @@ if (FindCharInReadable('.', iter, end)) { iter++; nsAutoCString thirdPartyURLToAdd; - thirdPartyURLToAdd.Assign(Substring(iter++, end)); + thirdPartyURLToAdd.Assign(Substring(iter, end)); // don't bother checking toplevel domains if (FindCharInReadable('.', iter, end)) { diff -Nru firefox-esr-140.9.1esr/toolkit/components/utils/SimpleServices.sys.mjs firefox-esr-140.10.0esr/toolkit/components/utils/SimpleServices.sys.mjs --- firefox-esr-140.9.1esr/toolkit/components/utils/SimpleServices.sys.mjs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/components/utils/SimpleServices.sys.mjs 2026-04-15 02:00:06.000000000 +0000 @@ -143,8 +143,8 @@ aDocListenerResult ) { // Bug 1824325: application/http-index-format is deprecated for almost all - // sites, we only allow it for urls with a inner scheme of "file" or - // "moz-gio" (specified in network.http_index_format.allowed_schemes). + // sites, we only allow it for urls with a inner scheme of "file" + // (specified in network.http_index_format.allowed_schemes). // This also includes jar: and resource:// uris, as jar: uris has a inner // scheme of "file", and resource:// uris have been turned into either a // jar: or file:// uri by the point where we are checking them here. diff -Nru firefox-esr-140.9.1esr/toolkit/content/widgets/findbar.js firefox-esr-140.10.0esr/toolkit/content/widgets/findbar.js --- firefox-esr-140.9.1esr/toolkit/content/widgets/findbar.js 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/content/widgets/findbar.js 2026-04-15 02:00:06.000000000 +0000 @@ -797,10 +797,10 @@ } // The event information comes from the child process. - let event = new target.ownerGlobal.KeyboardEvent( - fakeEvent.type, - fakeEvent - ); + let event = new target.ownerGlobal.KeyboardEvent("keypress", { + ...fakeEvent, + bubbles: false, + }); target.dispatchEvent(event); } diff -Nru firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/glean.rs firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/glean.rs --- firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/glean.rs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/glean.rs 2026-04-15 02:00:06.000000000 +0000 @@ -5,6 +5,8 @@ //! Glean telemetry integration. use crate::config::{buildid, Config}; +use crate::prefs_parser::find_bool_pref; +use crate::std::path::Path; use glean::{ClientInfoMetrics, Configuration, ConfigurationBuilder}; const APP_ID: &str = if cfg!(mock) { @@ -18,6 +20,55 @@ } else { "https://incoming.telemetry.mozilla.org" }; +const TELEMETRY_ENABLED_PREF_KEY: &str = "datareporting.healthreport.uploadEnabled"; + +/// Parse the telemetry enablement pref from the prefs file. +/// +/// For example: +/// ```rust +/// let input = r#"user_pref("datareporting.healthreport.uploadEnabled", false);"#; +/// assert_eq!(parse_telemetry_enabled_pref(input), Some(false)); +/// let input = r#"user_pref("datareporting.healthreport.uploadEnabled", true);"#; +/// assert_eq!(parse_telemetry_enabled_pref(input), Some(true)); +/// ``` +fn parse_telemetry_enabled_pref(prefs_content: &str) -> Option { + find_bool_pref(prefs_content, TELEMETRY_ENABLED_PREF_KEY) +} + +/// Determine whether telemetry should be enabled based on the profile. +fn determine_telemetry_enabled(profile_dir: Option<&Path>) -> bool { + // If there is no profile dir, we cannot determine whether telemetry is enabled or not. However, + // disabling telemetry in this case will cause us to entirely miss the class of crashes that + // occur before the profile is set up, so we leave it enabled. + let Some(profile_dir) = profile_dir else { + return true; + }; + + let prefs = profile_dir.join("prefs.js"); + + // If there is no pref file, default to true. + if !prefs.exists() { + return true; + } + + match crate::std::fs::read_to_string(&prefs) { + Ok(prefs_contents) => { + parse_telemetry_enabled_pref(&prefs_contents) + // If there is no pref, default to true + .unwrap_or(true) + } + Err(e) => { + // Like the no-profile-dir case, if we can't read the prefs file, this might be the + // cause of some crash that we are trying to report. So disabling telemetry in this case + // would make us blind to the issue. + log::error!( + "failed to read prefs file at {} for disabling telemetry: {e}", + prefs.display() + ); + true + } + } +} /// Initialize glean based on the given configuration. /// @@ -34,7 +85,8 @@ } fn config(cfg: &Config) -> Configuration { - ConfigurationBuilder::new(true, glean_data_dir(cfg), APP_ID) + let upload_enabled = determine_telemetry_enabled(cfg.profile_dir.as_deref()); + ConfigurationBuilder::new(upload_enabled, glean_data_dir(cfg), APP_ID) .with_server_endpoint(TELEMETRY_SERVER) .with_use_core_mps(false) .with_internal_pings(false) @@ -155,6 +207,27 @@ ); } } + + #[test] + fn test_telemetry_enable_pref() { + use crate::std::{ + fs::{MockFS, MockFiles}, + mock, + path::Path, + }; + + for pref_value in [false, true] { + let files = MockFiles::new(); + files.add_dir("profile_dir").add_file( + "profile_dir/prefs.js", + format!(r#"user_pref("datareporting.healthreport.uploadEnabled", {pref_value});"#), + ); + let result = mock::builder() + .set(MockFS, files) + .run(|| determine_telemetry_enabled(Some(Path::new("profile_dir")))); + assert_eq!(result, pref_value); + } + } } #[cfg(test)] diff -Nru firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/lang/langpack.rs firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/lang/langpack.rs --- firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/lang/langpack.rs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/lang/langpack.rs 2026-04-15 02:00:06.000000000 +0000 @@ -5,10 +5,11 @@ use super::language_info::LanguageInfo; use super::zip::{read_archive_file_as_string, read_zip, Archive}; use crate::config::installation_resource_path; +use crate::prefs_parser::find_string_pref; use crate::std::path::{Path, PathBuf}; use anyhow::Context; -const LOCALE_PREF_KEY: &str = r#""intl.locale.requested""#; +const LOCALE_PREF_KEY: &str = "intl.locale.requested"; /// Use the profile language preferences to determine the localization to use. pub fn read( @@ -115,12 +116,9 @@ /// Parse the language pref (if any) from the prefs file. /// -/// This finds the first string match for the regex `"intl.locale.requested"[ \t\n\r\f\v,]*"(.*)"`, -/// and splits and trims the first match group, returning the set of strings that results. -/// /// For example: /// ```rust -/// let input = r#""intl.locale.requested", "foo , bar,,""#; +/// let input = r#"user_pref("intl.locale.requested", "foo , bar,,");"#; /// let expected_output = Some(vec!["foo","bar"]); /// assert_eq!(parse_requested_locales(input), output); /// ``` @@ -128,10 +126,7 @@ /// This will parse the locales out of the user prefs file contents, which looks like /// `user_pref("intl.locale.requested", "")`. fn parse_requested_locales(prefs_content: &str) -> Option> { - let (_, s) = prefs_content.split_once(LOCALE_PREF_KEY)?; - let s = s.trim_start_matches(|c: char| c.is_whitespace() || c == ','); - let s = s.strip_prefix('"')?; - let (v, _) = s.split_once('"')?; + let v = find_string_pref(prefs_content, LOCALE_PREF_KEY)?; Some( v.split(",") .map(|s| s.trim()) @@ -187,7 +182,7 @@ #[test] fn parse_locales_empty() { assert_eq!( - parse_requested_locales(r#"user_pref("intl.locale.requested","")"#), + parse_requested_locales(r#"user_pref("intl.locale.requested","");"#), Some(vec![]) ); } @@ -195,7 +190,7 @@ #[test] fn parse_locales() { assert_eq!( - parse_requested_locales(r#"user_pref("intl.locale.requested", "fr,en-US")"#), + parse_requested_locales(r#"user_pref("intl.locale.requested", "fr,en-US");"#), Some(vec!["fr", "en-US"]) ); } diff -Nru firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/main.rs firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/main.rs --- firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/main.rs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/main.rs 2026-04-15 02:00:06.000000000 +0000 @@ -67,6 +67,7 @@ mod logic; mod memory_test; mod net; +mod prefs_parser; mod process; mod settings; mod std; diff -Nru firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/prefs_parser.rs firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/prefs_parser.rs --- firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/prefs_parser.rs 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/prefs_parser.rs 2026-04-15 02:00:06.000000000 +0000 @@ -0,0 +1,86 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//! Prefs file parsing utilities. + +/// Parse a single pref value (if any) from the prefs file contents. +/// +/// This parser could be improved (e.g., it doesn't respect comments), but it is compatible with +/// prefs files generated by Firefox. +/// +/// This finds the first string match for the regex `user_pref\("PREFSTRING"[ \t\n\r\f\v,]*(.*)[ \t\n\r\f\v]*\);`. +/// +/// For example: +/// ```rust +/// let input = r#"user_pref("FOOBAR", "baz");"#; +/// let expected_output = Some(r#""baz""#); +/// assert_eq!(find_pref(input, "FOOBAR"), output); +/// ``` +pub fn find_pref<'a>(prefs_content: &'a str, pref: &str) -> Option<&'a str> { + let mut search_content = prefs_content; + loop { + let (before, s) = search_content.split_once(&format!("\"{pref}\""))?; + if !before.trim().ends_with("user_pref(") { + search_content = s; + continue; + } + let s = s.trim_start_matches(|c: char| c.is_whitespace() || c == ','); + let (content, _) = s.split_once(");")?; + return Some(content.trim()); + } +} + +/// Find a single string pref (if any) from the prefs file contents. +pub fn find_string_pref<'a>(prefs_content: &'a str, pref: &str) -> Option<&'a str> { + find_pref(prefs_content, pref).and_then(|s| s.strip_prefix('"')?.strip_suffix('"')) +} + +/// Find a single bool pref (if any) from the prefs file contents. +pub fn find_bool_pref(prefs_content: &str, pref: &str) -> Option { + find_pref(prefs_content, pref).and_then(|s| s.parse().ok()) +} + +// Doctests don't run for binaries, so make some unit tests instead. +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn find_pref_read_value() { + let input = r#"user_pref("FOOBAR", "baz");"#; + assert_eq!(find_pref(input, "FOOBAR"), Some(r#""baz""#)); + } + + #[test] + fn find_pref_continues_search() { + let input = r#" + user_pref("rawr", "FOOBAR"); + user_pref("FOOBAR", "baz"); + "#; + assert_eq!(find_pref(input, "FOOBAR"), Some(r#""baz""#)); + } + + #[test] + fn find_pref_missing() { + let input = r#" + user_pref("rawr", "FOOBAR"); + user_pref("FOOBAR", "hello"); + "#; + assert_eq!(find_pref(input, "hello"), None); + } + + #[test] + fn test_find_string_pref() { + let input = r#"user_pref("FOOBAR", "baz");"#; + assert_eq!(find_string_pref(input, "FOOBAR"), Some("baz")); + } + + #[test] + fn test_find_bool_pref() { + let input = r#"user_pref("FOOBAR", true);"#; + assert_eq!(find_bool_pref(input, "FOOBAR"), Some(true)); + let input = r#"user_pref("FOOBAR", false);"#; + assert_eq!(find_bool_pref(input, "FOOBAR"), Some(false)); + } +} diff -Nru firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/std/fs.rs firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/std/fs.rs --- firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/std/fs.rs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/std/fs.rs 2026-04-15 02:00:06.000000000 +0000 @@ -524,6 +524,12 @@ }) } +pub fn read_to_string>(path: P) -> Result { + let mut s = String::new(); + File::open(path.as_ref())?.read_to_string(&mut s)?; + Ok(s) +} + pub fn write, C: AsRef<[u8]>>(path: P, contents: C) -> Result<()> { File::create(path.as_ref())?.write_all(contents.as_ref()) } diff -Nru firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/test.rs firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/test.rs --- firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/test.rs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/test.rs 2026-04-15 02:00:05.000000000 +0000 @@ -247,25 +247,29 @@ .. } = self; let before_run = self.before_run.take(); - let mut config = Arc::new(std::mem::take(config)); + let mut test_config = Arc::new(std::mem::take(config)); // Run the mock environment. - mock.run(move || { + let result = mock.run(|| { let _glean = if *enable_glean { - Some(glean::test_init(&config)) + Some(glean::test_init(&test_config)) } else { None }; gui_interact( - move || { + || { if let Some(f) = before_run { f(); } - try_run(&mut config) + try_run(&mut test_config) }, interact, ) - }) + }); + + *config = Arc::into_inner(test_config).unwrap(); + + result } /// Run the test as configured, using the given function to interact with the GUI. @@ -992,6 +996,87 @@ } #[test] +fn reads_profile_directory() { + let mut test = GuiTest::new(); + let minidump_extra_contents = r#"{ + "Vendor": "FooCorp", + "ProductName": "Bar", + "ProfileDirectory": "profile_dir", + "ReleaseChannel": "release", + "BuildID": "1234", + "AsyncShutdownTimeout": "{}", + "StackTraces": { + "status": "OK" + }, + "Version": "100.0", + "ServerURL": "https://reports.example.com", + "TelemetryServerURL": "https://telemetry.example.com", + "TelemetryClientId": "telemetry_client", + "TelemetryProfileGroupId": "telemetry_profile_group", + "TelemetrySessionId": "telemetry_session", + "SomeNestedJson": { "foo": "bar" }, + "URL": "https://url.example.com" + }"#; + test.files = { + let mock_files = MockFiles::new(); + mock_files + .add_file_result( + "minidump.dmp", + Ok(MOCK_MINIDUMP_FILE.into()), + current_system_time(), + ) + .add_file_result( + "minidump.extra", + Ok(minidump_extra_contents.into()), + current_system_time(), + ) + .add_dir("profile_dir"); + test.mock.set(MockFS, mock_files.clone()); + mock_files + }; + test.run(|interact| { + interact.element("quit", |_style, b: &model::Button| b.click.fire(&())); + }); + + assert_eq!(test.config.profile_dir, Some("profile_dir".into())); +} + +#[test] +#[ignore = "This test often passes, however it relies on Glean network scheduling, which has been + found to be unreliable for testing purposes. A more reliable unit test is in the glean module."] +fn glean_ping_uses_pref() { + for pref_value in [false, true] { + let mut test = GuiTest::new(); + test.enable_glean_pings(); + // Set profile dir manually because glean is initialized earlier than the extra file is read + // in tests. We check that the profile dir is correctly read in another test. + test.config.profile_dir = Some("profile_dir".into()); + test.files.add_dir("profile_dir").add_file( + "profile_dir/prefs.js", + format!(r#"user_pref("datareporting.healthreport.uploadEnabled", {pref_value});"#), + ); + + // Set a mock hook at the HTTP layer to check whether the ping is sent. + // test_before_next_send is called whether upload is enabled or not. + let submitted_glean_ping = Counter::new(); + test.mock.set( + net::http::MockHttp, + Box::new(cc! { (submitted_glean_ping) move |_request, url| { + if url.starts_with("https://incoming.glean.example.com/submit/firefox-crashreporter-mock/crash") { + submitted_glean_ping.inc(); + } + Ok(Ok(vec!())) + }}), + ); + + test.run(|interact| { + interact.element("quit", |_style, b: &model::Button| b.click.fire(&())); + }); + assert_eq!(submitted_glean_ping.count(), if pref_value { 1 } else { 0 }); + } +} + +#[test] fn eol_version() { let mut test = GuiTest::new(); test.files diff -Nru firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/ui/gtk.rs firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/ui/gtk.rs --- firefox-esr-140.9.1esr/toolkit/crashreporter/client/app/src/ui/gtk.rs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/crashreporter/client/app/src/ui/gtk.rs 2026-04-15 02:00:06.000000000 +0000 @@ -108,6 +108,7 @@ /// These types must be sized to avoid fat pointers (i.e., the pointers must be FFI-compatible, the /// same size as usize). trait ToPointer: Sized { + /// Convert the value to a pointer, passing ownership. fn to_ptr(self) -> *mut (); /// # Safety /// The caller must ensure that the pointer was created as the result of `to_ptr` on the same @@ -186,6 +187,33 @@ } } +/// An owned GLib Source. +/// +/// Dropping will remove the source. +#[repr(transparent)] +struct GSource(u32); + +impl ToPointer for GSource { + fn to_ptr(self) -> *mut () { + let ptr = self.0 as _; + // to_ptr passes ownership + std::mem::forget(self); + ptr + } + + unsafe fn from_ptr(ptr: *mut ()) -> Self { + GSource(ptr as _) + } +} + +impl Drop for GSource { + fn drop(&mut self) { + unsafe { + gtk::g_source_remove(self.0); + } + } +} + /// Connect a GTK+ object signal to a function, providing an additional context value (by /// reference). macro_rules! connect_signal { @@ -748,6 +776,11 @@ property_read_only! { property amount; fn set(value: &Option) { + // FIXME: The logic here assumes that if `amount` is None, it will remain that + // way. Specifically, if we were to change back and forth, additional pulse + // callbacks would be registered, and they are not be removed when changing to + // a specific fraction. As this property is currently used, we don't encounter + // this case. match &*value { Some(v) => unsafe { gtk::gtk_progress_bar_set_fraction( @@ -758,29 +791,16 @@ None => unsafe { gtk::gtk_progress_bar_pulse(progress_ptr as *mut _); - fn auto_pulse_progress_bar(progress: *mut gtk::GtkProgressBar) { - unsafe extern "C" fn pulse(progress: *mut std::ffi::c_void) -> gtk::gboolean { - if gtk::gtk_widget_is_visible(progress as _) == 0 { - false.into() - } else { - gtk::gtk_progress_bar_pulse(progress as _); - true.into() - } - } - unsafe { - gtk::g_timeout_add(100, Some(pulse as unsafe extern "C" fn(*mut std::ffi::c_void) -> gtk::gboolean), progress as _); - } - + unsafe extern "C" fn pulse(progress: *mut std::ffi::c_void) -> gtk::gboolean { + gtk::gtk_progress_bar_pulse(progress as _); + true.into() } - connect_signal! { - object progress_ptr; - with std::ptr::null_mut(); - signal show(_user_data: &(), progress: *mut gtk::GtkWidget) { - auto_pulse_progress_bar(progress as *mut _); - } - } - auto_pulse_progress_bar(progress_ptr as *mut _); + // This will call even when the progress bar is hidden, but it's of + // little consequence. + let source = GSource(gtk::g_timeout_add(100, Some(pulse), progress_ptr as _)); + + source.drop_with_widget(progress_ptr); } } } diff -Nru firefox-esr-140.9.1esr/toolkit/crashreporter/client/gtkbind/build.rs firefox-esr-140.10.0esr/toolkit/crashreporter/client/gtkbind/build.rs --- firefox-esr-140.9.1esr/toolkit/crashreporter/client/gtkbind/build.rs 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/crashreporter/client/gtkbind/build.rs 2026-04-15 02:00:05.000000000 +0000 @@ -19,7 +19,7 @@ .clang_args(GTK_CFLAGS) .allowlist_function("gtk_.*") .allowlist_function( - "g_(application|main_context|memory_input_stream|object|signal|timeout)_.*", + "g_(application|main_context|memory_input_stream|object|signal|source|timeout)_.*", ) .allowlist_function("gdk_pixbuf_new_from_stream") .allowlist_function("pango_attr_.*") diff -Nru firefox-esr-140.9.1esr/toolkit/library/rust/shared/Cargo.toml firefox-esr-140.10.0esr/toolkit/library/rust/shared/Cargo.toml --- firefox-esr-140.9.1esr/toolkit/library/rust/shared/Cargo.toml 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/library/rust/shared/Cargo.toml 2026-04-15 02:00:06.000000000 +0000 @@ -23,7 +23,7 @@ profiler_helper = { path = "../../../../tools/profiler/rust-helper", optional = true } mozurl = { path = "../../../../netwerk/base/mozurl" } webrender_bindings = { path = "../../../../gfx/webrender_bindings" } -cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "579b75af21c040700eee6a1d8520e222699fe4cd", optional = true } +cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "bebaa23317332c95734df76e25193c24a83a6840", optional = true } cubeb-pulse = { git = "https://github.com/mozilla/cubeb-pulse-rs", rev="8678dcab1c287de79c4c184ccc2e065bc62b70e2", optional = true, features=["pulse-dlopen"] } cubeb-sys = { version = "0.13", optional = true, features=["gecko-in-tree"] } audioipc2-client = { git = "https://github.com/mozilla/audioipc", rev = "e6f44a2bd1e57d11dfc737632a9e849077632330", optional = true } diff -Nru firefox-esr-140.9.1esr/toolkit/mozapps/update/updater/updater.cpp firefox-esr-140.10.0esr/toolkit/mozapps/update/updater/updater.cpp --- firefox-esr-140.9.1esr/toolkit/mozapps/update/updater/updater.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/toolkit/mozapps/update/updater/updater.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -100,7 +100,7 @@ struct UpdateServerThreadArgs { int argc; const NS_tchar** argv; - const char* marChannelID; + const char* marChannelID = ""; }; #endif @@ -3004,16 +3004,17 @@ * `OK` on success, `UPDATE_SETTINGS_FILE_CHANNEL` on failure. */ static int PopulategMARStrings() { + if (gMARStrings.MARChannelID && gMARStrings.MARChannelID[0] != '\0') { + return OK; + } + int rv = UPDATE_SETTINGS_FILE_CHANNEL; # ifdef XP_MACOSX - if (gInvocation == UpdaterInvocation::Second) { - // An elevated update process will have already populated gMARStrings when - // it connected to the unelevated update process to obtain the command line - // args. See `ObtainUpdaterArguments`. - rv = OK; - } else if (auto marChannels = - UpdateSettingsUtil::GetAcceptedMARChannelsValue()) { - rv = ReadMARChannelIDsFromBuffer(marChannels->data(), &gMARStrings); + if (gInvocation != UpdaterInvocation::Second) { + if (std::optional marChannels = + UpdateSettingsUtil::GetAcceptedMARChannelsValue()) { + rv = ReadMARChannelIDsFromBuffer(marChannels->data(), &gMARStrings); + } } # else NS_tchar updateSettingsPath[MAXPATHLEN]; @@ -3698,17 +3699,33 @@ UpdateServerThreadArgs threadArgs; threadArgs.argc = suiArgc; threadArgs.argv = suiArgv.get(); - threadArgs.marChannelID = gMARStrings.MARChannelID.get(); + threadArgs.marChannelID = ""; + bool shouldServeElevatedUpdate = true; - Thread t1; - if (t1.Run(ServeElevatedUpdateThreadFunc, &threadArgs) == 0) { - // Show an indeterminate progress bar while an elevated update is in - // progress. - if (!isDMGInstall) { - ShowProgressUI(true); +# ifdef MOZ_VERIFY_MAR_SIGNATURE + int rv = PopulategMARStrings(); + if (rv != OK) { + shouldServeElevatedUpdate = false; + WriteStatusFile(UPDATE_SETTINGS_FILE_CHANNEL); + fprintf(stderr, + "Unable to start unelevated update process to serve elevated " + "updater due to inability to retrieve MAR channels."); + } else { + threadArgs.marChannelID = gMARStrings.MARChannelID.get(); + } +# endif // MOZ_VERIFY_MAR_SIGNATURE + + if (shouldServeElevatedUpdate) { + Thread t1; + if (t1.Run(ServeElevatedUpdateThreadFunc, &threadArgs) == 0) { + // Show an indeterminate progress bar while an elevated update is in + // progress. + if (!isDMGInstall) { + ShowProgressUI(true); + } } + t1.Join(); } - t1.Join(); } LaunchCallbackAndPostProcessApps(argc, argv, std::move(umaskContext)); diff -Nru firefox-esr-140.9.1esr/widget/ClipboardWriteRequestParent.cpp firefox-esr-140.10.0esr/widget/ClipboardWriteRequestParent.cpp --- firefox-esr-140.9.1esr/widget/ClipboardWriteRequestParent.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/ClipboardWriteRequestParent.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -89,7 +89,11 @@ return IPC_OK(); } - mAsyncSetClipboardData->SetData(trans, nullptr); + rv = mAsyncSetClipboardData->SetData(trans, nullptr); + if (rv == NS_ERROR_IN_PROGRESS) { + return IPC_FAIL(this, "reentrant SetData"); + } + // Non-fatal errors are notified via the callback inside SetData. return IPC_OK(); } diff -Nru firefox-esr-140.9.1esr/widget/IMEData.h firefox-esr-140.10.0esr/widget/IMEData.h --- firefox-esr-140.9.1esr/widget/IMEData.h 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/IMEData.h 2026-04-15 02:00:06.000000000 +0000 @@ -7,6 +7,8 @@ #define mozilla_widget_IMEData_h_ #include "mozilla/CheckedInt.h" +#include "mozilla/EnumSet.h" +#include "mozilla/EnumTypeTraits.h" #include "mozilla/EventForwards.h" #include "mozilla/NativeKeyBindingsType.h" #include "mozilla/ToString.h" @@ -208,73 +210,45 @@ /** * Preference for receiving IME updates * - * If mWantUpdates is not NOTIFY_NOTHING, nsTextStateManager will observe text + * If mWantUpdates is not empty, IMEContentObserver will observe text * change and/or selection change and call nsIWidget::NotifyIME() with * NOTIFY_IME_OF_SELECTION_CHANGE and/or NOTIFY_IME_OF_TEXT_CHANGE. * Please note that the text change observing cost is very expensive especially * on an HTML editor has focus. * If the IME implementation on a particular platform doesn't care about * NOTIFY_IME_OF_SELECTION_CHANGE and/or NOTIFY_IME_OF_TEXT_CHANGE, - * they should set mWantUpdates to NOTIFY_NOTHING to avoid the cost. + * they should set mWantUpdates to empty to avoid the cost. * If the IME implementation needs notifications even while our process is - * deactive, it should also set NOTIFY_DURING_DEACTIVE. + * inactive, it should also set NotifyDuringInactive. */ -struct IMENotificationRequests final { - typedef uint8_t Notifications; - - enum : Notifications { - NOTIFY_NOTHING = 0, - NOTIFY_TEXT_CHANGE = 1 << 1, - NOTIFY_POSITION_CHANGE = 1 << 2, - // NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR is used when mouse button is pressed - // or released on a character in the focused editor. The notification is - // notified to IME as a mouse event. If it's consumed by IME, NotifyIME() - // returns NS_SUCCESS_EVENT_CONSUMED. Otherwise, it returns NS_OK if it's - // handled without any error. - NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR = 1 << 3, - // NOTE: NOTIFY_DURING_DEACTIVE isn't supported in environments where two - // or more compositions are possible. E.g., Mac and Linux (GTK). - NOTIFY_DURING_DEACTIVE = 1 << 7, - - NOTIFY_ALL = NOTIFY_TEXT_CHANGE | NOTIFY_POSITION_CHANGE | - NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR, - }; - - IMENotificationRequests() : mWantUpdates(NOTIFY_NOTHING) {} - - explicit IMENotificationRequests(Notifications aWantUpdates) - : mWantUpdates(aWantUpdates) {} - - IMENotificationRequests operator|( - const IMENotificationRequests& aOther) const { - return IMENotificationRequests(aOther.mWantUpdates | mWantUpdates); - } - IMENotificationRequests& operator|=(const IMENotificationRequests& aOther) { - mWantUpdates |= aOther.mWantUpdates; - return *this; - } - bool operator==(const IMENotificationRequests& aOther) const { - return mWantUpdates == aOther.mWantUpdates; - } - - bool WantTextChange() const { return !!(mWantUpdates & NOTIFY_TEXT_CHANGE); } - - bool WantPositionChanged() const { - return !!(mWantUpdates & NOTIFY_POSITION_CHANGE); - } +enum class IMENotificationRequest : uint8_t { + TextChange, + PositionChange, + // NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR is used when mouse button is pressed + // or released on a character in the focused editor. The notification is + // notified to IME as a mouse event. If it's consumed by IME, NotifyIME() + // returns NS_SUCCESS_EVENT_CONSUMED. Otherwise, it returns NS_OK if it's + // handled without any error. + MouseEventOnChar, + // NOTE: NotifyDuringInactive isn't supported in environments where two + // or more compositions are possible. E.g., Mac and Linux (GTK). + NotifyDuringInactive, +}; - bool WantChanges() const { return WantTextChange(); } +} // namespace widget - bool WantMouseButtonEventOnChar() const { - return !!(mWantUpdates & NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR); - } +template <> +struct MaxEnumValue { + static constexpr uint8_t value = static_cast( + widget::IMENotificationRequest::NotifyDuringInactive); +}; - bool WantDuringDeactive() const { - return !!(mWantUpdates & NOTIFY_DURING_DEACTIVE); - } +namespace widget { - Notifications mWantUpdates; -}; +using IMENotificationRequests = EnumSet; +inline constexpr const IMENotificationRequests AllIMENotificationRequests = { + IMENotificationRequest::TextChange, IMENotificationRequest::PositionChange, + IMENotificationRequest::MouseEventOnChar}; /** * IME enabled states. @@ -641,7 +615,7 @@ // IMEMessage is shared by IMEStateManager and TextComposition. // Update values in GeckoEditable.java if you make changes here. // XXX Negative values are used in Android... -typedef int8_t IMEMessageType; +using IMEMessageType = int8_t; enum IMEMessage : IMEMessageType { // This is used by IMENotification internally. This means that the instance // hasn't been initialized yet. diff -Nru firefox-esr-140.9.1esr/widget/PuppetWidget.cpp firefox-esr-140.10.0esr/widget/PuppetWidget.cpp --- firefox-esr-140.9.1esr/widget/PuppetWidget.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/PuppetWidget.cpp 2026-04-15 02:00:07.000000000 +0000 @@ -725,7 +725,7 @@ } mIMENotificationRequestsOfParent = - IMENotificationRequests(IMENotificationRequests::NOTIFY_ALL); + IMENotificationRequests(AllIMENotificationRequests); RefPtr self = this; mBrowserChild->SendNotifyIMEFocus(mContentCache, aIMENotification) ->Then( @@ -780,8 +780,9 @@ } // BrowserParent doesn't this this to cache. we don't send the notification - // if parent process doesn't request NOTIFY_TEXT_CHANGE. - if (mIMENotificationRequestsOfParent.WantTextChange()) { + // if parent process doesn't request text changes. + if (mIMENotificationRequestsOfParent.contains( + IMENotificationRequest::TextChange)) { mBrowserChild->SendNotifyIMETextChange(mContentCache, aIMENotification); } else { mBrowserChild->SendUpdateContentCache(mContentCache); @@ -843,7 +844,8 @@ !mContentCache.CacheCaretAndTextRects(this, &aIMENotification))) { return NS_ERROR_FAILURE; } - if (mIMENotificationRequestsOfParent.WantPositionChanged()) { + if (mIMENotificationRequestsOfParent.contains( + IMENotificationRequest::PositionChange)) { mBrowserChild->SendNotifyIMEPositionChange(mContentCache, aIMENotification); } else { mBrowserChild->SendUpdateContentCache(mContentCache); @@ -1089,10 +1091,9 @@ NS_IMETHODIMP_(IMENotificationRequests) PuppetWidget::GetIMENotificationRequests() { - return IMENotificationRequests( - mIMENotificationRequestsOfParent.mWantUpdates | - IMENotificationRequests::NOTIFY_TEXT_CHANGE | - IMENotificationRequests::NOTIFY_POSITION_CHANGE); + return mIMENotificationRequestsOfParent + + IMENotificationRequests{IMENotificationRequest::TextChange, + IMENotificationRequest::PositionChange}; } NS_IMETHODIMP_(void) diff -Nru firefox-esr-140.9.1esr/widget/SwipeTracker.cpp firefox-esr-140.10.0esr/widget/SwipeTracker.cpp --- firefox-esr-140.9.1esr/widget/SwipeTracker.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/SwipeTracker.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -40,15 +40,18 @@ const PanGestureInput& aSwipeStartEvent, uint32_t aAllowedDirections, uint32_t aSwipeDirection) - : mWidget(aWidget), - mRefreshDriver(GetRefreshDriver(mWidget)), + : mWidget(do_GetWeakReference(&aWidget)), + mRefreshDriver(GetRefreshDriver(aWidget)), mAxis(0.0, 0.0, 0.0, kSpringForce, 1.0), mEventPosition(RoundedToInt(ViewAs( aSwipeStartEvent.mPanStartPoint, PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent))), mLastEventTimeStamp(aSwipeStartEvent.mTimeStamp), mAllowedDirections(aAllowedDirections), - mSwipeDirection(aSwipeDirection) { + mSwipeDirection(aSwipeDirection) {} + +void SwipeTracker::StartTracking( + const PanGestureInput& aSwipeStartEvent) { SendSwipeEvent(eSwipeGestureStart, 0, 0.0, aSwipeStartEvent.mTimeStamp); ProcessEvent(aSwipeStartEvent, /* aProcessingFirstEvent = */ true); } @@ -96,6 +99,8 @@ nsEventStatus SwipeTracker::ProcessEvent( const PanGestureInput& aEvent, bool aProcessingFirstEvent /* = false */) { + RefPtr selfPin(this); + // If the fingers have already been lifted or the swipe direction is where // navigation is impossible, don't process this event for swiping. if (!mEventsAreControllingSwipe || !SwipingInAllowedDirection()) { @@ -109,12 +114,16 @@ : nsEventStatus_eConsumeNoDefault; } + nsCOMPtr widget = do_QueryReferent(mWidget); + if (!widget) { + return nsEventStatus_eIgnore; + } mDeltaTypeIsPage = aEvent.mDeltaType == PanGestureInput::PANDELTA_PAGE; double delta = [&]() -> double { if (mDeltaTypeIsPage) { return -aEvent.mPanDisplacement.x / StaticPrefs::widget_swipe_page_size(); } - return -aEvent.mPanDisplacement.x / mWidget.GetDefaultScaleInternal() / + return -aEvent.mPanDisplacement.x / widget->GetDefaultScaleInternal() / StaticPrefs::widget_swipe_pixel_size(); }(); @@ -185,6 +194,8 @@ } void SwipeTracker::WillRefresh(TimeStamp aTime) { + RefPtr selfPin(this); + // FIXME(emilio): shouldn't we be using `aTime`? TimeStamp now = TimeStamp::Now(); mAxis.Simulate(now - mLastAnimationFrameTime); @@ -214,7 +225,11 @@ void SwipeTracker::SwipeFinished(const TimeStamp& aTimeStamp) { SendSwipeEvent(eSwipeGestureEnd, 0, 0.0, aTimeStamp); - mWidget.SwipeFinished(); + nsCOMPtr widget = do_QueryReferent(mWidget); + if (!widget) { + return; + } + widget->SwipeFinished(); } void SwipeTracker::UnregisterFromRefreshDriver() { @@ -238,14 +253,18 @@ return geckoEvent; } -bool SwipeTracker::SendSwipeEvent(EventMessage aMsg, uint32_t aDirection, +void SwipeTracker::SendSwipeEvent(EventMessage aMsg, uint32_t aDirection, double aDelta, const TimeStamp& aTimeStamp) { + nsCOMPtr widget = do_QueryReferent(mWidget); + if (!widget) { + return; + } WidgetSimpleGestureEvent geckoEvent = - CreateSwipeGestureEvent(aMsg, &mWidget, mEventPosition, aTimeStamp); + CreateSwipeGestureEvent(aMsg, widget, mEventPosition, aTimeStamp); geckoEvent.mDirection = aDirection; geckoEvent.mDelta = aDelta; geckoEvent.mAllowedDirections = mAllowedDirections; - return mWidget.DispatchWindowEvent(geckoEvent); + widget->DispatchWindowEvent(geckoEvent); } // static diff -Nru firefox-esr-140.9.1esr/widget/SwipeTracker.h firefox-esr-140.10.0esr/widget/SwipeTracker.h --- firefox-esr-140.9.1esr/widget/SwipeTracker.h 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/SwipeTracker.h 2026-04-15 02:00:06.000000000 +0000 @@ -11,6 +11,7 @@ #include "mozilla/layers/AxisPhysicsMSDModel.h" #include "mozilla/RefPtr.h" #include "mozilla/TimeStamp.h" +#include "nsIWeakReferenceUtils.h" #include "nsRefreshObservers.h" #include "Units.h" @@ -54,6 +55,8 @@ void Destroy(); + void StartTracking(const PanGestureInput& aSwipeStartEvent); + nsEventStatus ProcessEvent(const PanGestureInput& aEvent, bool aProcessingFirstEvent = false); void CancelSwipe(const TimeStamp& aTimeStamp); @@ -79,10 +82,10 @@ void StartAnimating(double aStartValue, double aTargetValue); void SwipeFinished(const TimeStamp& aTimeStamp); void UnregisterFromRefreshDriver(); - bool SendSwipeEvent(EventMessage aMsg, uint32_t aDirection, double aDelta, + void SendSwipeEvent(EventMessage aMsg, uint32_t aDirection, double aDelta, const TimeStamp& aTimeStamp); - nsIWidget& mWidget; + nsWeakPtr mWidget; RefPtr mRefreshDriver; layers::AxisPhysicsMSDModel mAxis; const LayoutDeviceIntPoint mEventPosition; diff -Nru firefox-esr-140.9.1esr/widget/TextEventDispatcher.cpp firefox-esr-140.10.0esr/widget/TextEventDispatcher.cpp --- firefox-esr-140.9.1esr/widget/TextEventDispatcher.cpp 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/TextEventDispatcher.cpp 2026-04-15 02:00:05.000000000 +0000 @@ -527,7 +527,7 @@ nsCOMPtr nativeListener = mWidget->GetNativeTextEventDispatcherListener(); if (nativeListener) { - mIMENotificationRequests |= nativeListener->GetIMENotificationRequests(); + mIMENotificationRequests += nativeListener->GetIMENotificationRequests(); } } } diff -Nru firefox-esr-140.9.1esr/widget/TextEventDispatcherListener.h firefox-esr-140.10.0esr/widget/TextEventDispatcherListener.h --- firefox-esr-140.9.1esr/widget/TextEventDispatcherListener.h 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/TextEventDispatcherListener.h 2026-04-15 02:00:05.000000000 +0000 @@ -5,14 +5,16 @@ #ifndef mozilla_textinputdispatcherlistener_h_ #define mozilla_textinputdispatcherlistener_h_ +#include "mozilla/EnumSet.h" #include "nsWeakReference.h" namespace mozilla { namespace widget { +enum class IMENotificationRequest : uint8_t; class TextEventDispatcher; struct IMENotification; -struct IMENotificationRequests; +using IMENotificationRequests = EnumSet; #define NS_TEXT_INPUT_PROXY_LISTENER_IID \ {0xf2226f55, \ diff -Nru firefox-esr-140.9.1esr/widget/android/GeckoEditableSupport.cpp firefox-esr-140.10.0esr/widget/android/GeckoEditableSupport.cpp --- firefox-esr-140.9.1esr/widget/android/GeckoEditableSupport.cpp 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/android/GeckoEditableSupport.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -1461,7 +1461,7 @@ NS_IMETHODIMP_(IMENotificationRequests) GeckoEditableSupport::GetIMENotificationRequests() { - return IMENotificationRequests(IMENotificationRequests::NOTIFY_TEXT_CHANGE); + return {IMENotificationRequest::TextChange}; } static bool ShouldKeyboardDismiss(const nsAString& aInputType, diff -Nru firefox-esr-140.9.1esr/widget/cocoa/TextInputHandler.mm firefox-esr-140.10.0esr/widget/cocoa/TextInputHandler.mm --- firefox-esr-140.9.1esr/widget/cocoa/TextInputHandler.mm 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/cocoa/TextInputHandler.mm 2026-04-15 02:00:06.000000000 +0000 @@ -3436,7 +3436,7 @@ // XXX Shouldn't we move floating window which shows composition string // when plugin has focus and its parent is scrolled or the window is // moved? - return IMENotificationRequests(IMENotificationRequests::NOTIFY_TEXT_CHANGE); + return {IMENotificationRequest::TextChange}; } NS_IMETHODIMP_(void) diff -Nru firefox-esr-140.9.1esr/widget/gtk/DMABufSurface.cpp firefox-esr-140.10.0esr/widget/gtk/DMABufSurface.cpp --- firefox-esr-140.9.1esr/widget/gtk/DMABufSurface.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/gtk/DMABufSurface.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -919,13 +919,21 @@ const SurfaceDescriptor& aDesc) { const SurfaceDescriptorDMABuf& desc = aDesc.get_SurfaceDescriptorDMABuf(); + mBufferPlaneCount = desc.fds().Length(); + + MOZ_RELEASE_ASSERT(mBufferPlaneCount <= DMABUF_BUFFER_PLANES); + if (mBufferPlaneCount <= 0 || desc.width().Length() == 0 || + desc.height().Length() == 0 || desc.modifier().Length() == 0 || + desc.strides().Length() < (uint32_t)mBufferPlaneCount || + desc.offsets().Length() < (uint32_t)mBufferPlaneCount) { + return false; + } + mFOURCCFormat = desc.fourccFormat(); mWidth = desc.width()[0]; mHeight = desc.height()[0]; - mBufferPlaneCount = desc.fds().Length(); mGbmBufferFlags = desc.flags(); mBufferModifier = desc.modifier()[0]; - MOZ_RELEASE_ASSERT(mBufferPlaneCount <= DMABUF_BUFFER_PLANES); mUID = desc.uid(); mPID = desc.pid(); @@ -1482,6 +1490,9 @@ unsigned int subsample = i == 0 ? 0 : 1; unsigned int object = aDesc.layers[i].object_index[0]; + if (object >= aDesc.num_objects) { + return false; + } mBufferModifiers[i] = aDesc.objects[object].drm_format_modifier; mDrmFormats[i] = aDesc.layers[i].drm_format; mOffsets[i] = aDesc.layers[i].offset[0]; @@ -1515,6 +1526,9 @@ VADRMPRIMESurfaceDescriptor& aDesc) { for (unsigned int i = 0; i < aDesc.num_layers; i++) { unsigned int object = aDesc.layers[i].object_index[0]; + if (object >= aDesc.num_objects) { + continue; + } if (aDesc.objects[object].fd != -1) { close(aDesc.objects[object].fd); aDesc.objects[object].fd = -1; @@ -1792,6 +1806,19 @@ bool DMABufSurfaceYUV::ImportSurfaceDescriptor( const SurfaceDescriptorDMABuf& aDesc) { mBufferPlaneCount = aDesc.fds().Length(); + MOZ_RELEASE_ASSERT(mBufferPlaneCount <= DMABUF_BUFFER_PLANES); + if (mBufferPlaneCount <= 0 || + aDesc.width().Length() < (uint32_t)mBufferPlaneCount || + aDesc.height().Length() < (uint32_t)mBufferPlaneCount || + aDesc.widthAligned().Length() < (uint32_t)mBufferPlaneCount || + aDesc.heightAligned().Length() < (uint32_t)mBufferPlaneCount || + aDesc.format().Length() < (uint32_t)mBufferPlaneCount || + aDesc.modifier().Length() < (uint32_t)mBufferPlaneCount || + aDesc.strides().Length() < (uint32_t)mBufferPlaneCount || + aDesc.offsets().Length() < (uint32_t)mBufferPlaneCount) { + return false; + } + mSurfaceType = SURFACE_YUV; mFOURCCFormat = aDesc.fourccFormat(); mColorSpace = aDesc.yUVColorSpace(); @@ -1804,7 +1831,6 @@ LOGDMABUF("DMABufSurfaceYUV::ImportSurfaceDescriptor() UID %d", mUID); - MOZ_RELEASE_ASSERT(mBufferPlaneCount <= DMABUF_BUFFER_PLANES); for (int i = 0; i < mBufferPlaneCount; i++) { mDmabufFds[i] = aDesc.fds()[i]; mWidth[i] = aDesc.width()[i]; diff -Nru firefox-esr-140.9.1esr/widget/gtk/IMContextWrapper.cpp firefox-esr-140.10.0esr/widget/gtk/IMContextWrapper.cpp --- firefox-esr-140.9.1esr/widget/gtk/IMContextWrapper.cpp 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/gtk/IMContextWrapper.cpp 2026-04-15 02:00:05.000000000 +0000 @@ -603,13 +603,10 @@ NS_IMETHODIMP_(IMENotificationRequests) IMContextWrapper::GetIMENotificationRequests() { - IMENotificationRequests::Notifications notifications = - IMENotificationRequests::NOTIFY_NOTHING; // If it's not enabled, we don't need position change notification. - if (IsEnabled()) { - notifications |= IMENotificationRequests::NOTIFY_POSITION_CHANGE; - } - return IMENotificationRequests(notifications); + return IsEnabled() + ? IMENotificationRequests{IMENotificationRequest::PositionChange} + : IMENotificationRequests{}; } void IMContextWrapper::OnDestroyWindow(nsWindow* aWindow) { diff -Nru firefox-esr-140.9.1esr/widget/gtk/nsFilePicker.cpp firefox-esr-140.10.0esr/widget/gtk/nsFilePicker.cpp --- firefox-esr-140.9.1esr/widget/gtk/nsFilePicker.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/gtk/nsFilePicker.cpp 2026-04-15 02:00:07.000000000 +0000 @@ -30,6 +30,7 @@ #include "WidgetUtilsGtk.h" #include "gfxPlatform.h" +#include "GRefPtr.h" #include "nsFilePicker.h" #undef LOG @@ -615,10 +616,10 @@ } GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT; - auto* cancel_dialog = gtk_message_dialog_new( + RefPtr cancel_dialog = gtk_message_dialog_new( GTK_WINDOW(file_chooser), flags, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", NS_ConvertUTF16toUTF8(errorMessage).get()); - gtk_dialog_run(GTK_DIALOG(cancel_dialog)); + gtk_dialog_run(GTK_DIALOG(cancel_dialog.get())); gtk_widget_destroy(cancel_dialog); return true; diff -Nru firefox-esr-140.9.1esr/widget/gtk/nsPrintDialogGTK.cpp firefox-esr-140.10.0esr/widget/gtk/nsPrintDialogGTK.cpp --- firefox-esr-140.9.1esr/widget/gtk/nsPrintDialogGTK.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/gtk/nsPrintDialogGTK.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -10,6 +10,7 @@ #include "mozilla/ArrayUtils.h" #include "mozilla/Services.h" +#include "GRefPtr.h" #include "MozContainer.h" #include "nsIPrintSettings.h" #include "nsIWidget.h" @@ -69,12 +70,12 @@ nsAutoString intlString; printBundle->GetStringFromName("headerFooterCustom", intlString); - GtkWidget* prompt_dialog = gtk_dialog_new_with_buttons( + RefPtr prompt_dialog = gtk_dialog_new_with_buttons( NS_ConvertUTF16toUTF8(intlString).get(), printDialog, - (GtkDialogFlags)(GTK_DIALOG_MODAL), g_dgettext("gtk30", "_Cancel"), - GTK_RESPONSE_REJECT, g_dgettext("gtk30", "_OK"), GTK_RESPONSE_ACCEPT, - nullptr); - gtk_dialog_set_default_response(GTK_DIALOG(prompt_dialog), + (GtkDialogFlags)(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), + g_dgettext("gtk30", "_Cancel"), GTK_RESPONSE_REJECT, + g_dgettext("gtk30", "_OK"), GTK_RESPONSE_ACCEPT, nullptr); + gtk_dialog_set_default_response(GTK_DIALOG(prompt_dialog.get()), GTK_RESPONSE_ACCEPT); printBundle->GetStringFromName("customHeaderFooterPrompt", intlString); @@ -107,9 +108,9 @@ gtk_widget_show_all(custom_hbox); gtk_box_pack_start( - GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(prompt_dialog))), + GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(prompt_dialog.get()))), custom_hbox, FALSE, FALSE, 0); - gint diag_response = gtk_dialog_run(GTK_DIALOG(prompt_dialog)); + gint diag_response = gtk_dialog_run(GTK_DIALOG(prompt_dialog.get())); if (diag_response == GTK_RESPONSE_ACCEPT) { const gchar* response_text = gtk_entry_get_text(GTK_ENTRY(custom_entry)); @@ -139,7 +140,7 @@ nsresult ExportSettings(nsIPrintSettings* aNSSettings); private: - GtkWidget* dialog; + RefPtr dialog; GtkWidget* shrink_to_fit_toggle; GtkWidget* print_bg_colors_toggle; GtkWidget* print_bg_images_toggle; @@ -177,9 +178,12 @@ dialog = gtk_print_unix_dialog_new(GetUTF8FromBundle("printTitleGTK").get(), gtkParent); + if (gtkParent) { + gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog.get()), TRUE); + } gtk_print_unix_dialog_set_manual_capabilities( - GTK_PRINT_UNIX_DIALOG(dialog), + GTK_PRINT_UNIX_DIALOG(dialog.get()), GtkPrintCapabilities( GTK_PRINT_CAPABILITY_COPIES | GTK_PRINT_CAPABILITY_COLLATE | GTK_PRINT_CAPABILITY_REVERSE | GTK_PRINT_CAPABILITY_SCALE | @@ -315,7 +319,7 @@ gtk_box_pack_start(GTK_BOX(custom_options_tab), header_footer_vertical_squasher, FALSE, FALSE, 0); - gtk_print_unix_dialog_add_custom_tab(GTK_PRINT_UNIX_DIALOG(dialog), + gtk_print_unix_dialog_add_custom_tab(GTK_PRINT_UNIX_DIALOG(dialog.get()), custom_options_tab, tab_label); gtk_widget_show_all(custom_options_tab); } @@ -340,7 +344,7 @@ } gint nsPrintDialogWidgetGTK::Run() { - const gint response = gtk_dialog_run(GTK_DIALOG(dialog)); + const gint response = gtk_dialog_run(GTK_DIALOG(dialog.get())); gtk_widget_hide(dialog); return response; } @@ -394,8 +398,10 @@ aNSSettings->GetNumPagesPerSheet(&pagesPerSide); gtk_print_settings_set_number_up(settings, pagesPerSide); - gtk_print_unix_dialog_set_settings(GTK_PRINT_UNIX_DIALOG(dialog), settings); - gtk_print_unix_dialog_set_page_setup(GTK_PRINT_UNIX_DIALOG(dialog), setup); + gtk_print_unix_dialog_set_settings(GTK_PRINT_UNIX_DIALOG(dialog.get()), + settings); + gtk_print_unix_dialog_set_page_setup(GTK_PRINT_UNIX_DIALOG(dialog.get()), + setup); return NS_OK; } @@ -405,11 +411,11 @@ NS_ENSURE_TRUE(aNSSettings, NS_ERROR_FAILURE); GtkPrintSettings* settings = - gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(dialog)); + gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(dialog.get())); GtkPageSetup* setup = - gtk_print_unix_dialog_get_page_setup(GTK_PRINT_UNIX_DIALOG(dialog)); - GtkPrinter* printer = - gtk_print_unix_dialog_get_selected_printer(GTK_PRINT_UNIX_DIALOG(dialog)); + gtk_print_unix_dialog_get_page_setup(GTK_PRINT_UNIX_DIALOG(dialog.get())); + GtkPrinter* printer = gtk_print_unix_dialog_get_selected_printer( + GTK_PRINT_UNIX_DIALOG(dialog.get())); if (settings && setup && printer) { ExportHeaderFooter(aNSSettings); diff -Nru firefox-esr-140.9.1esr/widget/nsBaseClipboard.cpp firefox-esr-140.10.0esr/widget/nsBaseClipboard.cpp --- firefox-esr-140.9.1esr/widget/nsBaseClipboard.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/nsBaseClipboard.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -244,11 +244,13 @@ MOZ_ASSERT(mClipboard); MOZ_ASSERT( mClipboard->nsIClipboard::IsClipboardTypeSupported(mClipboardType)); - MOZ_DIAGNOSTIC_ASSERT(mClipboard->mPendingWriteRequests[mClipboardType] == - this); + RefPtr selfPin(this); + + if (mClipboard->mPendingWriteRequests[mClipboardType] != this) { + return NS_ERROR_IN_PROGRESS; + } + mClipboard->mPendingWriteRequests[mClipboardType] = nullptr; - RefPtr request = - std::move(mClipboard->mPendingWriteRequests[mClipboardType]); nsresult rv = mClipboard->SetData(aTransferable, aOwner, mClipboardType, mWindowContext); MaybeNotifyCallback(rv); @@ -275,13 +277,13 @@ // take a reference to mClipboard. MOZ_ASSERT(IsValid()); + // Once the callback is notified, setData should not be allowed, so invalidate + // this request. + mClipboard = nullptr; if (nsCOMPtr callback = mCallback.forget()) { callback->OnComplete(aResult); } - // Once the callback is notified, setData should not be allowed, so invalidate - // this request. - mClipboard = nullptr; } void nsBaseClipboard::RejectPendingAsyncSetDataRequestIfAny( diff -Nru firefox-esr-140.9.1esr/widget/nsBaseWidget.cpp firefox-esr-140.10.0esr/widget/nsBaseWidget.cpp --- firefox-esr-140.9.1esr/widget/nsBaseWidget.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/nsBaseWidget.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -1947,7 +1947,8 @@ mWidgetListener->WindowMoved(this, aX, aY, aByMoveToRect); } - if (mIMEHasFocus && IMENotificationRequestsRef().WantPositionChanged()) { + if (mIMEHasFocus && IMENotificationRequestsRef().contains( + IMENotificationRequest::PositionChange)) { NotifyIME(IMENotification(IMEMessage::NOTIFY_IME_OF_POSITION_CHANGE)); } } @@ -2371,6 +2372,7 @@ mSwipeTracker = new SwipeTracker(*this, aSwipeStartEvent, aAllowedDirections, direction); + mSwipeTracker->StartTracking(aSwipeStartEvent); if (!mAPZC) { mCurrentPanGestureBelongsToSwipe = true; diff -Nru firefox-esr-140.9.1esr/widget/nsColorPickerProxy.cpp firefox-esr-140.10.0esr/widget/nsColorPickerProxy.cpp --- firefox-esr-140.9.1esr/widget/nsColorPickerProxy.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/nsColorPickerProxy.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -40,24 +40,22 @@ mozilla::ipc::IPCResult nsColorPickerProxy::RecvUpdate( const nsAString& aColor) { - if (mCallback) { - mCallback->Update(aColor); + if (nsCOMPtr callback = mCallback) { + callback->Update(aColor); } return IPC_OK(); } mozilla::ipc::IPCResult nsColorPickerProxy::Recv__delete__( const nsAString& aColor) { - if (mCallback) { - mCallback->Done(aColor); - mCallback = nullptr; + if (nsCOMPtr callback = std::move(mCallback)) { + callback->Done(aColor); } return IPC_OK(); } void nsColorPickerProxy::ActorDestroy(ActorDestroyReason aWhy) { - if (mCallback) { - mCallback->Done(u""_ns); - mCallback = nullptr; + if (nsCOMPtr callback = std::move(mCallback)) { + callback->Done(u""_ns); } } diff -Nru firefox-esr-140.9.1esr/widget/nsGUIEventIPC.h firefox-esr-140.10.0esr/widget/nsGUIEventIPC.h --- firefox-esr-140.9.1esr/widget/nsGUIEventIPC.h 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/nsGUIEventIPC.h 2026-04-15 02:00:06.000000000 +0000 @@ -508,13 +508,19 @@ }; template <> +struct ParamTraits + : ContiguousEnumSerializerInclusive< + mozilla::TextRangeStyle::LineStyle, + mozilla::TextRangeStyle::LineStyle::None, + mozilla::TextRangeStyle::LineStyle::Wavy> {}; + +template <> struct ParamTraits { using paramType = mozilla::TextRangeStyle; static void Write(MessageWriter* aWriter, const paramType& aParam) { WriteParam(aWriter, aParam.mDefinedStyles); - WriteParam(aWriter, static_cast( - aParam.mLineStyle)); + WriteParam(aWriter, aParam.mLineStyle); WriteParam(aWriter, aParam.mIsBoldLine); WriteParam(aWriter, aParam.mForegroundColor); WriteParam(aWriter, aParam.mBackgroundColor); @@ -522,41 +528,37 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - mozilla::TextRangeStyle::LineStyleType lineStyle; - if (!ReadParam(aReader, &aResult->mDefinedStyles) || - !ReadParam(aReader, &lineStyle) || - !ReadParam(aReader, &aResult->mIsBoldLine) || - !ReadParam(aReader, &aResult->mForegroundColor) || - !ReadParam(aReader, &aResult->mBackgroundColor) || - !ReadParam(aReader, &aResult->mUnderlineColor)) { - return false; - } - aResult->mLineStyle = mozilla::TextRangeStyle::ToLineStyle(lineStyle); - return true; + return ReadParam(aReader, &aResult->mDefinedStyles) && + ReadParam(aReader, &aResult->mLineStyle) && + ReadParam(aReader, &aResult->mIsBoldLine) && + ReadParam(aReader, &aResult->mForegroundColor) && + ReadParam(aReader, &aResult->mBackgroundColor) && + ReadParam(aReader, &aResult->mUnderlineColor); } }; template <> +struct ParamTraits + : ContiguousEnumSerializerInclusive< + mozilla::TextRangeType, mozilla::TextRangeType::eUninitialized, + mozilla::TextRangeType::eSelectedClause> {}; + +template <> struct ParamTraits { using paramType = mozilla::TextRange; static void Write(MessageWriter* aWriter, const paramType& aParam) { WriteParam(aWriter, aParam.mStartOffset); WriteParam(aWriter, aParam.mEndOffset); - WriteParam(aWriter, mozilla::ToRawTextRangeType(aParam.mRangeType)); + WriteParam(aWriter, aParam.mRangeType); WriteParam(aWriter, aParam.mRangeStyle); } static bool Read(MessageReader* aReader, paramType* aResult) { - mozilla::RawTextRangeType rawTextRangeType; - if (ReadParam(aReader, &aResult->mStartOffset) && - ReadParam(aReader, &aResult->mEndOffset) && - ReadParam(aReader, &rawTextRangeType) && - ReadParam(aReader, &aResult->mRangeStyle)) { - aResult->mRangeType = mozilla::ToTextRangeType(rawTextRangeType); - return true; - } - return false; + return ReadParam(aReader, &aResult->mStartOffset) && + ReadParam(aReader, &aResult->mEndOffset) && + ReadParam(aReader, &aResult->mRangeType) && + ReadParam(aReader, &aResult->mRangeStyle); } }; @@ -669,19 +671,6 @@ }; template <> -struct ParamTraits { - using paramType = mozilla::widget::IMENotificationRequests; - - static void Write(MessageWriter* aWriter, const paramType& aParam) { - WriteParam(aWriter, aParam.mWantUpdates); - } - - static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, &aResult->mWantUpdates); - } -}; - -template <> struct ParamTraits { using paramType = mozilla::widget::NativeIMEContext; @@ -776,12 +765,21 @@ }; template <> +struct ParamTraits + : ContiguousEnumSerializerInclusive< + mozilla::widget::IMEMessage, + // FYI: mozilla::widget::NOTIFY_IME_OF_NOTHING is the actual lowest + // value, but it shouldn't be set at crossing the process boundary + // since it's odd to notify the process of "nothing happened". + mozilla::widget::NOTIFY_IME_OF_FOCUS, + mozilla::widget::REQUEST_TO_CANCEL_COMPOSITION> {}; + +template <> struct ParamTraits { using paramType = mozilla::widget::IMENotification; static void Write(MessageWriter* aWriter, const paramType& aParam) { - WriteParam(aWriter, - static_cast(aParam.mMessage)); + WriteParam(aWriter, aParam.mMessage); switch (aParam.mMessage) { case mozilla::widget::NOTIFY_IME_OF_SELECTION_CHANGE: WriteParam(aWriter, aParam.mSelectionChangeData); @@ -798,21 +796,29 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - mozilla::widget::IMEMessageType IMEMessage = 0; - if (!ReadParam(aReader, &IMEMessage)) { + if (!ReadParam(aReader, &aResult->mMessage)) { return false; } - aResult->mMessage = static_cast(IMEMessage); switch (aResult->mMessage) { + case mozilla::widget::NOTIFY_IME_OF_NOTHING: + MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE( + "NOTIFY_IME_OF_NOTHING shouldn't cross the process boundary"); + return false; case mozilla::widget::NOTIFY_IME_OF_SELECTION_CHANGE: return ReadParam(aReader, &aResult->mSelectionChangeData); case mozilla::widget::NOTIFY_IME_OF_TEXT_CHANGE: return ReadParam(aReader, &aResult->mTextChangeData); case mozilla::widget::NOTIFY_IME_OF_MOUSE_BUTTON_EVENT: return ReadParam(aReader, &aResult->mMouseButtonEventData); - default: + case mozilla::widget::NOTIFY_IME_OF_FOCUS: + case mozilla::widget::NOTIFY_IME_OF_BLUR: + case mozilla::widget::NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED: + case mozilla::widget::NOTIFY_IME_OF_POSITION_CHANGE: + case mozilla::widget::REQUEST_TO_COMMIT_COMPOSITION: + case mozilla::widget::REQUEST_TO_CANCEL_COMPOSITION: return true; } + return false; } }; @@ -1032,6 +1038,16 @@ WriteParam(aWriter, aParam.mLayersId); } + template + static bool Read(MessageReader* aReader, mozilla::InputType aInputType, + T* aResult) { + if (!Read(aReader, static_cast(aResult))) { + return false; + } + return aResult->mInputType == aInputType; + } + + private: static bool Read(MessageReader* aReader, paramType* aResult) { return ReadParam(aReader, &aResult->mInputType) && ReadParam(aReader, &aResult->mTimeStamp) && @@ -1118,7 +1134,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::MULTITOUCH_INPUT, aResult) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mTouches) && ReadParam(aReader, &aResult->mHandledByAPZ) && @@ -1160,7 +1177,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read(aReader, mozilla::MOUSE_INPUT, + aResult) && ReadParam(aReader, &aResult->mButtonType) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mInputSource) && @@ -1211,7 +1229,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::PANGESTURE_INPUT, aResult) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mPanStartPoint) && ReadParam(aReader, &aResult->mPanDisplacement) && @@ -1267,7 +1286,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::PINCHGESTURE_INPUT, aResult) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mSource) && ReadParam(aReader, &aResult->mScreenOffset) && @@ -1299,7 +1319,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::TAPGESTURE_INPUT, aResult) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mPoint) && ReadParam(aReader, &aResult->mLocalPoint); @@ -1362,7 +1383,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::SCROLLWHEEL_INPUT, aResult) && ReadParam(aReader, &aResult->mDeltaType) && ReadParam(aReader, &aResult->mScrollMode) && ReadParam(aReader, &aResult->mOrigin) && @@ -1406,7 +1428,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::KEYBOARD_INPUT, aResult) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mKeyCode) && ReadParam(aReader, &aResult->mCharCode) && diff -Nru firefox-esr-140.9.1esr/widget/nsIWidget.h firefox-esr-140.10.0esr/widget/nsIWidget.h --- firefox-esr-140.9.1esr/widget/nsIWidget.h 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/nsIWidget.h 2026-04-15 02:00:06.000000000 +0000 @@ -343,6 +343,7 @@ typedef mozilla::widget::IMEEnabled IMEEnabled; typedef mozilla::widget::IMEMessage IMEMessage; typedef mozilla::widget::IMENotification IMENotification; + typedef mozilla::widget::IMENotificationRequest IMENotificationRequest; typedef mozilla::widget::IMENotificationRequests IMENotificationRequests; typedef mozilla::widget::IMEState IMEState; typedef mozilla::widget::InputContext InputContext; diff -Nru firefox-esr-140.9.1esr/widget/nsTransferable.cpp firefox-esr-140.10.0esr/widget/nsTransferable.cpp --- firefox-esr-140.9.1esr/widget/nsTransferable.cpp 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/nsTransferable.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -114,6 +114,7 @@ void DataStruct::ClearData() { if (mCacheFD) { PR_Close(mCacheFD); + mCacheFD = nullptr; } mData = nullptr; } diff -Nru firefox-esr-140.9.1esr/widget/uikit/TextInputHandler.mm firefox-esr-140.10.0esr/widget/uikit/TextInputHandler.mm --- firefox-esr-140.9.1esr/widget/uikit/TextInputHandler.mm 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/uikit/TextInputHandler.mm 2026-04-15 02:00:05.000000000 +0000 @@ -36,7 +36,7 @@ } IMENotificationRequests TextInputHandler::GetIMENotificationRequests() { - return IMENotificationRequests(); + return IMENotificationRequests{}; } void TextInputHandler::OnRemovedFrom( diff -Nru firefox-esr-140.9.1esr/widget/windows/IMMHandler.cpp firefox-esr-140.10.0esr/widget/windows/IMMHandler.cpp --- firefox-esr-140.9.1esr/widget/windows/IMMHandler.cpp 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/windows/IMMHandler.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -347,9 +347,8 @@ // static IMENotificationRequests IMMHandler::GetIMENotificationRequests() { - return IMENotificationRequests( - IMENotificationRequests::NOTIFY_POSITION_CHANGE | - IMENotificationRequests::NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR); + return {IMENotificationRequest::PositionChange, + IMENotificationRequest::MouseEventOnChar}; } // used for checking the lParam of WM_IME_COMPOSITION diff -Nru firefox-esr-140.9.1esr/widget/windows/TSFEmptyTextStore.cpp firefox-esr-140.10.0esr/widget/windows/TSFEmptyTextStore.cpp --- firefox-esr-140.9.1esr/widget/windows/TSFEmptyTextStore.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/windows/TSFEmptyTextStore.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -497,7 +497,7 @@ } IMENotificationRequests TSFEmptyTextStore::GetIMENotificationRequests() const { - return IMENotificationRequests(); + return {}; } } // namespace mozilla::widget diff -Nru firefox-esr-140.9.1esr/widget/windows/TSFTextStore.cpp firefox-esr-140.10.0esr/widget/windows/TSFTextStore.cpp --- firefox-esr-140.9.1esr/widget/windows/TSFTextStore.cpp 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/windows/TSFTextStore.cpp 2026-04-15 02:00:05.000000000 +0000 @@ -3189,7 +3189,7 @@ if (NS_WARN_IF(!mDocumentMgr)) { // If there is no active text store, we don't need any notifications // since there is no sink which needs notifications. - return IMENotificationRequests(); + return {}; } // Otherwise, requests all notifications since even if some of them may not @@ -3207,11 +3207,10 @@ // focused element isn't changed. Therefore, if sEnabledTextStore isn't // nullptr, we need to keep notifying the sink even when it is not focused // text store for the thread manager. - return IMENotificationRequests( - IMENotificationRequests::NOTIFY_TEXT_CHANGE | - IMENotificationRequests::NOTIFY_POSITION_CHANGE | - IMENotificationRequests::NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR | - IMENotificationRequests::NOTIFY_DURING_DEACTIVE); + return {IMENotificationRequest::TextChange, + IMENotificationRequest::PositionChange, + IMENotificationRequest::MouseEventOnChar, + IMENotificationRequest::NotifyDuringInactive}; } nsresult TSFTextStore::OnTextChangeInternal( diff -Nru firefox-esr-140.9.1esr/widget/windows/TSFUtils.cpp firefox-esr-140.10.0esr/widget/windows/TSFUtils.cpp --- firefox-esr-140.9.1esr/widget/windows/TSFUtils.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/windows/TSFUtils.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -622,7 +622,7 @@ IMENotificationRequests TSFUtils::GetIMENotificationRequests() { return sCurrentTextStore ? sCurrentTextStore->GetIMENotificationRequests() - : IMENotificationRequests(); + : IMENotificationRequests{}; } inline std::ostream& operator<<( diff -Nru firefox-esr-140.9.1esr/widget/windows/TSFUtils.h firefox-esr-140.10.0esr/widget/windows/TSFUtils.h --- firefox-esr-140.9.1esr/widget/windows/TSFUtils.h 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/windows/TSFUtils.h 2026-04-15 02:00:06.000000000 +0000 @@ -41,9 +41,6 @@ class TSFEmptyTextStore; class TSFTextStore; class TSFTextStoreBase; -struct IMENotificationRequests; -struct InputContext; -struct InputContextAction; class TSFUtils final { public: diff -Nru firefox-esr-140.9.1esr/widget/windows/WinIMEHandler.cpp firefox-esr-140.10.0esr/widget/windows/WinIMEHandler.cpp --- firefox-esr-140.9.1esr/widget/windows/WinIMEHandler.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/widget/windows/WinIMEHandler.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -361,7 +361,7 @@ // an editor has focus isn't supported by IMEContentObserver nor // ContentCacheInParent. Therefore, we need to request whole notifications // which are necessary either IMMHandler or TSFTextStore. - return IMMHandler::GetIMENotificationRequests() | + return IMMHandler::GetIMENotificationRequests() + TSFUtils::GetIMENotificationRequests(); } diff -Nru firefox-esr-140.9.1esr/xpcom/base/CycleCollectedJSContext.cpp firefox-esr-140.10.0esr/xpcom/base/CycleCollectedJSContext.cpp --- firefox-esr-140.9.1esr/xpcom/base/CycleCollectedJSContext.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/base/CycleCollectedJSContext.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -1018,18 +1018,40 @@ : public DiscardableRunnable { public: explicit CleanupRunnable(FinalizationRegistryCleanup* aCleanupWork) - : DiscardableRunnable("CleanupRunnable"), mCleanupWork(aCleanupWork) {} + : DiscardableRunnable("CleanupRunnable"), mCleanupWork(aCleanupWork) { + MOZ_ASSERT(aCleanupWork); + } + + virtual ~CleanupRunnable() { + if (mCleanupWork) { + clearPendingRunnable(); + } + } // MOZ_CAN_RUN_SCRIPT_BOUNDARY until Runnable::Run is MOZ_CAN_RUN_SCRIPT. See // bug 1535398. MOZ_CAN_RUN_SCRIPT_BOUNDARY NS_IMETHOD Run() override { + if (!mCleanupWork) { + // The FinalizationRegistryCleanup has been destroyed. + return NS_OK; + } + + clearPendingRunnable(); + mCleanupWork->DoCleanup(); + mCleanupWork = nullptr; return NS_OK; } + void clearPendingRunnable() { + MOZ_ASSERT(mCleanupWork->mPendingRunnable == this); + mCleanupWork->mPendingRunnable = nullptr; + } + private: FinalizationRegistryCleanup* mCleanupWork; + friend class FinalizationRegistryCleanup; }; FinalizationRegistryCleanup::FinalizationRegistryCleanup( @@ -1039,6 +1061,10 @@ void FinalizationRegistryCleanup::Destroy() { // This must happen before the CycleCollectedJSContext destructor calls // JS_DestroyContext(). + if (mPendingRunnable) { + MOZ_ASSERT(mPendingRunnable->mCleanupWork == this); + mPendingRunnable->mCleanupWork = nullptr; + } mCallbacks.reset(); } @@ -1059,7 +1085,7 @@ void FinalizationRegistryCleanup::QueueCallback(JSFunction* aDoCleanup, JSObject* aHostDefinedData) { - bool firstCallback = mCallbacks.empty(); + MOZ_ASSERT_IF(!mCallbacks.empty(), mPendingRunnable); JSObject* incumbentGlobal = nullptr; @@ -1074,9 +1100,9 @@ MOZ_ALWAYS_TRUE(mCallbacks.append(Callback{aDoCleanup, incumbentGlobal})); - if (firstCallback) { - RefPtr cleanup = new CleanupRunnable(this); - NS_DispatchToCurrentThread(cleanup.forget()); + if (!mPendingRunnable) { + mPendingRunnable = new CleanupRunnable(this); + NS_DispatchToCurrentThread(mPendingRunnable); } } diff -Nru firefox-esr-140.9.1esr/xpcom/base/CycleCollectedJSContext.h firefox-esr-140.10.0esr/xpcom/base/CycleCollectedJSContext.h --- firefox-esr-140.9.1esr/xpcom/base/CycleCollectedJSContext.h 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/base/CycleCollectedJSContext.h 2026-04-15 02:00:06.000000000 +0000 @@ -134,6 +134,10 @@ // pointer to its containing context here. CycleCollectedJSContext* mContext; + // Weak pointer to a previously dispatched runnable. The CleanupRunnable::Run + // method will null out this pointer. + CleanupRunnable* mPendingRunnable = nullptr; + using CallbackVector = JS::GCVector; JS::PersistentRooted mCallbacks; }; diff -Nru firefox-esr-140.9.1esr/xpcom/base/CycleCollectedJSRuntime.cpp firefox-esr-140.10.0esr/xpcom/base/CycleCollectedJSRuntime.cpp --- firefox-esr-140.9.1esr/xpcom/base/CycleCollectedJSRuntime.cpp 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/base/CycleCollectedJSRuntime.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -1762,8 +1762,15 @@ for (auto iter = objects.Iter(); !iter.Done(); iter.Next()) { nsWrapperCache* cache = iter.Get(); + if (MOZ_UNLIKELY(!cache)) { + continue; + } JSObject* wrapper = cache->GetWrapperMaybeDead(); - MOZ_DIAGNOSTIC_ASSERT(wrapper); + if (MOZ_UNLIKELY(!wrapper)) { + // Wrapper might have been cleared temporarily while updating reflector + // global. + continue; + } if (js::gc::InCollectedNurseryRegion(wrapper)) { MOZ_ASSERT(!cache->PreservingWrapper()); @@ -1789,6 +1796,17 @@ mNurseryObjects.InfallibleAppend(aCache); } +void CycleCollectedJSRuntime::NurseryWrapperRemovedSlow( + nsWrapperCache* aCache) { + MOZ_ASSERT(aCache); + for (auto iter = mNurseryObjects.IterFromLast(); !iter.Done(); iter.Prev()) { + if (iter.Get() == aCache) { + iter.Get() = nullptr; + return; + } + } +} + void CycleCollectedJSRuntime::DeferredFinalize( DeferredFinalizeAppendFunction aAppendFunc, DeferredFinalizeFunction aFunc, void* aThing) { diff -Nru firefox-esr-140.9.1esr/xpcom/base/CycleCollectedJSRuntime.h firefox-esr-140.10.0esr/xpcom/base/CycleCollectedJSRuntime.h --- firefox-esr-140.9.1esr/xpcom/base/CycleCollectedJSRuntime.h 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/base/CycleCollectedJSRuntime.h 2026-04-15 02:00:06.000000000 +0000 @@ -529,6 +529,7 @@ // storage), because we do not want to keep it alive. nsWrapperCache handles // this for us via its "object moved" handling. void NurseryWrapperAdded(nsWrapperCache* aCache); + void NurseryWrapperRemovedSlow(nsWrapperCache* aCache); void JSObjectsTenured(JS::GCContext* aGCContext); void DeferredFinalize(DeferredFinalizeAppendFunction aAppendFunc, diff -Nru firefox-esr-140.9.1esr/xpcom/base/nsISupportsImpl.h firefox-esr-140.10.0esr/xpcom/base/nsISupportsImpl.h --- firefox-esr-140.9.1esr/xpcom/base/nsISupportsImpl.h 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/base/nsISupportsImpl.h 2026-04-15 02:00:06.000000000 +0000 @@ -20,6 +20,7 @@ #include "nsXPCOM.h" #include #include +#include #include "mozilla/Attributes.h" #include "mozilla/Assertions.h" #include "mozilla/Atomics.h" @@ -416,6 +417,31 @@ mValue.store(aValue, std::memory_order_release); return aValue; } + // Atomically decrements the refcount if it is strictly above Limit. + // Returns the pair of {success, new value}. + template + MOZ_ALWAYS_INLINE std::pair DecrementWithLimit() { + // This ensures we can never release the final reference on this thread. + // Callers which want to do that should use operator--() which adds the + // appropriate fencing. + static_assert(Limit > 0, + "DecrementWithLimit cannot release the final reference"); + nsrefcnt count = mValue.load(std::memory_order_relaxed); + while (count > Limit) { + // Since this may be the last release on this thread, we need + // release semantics on success so that prior writes on this thread + // are visible to the thread that destroys the object when it reads + // mValue with acquire semantics. + // On failure, this thread still owns a reference to the object, + // so no synchronization is required. + if (mValue.compare_exchange_weak(count, count - 1, + std::memory_order_release, + std::memory_order_relaxed)) { + return {true, count - 1}; + } + } + return {false, count}; + } MOZ_ALWAYS_INLINE operator nsrefcnt() const { return get(); } MOZ_ALWAYS_INLINE nsrefcnt get() const { // Use acquire semantics since we're not sure what the caller is diff -Nru firefox-esr-140.9.1esr/xpcom/ds/StaticAtoms.py firefox-esr-140.10.0esr/xpcom/ds/StaticAtoms.py --- firefox-esr-140.9.1esr/xpcom/ds/StaticAtoms.py 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/ds/StaticAtoms.py 2026-04-15 02:00:06.000000000 +0000 @@ -2037,7 +2037,6 @@ Atom("chrome", "chrome"), Atom("moz", "moz"), Atom("moz_icon", "moz-icon"), - Atom("moz_gio", "moz-gio"), Atom("proxy", "proxy"), Atom("privateBrowsingAllowedPermission", "internal:privateBrowsingAllowed"), Atom("svgContextPropertiesAllowedPermission", "internal:svgContextPropertiesAllowed"), diff -Nru firefox-esr-140.9.1esr/xpcom/io/nsLocalFileCommon.cpp firefox-esr-140.10.0esr/xpcom/io/nsLocalFileCommon.cpp --- firefox-esr-140.9.1esr/xpcom/io/nsLocalFileCommon.cpp 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/io/nsLocalFileCommon.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -53,6 +53,7 @@ ".chm", ".cmd", ".com", + ".command", // Mac script ".cpl", ".crt", ".der", @@ -115,6 +116,7 @@ ".scf", // Windows explorer command ".scr", ".sct", + ".search-ms", // Windows Saved Search ".settingcontent-ms", ".shb", ".shs", diff -Nru firefox-esr-140.9.1esr/xpcom/io/nsLocalFileCommon.h firefox-esr-140.10.0esr/xpcom/io/nsLocalFileCommon.h --- firefox-esr-140.9.1esr/xpcom/io/nsLocalFileCommon.h 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/io/nsLocalFileCommon.h 2026-04-15 02:00:06.000000000 +0000 @@ -8,9 +8,9 @@ #define _NS_LOCAL_FILE_COMMON_H_ #ifdef MOZ_ESR -extern const char* const sExecutableExts[110]; +extern const char* const sExecutableExts[112]; #else -extern const char* const sExecutableExts[111]; +extern const char* const sExecutableExts[113]; #endif #endif diff -Nru firefox-esr-140.9.1esr/xpcom/io/nsLocalFileUnix.cpp firefox-esr-140.10.0esr/xpcom/io/nsLocalFileUnix.cpp --- firefox-esr-140.9.1esr/xpcom/io/nsLocalFileUnix.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/io/nsLocalFileUnix.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -1958,21 +1958,22 @@ // Search for any of the set of executable extensions. static const char* const executableExts[] = { #ifdef MOZ_WIDGET_COCOA - "afploc", // Can point to other files. + ".afploc", // Can point to other files. #endif - "air", // Adobe AIR installer + ".air", // Adobe AIR installer #ifdef MOZ_WIDGET_COCOA - "atloc", // Can point to other files. - "fileloc", // File location files can be used to point to other - // files. - "ftploc", // Can point to other files. - "inetloc", // Shouldn't be able to do the same, but can, due to - // macOS vulnerabilities. - "terminal", // macOS Terminal app configuration files + ".atloc", // Can point to other files. + ".command", // Mac script + ".fileloc", // File location files can be used to point to other + // files. + ".ftploc", // Can point to other files. + ".inetloc", // Shouldn't be able to do the same, but can, due to + // macOS vulnerabilities. + ".terminal", // macOS Terminal app configuration files #endif - "jar" // java application bundle + ".jar" // java application bundle }; - nsDependentSubstring ext = Substring(path, dotIdx + 1); + nsDependentSubstring ext = Substring(path, dotIdx); for (auto executableExt : executableExts) { if (ext.EqualsASCII(executableExt)) { // Found a match. Set result and quit. diff -Nru firefox-esr-140.9.1esr/xpcom/tests/gtest/TestAutoRefCnt.cpp firefox-esr-140.10.0esr/xpcom/tests/gtest/TestAutoRefCnt.cpp --- firefox-esr-140.9.1esr/xpcom/tests/gtest/TestAutoRefCnt.cpp 2026-04-03 15:52:37.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/tests/gtest/TestAutoRefCnt.cpp 2026-04-15 02:00:05.000000000 +0000 @@ -43,6 +43,37 @@ Atomic nsThreadSafeAutoRefCntRunner::sIncToOne(0); Atomic nsThreadSafeAutoRefCntRunner::sDecToZero(0); +class nsThreadSafeAutoRefCntDecrementWithLimitRunner final : public Runnable { + public: + static constexpr size_t kDecrementsPerThread = 1000; + + NS_IMETHOD Run() final { + for (size_t i = 0; i < kDecrementsPerThread; i++) { + auto [ok, count] = sRefCnt.DecrementWithLimit<1>(); + if (!ok) { + sLimitHits++; + break; + } + } + return NS_OK; + } + + static ThreadSafeAutoRefCnt sRefCnt; + // Relaxed ordering so sLimitHits doesn't affect the ordering properties of + // DecrementWithLimit being tested. + static Atomic sLimitHits; + + nsThreadSafeAutoRefCntDecrementWithLimitRunner() + : Runnable("nsThreadSafeAutoRefCntDecrementWithLimitRunner") {} + + private: + ~nsThreadSafeAutoRefCntDecrementWithLimitRunner() = default; +}; + +ThreadSafeAutoRefCnt nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt; +Atomic + nsThreadSafeAutoRefCntDecrementWithLimitRunner::sLimitHits(0); + // When a refcounted object is actually owned by a cache, we may not // want to release the object after last reference gets released. In // this pattern, the cache may rely on the balance of increment to one @@ -51,16 +82,87 @@ { static const size_t kThreadCount = 4; nsCOMPtr threads[kThreadCount]; - for (size_t i = 0; i < kThreadCount; i++) { - nsresult rv = - NS_NewNamedThread("AutoRefCnt Test", getter_AddRefs(threads[i]), - new nsThreadSafeAutoRefCntRunner); + for (auto& thread : threads) { + nsresult rv = NS_NewNamedThread("AutoRefCnt Test", getter_AddRefs(thread), + new nsThreadSafeAutoRefCntRunner); EXPECT_NS_SUCCEEDED(rv); } - for (size_t i = 0; i < kThreadCount; i++) { - threads[i]->Shutdown(); + for (const auto& thread : threads) { + thread->Shutdown(); } EXPECT_EQ(nsThreadSafeAutoRefCntRunner::sRefCnt, nsrefcnt(0)); EXPECT_EQ(nsThreadSafeAutoRefCntRunner::sIncToOne, nsThreadSafeAutoRefCntRunner::sDecToZero); } + +// Spawns kThreadCount threads each attempting kDecrementsPerThread +// decrements, then verifies the final refcount is 1 and that exactly +// aExpectedLimitHits threads hit the limit. +// kInitial is derived from aExpectedLimitHits so that exactly +// (kThreadCount - aExpectedLimitHits) threads can complete all their +// decrements; the rest hit the limit. +static void RunDecrementWithLimitThreaded(uint32_t aExpectedLimitHits) { + static const size_t kThreadCount = 4; + const nsrefcnt kInitial = + (kThreadCount - aExpectedLimitHits) * + nsThreadSafeAutoRefCntDecrementWithLimitRunner::kDecrementsPerThread + + 1; + nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt = kInitial; + nsThreadSafeAutoRefCntDecrementWithLimitRunner::sLimitHits = 0; + + nsCOMPtr threads[kThreadCount]; + for (auto& thread : threads) { + nsresult rv = + NS_NewNamedThread("AutoRefCnt Test", getter_AddRefs(thread), + new nsThreadSafeAutoRefCntDecrementWithLimitRunner); + EXPECT_NS_SUCCEEDED(rv); + } + for (const auto& thread : threads) { + thread->Shutdown(); + } + EXPECT_EQ(nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt, + nsrefcnt(1)); + EXPECT_EQ(nsThreadSafeAutoRefCntDecrementWithLimitRunner::sLimitHits, + uint32_t(aExpectedLimitHits)); +} + +// Verify DecrementWithLimit with no lost updates when the limit is never hit. +TEST(AutoRefCnt, ThreadSafeAutoRefCntDecrementWithLimitNoHit) +{ + RunDecrementWithLimitThreaded(0); +} + +// Verify DecrementWithLimit correctly enforces the limit. With kInitial == 1 +// (equal to Limit), all threads hit the limit on their first attempt, +// giving a deterministic sLimitHits == kThreadCount. +TEST(AutoRefCnt, ThreadSafeAutoRefCntDecrementWithLimitHit) +{ + static const size_t kThreadCount = 4; + RunDecrementWithLimitThreaded(kThreadCount); +} + +// Verify DecrementWithLimit performs exactly kDecrementsPerThread successful +// decrements before hitting the limit. Single-threaded for determinism. +TEST(AutoRefCnt, ThreadSafeAutoRefCntDecrementWithLimitSequential) +{ + const nsrefcnt kDecrementsPerThread = + nsThreadSafeAutoRefCntDecrementWithLimitRunner::kDecrementsPerThread; + // Initialize so exactly kDecrementsPerThread decrements succeed before + // hitting the limit at 1. + nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt = + kDecrementsPerThread + 1; + + size_t successes = 0; + while (true) { + auto [ok, count] = nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt + .DecrementWithLimit<1>(); + if (!ok) { + break; + } + successes++; + } + + EXPECT_EQ(successes, size_t(kDecrementsPerThread)); + EXPECT_EQ(nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt, + nsrefcnt(1)); +} diff -Nru firefox-esr-140.9.1esr/xpcom/threads/nsThreadPool.cpp firefox-esr-140.10.0esr/xpcom/threads/nsThreadPool.cpp --- firefox-esr-140.9.1esr/xpcom/threads/nsThreadPool.cpp 2026-04-03 15:52:36.000000000 +0000 +++ firefox-esr-140.10.0esr/xpcom/threads/nsThreadPool.cpp 2026-04-15 02:00:06.000000000 +0000 @@ -466,6 +466,10 @@ MOZ_ASSERT(gCurrentThreadPool.get() == this); gCurrentThreadPool.set(nullptr); + // Clear the thread's back-pointer into this pool so that the profiler's + // SamplerThread stops using it for this thread. + static_cast(current.get())->SetPoolThreadFreePtr(nullptr); + if (shutdownThreadOnExit) { ShutdownThread(current); }