 
     // MARK: - Properties
 
-    private let EAGLContext: OpenGLES.EAGLContext
-    private let GLKView: GLKit.GLKView
-    private let CIContext: CoreImage.CIContext
+    private let EAGLContext: OpenGLES.EAGLContext?
+    private let GLKView: GLKit.GLKView?
+    private let CIContext: CoreImage.CIContext?
 
     /// The corresponding annotation.
     var annotation: BlurAnnotation? {

    // MARK: - GLKViewDelegate

    open func glkView(_ view: GLKit.GLKView, drawIn rect: CGRect) {
        glClearColor(0, 0, 0, 0)
        glClear(GLbitfield(GL_COLOR_BUFFER_BIT))

        if let image = annotation?.blurredImage {
            let drawableRect = CGRect(x: 0, y: 0, width: view.drawableWidth, height: view.drawableHeight)
            CIContext.draw(image, in: drawableRect, from: image.extent)
        }
    }
}


    public override init(frame: CGRect) {
        let bounds = CGRect(origin: CGPoint.zero, size: frame.size)
        
        if let EAGLContext = OpenGLES.EAGLContext(api: .openGLES2) {
            self.EAGLContext = EAGLContext
            GLKView = GLKit.GLKView(frame: bounds, context: EAGLContext)
            CIContext = CoreImage.CIContext(eaglContext: EAGLContext, options: [
                kCIContextUseSoftwareRenderer: false
            ])
        } else {
            EAGLContext = nil
            GLKView = nil
            CIContext = nil
        }

        super.init(frame: frame)

        isOpaque = false
        
        GLKView?.isUserInteractionEnabled = false
        GLKView?.delegate = self
        GLKView?.contentMode = .redraw
        
        if let glkView = GLKView {
            addSubview(glkView)
        }
    }

    public required init?(coder: NSCoder) {
