def METHOD_NAME(self, op: cirq.Operation, _) -> cirq.OP_TREE:
    if not cirq.has_unitary(op):
        return NotImplemented
    mat = cirq.unitary(op)
    q0, q1 = op.qubits
    naive = cirq.two_qubit_matrix_to_cz_operations(q0, q1, mat, allow_partial_czs=False)
    temp = cirq.map_operations_and_unroll(
        cirq.Circuit(naive),
        lambda op, _: [cirq.H(op.qubits[1]), cirq.CNOT(*op.qubits), cirq.H(op.qubits[1])]
        if op.gate == cirq.CZ
        else op,
    )
    return cirq.merge_k_qubit_unitaries(
        temp, k=1, rewriter=lambda op: self._decompose_single_qubit_operation(op, -1)
    ).all_operations()