code: def outer(
      x1: Union[ivy.Array, ivy.NativeArray],
      x2: Union[ivy.Array, ivy.NativeArray],
      /,
      *,
      out: Optional[ivy.Array] = None,
  ) -> ivy.Array:
      """Return the outer product of two vectors ``x1`` and ``x2``.
  
      Parameters
      ----------
      x1
          first one-dimensional input array of size N. Should have a numeric data type.
          a(N,) array_like
          First input vector. Input is flattened if not already 1-dimensional.
      x2
          second one-dimensional input array of size M. Should have a numeric data type.
          b(M,) array_like
          Second input vector. Input is flattened if not already 1-dimensional.
      out
          optional output array, for writing the result to. It must have a shape that the
          inputs broadcast to.
  
      Returns
      -------
      ret
          a two-dimensional array containing the outer product and whose shape is (N, M).
          The returned array must have a data type determined by Type Promotion Rules.
  
  
      This function conforms to the `Array API Standard
      <https://data-apis.org/array-api/latest/>`_. This docstring is an extension of the
      `docstring <https://data-apis.org/array-api/latest/
      extensions/generated/array_api.linalg.outer.html>`_
      in the standard.
  
      Both the description and the type hints above assumes an array input for simplicity,
      but this function is *nestable*, and therefore also accepts :class:`ivy.Container`
      instances in place of any of the arguments.
  
      Examples
      --------
      >>> x = ivy.array([[1., 2.],[3., 4.]])
      >>> y = ivy.array([[5., 6.],[7., 8.]])
      >>> d = ivy.outer(x,y)
      >>> print(d)
      ivy.array([[ 5.,  6.,  7.,  8.],
                  [10., 12., 14., 16.],
                  [15., 18., 21., 24.],
                  [20., 24., 28., 32.]])
  
      >>> d = ivy.outer(x, 1)
      >>> print(d)
      ivy.array([[1.],
                  [2.],
                  [3.],
                  [4.]])
  
      A 3-D Example
  
      >>> x = ivy.array([[[1., 2.],
                          [3., 4.]],
                         [[5., 6.],
                          [7., 8.]]])
      >>> y = ivy.array([[[9., 10.],
                          [11., 12.]],
                         [[13., 14.],
                          [15., 16.]]])
      >>> d = ivy.outer(x, y)
      >>> print(d)
      ivy.array([[  9.,  10.,  11.,  12.,  13.,  14.,  15.,  16.],
                  [ 18.,  20.,  22.,  24.,  26.,  28.,  30.,  32.],
                  [ 27.,  30.,  33.,  36.,  39.,  42.,  45.,  48.],
                  [ 36.,  40.,  44.,  48.,  52.,  56.,  60.,  64.],
                  [ 45.,  50.,  55.,  60.,  65.,  70.,  75.,  80.],
                  [ 54.,  60.,  66.,  72.,  78.,  84.,  90.,  96.],
                  [ 63.,  70.,  77.,  84.,  91.,  98., 105., 112.],
                  [ 72.,  80.,  88.,  96., 104., 112., 120., 128.]])
      """
      return current_backend(x1, x2).outer(x1, x2, out=out)
  
imports: from typing import Union, Optional, Tuple, Literal, List, Sequence
  import ivy
  from ivy.utils.backend import current_backend
  from ivy.func_wrapper import handle_array_function, to_native_arrays_and_back, handle_out_argument, handle_nestable, handle_array_like_without_promotion, handle_device, handle_backend_invalid
  from ivy.utils.exceptions import handle_exceptions
label_desc: Use image node_id 15 for calling a global function with example usage: outer() and returns: current_backend