Best Python code snippet using websmith_python
sparse.py
Source:sparse.py  
1"""2SparseArray data structure3"""4from __future__ import division5import numbers6import operator7import re8import warnings9import numpy as np10from pandas._libs import index as libindex, lib11import pandas._libs.sparse as splib12from pandas._libs.sparse import BlockIndex, IntIndex13from pandas._libs.tslibs import NaT14import pandas.compat as compat15from pandas.compat.numpy import function as nv16from pandas.errors import PerformanceWarning17from pandas.core.dtypes.base import ExtensionDtype18from pandas.core.dtypes.cast import (19    astype_nansafe, construct_1d_arraylike_from_scalar, find_common_type,20    infer_dtype_from_scalar, maybe_convert_platform)21from pandas.core.dtypes.common import (22    is_array_like, is_bool_dtype, is_datetime64_any_dtype, is_dtype_equal,23    is_integer, is_list_like, is_object_dtype, is_scalar, is_string_dtype,24    pandas_dtype)25from pandas.core.dtypes.dtypes import register_extension_dtype26from pandas.core.dtypes.generic import (27    ABCIndexClass, ABCSeries, ABCSparseSeries)28from pandas.core.dtypes.missing import isna, na_value_for_dtype, notna29from pandas.core.accessor import PandasDelegate, delegate_names30import pandas.core.algorithms as algos31from pandas.core.arrays import ExtensionArray, ExtensionOpsMixin32from pandas.core.base import PandasObject33import pandas.core.common as com34from pandas.core.missing import interpolate_2d35import pandas.io.formats.printing as printing36# ----------------------------------------------------------------------------37# Dtype38@register_extension_dtype39class SparseDtype(ExtensionDtype):40    """41    Dtype for data stored in :class:`SparseArray`.42    This dtype implements the pandas ExtensionDtype interface.43    .. versionadded:: 0.24.044    Parameters45    ----------46    dtype : str, ExtensionDtype, numpy.dtype, type, default numpy.float6447        The dtype of the underlying array storing the non-fill value values.48    fill_value : scalar, optional49        The scalar value not stored in the SparseArray. By default, this50        depends on `dtype`.51        =========== ==========52        dtype       na_value53        =========== ==========54        float       ``np.nan``55        int         ``0``56        bool        ``False``57        datetime64  ``pd.NaT``58        timedelta64 ``pd.NaT``59        =========== ==========60        The default value may be overridden by specifying a `fill_value`.61    """62    # We include `_is_na_fill_value` in the metadata to avoid hash collisions63    # between SparseDtype(float, 0.0) and SparseDtype(float, nan).64    # Without is_na_fill_value in the comparison, those would be equal since65    # hash(nan) is (sometimes?) 0.66    _metadata = ('_dtype', '_fill_value', '_is_na_fill_value')67    def __init__(self, dtype=np.float64, fill_value=None):68        # type: (Union[str, np.dtype, 'ExtensionDtype', type], Any) -> None69        from pandas.core.dtypes.missing import na_value_for_dtype70        from pandas.core.dtypes.common import (71            pandas_dtype, is_string_dtype, is_scalar72        )73        if isinstance(dtype, type(self)):74            if fill_value is None:75                fill_value = dtype.fill_value76            dtype = dtype.subtype77        dtype = pandas_dtype(dtype)78        if is_string_dtype(dtype):79            dtype = np.dtype('object')80        if fill_value is None:81            fill_value = na_value_for_dtype(dtype)82        if not is_scalar(fill_value):83            raise ValueError("fill_value must be a scalar. Got {} "84                             "instead".format(fill_value))85        self._dtype = dtype86        self._fill_value = fill_value87    def __hash__(self):88        # Python3 doesn't inherit __hash__ when a base class overrides89        # __eq__, so we explicitly do it here.90        return super(SparseDtype, self).__hash__()91    def __eq__(self, other):92        # We have to override __eq__ to handle NA values in _metadata.93        # The base class does simple == checks, which fail for NA.94        if isinstance(other, compat.string_types):95            try:96                other = self.construct_from_string(other)97            except TypeError:98                return False99        if isinstance(other, type(self)):100            subtype = self.subtype == other.subtype101            if self._is_na_fill_value:102                # this case is complicated by two things:103                # SparseDtype(float, float(nan)) == SparseDtype(float, np.nan)104                # SparseDtype(float, np.nan)     != SparseDtype(float, pd.NaT)105                # i.e. we want to treat any floating-point NaN as equal, but106                # not a floating-point NaN and a datetime NaT.107                fill_value = (108                    other._is_na_fill_value and109                    isinstance(self.fill_value, type(other.fill_value)) or110                    isinstance(other.fill_value, type(self.fill_value))111                )112            else:113                fill_value = self.fill_value == other.fill_value114            return subtype and fill_value115        return False116    @property117    def fill_value(self):118        """119        The fill value of the array.120        Converting the SparseArray to a dense ndarray will fill the121        array with this value.122        .. warning::123           It's possible to end up with a SparseArray that has ``fill_value``124           values in ``sp_values``. This can occur, for example, when setting125           ``SparseArray.fill_value`` directly.126        """127        return self._fill_value128    @property129    def _is_na_fill_value(self):130        from pandas.core.dtypes.missing import isna131        return isna(self.fill_value)132    @property133    def _is_numeric(self):134        from pandas.core.dtypes.common import is_object_dtype135        return not is_object_dtype(self.subtype)136    @property137    def _is_boolean(self):138        from pandas.core.dtypes.common import is_bool_dtype139        return is_bool_dtype(self.subtype)140    @property141    def kind(self):142        """143        The sparse kind. Either 'integer', or 'block'.144        """145        return self.subtype.kind146    @property147    def type(self):148        return self.subtype.type149    @property150    def subtype(self):151        return self._dtype152    @property153    def name(self):154        return 'Sparse[{}, {}]'.format(self.subtype.name, self.fill_value)155    def __repr__(self):156        return self.name157    @classmethod158    def construct_array_type(cls):159        return SparseArray160    @classmethod161    def construct_from_string(cls, string):162        """163        Construct a SparseDtype from a string form.164        Parameters165        ----------166        string : str167            Can take the following forms.168            string           dtype169            ================ ============================170            'int'            SparseDtype[np.int64, 0]171            'Sparse'         SparseDtype[np.float64, nan]172            'Sparse[int]'    SparseDtype[np.int64, 0]173            'Sparse[int, 0]' SparseDtype[np.int64, 0]174            ================ ============================175            It is not possible to specify non-default fill values176            with a string. An argument like ``'Sparse[int, 1]'``177            will raise a ``TypeError`` because the default fill value178            for integers is 0.179        Returns180        -------181        SparseDtype182        """183        msg = "Could not construct SparseDtype from '{}'".format(string)184        if string.startswith("Sparse"):185            try:186                sub_type, has_fill_value = cls._parse_subtype(string)187                result = SparseDtype(sub_type)188            except Exception:189                raise TypeError(msg)190            else:191                msg = ("Could not construct SparseDtype from '{}'.\n\nIt "192                       "looks like the fill_value in the string is not "193                       "the default for the dtype. Non-default fill_values "194                       "are not supported. Use the 'SparseDtype()' "195                       "constructor instead.")196                if has_fill_value and str(result) != string:197                    raise TypeError(msg.format(string))198                return result199        else:200            raise TypeError(msg)201    @staticmethod202    def _parse_subtype(dtype):203        """204        Parse a string to get the subtype205        Parameters206        ----------207        dtype : str208            A string like209            * Sparse[subtype]210            * Sparse[subtype, fill_value]211        Returns212        -------213        subtype : str214        Raises215        ------216        ValueError217            When the subtype cannot be extracted.218        """219        xpr = re.compile(220            r"Sparse\[(?P<subtype>[^,]*)(, )?(?P<fill_value>.*?)?\]$"221        )222        m = xpr.match(dtype)223        has_fill_value = False224        if m:225            subtype = m.groupdict()['subtype']226            has_fill_value = m.groupdict()['fill_value'] or has_fill_value227        elif dtype == "Sparse":228            subtype = 'float64'229        else:230            raise ValueError("Cannot parse {}".format(dtype))231        return subtype, has_fill_value232    @classmethod233    def is_dtype(cls, dtype):234        dtype = getattr(dtype, 'dtype', dtype)235        if (isinstance(dtype, compat.string_types) and236                dtype.startswith("Sparse")):237            sub_type, _ = cls._parse_subtype(dtype)238            dtype = np.dtype(sub_type)239        elif isinstance(dtype, cls):240            return True241        return isinstance(dtype, np.dtype) or dtype == 'Sparse'242    def update_dtype(self, dtype):243        """244        Convert the SparseDtype to a new dtype.245        This takes care of converting the ``fill_value``.246        Parameters247        ----------248        dtype : Union[str, numpy.dtype, SparseDtype]249            The new dtype to use.250            * For a SparseDtype, it is simply returned251            * For a NumPy dtype (or str), the current fill value252              is converted to the new dtype, and a SparseDtype253              with `dtype` and the new fill value is returned.254        Returns255        -------256        SparseDtype257            A new SparseDtype with the corret `dtype` and fill value258            for that `dtype`.259        Raises260        ------261        ValueError262            When the current fill value cannot be converted to the263            new `dtype` (e.g. trying to convert ``np.nan`` to an264            integer dtype).265        Examples266        --------267        >>> SparseDtype(int, 0).update_dtype(float)268        Sparse[float64, 0.0]269        >>> SparseDtype(int, 1).update_dtype(SparseDtype(float, np.nan))270        Sparse[float64, nan]271        """272        cls = type(self)273        dtype = pandas_dtype(dtype)274        if not isinstance(dtype, cls):275            fill_value = astype_nansafe(np.array(self.fill_value),276                                        dtype).item()277            dtype = cls(dtype, fill_value=fill_value)278        return dtype279    @property280    def _subtype_with_str(self):281        """282        Whether the SparseDtype's subtype should be considered ``str``.283        Typically, pandas will store string data in an object-dtype array.284        When converting values to a dtype, e.g. in ``.astype``, we need to285        be more specific, we need the actual underlying type.286        Returns287        -------288        >>> SparseDtype(int, 1)._subtype_with_str289        dtype('int64')290        >>> SparseDtype(object, 1)._subtype_with_str291        dtype('O')292        >>> dtype = SparseDtype(str, '')293        >>> dtype.subtype294        dtype('O')295        >>> dtype._subtype_with_str296        str297        """298        if isinstance(self.fill_value, compat.string_types):299            return type(self.fill_value)300        return self.subtype301# ----------------------------------------------------------------------------302# Array303_sparray_doc_kwargs = dict(klass='SparseArray')304def _get_fill(arr):305    # type: (SparseArray) -> ndarray306    """307    Create a 0-dim ndarray containing the fill value308    Parameters309    ----------310    arr : SparseArray311    Returns312    -------313    fill_value : ndarray314        0-dim ndarray with just the fill value.315    Notes316    -----317    coerce fill_value to arr dtype if possible318    int64 SparseArray can have NaN as fill_value if there is no missing319    """320    try:321        return np.asarray(arr.fill_value, dtype=arr.dtype.subtype)322    except ValueError:323        return np.asarray(arr.fill_value)324def _sparse_array_op(left, right, op, name):325    """326    Perform a binary operation between two arrays.327    Parameters328    ----------329    left : Union[SparseArray, ndarray]330    right : Union[SparseArray, ndarray]331    op : Callable332        The binary operation to perform333    name str334        Name of the callable.335    Returns336    -------337    SparseArray338    """339    # type: (SparseArray, SparseArray, Callable, str) -> Any340    if name.startswith('__'):341        # For lookups in _libs.sparse we need non-dunder op name342        name = name[2:-2]343    # dtype used to find corresponding sparse method344    ltype = left.dtype.subtype345    rtype = right.dtype.subtype346    if not is_dtype_equal(ltype, rtype):347        subtype = find_common_type([ltype, rtype])348        ltype = SparseDtype(subtype, left.fill_value)349        rtype = SparseDtype(subtype, right.fill_value)350        # TODO(GH-23092): pass copy=False. Need to fix astype_nansafe351        left = left.astype(ltype)352        right = right.astype(rtype)353        dtype = ltype.subtype354    else:355        dtype = ltype356    # dtype the result must have357    result_dtype = None358    if left.sp_index.ngaps == 0 or right.sp_index.ngaps == 0:359        with np.errstate(all='ignore'):360            result = op(left.get_values(), right.get_values())361            fill = op(_get_fill(left), _get_fill(right))362        if left.sp_index.ngaps == 0:363            index = left.sp_index364        else:365            index = right.sp_index366    elif left.sp_index.equals(right.sp_index):367        with np.errstate(all='ignore'):368            result = op(left.sp_values, right.sp_values)369            fill = op(_get_fill(left), _get_fill(right))370        index = left.sp_index371    else:372        if name[0] == 'r':373            left, right = right, left374            name = name[1:]375        if name in ('and', 'or') and dtype == 'bool':376            opname = 'sparse_{name}_uint8'.format(name=name)377            # to make template simple, cast here378            left_sp_values = left.sp_values.view(np.uint8)379            right_sp_values = right.sp_values.view(np.uint8)380            result_dtype = np.bool381        else:382            opname = 'sparse_{name}_{dtype}'.format(name=name, dtype=dtype)383            left_sp_values = left.sp_values384            right_sp_values = right.sp_values385        sparse_op = getattr(splib, opname)386        with np.errstate(all='ignore'):387            result, index, fill = sparse_op(388                left_sp_values, left.sp_index, left.fill_value,389                right_sp_values, right.sp_index, right.fill_value)390    if result_dtype is None:391        result_dtype = result.dtype392    return _wrap_result(name, result, index, fill, dtype=result_dtype)393def _wrap_result(name, data, sparse_index, fill_value, dtype=None):394    """395    wrap op result to have correct dtype396    """397    if name.startswith('__'):398        # e.g. __eq__ --> eq399        name = name[2:-2]400    if name in ('eq', 'ne', 'lt', 'gt', 'le', 'ge'):401        dtype = np.bool402    fill_value = lib.item_from_zerodim(fill_value)403    if is_bool_dtype(dtype):404        # fill_value may be np.bool_405        fill_value = bool(fill_value)406    return SparseArray(data,407                       sparse_index=sparse_index,408                       fill_value=fill_value,409                       dtype=dtype)410class SparseArray(PandasObject, ExtensionArray, ExtensionOpsMixin):411    """412    An ExtensionArray for storing sparse data.413    .. versionchanged:: 0.24.0414       Implements the ExtensionArray interface.415    Parameters416    ----------417    data : array-like418        A dense array of values to store in the SparseArray. This may contain419        `fill_value`.420    sparse_index : SparseIndex, optional421    index : Index422    fill_value : scalar, optional423        Elements in `data` that are `fill_value` are not stored in the424        SparseArray. For memory savings, this should be the most common value425        in `data`. By default, `fill_value` depends on the dtype of `data`:426        =========== ==========427        data.dtype  na_value428        =========== ==========429        float       ``np.nan``430        int         ``0``431        bool        False432        datetime64  ``pd.NaT``433        timedelta64 ``pd.NaT``434        =========== ==========435        The fill value is potentiall specified in three ways. In order of436        precedence, these are437        1. The `fill_value` argument438        2. ``dtype.fill_value`` if `fill_value` is None and `dtype` is439           a ``SparseDtype``440        3. ``data.dtype.fill_value`` if `fill_value` is None and `dtype`441           is not a ``SparseDtype`` and `data` is a ``SparseArray``.442    kind : {'integer', 'block'}, default 'integer'443        The type of storage for sparse locations.444        * 'block': Stores a `block` and `block_length` for each445          contiguous *span* of sparse values. This is best when446          sparse data tends to be clumped together, with large447          regsions of ``fill-value`` values between sparse values.448        * 'integer': uses an integer to store the location of449          each sparse value.450    dtype : np.dtype or SparseDtype, optional451        The dtype to use for the SparseArray. For numpy dtypes, this452        determines the dtype of ``self.sp_values``. For SparseDtype,453        this determines ``self.sp_values`` and ``self.fill_value``.454    copy : bool, default False455        Whether to explicitly copy the incoming `data` array.456    """457    __array_priority__ = 15458    _pandas_ftype = 'sparse'459    _subtyp = 'sparse_array'  # register ABCSparseArray460    def __init__(self, data, sparse_index=None, index=None, fill_value=None,461                 kind='integer', dtype=None, copy=False):462        from pandas.core.internals import SingleBlockManager463        if isinstance(data, SingleBlockManager):464            data = data.internal_values()465        if fill_value is None and isinstance(dtype, SparseDtype):466            fill_value = dtype.fill_value467        if isinstance(data, (type(self), ABCSparseSeries)):468            # disable normal inference on dtype, sparse_index, & fill_value469            if sparse_index is None:470                sparse_index = data.sp_index471            if fill_value is None:472                fill_value = data.fill_value473            if dtype is None:474                dtype = data.dtype475            # TODO: make kind=None, and use data.kind?476            data = data.sp_values477        # Handle use-provided dtype478        if isinstance(dtype, compat.string_types):479            # Two options: dtype='int', regular numpy dtype480            # or dtype='Sparse[int]', a sparse dtype481            try:482                dtype = SparseDtype.construct_from_string(dtype)483            except TypeError:484                dtype = pandas_dtype(dtype)485        if isinstance(dtype, SparseDtype):486            if fill_value is None:487                fill_value = dtype.fill_value488            dtype = dtype.subtype489        if index is not None and not is_scalar(data):490            raise Exception("must only pass scalars with an index ")491        if is_scalar(data):492            if index is not None:493                if data is None:494                    data = np.nan495            if index is not None:496                npoints = len(index)497            elif sparse_index is None:498                npoints = 1499            else:500                npoints = sparse_index.length501            dtype = infer_dtype_from_scalar(data)[0]502            data = construct_1d_arraylike_from_scalar(503                data, npoints, dtype504            )505        if dtype is not None:506            dtype = pandas_dtype(dtype)507        # TODO: disentangle the fill_value dtype inference from508        # dtype inference509        if data is None:510            # XXX: What should the empty dtype be? Object or float?511            data = np.array([], dtype=dtype)512        if not is_array_like(data):513            try:514                # probably shared code in sanitize_series515                from pandas.core.internals.construction import sanitize_array516                data = sanitize_array(data, index=None)517            except ValueError:518                # NumPy may raise a ValueError on data like [1, []]519                # we retry with object dtype here.520                if dtype is None:521                    dtype = object522                    data = np.atleast_1d(np.asarray(data, dtype=dtype))523                else:524                    raise525        if copy:526            # TODO: avoid double copy when dtype forces cast.527            data = data.copy()528        if fill_value is None:529            fill_value_dtype = data.dtype if dtype is None else dtype530            if fill_value_dtype is None:531                fill_value = np.nan532            else:533                fill_value = na_value_for_dtype(fill_value_dtype)534        if isinstance(data, type(self)) and sparse_index is None:535            sparse_index = data._sparse_index536            sparse_values = np.asarray(data.sp_values, dtype=dtype)537        elif sparse_index is None:538            sparse_values, sparse_index, fill_value = make_sparse(539                data, kind=kind, fill_value=fill_value, dtype=dtype540            )541        else:542            sparse_values = np.asarray(data, dtype=dtype)543            if len(sparse_values) != sparse_index.npoints:544                raise AssertionError("Non array-like type {type} must "545                                     "have the same length as the index"546                                     .format(type=type(sparse_values)))547        self._sparse_index = sparse_index548        self._sparse_values = sparse_values549        self._dtype = SparseDtype(sparse_values.dtype, fill_value)550    @classmethod551    def _simple_new(cls, sparse_array, sparse_index, dtype):552        # type: (np.ndarray, SparseIndex, SparseDtype) -> 'SparseArray'553        new = cls([])554        new._sparse_index = sparse_index555        new._sparse_values = sparse_array556        new._dtype = dtype557        return new558    def __array__(self, dtype=None, copy=True):559        fill_value = self.fill_value560        if self.sp_index.ngaps == 0:561            # Compat for na dtype and int values.562            return self.sp_values563        if dtype is None:564            # Can NumPy represent this type?565            # If not, `np.result_type` will raise. We catch that566            # and return object.567            if is_datetime64_any_dtype(self.sp_values.dtype):568                # However, we *do* special-case the common case of569                # a datetime64 with pandas NaT.570                if fill_value is NaT:571                    # Can't put pd.NaT in a datetime64[ns]572                    fill_value = np.datetime64('NaT')573            try:574                dtype = np.result_type(self.sp_values.dtype, type(fill_value))575            except TypeError:576                dtype = object577        out = np.full(self.shape, fill_value, dtype=dtype)578        out[self.sp_index.to_int_index().indices] = self.sp_values579        return out580    def __setitem__(self, key, value):581        # I suppose we could allow setting of non-fill_value elements.582        # TODO(SparseArray.__setitem__): remove special cases in583        # ExtensionBlock.where584        msg = "SparseArray does not support item assignment via setitem"585        raise TypeError(msg)586    @classmethod587    def _from_sequence(cls, scalars, dtype=None, copy=False):588        return cls(scalars, dtype=dtype)589    @classmethod590    def _from_factorized(cls, values, original):591        return cls(values, dtype=original.dtype)592    # ------------------------------------------------------------------------593    # Data594    # ------------------------------------------------------------------------595    @property596    def sp_index(self):597        """598        The SparseIndex containing the location of non- ``fill_value`` points.599        """600        return self._sparse_index601    @property602    def sp_values(self):603        """604        An ndarray containing the non- ``fill_value`` values.605        Examples606        --------607        >>> s = SparseArray([0, 0, 1, 0, 2], fill_value=0)608        >>> s.sp_values609        array([1, 2])610        """611        return self._sparse_values612    @property613    def dtype(self):614        return self._dtype615    @property616    def fill_value(self):617        """618        Elements in `data` that are `fill_value` are not stored.619        For memory savings, this should be the most common value in the array.620        """621        return self.dtype.fill_value622    @fill_value.setter623    def fill_value(self, value):624        self._dtype = SparseDtype(self.dtype.subtype, value)625    @property626    def kind(self):627        """628        The kind of sparse index for this array. One of {'integer', 'block'}.629        """630        if isinstance(self.sp_index, IntIndex):631            return 'integer'632        else:633            return 'block'634    @property635    def _valid_sp_values(self):636        sp_vals = self.sp_values637        mask = notna(sp_vals)638        return sp_vals[mask]639    def __len__(self):640        return self.sp_index.length641    @property642    def _null_fill_value(self):643        return self._dtype._is_na_fill_value644    def _fill_value_matches(self, fill_value):645        if self._null_fill_value:646            return isna(fill_value)647        else:648            return self.fill_value == fill_value649    @property650    def nbytes(self):651        return self.sp_values.nbytes + self.sp_index.nbytes652    @property653    def density(self):654        """655        The percent of non- ``fill_value`` points, as decimal.656        Examples657        --------658        >>> s = SparseArray([0, 0, 1, 1, 1], fill_value=0)659        >>> s.density660        0.6661        """662        r = float(self.sp_index.npoints) / float(self.sp_index.length)663        return r664    @property665    def npoints(self):666        """667        The number of non- ``fill_value`` points.668        Examples669        --------670        >>> s = SparseArray([0, 0, 1, 1, 1], fill_value=0)671        >>> s.npoints672        3673        """674        return self.sp_index.npoints675    @property676    def values(self):677        """678        Dense values679        """680        return self.to_dense()681    def isna(self):682        from pandas import isna683        # If null fill value, we want SparseDtype[bool, true]684        # to preserve the same memory usage.685        dtype = SparseDtype(bool, self._null_fill_value)686        return type(self)._simple_new(isna(self.sp_values),687                                      self.sp_index, dtype)688    def fillna(self, value=None, method=None, limit=None):689        """690        Fill missing values with `value`.691        Parameters692        ----------693        value : scalar, optional694        method : str, optional695            .. warning::696               Using 'method' will result in high memory use,697               as all `fill_value` methods will be converted to698               an in-memory ndarray699        limit : int, optional700        Returns701        -------702        SparseArray703        Notes704        -----705        When `value` is specified, the result's ``fill_value`` depends on706        ``self.fill_value``. The goal is to maintain low-memory use.707        If ``self.fill_value`` is NA, the result dtype will be708        ``SparseDtype(self.dtype, fill_value=value)``. This will preserve709        amount of memory used before and after filling.710        When ``self.fill_value`` is not NA, the result dtype will be711        ``self.dtype``. Again, this preserves the amount of memory used.712        """713        if ((method is None and value is None) or714                (method is not None and value is not None)):715            raise ValueError("Must specify one of 'method' or 'value'.")716        elif method is not None:717            msg = "fillna with 'method' requires high memory usage."718            warnings.warn(msg, PerformanceWarning)719            filled = interpolate_2d(np.asarray(self), method=method,720                                    limit=limit)721            return type(self)(filled, fill_value=self.fill_value)722        else:723            new_values = np.where(isna(self.sp_values), value, self.sp_values)724            if self._null_fill_value:725                # This is essentially just updating the dtype.726                new_dtype = SparseDtype(self.dtype.subtype, fill_value=value)727            else:728                new_dtype = self.dtype729        return self._simple_new(new_values, self._sparse_index, new_dtype)730    def shift(self, periods=1, fill_value=None):731        if not len(self) or periods == 0:732            return self.copy()733        if isna(fill_value):734            fill_value = self.dtype.na_value735        subtype = np.result_type(fill_value, self.dtype.subtype)736        if subtype != self.dtype.subtype:737            # just coerce up front738            arr = self.astype(SparseDtype(subtype, self.fill_value))739        else:740            arr = self741        empty = self._from_sequence(742            [fill_value] * min(abs(periods), len(self)),743            dtype=arr.dtype744        )745        if periods > 0:746            a = empty747            b = arr[:-periods]748        else:749            a = arr[abs(periods):]750            b = empty751        return arr._concat_same_type([a, b])752    def _first_fill_value_loc(self):753        """754        Get the location of the first missing value.755        Returns756        -------757        int758        """759        if len(self) == 0 or self.sp_index.npoints == len(self):760            return -1761        indices = self.sp_index.to_int_index().indices762        if not len(indices) or indices[0] > 0:763            return 0764        diff = indices[1:] - indices[:-1]765        return np.searchsorted(diff, 2) + 1766    def unique(self):767        uniques = list(algos.unique(self.sp_values))768        fill_loc = self._first_fill_value_loc()769        if fill_loc >= 0:770            uniques.insert(fill_loc, self.fill_value)771        return type(self)._from_sequence(uniques, dtype=self.dtype)772    def _values_for_factorize(self):773        # Still override this for hash_pandas_object774        return np.asarray(self), self.fill_value775    def factorize(self, na_sentinel=-1):776        # Currently, ExtensionArray.factorize -> Tuple[ndarray, EA]777        # The sparsity on this is backwards from what Sparse would want. Want778        # ExtensionArray.factorize -> Tuple[EA, EA]779        # Given that we have to return a dense array of labels, why bother780        # implementing an efficient factorize?781        labels, uniques = algos.factorize(np.asarray(self),782                                          na_sentinel=na_sentinel)783        uniques = SparseArray(uniques, dtype=self.dtype)784        return labels, uniques785    def value_counts(self, dropna=True):786        """787        Returns a Series containing counts of unique values.788        Parameters789        ----------790        dropna : boolean, default True791            Don't include counts of NaN, even if NaN is in sp_values.792        Returns793        -------794        counts : Series795        """796        from pandas import Index, Series797        keys, counts = algos._value_counts_arraylike(self.sp_values,798                                                     dropna=dropna)799        fcounts = self.sp_index.ngaps800        if fcounts > 0:801            if self._null_fill_value and dropna:802                pass803            else:804                if self._null_fill_value:805                    mask = isna(keys)806                else:807                    mask = keys == self.fill_value808                if mask.any():809                    counts[mask] += fcounts810                else:811                    keys = np.insert(keys, 0, self.fill_value)812                    counts = np.insert(counts, 0, fcounts)813        if not isinstance(keys, ABCIndexClass):814            keys = Index(keys)815        result = Series(counts, index=keys)816        return result817    # --------818    # Indexing819    # --------820    def __getitem__(self, key):821        if isinstance(key, tuple):822            if len(key) > 1:823                raise IndexError("too many indices for array.")824            key = key[0]825        if is_integer(key):826            return self._get_val_at(key)827        elif isinstance(key, tuple):828            data_slice = self.values[key]829        elif isinstance(key, slice):830            # special case to preserve dtypes831            if key == slice(None):832                return self.copy()833            # TODO: this logic is surely elsewhere834            # TODO: this could be more efficient835            indices = np.arange(len(self), dtype=np.int32)[key]836            return self.take(indices)837        else:838            # TODO: I think we can avoid densifying when masking a839            # boolean SparseArray with another. Need to look at the840            # key's fill_value for True / False, and then do an intersection841            # on the indicies of the sp_values.842            if isinstance(key, SparseArray):843                if is_bool_dtype(key):844                    key = key.to_dense()845                else:846                    key = np.asarray(key)847            if com.is_bool_indexer(key) and len(self) == len(key):848                return self.take(np.arange(len(key), dtype=np.int32)[key])849            elif hasattr(key, '__len__'):850                return self.take(key)851            else:852                raise ValueError("Cannot slice with '{}'".format(key))853        return type(self)(data_slice, kind=self.kind)854    def _get_val_at(self, loc):855        n = len(self)856        if loc < 0:857            loc += n858        if loc >= n or loc < 0:859            raise IndexError('Out of bounds access')860        sp_loc = self.sp_index.lookup(loc)861        if sp_loc == -1:862            return self.fill_value863        else:864            return libindex.get_value_at(self.sp_values, sp_loc)865    def take(self, indices, allow_fill=False, fill_value=None):866        if is_scalar(indices):867            raise ValueError("'indices' must be an array, not a "868                             "scalar '{}'.".format(indices))869        indices = np.asarray(indices, dtype=np.int32)870        if indices.size == 0:871            result = []872            kwargs = {'dtype': self.dtype}873        elif allow_fill:874            result = self._take_with_fill(indices, fill_value=fill_value)875            kwargs = {}876        else:877            result = self._take_without_fill(indices)878            kwargs = {'dtype': self.dtype}879        return type(self)(result, fill_value=self.fill_value, kind=self.kind,880                          **kwargs)881    def _take_with_fill(self, indices, fill_value=None):882        if fill_value is None:883            fill_value = self.dtype.na_value884        if indices.min() < -1:885            raise ValueError("Invalid value in 'indices'. Must be between -1 "886                             "and the length of the array.")887        if indices.max() >= len(self):888            raise IndexError("out of bounds value in 'indices'.")889        if len(self) == 0:890            # Empty... Allow taking only if all empty891            if (indices == -1).all():892                dtype = np.result_type(self.sp_values, type(fill_value))893                taken = np.empty_like(indices, dtype=dtype)894                taken.fill(fill_value)895                return taken896            else:897                raise IndexError('cannot do a non-empty take from an empty '898                                 'axes.')899        sp_indexer = self.sp_index.lookup_array(indices)900        if self.sp_index.npoints == 0:901            # Avoid taking from the empty self.sp_values902            taken = np.full(sp_indexer.shape, fill_value=fill_value,903                            dtype=np.result_type(type(fill_value)))904        else:905            taken = self.sp_values.take(sp_indexer)906            # sp_indexer may be -1 for two reasons907            # 1.) we took for an index of -1 (new)908            # 2.) we took a value that was self.fill_value (old)909            new_fill_indices = indices == -1910            old_fill_indices = (sp_indexer == -1) & ~new_fill_indices911            # Fill in two steps.912            # Old fill values913            # New fill values914            # potentially coercing to a new dtype at each stage.915            m0 = sp_indexer[old_fill_indices] < 0916            m1 = sp_indexer[new_fill_indices] < 0917            result_type = taken.dtype918            if m0.any():919                result_type = np.result_type(result_type,920                                             type(self.fill_value))921                taken = taken.astype(result_type)922                taken[old_fill_indices] = self.fill_value923            if m1.any():924                result_type = np.result_type(result_type, type(fill_value))925                taken = taken.astype(result_type)926                taken[new_fill_indices] = fill_value927        return taken928    def _take_without_fill(self, indices):929        to_shift = indices < 0930        indices = indices.copy()931        n = len(self)932        if (indices.max() >= n) or (indices.min() < -n):933            if n == 0:934                raise IndexError("cannot do a non-empty take from an "935                                 "empty axes.")936            else:937                raise IndexError("out of bounds value in 'indices'.")938        if to_shift.any():939            indices[to_shift] += n940        if self.sp_index.npoints == 0:941            # edge case in take...942            # I think just return943            out = np.full(indices.shape, self.fill_value,944                          dtype=np.result_type(type(self.fill_value)))945            arr, sp_index, fill_value = make_sparse(out,946                                                    fill_value=self.fill_value)947            return type(self)(arr, sparse_index=sp_index,948                              fill_value=fill_value)949        sp_indexer = self.sp_index.lookup_array(indices)950        taken = self.sp_values.take(sp_indexer)951        fillable = (sp_indexer < 0)952        if fillable.any():953            # TODO: may need to coerce array to fill value954            result_type = np.result_type(taken, type(self.fill_value))955            taken = taken.astype(result_type)956            taken[fillable] = self.fill_value957        return taken958    def searchsorted(self, v, side="left", sorter=None):959        msg = "searchsorted requires high memory usage."960        warnings.warn(msg, PerformanceWarning, stacklevel=2)961        if not is_scalar(v):962            v = np.asarray(v)963        v = np.asarray(v)964        return np.asarray(self, dtype=self.dtype.subtype).searchsorted(965            v, side, sorter966        )967    def copy(self, deep=False):968        if deep:969            values = self.sp_values.copy()970        else:971            values = self.sp_values972        return self._simple_new(values, self.sp_index, self.dtype)973    @classmethod974    def _concat_same_type(cls, to_concat):975        fill_values = [x.fill_value for x in to_concat]976        fill_value = fill_values[0]977        # np.nan isn't a singleton, so we may end up with multiple978        # NaNs here, so we ignore tha all NA case too.979        if not (len(set(fill_values)) == 1 or isna(fill_values).all()):980            warnings.warn("Concatenating sparse arrays with multiple fill "981                          "values: '{}'. Picking the first and "982                          "converting the rest.".format(fill_values),983                          PerformanceWarning,984                          stacklevel=6)985            keep = to_concat[0]986            to_concat2 = [keep]987            for arr in to_concat[1:]:988                to_concat2.append(cls(np.asarray(arr), fill_value=fill_value))989            to_concat = to_concat2990        values = []991        length = 0992        if to_concat:993            sp_kind = to_concat[0].kind994        else:995            sp_kind = 'integer'996        if sp_kind == 'integer':997            indices = []998            for arr in to_concat:999                idx = arr.sp_index.to_int_index().indices.copy()1000                idx += length  # TODO: wraparound1001                length += arr.sp_index.length1002                values.append(arr.sp_values)1003                indices.append(idx)1004            data = np.concatenate(values)1005            indices = np.concatenate(indices)1006            sp_index = IntIndex(length, indices)1007        else:1008            # when concatentating block indices, we don't claim that you'll1009            # get an identical index as concating the values and then1010            # creating a new index. We don't want to spend the time trying1011            # to merge blocks across arrays in `to_concat`, so the resulting1012            # BlockIndex may have more blocs.1013            blengths = []1014            blocs = []1015            for arr in to_concat:1016                idx = arr.sp_index.to_block_index()1017                values.append(arr.sp_values)1018                blocs.append(idx.blocs.copy() + length)1019                blengths.append(idx.blengths)1020                length += arr.sp_index.length1021            data = np.concatenate(values)1022            blocs = np.concatenate(blocs)1023            blengths = np.concatenate(blengths)1024            sp_index = BlockIndex(length, blocs, blengths)1025        return cls(data, sparse_index=sp_index, fill_value=fill_value)1026    def astype(self, dtype=None, copy=True):1027        """1028        Change the dtype of a SparseArray.1029        The output will always be a SparseArray. To convert to a dense1030        ndarray with a certain dtype, use :meth:`numpy.asarray`.1031        Parameters1032        ----------1033        dtype : np.dtype or ExtensionDtype1034            For SparseDtype, this changes the dtype of1035            ``self.sp_values`` and the ``self.fill_value``.1036            For other dtypes, this only changes the dtype of1037            ``self.sp_values``.1038        copy : bool, default True1039            Whether to ensure a copy is made, even if not necessary.1040        Returns1041        -------1042        SparseArray1043        Examples1044        --------1045        >>> arr = SparseArray([0, 0, 1, 2])1046        >>> arr1047        [0, 0, 1, 2]1048        Fill: 01049        IntIndex1050        Indices: array([2, 3], dtype=int32)1051        >>> arr.astype(np.dtype('int32'))1052        [0, 0, 1, 2]1053        Fill: 01054        IntIndex1055        Indices: array([2, 3], dtype=int32)1056        Using a NumPy dtype with a different kind (e.g. float) will coerce1057        just ``self.sp_values``.1058        >>> arr.astype(np.dtype('float64'))1059        ... # doctest: +NORMALIZE_WHITESPACE1060        [0, 0, 1.0, 2.0]1061        Fill: 01062        IntIndex1063        Indices: array([2, 3], dtype=int32)1064        Use a SparseDtype if you wish to be change the fill value as well.1065        >>> arr.astype(SparseDtype("float64", fill_value=np.nan))1066        ... # doctest: +NORMALIZE_WHITESPACE1067        [nan, nan, 1.0, 2.0]1068        Fill: nan1069        IntIndex1070        Indices: array([2, 3], dtype=int32)1071        """1072        dtype = self.dtype.update_dtype(dtype)1073        subtype = dtype._subtype_with_str1074        sp_values = astype_nansafe(self.sp_values,1075                                   subtype,1076                                   copy=copy)1077        if sp_values is self.sp_values and copy:1078            sp_values = sp_values.copy()1079        return self._simple_new(sp_values,1080                                self.sp_index,1081                                dtype)1082    def map(self, mapper):1083        """1084        Map categories using input correspondence (dict, Series, or function).1085        Parameters1086        ----------1087        mapper : dict, Series, callable1088            The correspondence from old values to new.1089        Returns1090        -------1091        SparseArray1092            The output array will have the same density as the input.1093            The output fill value will be the result of applying the1094            mapping to ``self.fill_value``1095        Examples1096        --------1097        >>> arr = pd.SparseArray([0, 1, 2])1098        >>> arr.apply(lambda x: x + 10)1099        [10, 11, 12]1100        Fill: 101101        IntIndex1102        Indices: array([1, 2], dtype=int32)1103        >>> arr.apply({0: 10, 1: 11, 2: 12})1104        [10, 11, 12]1105        Fill: 101106        IntIndex1107        Indices: array([1, 2], dtype=int32)1108        >>> arr.apply(pd.Series([10, 11, 12], index=[0, 1, 2]))1109        [10, 11, 12]1110        Fill: 101111        IntIndex1112        Indices: array([1, 2], dtype=int32)1113        """1114        # this is used in apply.1115        # We get hit since we're an "is_extension_type" but regular extension1116        # types are not hit. This may be worth adding to the interface.1117        if isinstance(mapper, ABCSeries):1118            mapper = mapper.to_dict()1119        if isinstance(mapper, compat.Mapping):1120            fill_value = mapper.get(self.fill_value, self.fill_value)1121            sp_values = [mapper.get(x, None) for x in self.sp_values]1122        else:1123            fill_value = mapper(self.fill_value)1124            sp_values = [mapper(x) for x in self.sp_values]1125        return type(self)(sp_values, sparse_index=self.sp_index,1126                          fill_value=fill_value)1127    def to_dense(self):1128        """1129        Convert SparseArray to a NumPy array.1130        Returns1131        -------1132        arr : NumPy array1133        """1134        return np.asarray(self, dtype=self.sp_values.dtype)1135    # TODO: Look into deprecating this in favor of `to_dense`.1136    get_values = to_dense1137    # ------------------------------------------------------------------------1138    # IO1139    # ------------------------------------------------------------------------1140    def __setstate__(self, state):1141        """Necessary for making this object picklable"""1142        if isinstance(state, tuple):1143            # Compat for pandas < 0.24.01144            nd_state, (fill_value, sp_index) = state1145            sparse_values = np.array([])1146            sparse_values.__setstate__(nd_state)1147            self._sparse_values = sparse_values1148            self._sparse_index = sp_index1149            self._dtype = SparseDtype(sparse_values.dtype, fill_value)1150        else:1151            self.__dict__.update(state)1152    def nonzero(self):1153        if self.fill_value == 0:1154            return self.sp_index.to_int_index().indices,1155        else:1156            return self.sp_index.to_int_index().indices[self.sp_values != 0],1157    # ------------------------------------------------------------------------1158    # Reductions1159    # ------------------------------------------------------------------------1160    def _reduce(self, name, skipna=True, **kwargs):1161        method = getattr(self, name, None)1162        if method is None:1163            raise TypeError("cannot perform {name} with type {dtype}".format(1164                name=name, dtype=self.dtype))1165        if skipna:1166            arr = self1167        else:1168            arr = self.dropna()1169        # we don't support these kwargs.1170        # They should only be present when called via pandas, so do it here.1171        # instead of in `any` / `all` (which will raise if they're present,1172        # thanks to nv.validate1173        kwargs.pop('filter_type', None)1174        kwargs.pop('numeric_only', None)1175        kwargs.pop('op', None)1176        return getattr(arr, name)(**kwargs)1177    def all(self, axis=None, *args, **kwargs):1178        """1179        Tests whether all elements evaluate True1180        Returns1181        -------1182        all : bool1183        See Also1184        --------1185        numpy.all1186        """1187        nv.validate_all(args, kwargs)1188        values = self.sp_values1189        if len(values) != len(self) and not np.all(self.fill_value):1190            return False1191        return values.all()1192    def any(self, axis=0, *args, **kwargs):1193        """1194        Tests whether at least one of elements evaluate True1195        Returns1196        -------1197        any : bool1198        See Also1199        --------1200        numpy.any1201        """1202        nv.validate_any(args, kwargs)1203        values = self.sp_values1204        if len(values) != len(self) and np.any(self.fill_value):1205            return True1206        return values.any().item()1207    def sum(self, axis=0, *args, **kwargs):1208        """1209        Sum of non-NA/null values1210        Returns1211        -------1212        sum : float1213        """1214        nv.validate_sum(args, kwargs)1215        valid_vals = self._valid_sp_values1216        sp_sum = valid_vals.sum()1217        if self._null_fill_value:1218            return sp_sum1219        else:1220            nsparse = self.sp_index.ngaps1221            return sp_sum + self.fill_value * nsparse1222    def cumsum(self, axis=0, *args, **kwargs):1223        """1224        Cumulative sum of non-NA/null values.1225        When performing the cumulative summation, any non-NA/null values will1226        be skipped. The resulting SparseArray will preserve the locations of1227        NaN values, but the fill value will be `np.nan` regardless.1228        Parameters1229        ----------1230        axis : int or None1231            Axis over which to perform the cumulative summation. If None,1232            perform cumulative summation over flattened array.1233        Returns1234        -------1235        cumsum : SparseArray1236        """1237        nv.validate_cumsum(args, kwargs)1238        if axis is not None and axis >= self.ndim:  # Mimic ndarray behaviour.1239            raise ValueError("axis(={axis}) out of bounds".format(axis=axis))1240        if not self._null_fill_value:1241            return SparseArray(self.to_dense()).cumsum()1242        return SparseArray(self.sp_values.cumsum(), sparse_index=self.sp_index,1243                           fill_value=self.fill_value)1244    def mean(self, axis=0, *args, **kwargs):1245        """1246        Mean of non-NA/null values1247        Returns1248        -------1249        mean : float1250        """1251        nv.validate_mean(args, kwargs)1252        valid_vals = self._valid_sp_values1253        sp_sum = valid_vals.sum()1254        ct = len(valid_vals)1255        if self._null_fill_value:1256            return sp_sum / ct1257        else:1258            nsparse = self.sp_index.ngaps1259            return (sp_sum + self.fill_value * nsparse) / (ct + nsparse)1260    def transpose(self, *axes):1261        """1262        Returns the SparseArray.1263        """1264        return self1265    @property1266    def T(self):1267        """1268        Returns the SparseArray.1269        """1270        return self1271    # ------------------------------------------------------------------------1272    # Ufuncs1273    # ------------------------------------------------------------------------1274    def __array_wrap__(self, array, context=None):1275        from pandas.core.dtypes.generic import ABCSparseSeries1276        ufunc, inputs, _ = context1277        inputs = tuple(x.values if isinstance(x, ABCSparseSeries) else x1278                       for x in inputs)1279        return self.__array_ufunc__(ufunc, '__call__', *inputs)1280    _HANDLED_TYPES = (np.ndarray, numbers.Number)1281    def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):1282        out = kwargs.get('out', ())1283        for x in inputs + out:1284            if not isinstance(x, self._HANDLED_TYPES + (SparseArray,)):1285                return NotImplemented1286        special = {'add', 'sub', 'mul', 'pow', 'mod', 'floordiv', 'truediv',1287                   'divmod', 'eq', 'ne', 'lt', 'gt', 'le', 'ge', 'remainder'}1288        if compat.PY2:1289            special.add('div')1290        aliases = {1291            'subtract': 'sub',1292            'multiply': 'mul',1293            'floor_divide': 'floordiv',1294            'true_divide': 'truediv',1295            'power': 'pow',1296            'remainder': 'mod',1297            'divide': 'div',1298            'equal': 'eq',1299            'not_equal': 'ne',1300            'less': 'lt',1301            'less_equal': 'le',1302            'greater': 'gt',1303            'greater_equal': 'ge',1304        }1305        flipped = {1306            'lt': '__gt__',1307            'le': '__ge__',1308            'gt': '__lt__',1309            'ge': '__le__',1310            'eq': '__eq__',1311            'ne': '__ne__',1312        }1313        op_name = ufunc.__name__1314        op_name = aliases.get(op_name, op_name)1315        if op_name in special and kwargs.get('out') is None:1316            if isinstance(inputs[0], type(self)):1317                return getattr(self, '__{}__'.format(op_name))(inputs[1])1318            else:1319                name = flipped.get(op_name, '__r{}__'.format(op_name))1320                return getattr(self, name)(inputs[0])1321        if len(inputs) == 1:1322            # No alignment necessary.1323            sp_values = getattr(ufunc, method)(self.sp_values, **kwargs)1324            fill_value = getattr(ufunc, method)(self.fill_value, **kwargs)1325            return self._simple_new(sp_values,1326                                    self.sp_index,1327                                    SparseDtype(sp_values.dtype, fill_value))1328        result = getattr(ufunc, method)(*[np.asarray(x) for x in inputs],1329                                        **kwargs)1330        if out:1331            if len(out) == 1:1332                out = out[0]1333            return out1334        if type(result) is tuple:1335            return tuple(type(self)(x) for x in result)1336        elif method == 'at':1337            # no return value1338            return None1339        else:1340            return type(self)(result)1341    def __abs__(self):1342        return np.abs(self)1343    # ------------------------------------------------------------------------1344    # Ops1345    # ------------------------------------------------------------------------1346    @classmethod1347    def _create_unary_method(cls, op):1348        def sparse_unary_method(self):1349            fill_value = op(np.array(self.fill_value)).item()1350            values = op(self.sp_values)1351            dtype = SparseDtype(values.dtype, fill_value)1352            return cls._simple_new(values, self.sp_index, dtype)1353        name = '__{name}__'.format(name=op.__name__)1354        return compat.set_function_name(sparse_unary_method, name, cls)1355    @classmethod1356    def _create_arithmetic_method(cls, op):1357        def sparse_arithmetic_method(self, other):1358            op_name = op.__name__1359            if isinstance(other, (ABCSeries, ABCIndexClass)):1360                # Rely on pandas to dispatch to us.1361                return NotImplemented1362            if isinstance(other, SparseArray):1363                return _sparse_array_op(self, other, op, op_name)1364            elif is_scalar(other):1365                with np.errstate(all='ignore'):1366                    fill = op(_get_fill(self), np.asarray(other))1367                    result = op(self.sp_values, other)1368                if op_name == 'divmod':1369                    left, right = result1370                    lfill, rfill = fill1371                    return (_wrap_result(op_name, left, self.sp_index, lfill),1372                            _wrap_result(op_name, right, self.sp_index, rfill))1373                return _wrap_result(op_name, result, self.sp_index, fill)1374            else:1375                other = np.asarray(other)1376                with np.errstate(all='ignore'):1377                    # TODO: delete sparse stuff in core/ops.py1378                    # TODO: look into _wrap_result1379                    if len(self) != len(other):1380                        raise AssertionError(1381                            ("length mismatch: {self} vs. {other}".format(1382                                self=len(self), other=len(other))))1383                    if not isinstance(other, SparseArray):1384                        dtype = getattr(other, 'dtype', None)1385                        other = SparseArray(other, fill_value=self.fill_value,1386                                            dtype=dtype)1387                    return _sparse_array_op(self, other, op, op_name)1388        name = '__{name}__'.format(name=op.__name__)1389        return compat.set_function_name(sparse_arithmetic_method, name, cls)1390    @classmethod1391    def _create_comparison_method(cls, op):1392        def cmp_method(self, other):1393            op_name = op.__name__1394            if op_name in {'and_', 'or_'}:1395                op_name = op_name[:-1]1396            if isinstance(other, (ABCSeries, ABCIndexClass)):1397                # Rely on pandas to unbox and dispatch to us.1398                return NotImplemented1399            if not is_scalar(other) and not isinstance(other, type(self)):1400                # convert list-like to ndarray1401                other = np.asarray(other)1402            if isinstance(other, np.ndarray):1403                # TODO: make this more flexible than just ndarray...1404                if len(self) != len(other):1405                    raise AssertionError("length mismatch: {self} vs. {other}"1406                                         .format(self=len(self),1407                                                 other=len(other)))1408                other = SparseArray(other, fill_value=self.fill_value)1409            if isinstance(other, SparseArray):1410                return _sparse_array_op(self, other, op, op_name)1411            else:1412                with np.errstate(all='ignore'):1413                    fill_value = op(self.fill_value, other)1414                    result = op(self.sp_values, other)1415                return type(self)(result,1416                                  sparse_index=self.sp_index,1417                                  fill_value=fill_value,1418                                  dtype=np.bool_)1419        name = '__{name}__'.format(name=op.__name__)1420        return compat.set_function_name(cmp_method, name, cls)1421    @classmethod1422    def _add_unary_ops(cls):1423        cls.__pos__ = cls._create_unary_method(operator.pos)1424        cls.__neg__ = cls._create_unary_method(operator.neg)1425        cls.__invert__ = cls._create_unary_method(operator.invert)1426    @classmethod1427    def _add_comparison_ops(cls):1428        cls.__and__ = cls._create_comparison_method(operator.and_)1429        cls.__or__ = cls._create_comparison_method(operator.or_)1430        super(SparseArray, cls)._add_comparison_ops()1431    # ----------1432    # Formatting1433    # -----------1434    def __unicode__(self):1435        return '{self}\nFill: {fill}\n{index}'.format(1436            self=printing.pprint_thing(self),1437            fill=printing.pprint_thing(self.fill_value),1438            index=printing.pprint_thing(self.sp_index))1439    def _formatter(self, boxed=False):1440        # Defer to the formatter from the GenericArrayFormatter calling us.1441        # This will infer the correct formatter from the dtype of the values.1442        return None1443SparseArray._add_arithmetic_ops()1444SparseArray._add_comparison_ops()1445SparseArray._add_unary_ops()1446def _maybe_to_dense(obj):1447    """1448    try to convert to dense1449    """1450    if hasattr(obj, 'to_dense'):1451        return obj.to_dense()1452    return obj1453def _maybe_to_sparse(array):1454    """1455    array must be SparseSeries or SparseArray1456    """1457    if isinstance(array, ABCSparseSeries):1458        array = array.values.copy()1459    return array1460def _sanitize_values(arr):1461    """1462    return an ndarray for our input,1463    in a platform independent manner1464    """1465    if hasattr(arr, 'values'):1466        arr = arr.values1467    else:1468        # scalar1469        if is_scalar(arr):1470            arr = [arr]1471        # ndarray1472        if isinstance(arr, np.ndarray):1473            pass1474        elif is_list_like(arr) and len(arr) > 0:1475            arr = maybe_convert_platform(arr)1476        else:1477            arr = np.asarray(arr)1478    return arr1479def make_sparse(arr, kind='block', fill_value=None, dtype=None, copy=False):1480    """1481    Convert ndarray to sparse format1482    Parameters1483    ----------1484    arr : ndarray1485    kind : {'block', 'integer'}1486    fill_value : NaN or another value1487    dtype : np.dtype, optional1488    copy : bool, default False1489    Returns1490    -------1491    (sparse_values, index, fill_value) : (ndarray, SparseIndex, Scalar)1492    """1493    arr = _sanitize_values(arr)1494    if arr.ndim > 1:1495        raise TypeError("expected dimension <= 1 data")1496    if fill_value is None:1497        fill_value = na_value_for_dtype(arr.dtype)1498    if isna(fill_value):1499        mask = notna(arr)1500    else:1501        # For str arrays in NumPy 1.12.0, operator!= below isn't1502        # element-wise but just returns False if fill_value is not str,1503        # so cast to object comparison to be safe1504        if is_string_dtype(arr):1505            arr = arr.astype(object)1506        if is_object_dtype(arr.dtype):1507            # element-wise equality check method in numpy doesn't treat1508            # each element type, eg. 0, 0.0, and False are treated as1509            # same. So we have to check the both of its type and value.1510            mask = splib.make_mask_object_ndarray(arr, fill_value)1511        else:1512            mask = arr != fill_value1513    length = len(arr)1514    if length != len(mask):1515        # the arr is a SparseArray1516        indices = mask.sp_index.indices1517    else:1518        indices = mask.nonzero()[0].astype(np.int32)1519    index = _make_index(length, indices, kind)1520    sparsified_values = arr[mask]1521    if dtype is not None:1522        sparsified_values = astype_nansafe(sparsified_values, dtype=dtype)1523    # TODO: copy1524    return sparsified_values, index, fill_value1525def _make_index(length, indices, kind):1526    if kind == 'block' or isinstance(kind, BlockIndex):1527        locs, lens = splib.get_blocks(indices)1528        index = BlockIndex(length, locs, lens)1529    elif kind == 'integer' or isinstance(kind, IntIndex):1530        index = IntIndex(length, indices)1531    else:  # pragma: no cover1532        raise ValueError('must be block or integer type')1533    return index1534# ----------------------------------------------------------------------------1535# Accessor1536@delegate_names(SparseArray, ['npoints', 'density', 'fill_value',1537                              'sp_values'],1538                typ='property')1539class SparseAccessor(PandasDelegate):1540    """1541    Accessor for SparseSparse from other sparse matrix data types.1542    """1543    def __init__(self, data=None):1544        self._validate(data)1545        # Store the Series since we need that for to_coo1546        self._parent = data1547    @staticmethod1548    def _validate(data):1549        if not isinstance(data.dtype, SparseDtype):1550            msg = "Can only use the '.sparse' accessor with Sparse data."1551            raise AttributeError(msg)1552    def _delegate_property_get(self, name, *args, **kwargs):1553        return getattr(self._parent.values, name)1554    def _delegate_method(self, name, *args, **kwargs):1555        if name == 'from_coo':1556            return self.from_coo(*args, **kwargs)1557        elif name == 'to_coo':1558            return self.to_coo(*args, **kwargs)1559        else:1560            raise ValueError1561    @classmethod1562    def from_coo(cls, A, dense_index=False):1563        """1564        Create a SparseSeries from a scipy.sparse.coo_matrix.1565        Parameters1566        ----------1567        A : scipy.sparse.coo_matrix1568        dense_index : bool, default False1569            If False (default), the SparseSeries index consists of only the1570            coords of the non-null entries of the original coo_matrix.1571            If True, the SparseSeries index consists of the full sorted1572            (row, col) coordinates of the coo_matrix.1573        Returns1574        -------1575        s : SparseSeries1576        Examples1577        ---------1578        >>> from scipy import sparse1579        >>> A = sparse.coo_matrix(([3.0, 1.0, 2.0], ([1, 0, 0], [0, 2, 3])),1580                               shape=(3, 4))1581        >>> A1582        <3x4 sparse matrix of type '<class 'numpy.float64'>'1583                with 3 stored elements in COOrdinate format>1584        >>> A.todense()1585        matrix([[ 0.,  0.,  1.,  2.],1586                [ 3.,  0.,  0.,  0.],1587                [ 0.,  0.,  0.,  0.]])1588        >>> ss = pd.SparseSeries.from_coo(A)1589        >>> ss1590        0  2    11591           3    21592        1  0    31593        dtype: float641594        BlockIndex1595        Block locations: array([0], dtype=int32)1596        Block lengths: array([3], dtype=int32)1597        """1598        from pandas.core.sparse.scipy_sparse import _coo_to_sparse_series1599        from pandas import Series1600        result = _coo_to_sparse_series(A, dense_index=dense_index)1601        # SparseSeries -> Series[sparse]1602        result = Series(result.values, index=result.index, copy=False)1603        return result1604    def to_coo(self, row_levels=(0, ), column_levels=(1, ), sort_labels=False):1605        """1606        Create a scipy.sparse.coo_matrix from a SparseSeries with MultiIndex.1607        Use row_levels and column_levels to determine the row and column1608        coordinates respectively. row_levels and column_levels are the names1609        (labels) or numbers of the levels. {row_levels, column_levels} must be1610        a partition of the MultiIndex level names (or numbers).1611        Parameters1612        ----------1613        row_levels : tuple/list1614        column_levels : tuple/list1615        sort_labels : bool, default False1616            Sort the row and column labels before forming the sparse matrix.1617        Returns1618        -------1619        y : scipy.sparse.coo_matrix1620        rows : list (row labels)1621        columns : list (column labels)1622        Examples1623        --------1624        >>> s = pd.Series([3.0, np.nan, 1.0, 3.0, np.nan, np.nan])1625        >>> s.index = pd.MultiIndex.from_tuples([(1, 2, 'a', 0),1626                                                (1, 2, 'a', 1),1627                                                (1, 1, 'b', 0),1628                                                (1, 1, 'b', 1),1629                                                (2, 1, 'b', 0),1630                                                (2, 1, 'b', 1)],1631                                                names=['A', 'B', 'C', 'D'])1632        >>> ss = s.to_sparse()1633        >>> A, rows, columns = ss.to_coo(row_levels=['A', 'B'],1634                                         column_levels=['C', 'D'],1635                                         sort_labels=True)1636        >>> A1637        <3x4 sparse matrix of type '<class 'numpy.float64'>'1638                with 3 stored elements in COOrdinate format>1639        >>> A.todense()1640        matrix([[ 0.,  0.,  1.,  3.],1641        [ 3.,  0.,  0.,  0.],1642        [ 0.,  0.,  0.,  0.]])1643        >>> rows1644        [(1, 1), (1, 2), (2, 1)]1645        >>> columns1646        [('a', 0), ('a', 1), ('b', 0), ('b', 1)]1647        """1648        from pandas.core.sparse.scipy_sparse import _sparse_series_to_coo1649        A, rows, columns = _sparse_series_to_coo(self._parent,1650                                                 row_levels,1651                                                 column_levels,1652                                                 sort_labels=sort_labels)...0002_auto_20210108_1807.py
Source:0002_auto_20210108_1807.py  
1# Generated by Django 3.1.4 on 2021-01-08 18:072from django.db import migrations, models3class Migration(migrations.Migration):4    dependencies = [5        ('module', '0001_initial'),6    ]7    operations = [8        migrations.RemoveField(9            model_name='module',10            name='icon',11        ),12        migrations.AddField(13            model_name='module',14            name='icon_name',15            field=models.CharField(blank=True, choices=[('house-door.svg', 'house-door.svg'), ('graph-up.svg', 'graph-up.svg'), ('sort-alpha-up-alt.svg', 'sort-alpha-up-alt.svg'), ('eye-slash-fill.svg', 'eye-slash-fill.svg'), ('arrows-angle-expand.svg', 'arrows-angle-expand.svg'), ('layout-text-window.svg', 'layout-text-window.svg'), ('textarea.svg', 'textarea.svg'), ('slack.svg', 'slack.svg'), ('tv-fill.svg', 'tv-fill.svg'), ('hash.svg', 'hash.svg'), ('file-medical-fill.svg', 'file-medical-fill.svg'), ('calculator-fill.svg', 'calculator-fill.svg'), ('twitter.svg', 'twitter.svg'), ('bookmark-heart.svg', 'bookmark-heart.svg'), ('star.svg', 'star.svg'), ('at.svg', 'at.svg'), ('type-italic.svg', 'type-italic.svg'), ('hand-index.svg', 'hand-index.svg'), ('volume-off.svg', 'volume-off.svg'), ('telephone-plus-fill.svg', 'telephone-plus-fill.svg'), ('arrow-down-left.svg', 'arrow-down-left.svg'), ('hand-index-thumb.svg', 'hand-index-thumb.svg'), ('calendar2-range.svg', 'calendar2-range.svg'), ('dice-4.svg', 'dice-4.svg'), ('inboxes-fill.svg', 'inboxes-fill.svg'), ('bag-x-fill.svg', 'bag-x-fill.svg'), ('caret-down-square-fill.svg', 'caret-down-square-fill.svg'), ('thermometer-half.svg', 'thermometer-half.svg'), ('calendar2-day-fill.svg', 'calendar2-day-fill.svg'), ('alt.svg', 'alt.svg'), ('heart-half.svg', 'heart-half.svg'), ('pause-btn.svg', 'pause-btn.svg'), ('plus-circle-fill.svg', 'plus-circle-fill.svg'), ('mic.svg', 'mic.svg'), ('person-lines-fill.svg', 'person-lines-fill.svg'), ('markdown.svg', 'markdown.svg'), ('shield-minus.svg', 'shield-minus.svg'), ('file-earmark-richtext-fill.svg', 'file-earmark-richtext-fill.svg'), ('trophy-fill.svg', 'trophy-fill.svg'), ('hdd.svg', 'hdd.svg'), ('shop.svg', 'shop.svg'), ('skip-backward-circle.svg', 'skip-backward-circle.svg'), ('bar-chart.svg', 'bar-chart.svg'), ('phone-landscape.svg', 'phone-landscape.svg'), ('suit-spade.svg', 'suit-spade.svg'), ('wrench.svg', 'wrench.svg'), ('badge-vo.svg', 'badge-vo.svg'), ('house-door-fill.svg', 'house-door-fill.svg'), ('sort-down.svg', 'sort-down.svg'), ('plus-circle.svg', 'plus-circle.svg'), ('skip-end-circle.svg', 'skip-end-circle.svg'), ('inboxes.svg', 'inboxes.svg'), ('envelope-open-fill.svg', 'envelope-open-fill.svg'), ('file-arrow-down.svg', 'file-arrow-down.svg'), ('file-x.svg', 'file-x.svg'), ('record-btn.svg', 'record-btn.svg'), ('basket.svg', 'basket.svg'), ('award-fill.svg', 'award-fill.svg'), ('badge-8k.svg', 'badge-8k.svg'), ('flower3.svg', 'flower3.svg'), ('skip-start-circle-fill.svg', 'skip-start-circle-fill.svg'), ('voicemail.svg', 'voicemail.svg'), ('arrow-up-down.svg', 'arrow-up-down.svg'), ('ui-checks-grid.svg', 'ui-checks-grid.svg'), ('upc.svg', 'upc.svg'), ('tablet.svg', 'tablet.svg'), ('bag-plus.svg', 'bag-plus.svg'), ('calendar3.svg', 'calendar3.svg'), ('calendar2-x-fill.svg', 'calendar2-x-fill.svg'), ('arrow-up-left-circle.svg', 'arrow-up-left-circle.svg'), ('chat-square-text.svg', 'chat-square-text.svg'), ('toggle-on.svg', 'toggle-on.svg'), ('patch-plus.svg', 'patch-plus.svg'), ('peace.svg', 'peace.svg'), ('file-word.svg', 'file-word.svg'), ('chat-right-quote.svg', 'chat-right-quote.svg'), ('file-earmark-person.svg', 'file-earmark-person.svg'), ('bell.svg', 'bell.svg'), ('share.svg', 'share.svg'), ('easel.svg', 'easel.svg'), ('layout-text-window-reverse.svg', 'layout-text-window-reverse.svg'), ('file-bar-graph-fill.svg', 'file-bar-graph-fill.svg'), ('pentagon.svg', 'pentagon.svg'), ('table.svg', 'table.svg'), ('patch-question.svg', 'patch-question.svg'), ('gem.svg', 'gem.svg'), ('person-fill.svg', 'person-fill.svg'), ('file-earmark-excel-fill.svg', 'file-earmark-excel-fill.svg'), ('bookmark-star-fill.svg', 'bookmark-star-fill.svg'), ('option.svg', 'option.svg'), ('stop-circle.svg', 'stop-circle.svg'), ('layout-sidebar-inset-reverse.svg', 'layout-sidebar-inset-reverse.svg'), ('bag-check.svg', 'bag-check.svg'), ('badge-cc.svg', 'badge-cc.svg'), ('octagon-fill.svg', 'octagon-fill.svg'), ('pause-circle.svg', 'pause-circle.svg'), ('arrow-down-square.svg', 'arrow-down-square.svg'), ('hdd-network-fill.svg', 'hdd-network-fill.svg'), ('chevron-right.svg', 'chevron-right.svg'), ('peace-fill.svg', 'peace-fill.svg'), ('journal-bookmark-fill.svg', 'journal-bookmark-fill.svg'), ('collection.svg', 'collection.svg'), ('headphones.svg', 'headphones.svg'), ('chat-square.svg', 'chat-square.svg'), ('filter-square.svg', 'filter-square.svg'), ('blockquote-left.svg', 'blockquote-left.svg'), ('folder-fill.svg', 'folder-fill.svg'), ('crop.svg', 'crop.svg'), ('play-circle.svg', 'play-circle.svg'), ('record-circle-fill.svg', 'record-circle-fill.svg'), ('calendar-week.svg', 'calendar-week.svg'), ('cloud.svg', 'cloud.svg'), ('egg.svg', 'egg.svg'), ('ui-radios-grid.svg', 'ui-radios-grid.svg'), ('check2-circle.svg', 'check2-circle.svg'), ('badge-4k-fill.svg', 'badge-4k-fill.svg'), ('arrow-left-square.svg', 'arrow-left-square.svg'), ('bag-plus-fill.svg', 'bag-plus-fill.svg'), ('binoculars-fill.svg', 'binoculars-fill.svg'), ('droplet-half.svg', 'droplet-half.svg'), ('calendar-event.svg', 'calendar-event.svg'), ('emoji-expressionless.svg', 'emoji-expressionless.svg'), ('input-cursor.svg', 'input-cursor.svg'), ('check-square-fill.svg', 'check-square-fill.svg'), ('reply.svg', 'reply.svg'), ('door-open.svg', 'door-open.svg'), ('arrow-up-right-square.svg', 'arrow-up-right-square.svg'), ('intersect.svg', 'intersect.svg'), ('basket3.svg', 'basket3.svg'), ('pentagon-half.svg', 'pentagon-half.svg'), ('arrow-down-right-square-fill.svg', 'arrow-down-right-square-fill.svg'), ('check-box.svg', 'check-box.svg'), ('kanban-fill.svg', 'kanban-fill.svg'), ('camera-fill.svg', 'camera-fill.svg'), ('badge-hd.svg', 'badge-hd.svg'), ('stickies.svg', 'stickies.svg'), ('vector-pen.svg', 'vector-pen.svg'), ('map.svg', 'map.svg'), ('layers-half.svg', 'layers-half.svg'), ('pencil-square.svg', 'pencil-square.svg'), ('file-earmark-zip-fill.svg', 'file-earmark-zip-fill.svg'), ('pause-fill.svg', 'pause-fill.svg'), ('reply-fill.svg', 'reply-fill.svg'), ('toggles2.svg', 'toggles2.svg'), ('fullscreen.svg', 'fullscreen.svg'), ('music-note.svg', 'music-note.svg'), ('journal-text.svg', 'journal-text.svg'), ('x-diamond.svg', 'x-diamond.svg'), ('node-minus-fill.svg', 'node-minus-fill.svg'), ('file-arrow-down-fill.svg', 'file-arrow-down-fill.svg'), ('laptop-fill.svg', 'laptop-fill.svg'), ('chevron-double-down.svg', 'chevron-double-down.svg'), ('heart-fill.svg', 'heart-fill.svg'), ('skip-end-btn-fill.svg', 'skip-end-btn-fill.svg'), ('record2.svg', 'record2.svg'), ('chevron-double-left.svg', 'chevron-double-left.svg'), ('bookmark-check-fill.svg', 'bookmark-check-fill.svg'), ('file-lock2.svg', 'file-lock2.svg'), ('stop-fill.svg', 'stop-fill.svg'), ('emoji-heart-eyes.svg', 'emoji-heart-eyes.svg'), ('arrow-down-left-circle-fill.svg', 'arrow-down-left-circle-fill.svg'), ('skip-forward-fill.svg', 'skip-forward-fill.svg'), ('pencil-fill.svg', 'pencil-fill.svg'), ('clock.svg', 'clock.svg'), ('clipboard-data.svg', 'clipboard-data.svg'), ('cart2.svg', 'cart2.svg'), ('volume-up-fill.svg', 'volume-up-fill.svg'), ('arrow-down-right.svg', 'arrow-down-right.svg'), ('calendar3-week.svg', 'calendar3-week.svg'), ('slash-square-fill.svg', 'slash-square-fill.svg'), ('reception-0.svg', 'reception-0.svg'), ('file-play.svg', 'file-play.svg'), ('collection-fill.svg', 'collection-fill.svg'), ('check-all.svg', 'check-all.svg'), ('wallet2.svg', 'wallet2.svg'), ('text-indent-left.svg', 'text-indent-left.svg'), ('building.svg', 'building.svg'), ('dice-2.svg', 'dice-2.svg'), ('door-closed-fill.svg', 'door-closed-fill.svg'), ('arrow-up-square.svg', 'arrow-up-square.svg'), ('emoji-expressionless-fill.svg', 'emoji-expressionless-fill.svg'), ('file-earmark-plus-fill.svg', 'file-earmark-plus-fill.svg'), ('minecart.svg', 'minecart.svg'), ('chat-left-dots-fill.svg', 'chat-left-dots-fill.svg'), ('record2-fill.svg', 'record2-fill.svg'), ('search.svg', 'search.svg'), ('watch.svg', 'watch.svg'), ('calendar3-event-fill.svg', 'calendar3-event-fill.svg'), ('journal-x.svg', 'journal-x.svg'), ('check.svg', 'check.svg'), ('file-earmark-binary-fill.svg', 'file-earmark-binary-fill.svg'), ('arrow-right-short.svg', 'arrow-right-short.svg'), ('file-earmark-minus-fill.svg', 'file-earmark-minus-fill.svg'), ('chevron-compact-left.svg', 'chevron-compact-left.svg'), ('arrow-up-circle-fill.svg', 'arrow-up-circle-fill.svg'), ('cart-plus.svg', 'cart-plus.svg'), ('chevron-left.svg', 'chevron-left.svg'), ('diamond.svg', 'diamond.svg'), ('arrow-left-square-fill.svg', 'arrow-left-square-fill.svg'), ('bell-fill.svg', 'bell-fill.svg'), ('cloud-minus-fill.svg', 'cloud-minus-fill.svg'), ('record-circle.svg', 'record-circle.svg'), ('exclamation-square-fill.svg', 'exclamation-square-fill.svg'), ('emoji-laughing-fill.svg', 'emoji-laughing-fill.svg'), ('emoji-dizzy-fill.svg', 'emoji-dizzy-fill.svg'), ('layout-wtf.svg', 'layout-wtf.svg'), ('file-post.svg', 'file-post.svg'), ('file.svg', 'file.svg'), ('check-circle-fill.svg', 'check-circle-fill.svg'), ('folder-check.svg', 'folder-check.svg'), ('question-diamond-fill.svg', 'question-diamond-fill.svg'), ('toggles.svg', 'toggles.svg'), ('columns.svg', 'columns.svg'), ('rss-fill.svg', 'rss-fill.svg'), ('arrows-collapse.svg', 'arrows-collapse.svg'), ('cloud-check-fill.svg', 'cloud-check-fill.svg'), ('box-arrow-in-up-left.svg', 'box-arrow-in-up-left.svg'), ('triangle.svg', 'triangle.svg'), ('plus-square-fill.svg', 'plus-square-fill.svg'), ('person-badge-fill.svg', 'person-badge-fill.svg'), ('person-bounding-box.svg', 'person-bounding-box.svg'), ('life-preserver.svg', 'life-preserver.svg'), ('input-cursor-text.svg', 'input-cursor-text.svg'), ('calendar2-month-fill.svg', 'calendar2-month-fill.svg'), ('columns-gap.svg', 'columns-gap.svg'), ('slash-circle-fill.svg', 'slash-circle-fill.svg'), ('people-fill.svg', 'people-fill.svg'), ('shield-lock.svg', 'shield-lock.svg'), ('file-arrow-up-fill.svg', 'file-arrow-up-fill.svg'), ('book.svg', 'book.svg'), ('cloud-plus.svg', 'cloud-plus.svg'), ('calendar-check-fill.svg', 'calendar-check-fill.svg'), ('calendar-x.svg', 'calendar-x.svg'), ('image-fill.svg', 'image-fill.svg'), ('emoji-frown-fill.svg', 'emoji-frown-fill.svg'), ('calendar-date-fill.svg', 'calendar-date-fill.svg'), ('broadcast.svg', 'broadcast.svg'), ('arrow-down-left-circle.svg', 'arrow-down-left-circle.svg'), ('calendar4-week.svg', 'calendar4-week.svg'), ('headset.svg', 'headset.svg'), ('flag.svg', 'flag.svg'), ('wifi-2.svg', 'wifi-2.svg'), ('emoji-smile-upside-down.svg', 'emoji-smile-upside-down.svg'), ('patch-question-fll.svg', 'patch-question-fll.svg'), ('emoji-sunglasses-fill.svg', 'emoji-sunglasses-fill.svg'), ('minecart-loaded.svg', 'minecart-loaded.svg'), ('shuffle.svg', 'shuffle.svg'), ('hand-thumbs-down.svg', 'hand-thumbs-down.svg'), ('file-medical.svg', 'file-medical.svg'), ('file-check.svg', 'file-check.svg'), ('triangle-fill.svg', 'triangle-fill.svg'), ('person-plus-fill.svg', 'person-plus-fill.svg'), ('bricks.svg', 'bricks.svg'), ('type-h1.svg', 'type-h1.svg'), ('text-center.svg', 'text-center.svg'), ('calendar-range.svg', 'calendar-range.svg'), ('funnel.svg', 'funnel.svg'), ('lamp-fill.svg', 'lamp-fill.svg'), ('distribute-horizontal.svg', 'distribute-horizontal.svg'), ('gift-fill.svg', 'gift-fill.svg'), ('diagram-2.svg', 'diagram-2.svg'), ('key.svg', 'key.svg'), ('shield-x.svg', 'shield-x.svg'), ('brightness-low-fill.svg', 'brightness-low-fill.svg'), ('calendar2-week-fill.svg', 'calendar2-week-fill.svg'), ('file-earmark-ruled-fill.svg', 'file-earmark-ruled-fill.svg'), ('envelope.svg', 'envelope.svg'), ('cloud-download.svg', 'cloud-download.svg'), ('file-image.svg', 'file-image.svg'), ('chevron-expand.svg', 'chevron-expand.svg'), ('border-style.svg', 'border-style.svg'), ('compass-fill.svg', 'compass-fill.svg'), ('box-seam.svg', 'box-seam.svg'), ('credit-card-2-front.svg', 'credit-card-2-front.svg'), ('bookmark-fill.svg', 'bookmark-fill.svg'), ('file-person-fill.svg', 'file-person-fill.svg'), ('bounding-box.svg', 'bounding-box.svg'), ('type-strikethrough.svg', 'type-strikethrough.svg'), ('rss.svg', 'rss.svg'), ('laptop.svg', 'laptop.svg'), ('align-bottom.svg', 'align-bottom.svg'), ('chevron-bar-up.svg', 'chevron-bar-up.svg'), ('list-stars.svg', 'list-stars.svg'), ('heptagon.svg', 'heptagon.svg'), ('vinyl.svg', 'vinyl.svg'), ('file-excel-fill.svg', 'file-excel-fill.svg'), ('file-slides.svg', 'file-slides.svg'), ('controller.svg', 'controller.svg'), ('hexagon-fill.svg', 'hexagon-fill.svg'), ('chevron-double-up.svg', 'chevron-double-up.svg'), ('caret-left-fill.svg', 'caret-left-fill.svg'), ('box-arrow-up-left.svg', 'box-arrow-up-left.svg'), ('trash2.svg', 'trash2.svg'), ('hexagon.svg', 'hexagon.svg'), ('cloud-arrow-down-fill.svg', 'cloud-arrow-down-fill.svg'), ('file-earmark-arrow-up-fill.svg', 'file-earmark-arrow-up-fill.svg'), ('grid-3x3-gap.svg', 'grid-3x3-gap.svg'), ('flower1.svg', 'flower1.svg'), ('file-earmark-medical.svg', 'file-earmark-medical.svg'), ('file-earmark-easel-fill.svg', 'file-earmark-easel-fill.svg'), ('stop.svg', 'stop.svg'), ('slash-square.svg', 'slash-square.svg'), ('question-circle.svg', 'question-circle.svg'), ('align-start.svg', 'align-start.svg'), ('chat-square-text-fill.svg', 'chat-square-text-fill.svg'), ('calendar3-week-fill.svg', 'calendar3-week-fill.svg'), ('file-code-fill.svg', 'file-code-fill.svg'), ('record.svg', 'record.svg'), ('cloud-slash.svg', 'cloud-slash.svg'), ('newspaper.svg', 'newspaper.svg'), ('cursor.svg', 'cursor.svg'), ('arrow-right.svg', 'arrow-right.svg'), ('file-text-fill.svg', 'file-text-fill.svg'), ('file-earmark-richtext.svg', 'file-earmark-richtext.svg'), ('sim-fill.svg', 'sim-fill.svg'), ('file-easel-fill.svg', 'file-easel-fill.svg'), ('file-earmark-spreadsheet.svg', 'file-earmark-spreadsheet.svg'), ('clock-fill.svg', 'clock-fill.svg'), ('reception-3.svg', 'reception-3.svg'), ('disc-fill.svg', 'disc-fill.svg'), ('file-earmark-music-fill.svg', 'file-earmark-music-fill.svg'), ('layout-sidebar.svg', 'layout-sidebar.svg'), ('menu-button-wide.svg', 'menu-button-wide.svg'), ('back.svg', 'back.svg'), ('node-plus-fill.svg', 'node-plus-fill.svg'), ('file-arrow-up.svg', 'file-arrow-up.svg'), ('caret-left.svg', 'caret-left.svg'), ('skip-start-btn.svg', 'skip-start-btn.svg'), ('file-text.svg', 'file-text.svg'), ('chat-right.svg', 'chat-right.svg'), ('file-earmark-image-fill.svg', 'file-earmark-image-fill.svg'), ('cart-check.svg', 'cart-check.svg'), ('key-fill.svg', 'key-fill.svg'), ('circle-fill.svg', 'circle-fill.svg'), ('cloud-minus.svg', 'cloud-minus.svg'), ('volume-mute.svg', 'volume-mute.svg'), ('reply-all-fill.svg', 'reply-all-fill.svg'), ('chat-left-quote-fill.svg', 'chat-left-quote-fill.svg'), ('file-image-fill.svg', 'file-image-fill.svg'), ('box-arrow-down-right.svg', 'box-arrow-down-right.svg'), ('file-earmark-text.svg', 'file-earmark-text.svg'), ('asterisk.svg', 'asterisk.svg'), ('align-end.svg', 'align-end.svg'), ('shift-fill.svg', 'shift-fill.svg'), ('file-earmark-x-fill.svg', 'file-earmark-x-fill.svg'), ('telephone-minus.svg', 'telephone-minus.svg'), ('arrow-bar-right.svg', 'arrow-bar-right.svg'), ('file-earmark-arrow-down.svg', 'file-earmark-arrow-down.svg'), ('arrow-bar-left.svg', 'arrow-bar-left.svg'), ('box-arrow-up.svg', 'box-arrow-up.svg'), ('emoji-smile-upside-down-fill.svg', 'emoji-smile-upside-down-fill.svg'), ('calendar2-range-fill.svg', 'calendar2-range-fill.svg'), ('receipt.svg', 'receipt.svg'), ('calendar-day.svg', 'calendar-day.svg'), ('play-btn.svg', 'play-btn.svg'), ('toggle2-on.svg', 'toggle2-on.svg'), ('brightness-high.svg', 'brightness-high.svg'), ('battery-half.svg', 'battery-half.svg'), ('arrow-up-right-circle.svg', 'arrow-up-right-circle.svg'), ('square.svg', 'square.svg'), ('file-earmark-ruled.svg', 'file-earmark-ruled.svg'), ('chat-left-quote.svg', 'chat-left-quote.svg'), ('circle-square.svg', 'circle-square.svg'), ('calculator.svg', 'calculator.svg'), ('aspect-ratio-fill.svg', 'aspect-ratio-fill.svg'), ('emoji-dizzy.svg', 'emoji-dizzy.svg'), ('sort-numeric-up.svg', 'sort-numeric-up.svg'), ('star-half.svg', 'star-half.svg'), ('card-heading.svg', 'card-heading.svg'), ('exclamation-triangle-fill.svg', 'exclamation-triangle-fill.svg'), ('caret-up.svg', 'caret-up.svg'), ('chat-square-dots-fill.svg', 'chat-square-dots-fill.svg'), ('calendar-check.svg', 'calendar-check.svg'), ('stop-btn.svg', 'stop-btn.svg'), ('justify.svg', 'justify.svg'), ('brightness-alt-low-fill.svg', 'brightness-alt-low-fill.svg'), ('sort-numeric-down-alt.svg', 'sort-numeric-down-alt.svg'), ('unlock-fill.svg', 'unlock-fill.svg'), ('cup.svg', 'cup.svg'), ('patch-minus-fll.svg', 'patch-minus-fll.svg'), ('people-circle.svg', 'people-circle.svg'), ('suit-diamond-fill.svg', 'suit-diamond-fill.svg'), ('badge-tm.svg', 'badge-tm.svg'), ('outlet.svg', 'outlet.svg'), ('calendar-month-fill.svg', 'calendar-month-fill.svg'), ('dash-square.svg', 'dash-square.svg'), ('capslock-fill.svg', 'capslock-fill.svg'), ('folder.svg', 'folder.svg'), ('person-check.svg', 'person-check.svg'), ('ui-checks.svg', 'ui-checks.svg'), ('arrow-up-left.svg', 'arrow-up-left.svg'), ('mailbox2.svg', 'mailbox2.svg'), ('flag-fill.svg', 'flag-fill.svg'), ('x-octagon.svg', 'x-octagon.svg'), ('filter-right.svg', 'filter-right.svg'), ('braces.svg', 'braces.svg'), ('soundwave.svg', 'soundwave.svg'), ('signpost-split-fill.svg', 'signpost-split-fill.svg'), ('music-player.svg', 'music-player.svg'), ('file-spreadsheet-fill.svg', 'file-spreadsheet-fill.svg'), ('three-dots.svg', 'three-dots.svg'), ('phone-fill.svg', 'phone-fill.svg'), ('chat-square-dots.svg', 'chat-square-dots.svg'), ('suit-spade-fill.svg', 'suit-spade-fill.svg'), ('camera-video.svg', 'camera-video.svg'), ('bookmarks-fill.svg', 'bookmarks-fill.svg'), ('heart.svg', 'heart.svg'), ('credit-card-2-back.svg', 'credit-card-2-back.svg'), ('question-diamond.svg', 'question-diamond.svg'), ('graph-down.svg', 'graph-down.svg'), ('menu-button-wide-fill.svg', 'menu-button-wide-fill.svg'), ('upload.svg', 'upload.svg'), ('badge-tm-fill.svg', 'badge-tm-fill.svg'), ('lock-fill.svg', 'lock-fill.svg'), ('calendar3-fill.svg', 'calendar3-fill.svg'), ('tree-fill.svg', 'tree-fill.svg'), ('mouse3.svg', 'mouse3.svg'), ('chat-left-dots.svg', 'chat-left-dots.svg'), ('calendar-x-fill.svg', 'calendar-x-fill.svg'), ('type.svg', 'type.svg'), ('people.svg', 'people.svg'), ('reception-2.svg', 'reception-2.svg'), ('layers.svg', 'layers.svg'), ('signpost-fill.svg', 'signpost-fill.svg'), ('skip-forward-circle-fill.svg', 'skip-forward-circle-fill.svg'), ('printer.svg', 'printer.svg'), ('phone.svg', 'phone.svg'), ('square-half.svg', 'square-half.svg'), ('emoji-wink-fill.svg', 'emoji-wink-fill.svg'), ('code-slash.svg', 'code-slash.svg'), ('chat-right-dots-fill.svg', 'chat-right-dots-fill.svg'), ('hourglass.svg', 'hourglass.svg'), ('bicycle.svg', 'bicycle.svg'), ('calendar2-date-fill.svg', 'calendar2-date-fill.svg'), ('text-right.svg', 'text-right.svg'), ('layout-text-sidebar-reverse.svg', 'layout-text-sidebar-reverse.svg'), ('mouse.svg', 'mouse.svg'), ('tags-fill.svg', 'tags-fill.svg'), ('bookmark-plus-fill.svg', 'bookmark-plus-fill.svg'), ('bookmark-x.svg', 'bookmark-x.svg'), ('forward-fill.svg', 'forward-fill.svg'), ('play.svg', 'play.svg'), ('thermometer.svg', 'thermometer.svg'), ('geo-alt-fill.svg', 'geo-alt-fill.svg'), ('puzzle.svg', 'puzzle.svg'), ('chevron-bar-expand.svg', 'chevron-bar-expand.svg'), ('tree.svg', 'tree.svg'), ('arrow-down-up.svg', 'arrow-down-up.svg'), ('tablet-landscape.svg', 'tablet-landscape.svg'), ('nut.svg', 'nut.svg'), ('zoom-in.svg', 'zoom-in.svg'), ('bar-chart-steps.svg', 'bar-chart-steps.svg'), ('backspace-reverse.svg', 'backspace-reverse.svg'), ('grid-fill.svg', 'grid-fill.svg'), ('file-richtext-fill.svg', 'file-richtext-fill.svg'), ('arrow-up-left-square.svg', 'arrow-up-left-square.svg'), ('file-earmark-play.svg', 'file-earmark-play.svg'), ('link-45deg.svg', 'link-45deg.svg'), ('terminal.svg', 'terminal.svg'), ('handbag-fill.svg', 'handbag-fill.svg'), ('calendar4-range.svg', 'calendar4-range.svg'), ('file-diff.svg', 'file-diff.svg'), ('calendar2-day.svg', 'calendar2-day.svg'), ('info-square.svg', 'info-square.svg'), ('file-word-fill.svg', 'file-word-fill.svg'), ('x-circle.svg', 'x-circle.svg'), ('twitch.svg', 'twitch.svg'), ('person-circle.svg', 'person-circle.svg'), ('file-zip.svg', 'file-zip.svg'), ('geo-alt.svg', 'geo-alt.svg'), ('file-earmark-word.svg', 'file-earmark-word.svg'), ('patch-minus.svg', 'patch-minus.svg'), ('spellcheck.svg', 'spellcheck.svg'), ('hourglass-bottom.svg', 'hourglass-bottom.svg'), ('disc.svg', 'disc.svg'), ('chat-square-quote-fill.svg', 'chat-square-quote-fill.svg'), ('file-earmark-diff-fill.svg', 'file-earmark-diff-fill.svg'), ('box-arrow-in-right.svg', 'box-arrow-in-right.svg'), ('shield-fill-minus.svg', 'shield-fill-minus.svg'), ('pie-chart.svg', 'pie-chart.svg'), ('info.svg', 'info.svg'), ('files.svg', 'files.svg'), ('x-square-fill.svg', 'x-square-fill.svg'), ('file-lock2-fill.svg', 'file-lock2-fill.svg'), ('chat-square-fill.svg', 'chat-square-fill.svg'), ('skip-start-fill.svg', 'skip-start-fill.svg'), ('bezier.svg', 'bezier.svg'), ('phone-vibrate.svg', 'phone-vibrate.svg'), ('calendar.svg', 'calendar.svg'), ('shield-lock-fill.svg', 'shield-lock-fill.svg'), ('patch-check-fll.svg', 'patch-check-fll.svg'), ('reception-1.svg', 'reception-1.svg'), ('bar-chart-line-fill.svg', 'bar-chart-line-fill.svg'), ('arrow-down-circle-fill.svg', 'arrow-down-circle-fill.svg'), ('lock.svg', 'lock.svg'), ('arrow-left-right.svg', 'arrow-left-right.svg'), ('arrow-up-circle.svg', 'arrow-up-circle.svg'), ('mic-mute.svg', 'mic-mute.svg'), ('lamp.svg', 'lamp.svg'), ('skip-backward-circle-fill.svg', 'skip-backward-circle-fill.svg'), ('emoji-sunglasses.svg', 'emoji-sunglasses.svg'), ('list.svg', 'list.svg'), ('instagram.svg', 'instagram.svg'), ('bootstrap-icons.svg', 'bootstrap-icons.svg'), ('dice-6-fill.svg', 'dice-6-fill.svg'), ('file-check-fill.svg', 'file-check-fill.svg'), ('arrow-bar-up.svg', 'arrow-bar-up.svg'), ('grid-1x2-fill.svg', 'grid-1x2-fill.svg'), ('dice-5.svg', 'dice-5.svg'), ('cloud-plus-fill.svg', 'cloud-plus-fill.svg'), ('file-earmark-check.svg', 'file-earmark-check.svg'), ('box-arrow-up-right.svg', 'box-arrow-up-right.svg'), ('journal-code.svg', 'journal-code.svg'), ('bookmarks.svg', 'bookmarks.svg'), ('pie-chart-fill.svg', 'pie-chart-fill.svg'), ('folder-symlink-fill.svg', 'folder-symlink-fill.svg'), ('stopwatch.svg', 'stopwatch.svg'), ('sort-alpha-down-alt.svg', 'sort-alpha-down-alt.svg'), ('shield-fill-check.svg', 'shield-fill-check.svg'), ('exclamation-square.svg', 'exclamation-square.svg'), ('door-closed.svg', 'door-closed.svg'), ('filter-left.svg', 'filter-left.svg'), ('calendar-plus.svg', 'calendar-plus.svg'), ('wifi-1.svg', 'wifi-1.svg'), ('book-half.svg', 'book-half.svg'), ('discord.svg', 'discord.svg'), ('box.svg', 'box.svg'), ('skip-backward-fill.svg', 'skip-backward-fill.svg'), ('file-earmark-image.svg', 'file-earmark-image.svg'), ('battery-full.svg', 'battery-full.svg'), ('file-earmark-code-fill.svg', 'file-earmark-code-fill.svg'), ('question.svg', 'question.svg'), ('journal-medical.svg', 'journal-medical.svg'), ('forward.svg', 'forward.svg'), ('shield-check.svg', 'shield-check.svg'), ('calendar2-event-fill.svg', 'calendar2-event-fill.svg'), ('folder-symlink.svg', 'folder-symlink.svg'), ('pen.svg', 'pen.svg'), ('box-arrow-left.svg', 'box-arrow-left.svg'), ('easel-fill.svg', 'easel-fill.svg'), ('hdd-rack-fill.svg', 'hdd-rack-fill.svg'), ('info-square-fill.svg', 'info-square-fill.svg'), ('chevron-bar-down.svg', 'chevron-bar-down.svg'), ('blockquote-right.svg', 'blockquote-right.svg'), ('toggle-off.svg', 'toggle-off.svg'), ('view-stacked.svg', 'view-stacked.svg'), ('display-fill.svg', 'display-fill.svg'), ('telephone-x.svg', 'telephone-x.svg'), ('file-richtext.svg', 'file-richtext.svg'), ('circle-half.svg', 'circle-half.svg'), ('archive.svg', 'archive.svg'), ('exclamation-diamond-fill.svg', 'exclamation-diamond-fill.svg'), ('chat-square-quote.svg', 'chat-square-quote.svg'), ('caret-up-square-fill.svg', 'caret-up-square-fill.svg'), ('dice-3-fill.svg', 'dice-3-fill.svg'), ('chat-right-dots.svg', 'chat-right-dots.svg'), ('journal-check.svg', 'journal-check.svg'), ('envelope-fill.svg', 'envelope-fill.svg'), ('sort-down-alt.svg', 'sort-down-alt.svg'), ('list-ul.svg', 'list-ul.svg'), ('calendar-plus-fill.svg', 'calendar-plus-fill.svg'), ('subtract.svg', 'subtract.svg'), ('chat-quote-fill.svg', 'chat-quote-fill.svg'), ('person-badge.svg', 'person-badge.svg'), ('arrow-up.svg', 'arrow-up.svg'), ('cart3.svg', 'cart3.svg'), ('card-text.svg', 'card-text.svg'), ('cursor-fill.svg', 'cursor-fill.svg'), ('calendar2-check-fill.svg', 'calendar2-check-fill.svg'), ('square-fill.svg', 'square-fill.svg'), ('fullscreen-exit.svg', 'fullscreen-exit.svg'), ('bucket-fill.svg', 'bucket-fill.svg'), ('suit-heart-fill.svg', 'suit-heart-fill.svg'), ('file-bar-graph.svg', 'file-bar-graph.svg'), ('caret-left-square.svg', 'caret-left-square.svg'), ('bookshelf.svg', 'bookshelf.svg'), ('flower2.svg', 'flower2.svg'), ('cone.svg', 'cone.svg'), ('arrow-up-right.svg', 'arrow-up-right.svg'), ('diamond-fill.svg', 'diamond-fill.svg'), ('command.svg', 'command.svg'), ('chat-dots.svg', 'chat-dots.svg'), ('shield-plus.svg', 'shield-plus.svg'), ('bookmark-plus.svg', 'bookmark-plus.svg'), ('calendar3-event.svg', 'calendar3-event.svg'), ('chat-right-fill.svg', 'chat-right-fill.svg'), ('badge-hd-fill.svg', 'badge-hd-fill.svg'), ('trophy.svg', 'trophy.svg'), ('envelope-open.svg', 'envelope-open.svg'), ('clipboard-plus.svg', 'clipboard-plus.svg'), ('file-plus.svg', 'file-plus.svg'), ('gear.svg', 'gear.svg'), ('calendar-date.svg', 'calendar-date.svg'), ('suit-club.svg', 'suit-club.svg'), ('calendar2-date.svg', 'calendar2-date.svg'), ('hexagon-half.svg', 'hexagon-half.svg'), ('emoji-neutral-fill.svg', 'emoji-neutral-fill.svg'), ('ui-radios.svg', 'ui-radios.svg'), ('menu-app-fill.svg', 'menu-app-fill.svg'), ('telephone-forward-fill.svg', 'telephone-forward-fill.svg'), ('justify-left.svg', 'justify-left.svg'), ('chevron-compact-up.svg', 'chevron-compact-up.svg'), ('triangle-half.svg', 'triangle-half.svg'), ('cash.svg', 'cash.svg'), ('cloud-slash-fill.svg', 'cloud-slash-fill.svg'), ('arrow-down-right-square.svg', 'arrow-down-right-square.svg'), ('arrow-up-right-square-fill.svg', 'arrow-up-right-square-fill.svg'), ('person-square.svg', 'person-square.svg'), ('file-earmark-text-fill.svg', 'file-earmark-text-fill.svg'), ('camera2.svg', 'camera2.svg'), ('arrow-down-left-square-fill.svg', 'arrow-down-left-square-fill.svg'), ('files-alt.svg', 'files-alt.svg'), ('egg-fill.svg', 'egg-fill.svg'), ('box-arrow-right.svg', 'box-arrow-right.svg'), ('file-break-fill.svg', 'file-break-fill.svg'), ('caret-up-fill.svg', 'caret-up-fill.svg'), ('badge-4k.svg', 'badge-4k.svg'), ('dice-6.svg', 'dice-6.svg'), ('smartwatch.svg', 'smartwatch.svg'), ('cart-plus-fill.svg', 'cart-plus-fill.svg'), ('file-play-fill.svg', 'file-play-fill.svg'), ('eye-fill.svg', 'eye-fill.svg'), ('volume-off-fill.svg', 'volume-off-fill.svg'), ('basket2.svg', 'basket2.svg'), ('clipboard-check.svg', 'clipboard-check.svg'), ('align-center.svg', 'align-center.svg'), ('reply-all.svg', 'reply-all.svg'), ('chat.svg', 'chat.svg'), ('skip-backward-btn.svg', 'skip-backward-btn.svg'), ('person-plus.svg', 'person-plus.svg'), ('box-arrow-down.svg', 'box-arrow-down.svg'), ('text-left.svg', 'text-left.svg'), ('shift.svg', 'shift.svg'), ('cpu-fill.svg', 'cpu-fill.svg'), ('slash.svg', 'slash.svg'), ('file-earmark-slides.svg', 'file-earmark-slides.svg'), ('signpost-split.svg', 'signpost-split.svg'), ('server.svg', 'server.svg'), ('cloud-upload.svg', 'cloud-upload.svg'), ('box-arrow-in-left.svg', 'box-arrow-in-left.svg'), ('broadcast-pin.svg', 'broadcast-pin.svg'), ('briefcase.svg', 'briefcase.svg'), ('file-font-fill.svg', 'file-font-fill.svg'), ('phone-landscape-fill.svg', 'phone-landscape-fill.svg'), ('link.svg', 'link.svg'), ('three-dots-vertical.svg', 'three-dots-vertical.svg'), ('x-circle-fill.svg', 'x-circle-fill.svg'), ('chat-text-fill.svg', 'chat-text-fill.svg'), ('sort-up-alt.svg', 'sort-up-alt.svg'), ('bar-chart-line.svg', 'bar-chart-line.svg'), ('box-arrow-in-up-right.svg', 'box-arrow-in-up-right.svg'), ('file-earmark-lock-fill.svg', 'file-earmark-lock-fill.svg'), ('handbag.svg', 'handbag.svg'), ('credit-card-2-front-fill.svg', 'credit-card-2-front-fill.svg'), ('calendar-week-fill.svg', 'calendar-week-fill.svg'), ('exclamation-triangle.svg', 'exclamation-triangle.svg'), ('textarea-resize.svg', 'textarea-resize.svg'), ('calendar-fill.svg', 'calendar-fill.svg'), ('calendar2-minus.svg', 'calendar2-minus.svg'), ('compass.svg', 'compass.svg'), ('cart-x.svg', 'cart-x.svg'), ('chevron-double-right.svg', 'chevron-double-right.svg'), ('check2-all.svg', 'check2-all.svg'), ('bookmark.svg', 'bookmark.svg'), ('file-earmark-easel.svg', 'file-earmark-easel.svg'), ('images.svg', 'images.svg'), ('hourglass-split.svg', 'hourglass-split.svg'), ('eyeglasses.svg', 'eyeglasses.svg'), ('layers-fill.svg', 'layers-fill.svg'), ('emoji-heart-eyes-fill.svg', 'emoji-heart-eyes-fill.svg'), ('mouse2.svg', 'mouse2.svg'), ('hdd-stack.svg', 'hdd-stack.svg'), ('code.svg', 'code.svg'), ('chat-left.svg', 'chat-left.svg'), ('cup-straw.svg', 'cup-straw.svg'), ('file-earmark-arrow-down-fill.svg', 'file-earmark-arrow-down-fill.svg'), ('bag-x.svg', 'bag-x.svg'), ('suit-club-fill.svg', 'suit-club-fill.svg'), ('stop-btn-fill.svg', 'stop-btn-fill.svg'), ('stoplights-fill.svg', 'stoplights-fill.svg'), ('grid-3x2-gap-fill.svg', 'grid-3x2-gap-fill.svg'), ('cone-striped.svg', 'cone-striped.svg'), ('bullseye.svg', 'bullseye.svg'), ('calendar2-fill.svg', 'calendar2-fill.svg'), ('music-player-fill.svg', 'music-player-fill.svg'), ('hammer.svg', 'hammer.svg'), ('reception-4.svg', 'reception-4.svg'), ('percent.svg', 'percent.svg'), ('briefcase-fill.svg', 'briefcase-fill.svg'), ('bootstrap-reboot.svg', 'bootstrap-reboot.svg'), ('person-dash.svg', 'person-dash.svg'), ('bucket.svg', 'bucket.svg'), ('alarm-fill.svg', 'alarm-fill.svg'), ('grid-3x2-gap.svg', 'grid-3x2-gap.svg'), ('card-list.svg', 'card-list.svg'), ('arrow-90deg-down.svg', 'arrow-90deg-down.svg'), ('x.svg', 'x.svg'), ('chevron-down.svg', 'chevron-down.svg'), ('sort-alpha-up.svg', 'sort-alpha-up.svg'), ('caret-right-square-fill.svg', 'caret-right-square-fill.svg'), ('calendar3-range-fill.svg', 'calendar3-range-fill.svg'), ('app.svg', 'app.svg'), ('truck.svg', 'truck.svg'), ('file-earmark-medical-fill.svg', 'file-earmark-medical-fill.svg'), ('house.svg', 'house.svg'), ('calendar-minus-fill.svg', 'calendar-minus-fill.svg'), ('arrow-up-square-fill.svg', 'arrow-up-square-fill.svg'), ('grid-1x2.svg', 'grid-1x2.svg'), ('vr.svg', 'vr.svg'), ('calendar-range-fill.svg', 'calendar-range-fill.svg'), ('telephone-plus.svg', 'telephone-plus.svg'), ('wallet-fill.svg', 'wallet-fill.svg'), ('telephone-inbound-fill.svg', 'telephone-inbound-fill.svg'), ('arrow-90deg-left.svg', 'arrow-90deg-left.svg'), ('person-x.svg', 'person-x.svg'), ('front.svg', 'front.svg'), ('arrow-right-circle.svg', 'arrow-right-circle.svg'), ('pip.svg', 'pip.svg'), ('chat-quote.svg', 'chat-quote.svg'), ('layout-three-columns.svg', 'layout-three-columns.svg'), ('keyboard.svg', 'keyboard.svg'), ('dice-1.svg', 'dice-1.svg'), ('receipt-cutoff.svg', 'receipt-cutoff.svg'), ('kanban.svg', 'kanban.svg'), ('tablet-landscape-fill.svg', 'tablet-landscape-fill.svg'), ('code-square.svg', 'code-square.svg'), ('file-earmark-font.svg', 'file-earmark-font.svg'), ('tablet-fill.svg', 'tablet-fill.svg'), ('text-paragraph.svg', 'text-paragraph.svg'), ('inbox-fill.svg', 'inbox-fill.svg'), ('hdd-stack-fill.svg', 'hdd-stack-fill.svg'), ('sticky-fill.svg', 'sticky-fill.svg'), ('arrows-move.svg', 'arrows-move.svg'), ('arrows-angle-contract.svg', 'arrows-angle-contract.svg'), ('exclamation-octagon.svg', 'exclamation-octagon.svg'), ('hdd-rack.svg', 'hdd-rack.svg'), ('view-list.svg', 'view-list.svg'), ('youtube.svg', 'youtube.svg'), ('arrow-down-circle.svg', 'arrow-down-circle.svg'), ('file-earmark-minus.svg', 'file-earmark-minus.svg'), ('x-diamond-fill.svg', 'x-diamond-fill.svg'), ('cast.svg', 'cast.svg'), ('layout-text-sidebar.svg', 'layout-text-sidebar.svg'), ('sort-numeric-up-alt.svg', 'sort-numeric-up-alt.svg'), ('arrow-right-circle-fill.svg', 'arrow-right-circle-fill.svg'), ('badge-ad.svg', 'badge-ad.svg'), ('arrow-left-short.svg', 'arrow-left-short.svg'), ('clipboard-x.svg', 'clipboard-x.svg'), ('lightning.svg', 'lightning.svg'), ('plus.svg', 'plus.svg'), ('type-h2.svg', 'type-h2.svg'), ('caret-right-square.svg', 'caret-right-square.svg'), ('calendar3-range.svg', 'calendar3-range.svg'), ('person.svg', 'person.svg'), ('chat-left-text.svg', 'chat-left-text.svg'), ('menu-app.svg', 'menu-app.svg'), ('volume-down.svg', 'volume-down.svg'), ('circle.svg', 'circle.svg'), ('grid-3x3.svg', 'grid-3x3.svg'), ('cart-x-fill.svg', 'cart-x-fill.svg'), ('bag-fill.svg', 'bag-fill.svg'), ('emoji-smile.svg', 'emoji-smile.svg'), ('folder-plus.svg', 'folder-plus.svg'), ('tools.svg', 'tools.svg'), ('calendar4.svg', 'calendar4.svg'), ('sort-alpha-down.svg', 'sort-alpha-down.svg'), ('backspace-fill.svg', 'backspace-fill.svg'), ('plug.svg', 'plug.svg'), ('bar-chart-fill.svg', 'bar-chart-fill.svg'), ('list-check.svg', 'list-check.svg'), ('window.svg', 'window.svg'), ('aspect-ratio.svg', 'aspect-ratio.svg'), ('markdown-fill.svg', 'markdown-fill.svg'), ('journal-arrow-up.svg', 'journal-arrow-up.svg'), ('file-diff-fill.svg', 'file-diff-fill.svg'), ('clock-history.svg', 'clock-history.svg'), ('bookmark-star.svg', 'bookmark-star.svg'), ('cloud-fill.svg', 'cloud-fill.svg'), ('shield-fill-x.svg', 'shield-fill-x.svg'), ('eye.svg', 'eye.svg'), ('person-check-fill.svg', 'person-check-fill.svg'), ('skip-start.svg', 'skip-start.svg'), ('file-earmark-zip.svg', 'file-earmark-zip.svg'), ('chevron-compact-right.svg', 'chevron-compact-right.svg'), ('person-dash-fill.svg', 'person-dash-fill.svg'), ('sun.svg', 'sun.svg'), ('filter-circle-fill.svg', 'filter-circle-fill.svg'), ('pause-btn-fill.svg', 'pause-btn-fill.svg'), ('bag-check-fill.svg', 'bag-check-fill.svg'), ('arrow-counterclockwise.svg', 'arrow-counterclockwise.svg'), ('chevron-bar-contract.svg', 'chevron-bar-contract.svg'), ('hdd-fill.svg', 'hdd-fill.svg'), ('list-nested.svg', 'list-nested.svg'), ('chevron-bar-right.svg', 'chevron-bar-right.svg'), ('arrow-return-left.svg', 'arrow-return-left.svg'), ('file-music-fill.svg', 'file-music-fill.svg'), ('shop-window.svg', 'shop-window.svg'), ('justify-right.svg', 'justify-right.svg'), ('exclude.svg', 'exclude.svg'), ('shield-exclamation.svg', 'shield-exclamation.svg'), ('arrow-right-square-fill.svg', 'arrow-right-square-fill.svg'), ('check-square.svg', 'check-square.svg'), ('question-circle-fill.svg', 'question-circle-fill.svg'), ('geo-fill.svg', 'geo-fill.svg'), ('credit-card-fill.svg', 'credit-card-fill.svg'), ('grid-3x2.svg', 'grid-3x2.svg'), ('share-fill.svg', 'share-fill.svg'), ('brush.svg', 'brush.svg'), ('diagram-2-fill.svg', 'diagram-2-fill.svg'), ('ladder.svg', 'ladder.svg'), ('grip-vertical.svg', 'grip-vertical.svg'), ('speaker.svg', 'speaker.svg'), ('arrow-left-circle-fill.svg', 'arrow-left-circle-fill.svg'), ('speaker-fill.svg', 'speaker-fill.svg'), ('filter-circle.svg', 'filter-circle.svg'), ('brightness-alt-high.svg', 'brightness-alt-high.svg'), ('earbuds.svg', 'earbuds.svg'), ('shield-fill.svg', 'shield-fill.svg'), ('shield-fill-plus.svg', 'shield-fill-plus.svg'), ('list-ol.svg', 'list-ol.svg'), ('gear-wide-connected.svg', 'gear-wide-connected.svg'), ('dice-2-fill.svg', 'dice-2-fill.svg'), ('display.svg', 'display.svg'), ('exclamation-diamond.svg', 'exclamation-diamond.svg'), ('eye-slash.svg', 'eye-slash.svg'), ('journals.svg', 'journals.svg'), ('arrow-up-left-square-fill.svg', 'arrow-up-left-square-fill.svg'), ('arrow-left.svg', 'arrow-left.svg'), ('skip-backward.svg', 'skip-backward.svg'), ('bootstrap-fill.svg', 'bootstrap-fill.svg'), ('file-zip-fill.svg', 'file-zip-fill.svg'), ('diamond-half.svg', 'diamond-half.svg'), ('telephone-inbound.svg', 'telephone-inbound.svg'), ('file-earmark-break.svg', 'file-earmark-break.svg'), ('file-post-fill.svg', 'file-post-fill.svg'), ('shield.svg', 'shield.svg'), ('linkedin.svg', 'linkedin.svg'), ('dice-4-fill.svg', 'dice-4-fill.svg'), ('arrow-return-right.svg', 'arrow-return-right.svg'), ('backspace-reverse-fill.svg', 'backspace-reverse-fill.svg'), ('gift.svg', 'gift.svg'), ('trash2-fill.svg', 'trash2-fill.svg'), ('brightness-high-fill.svg', 'brightness-high-fill.svg'), ('arrow-left-circle.svg', 'arrow-left-circle.svg'), ('exclamation.svg', 'exclamation.svg'), ('star-fill.svg', 'star-fill.svg'), ('question-square-fill.svg', 'question-square-fill.svg'), ('emoji-smile-fill.svg', 'emoji-smile-fill.svg'), ('chat-left-text-fill.svg', 'chat-left-text-fill.svg'), ('wallet.svg', 'wallet.svg'), ('menu-button-fill.svg', 'menu-button-fill.svg'), ('map-fill.svg', 'map-fill.svg'), ('dice-1-fill.svg', 'dice-1-fill.svg'), ('emoji-angry.svg', 'emoji-angry.svg'), ('journal-minus.svg', 'journal-minus.svg'), ('card-image.svg', 'card-image.svg'), ('arrow-90deg-right.svg', 'arrow-90deg-right.svg'), ('sliders.svg', 'sliders.svg'), ('box-arrow-in-down-right.svg', 'box-arrow-in-down-right.svg'), ('fonts.svg', 'fonts.svg'), ('exclamation-circle.svg', 'exclamation-circle.svg'), ('file-earmark-play-fill.svg', 'file-earmark-play-fill.svg'), ('cloud-arrow-down.svg', 'cloud-arrow-down.svg'), ('file-ppt-fill.svg', 'file-ppt-fill.svg'), ('emoji-wink.svg', 'emoji-wink.svg'), ('calendar4-event.svg', 'calendar4-event.svg'), ('collection-play.svg', 'collection-play.svg'), ('pentagon-fill.svg', 'pentagon-fill.svg'), ('file-earmark-plus.svg', 'file-earmark-plus.svg'), ('journal-album.svg', 'journal-album.svg'), ('paperclip.svg', 'paperclip.svg'), ('sort-up.svg', 'sort-up.svg'), ('file-lock.svg', 'file-lock.svg'), ('file-earmark-break-fill.svg', 'file-earmark-break-fill.svg'), ('patch-check.svg', 'patch-check.svg'), ('file-fill.svg', 'file-fill.svg'), ('shield-fill-exclamation.svg', 'shield-fill-exclamation.svg'), ('journal-plus.svg', 'journal-plus.svg'), ('question-square.svg', 'question-square.svg'), ('printer-fill.svg', 'printer-fill.svg'), ('file-break.svg', 'file-break.svg'), ('egg-fried.svg', 'egg-fried.svg'), ('camera-video-off.svg', 'camera-video-off.svg'), ('layout-sidebar-inset.svg', 'layout-sidebar-inset.svg'), ('stoplights.svg', 'stoplights.svg'), ('basket2-fill.svg', 'basket2-fill.svg'), ('toggle2-off.svg', 'toggle2-off.svg'), ('emoji-frown.svg', 'emoji-frown.svg'), ('grid.svg', 'grid.svg'), ('tag-fill.svg', 'tag-fill.svg'), ('folder-x.svg', 'folder-x.svg'), ('skip-end-fill.svg', 'skip-end-fill.svg'), ('heptagon-fill.svg', 'heptagon-fill.svg'), ('bug-fill.svg', 'bug-fill.svg'), ('signpost.svg', 'signpost.svg'), ('caret-left-square-fill.svg', 'caret-left-square-fill.svg'), ('sticky.svg', 'sticky.svg'), ('emoji-angry-fill.svg', 'emoji-angry-fill.svg'), ('calendar2-x.svg', 'calendar2-x.svg'), ('file-code.svg', 'file-code.svg'), ('file-earmark-code.svg', 'file-earmark-code.svg'), ('chevron-compact-down.svg', 'chevron-compact-down.svg'), ('arrow-bar-down.svg', 'arrow-bar-down.svg'), ('keyboard-fill.svg', 'keyboard-fill.svg'), ('file-earmark-font-fill.svg', 'file-earmark-font-fill.svg'), ('suit-heart.svg', 'suit-heart.svg'), ('telephone-fill.svg', 'telephone-fill.svg'), ('skip-start-btn-fill.svg', 'skip-start-btn-fill.svg'), ('inbox.svg', 'inbox.svg'), ('bag.svg', 'bag.svg'), ('skip-end.svg', 'skip-end.svg'), ('arrow-up-short.svg', 'arrow-up-short.svg'), ('filter-square-fill.svg', 'filter-square-fill.svg'), ('camera-reels-fill.svg', 'camera-reels-fill.svg'), ('hand-thumbs-up.svg', 'hand-thumbs-up.svg'), ('vinyl-fill.svg', 'vinyl-fill.svg'), ('file-earmark-lock2-fill.svg', 'file-earmark-lock2-fill.svg'), ('play-fill.svg', 'play-fill.svg'), ('truck-flatbed.svg', 'truck-flatbed.svg'), ('chat-left-fill.svg', 'chat-left-fill.svg'), ('scissors.svg', 'scissors.svg'), ('volume-mute-fill.svg', 'volume-mute-fill.svg'), ('pip-fill.svg', 'pip-fill.svg'), ('folder2.svg', 'folder2.svg'), ('telephone-outbound.svg', 'telephone-outbound.svg'), ('arrow-90deg-up.svg', 'arrow-90deg-up.svg'), ('file-earmark-post.svg', 'file-earmark-post.svg'), ('file-earmark-arrow-up.svg', 'file-earmark-arrow-up.svg'), ('arrow-down-right-circle.svg', 'arrow-down-right-circle.svg'), ('text-indent-right.svg', 'text-indent-right.svg'), ('file-easel.svg', 'file-easel.svg'), ('capslock.svg', 'capslock.svg'), ('octagon-half.svg', 'octagon-half.svg'), ('camera-video-off-fill.svg', 'camera-video-off-fill.svg'), ('caret-right.svg', 'caret-right.svg'), ('file-earmark-person-fill.svg', 'file-earmark-person-fill.svg'), ('patch-exclamation-fll.svg', 'patch-exclamation-fll.svg'), ('file-earmark-ppt.svg', 'file-earmark-ppt.svg'), ('battery.svg', 'battery.svg'), ('nut-fill.svg', 'nut-fill.svg'), ('trash.svg', 'trash.svg'), ('textarea-t.svg', 'textarea-t.svg'), ('bootstrap.svg', 'bootstrap.svg'), ('segmented-nav.svg', 'segmented-nav.svg'), ('file-earmark-spreadsheet-fill.svg', 'file-earmark-spreadsheet-fill.svg'), ('moon.svg', 'moon.svg'), ('caret-down-fill.svg', 'caret-down-fill.svg'), ('skip-forward-circle.svg', 'skip-forward-circle.svg'), ('grip-horizontal.svg', 'grip-horizontal.svg'), ('award.svg', 'award.svg'), ('signpost-2-fill.svg', 'signpost-2-fill.svg'), ('dot.svg', 'dot.svg'), ('file-slides-fill.svg', 'file-slides-fill.svg'), ('caret-down-square.svg', 'caret-down-square.svg'), ('plug-fill.svg', 'plug-fill.svg'), ('gear-wide.svg', 'gear-wide.svg'), ('music-note-list.svg', 'music-note-list.svg'), ('file-earmark-lock.svg', 'file-earmark-lock.svg'), ('file-ppt.svg', 'file-ppt.svg'), ('bookmark-heart-fill.svg', 'bookmark-heart-fill.svg'), ('basket3-fill.svg', 'basket3-fill.svg'), ('file-spreadsheet.svg', 'file-spreadsheet.svg'), ('box-arrow-in-down-left.svg', 'box-arrow-in-down-left.svg'), ('plus-square.svg', 'plus-square.svg'), ('file-earmark-binary.svg', 'file-earmark-binary.svg'), ('info-circle-fill.svg', 'info-circle-fill.svg'), ('cloud-upload-fill.svg', 'cloud-upload-fill.svg'), ('calendar2-check.svg', 'calendar2-check.svg'), ('arrow-right-square.svg', 'arrow-right-square.svg'), ('file-earmark-ppt-fill.svg', 'file-earmark-ppt-fill.svg'), ('emoji-neutral.svg', 'emoji-neutral.svg'), ('cart-fill.svg', 'cart-fill.svg'), ('info-circle.svg', 'info-circle.svg'), ('hourglass-top.svg', 'hourglass-top.svg'), ('file-excel.svg', 'file-excel.svg'), ('chevron-up.svg', 'chevron-up.svg'), ('patch-exclamation.svg', 'patch-exclamation.svg'), ('menu-up.svg', 'menu-up.svg'), ('heptagon-half.svg', 'heptagon-half.svg'), ('dash.svg', 'dash.svg'), ('dice-3.svg', 'dice-3.svg'), ('sort-numeric-down.svg', 'sort-numeric-down.svg'), ('volume-up.svg', 'volume-up.svg'), ('slash-circle.svg', 'slash-circle.svg'), ('lightning-fill.svg', 'lightning-fill.svg'), ('pause.svg', 'pause.svg'), ('calendar2-month.svg', 'calendar2-month.svg'), ('pen-fill.svg', 'pen-fill.svg'), ('hr.svg', 'hr.svg'), ('exclamation-octagon-fill.svg', 'exclamation-octagon-fill.svg'), ('file-minus.svg', 'file-minus.svg'), ('eject-fill.svg', 'eject-fill.svg'), ('file-x-fill.svg', 'file-x-fill.svg'), ('camera-video-fill.svg', 'camera-video-fill.svg'), ('border-width.svg', 'border-width.svg'), ('calendar-minus.svg', 'calendar-minus.svg'), ('mailbox.svg', 'mailbox.svg'), ('chat-dots-fill.svg', 'chat-dots-fill.svg'), ('cart-check-fill.svg', 'cart-check-fill.svg'), ('menu-down.svg', 'menu-down.svg'), ('tv.svg', 'tv.svg'), ('house-fill.svg', 'house-fill.svg'), ('calendar2-week.svg', 'calendar2-week.svg'), ('type-h3.svg', 'type-h3.svg'), ('door-open-fill.svg', 'door-open-fill.svg'), ('play-circle-fill.svg', 'play-circle-fill.svg'), ('calendar2-minus-fill.svg', 'calendar2-minus-fill.svg'), ('chevron-contract.svg', 'chevron-contract.svg'), ('file-minus-fill.svg', 'file-minus-fill.svg'), ('bookmark-check.svg', 'bookmark-check.svg'), ('zoom-out.svg', 'zoom-out.svg'), ('bookmark-x-fill.svg', 'bookmark-x-fill.svg'), ('arrow-down-short.svg', 'arrow-down-short.svg'), ('file-person.svg', 'file-person.svg'), ('file-earmark-x.svg', 'file-earmark-x.svg'), ('octagon.svg', 'octagon.svg'), ('screwdriver.svg', 'screwdriver.svg'), ('credit-card.svg', 'credit-card.svg'), ('telephone-outbound-fill.svg', 'telephone-outbound-fill.svg'), ('file-earmark-post-fill.svg', 'file-earmark-post-fill.svg'), ('chat-fill.svg', 'chat-fill.svg'), ('exclamation-circle-fill.svg', 'exclamation-circle-fill.svg'), ('calendar2-event.svg', 'calendar2-event.svg'), ('geo.svg', 'geo.svg'), ('play-btn-fill.svg', 'play-btn-fill.svg'), ('skip-forward-btn-fill.svg', 'skip-forward-btn-fill.svg'), ('dash-circle.svg', 'dash-circle.svg'), ('file-binary-fill.svg', 'file-binary-fill.svg'), ('calendar2.svg', 'calendar2.svg'), ('filter.svg', 'filter.svg'), ('wifi.svg', 'wifi.svg'), ('cloud-arrow-up.svg', 'cloud-arrow-up.svg'), ('file-earmark-bar-graph-fill.svg', 'file-earmark-bar-graph-fill.svg'), ('hdd-network.svg', 'hdd-network.svg'), ('telephone-minus-fill.svg', 'telephone-minus-fill.svg'), ('file-earmark-excel.svg', 'file-earmark-excel.svg'), ('volume-down-fill.svg', 'volume-down-fill.svg'), ('power.svg', 'power.svg'), ('droplet.svg', 'droplet.svg'), ('layout-split.svg', 'layout-split.svg'), ('arrows-fullscreen.svg', 'arrows-fullscreen.svg'), ('dice-5-fill.svg', 'dice-5-fill.svg'), ('file-font.svg', 'file-font.svg'), ('file-music.svg', 'file-music.svg'), ('cloud-download-fill.svg', 'cloud-download-fill.svg'), ('cup-fill.svg', 'cup-fill.svg'), ('cash-stack.svg', 'cash-stack.svg'), ('box-arrow-in-down.svg', 'box-arrow-in-down.svg'), ('globe2.svg', 'globe2.svg'), ('google.svg', 'google.svg'), ('skip-forward.svg', 'skip-forward.svg'), ('file-earmark-slides-fill.svg', 'file-earmark-slides-fill.svg'), ('record-fill.svg', 'record-fill.svg'), ('file-ruled-fill.svg', 'file-ruled-fill.svg'), ('facebook.svg', 'facebook.svg'), ('box-arrow-in-up.svg', 'box-arrow-in-up.svg'), ('list-task.svg', 'list-task.svg'), ('diagram-3-fill.svg', 'diagram-3-fill.svg'), ('folder2-open.svg', 'folder2-open.svg'), ('folder-minus.svg', 'folder-minus.svg'), ('journal-bookmark.svg', 'journal-bookmark.svg'), ('calendar2-plus-fill.svg', 'calendar2-plus-fill.svg'), ('calendar2-plus.svg', 'calendar2-plus.svg'), ('unlock.svg', 'unlock.svg'), ('music-note-beamed.svg', 'music-note-beamed.svg'), ('arrow-down.svg', 'arrow-down.svg'), ('calendar-day-fill.svg', 'calendar-day-fill.svg'), ('arrow-down-square-fill.svg', 'arrow-down-square-fill.svg'), ('bookmark-dash-fill.svg', 'bookmark-dash-fill.svg'), ('mic-mute-fill.svg', 'mic-mute-fill.svg'), ('sunglasses.svg', 'sunglasses.svg'), ('suit-diamond.svg', 'suit-diamond.svg'), ('gear-fill.svg', 'gear-fill.svg'), ('pencil.svg', 'pencil.svg'), ('chat-text.svg', 'chat-text.svg'), ('cart-dash-fill.svg', 'cart-dash-fill.svg'), ('stop-circle-fill.svg', 'stop-circle-fill.svg'), ('battery-charging.svg', 'battery-charging.svg'), ('wifi-off.svg', 'wifi-off.svg'), ('tag.svg', 'tag.svg'), ('credit-card-2-back-fill.svg', 'credit-card-2-back-fill.svg'), ('chat-right-text.svg', 'chat-right-text.svg'), ('file-binary.svg', 'file-binary.svg'), ('puzzle-fill.svg', 'puzzle-fill.svg'), ('chat-right-quote-fill.svg', 'chat-right-quote-fill.svg'), ('arrow-down-right-circle-fill.svg', 'arrow-down-right-circle-fill.svg'), ('x-octagon-fill.svg', 'x-octagon-fill.svg'), ('download.svg', 'download.svg'), ('layout-sidebar-reverse.svg', 'layout-sidebar-reverse.svg'), ('bezier2.svg', 'bezier2.svg'), ('camera-reels.svg', 'camera-reels.svg'), ('calendar-month.svg', 'calendar-month.svg'), ('sim.svg', 'sim.svg'), ('globe.svg', 'globe.svg'), ('dash-square-fill.svg', 'dash-square-fill.svg'), ('binoculars.svg', 'binoculars.svg'), ('telephone.svg', 'telephone.svg'), ('stopwatch-fill.svg', 'stopwatch-fill.svg'), ('telephone-x-fill.svg', 'telephone-x-fill.svg'), ('tags.svg', 'tags.svg'), ('arrows-expand.svg', 'arrows-expand.svg'), ('trash-fill.svg', 'trash-fill.svg'), ('shield-slash-fill.svg', 'shield-slash-fill.svg'), ('cpu.svg', 'cpu.svg'), ('shield-shaded.svg', 'shield-shaded.svg'), ('file-earmark-check-fill.svg', 'file-earmark-check-fill.svg'), ('image-alt.svg', 'image-alt.svg'), ('paragraph.svg', 'paragraph.svg'), ('caret-up-square.svg', 'caret-up-square.svg'), ('node-plus.svg', 'node-plus.svg'), ('badge-ad-fill.svg', 'badge-ad-fill.svg'), ('skip-start-circle.svg', 'skip-start-circle.svg'), ('skip-forward-btn.svg', 'skip-forward-btn.svg'), ('record-btn-fill.svg', 'record-btn-fill.svg'), ('cart4.svg', 'cart4.svg'), ('check2.svg', 'check2.svg'), ('droplet-fill.svg', 'droplet-fill.svg'), ('file-lock-fill.svg', 'file-lock-fill.svg'), ('bug.svg', 'bug.svg'), ('align-top.svg', 'align-top.svg'), ('check2-square.svg', 'check2-square.svg'), ('film.svg', 'film.svg'), ('distribute-vertical.svg', 'distribute-vertical.svg'), ('bag-dash-fill.svg', 'bag-dash-fill.svg'), ('arrow-repeat.svg', 'arrow-repeat.svg'), ('person-x-fill.svg', 'person-x-fill.svg'), ('app-indicator.svg', 'app-indicator.svg'), ('chat-right-text-fill.svg', 'chat-right-text-fill.svg'), ('question-octagon.svg', 'question-octagon.svg'), ('camera.svg', 'camera.svg'), ('box-arrow-down-left.svg', 'box-arrow-down-left.svg'), ('upc-scan.svg', 'upc-scan.svg'), ('alarm.svg', 'alarm.svg'), ('mic-fill.svg', 'mic-fill.svg'), ('file-earmark-word-fill.svg', 'file-earmark-word-fill.svg'), ('type-underline.svg', 'type-underline.svg'), ('github.svg', 'github.svg'), ('node-minus.svg', 'node-minus.svg'), ('telephone-forward.svg', 'telephone-forward.svg'), ('union.svg', 'union.svg'), ('stickies-fill.svg', 'stickies-fill.svg'), ('file-earmark-fill.svg', 'file-earmark-fill.svg'), ('shield-slash.svg', 'shield-slash.svg'), ('arrow-up-left-circle-fill.svg', 'arrow-up-left-circle-fill.svg'), ('brightness-low.svg', 'brightness-low.svg'), ('backspace.svg', 'backspace.svg'), ('file-earmark-lock2.svg', 'file-earmark-lock2.svg'), ('file-earmark-music.svg', 'file-earmark-music.svg'), ('eject.svg', 'eject.svg'), ('skip-end-circle-fill.svg', 'skip-end-circle-fill.svg'), ('terminal-fill.svg', 'terminal-fill.svg'), ('caret-right-fill.svg', 'caret-right-fill.svg'), ('grid-3x3-gap-fill.svg', 'grid-3x3-gap-fill.svg'), ('check-circle.svg', 'check-circle.svg'), ('dash-circle-fill.svg', 'dash-circle-fill.svg'), ('arrow-down-left-square.svg', 'arrow-down-left-square.svg'), ('signpost-2.svg', 'signpost-2.svg'), ('file-earmark-bar-graph.svg', 'file-earmark-bar-graph.svg'), ('file-earmark.svg', 'file-earmark.svg'), ('card-checklist.svg', 'card-checklist.svg'), ('clipboard.svg', 'clipboard.svg'), ('journal-richtext.svg', 'journal-richtext.svg'), ('brightness-alt-high-fill.svg', 'brightness-alt-high-fill.svg'), ('skip-end-btn.svg', 'skip-end-btn.svg'), ('brush-fill.svg', 'brush-fill.svg'), ('bag-dash.svg', 'bag-dash.svg'), ('cart-dash.svg', 'cart-dash.svg'), ('badge-8k-fill.svg', 'badge-8k-fill.svg'), ('brightness-alt-low.svg', 'brightness-alt-low.svg'), ('menu-button.svg', 'menu-button.svg'), ('cloud-check.svg', 'cloud-check.svg'), ('emoji-laughing.svg', 'emoji-laughing.svg'), ('arrow-clockwise.svg', 'arrow-clockwise.svg'), ('file-earmark-diff.svg', 'file-earmark-diff.svg'), ('cart.svg', 'cart.svg'), ('file-ruled.svg', 'file-ruled.svg'), ('cursor-text.svg', 'cursor-text.svg'), ('funnel-fill.svg', 'funnel-fill.svg'), ('patch-plus-fll.svg', 'patch-plus-fll.svg'), ('chevron-bar-left.svg', 'chevron-bar-left.svg'), ('skip-backward-btn-fill.svg', 'skip-backward-btn-fill.svg'), ('diagram-3.svg', 'diagram-3.svg'), ('basket-fill.svg', 'basket-fill.svg'), ('clipboard-minus.svg', 'clipboard-minus.svg'), ('question-octagon-fill.svg', 'question-octagon-fill.svg'), ('collection-play-fill.svg', 'collection-play-fill.svg'), ('image.svg', 'image.svg'), ('file-plus-fill.svg', 'file-plus-fill.svg'), ('pause-circle-fill.svg', 'pause-circle-fill.svg'), ('journal-arrow-down.svg', 'journal-arrow-down.svg'), ('align-middle.svg', 'align-middle.svg'), ('archive-fill.svg', 'archive-fill.svg'), ('joystick.svg', 'joystick.svg'), ('calendar-event-fill.svg', 'calendar-event-fill.svg'), ('journal.svg', 'journal.svg'), ('badge-cc-fill.svg', 'badge-cc-fill.svg'), ('caret-down.svg', 'caret-down.svg'), ('x-square.svg', 'x-square.svg'), ('bounding-box-circles.svg', 'bounding-box-circles.svg'), ('book-fill.svg', 'book-fill.svg'), ('type-bold.svg', 'type-bold.svg'), ('bookmark-dash.svg', 'bookmark-dash.svg'), ('arrow-up-right-circle-fill.svg', 'arrow-up-right-circle-fill.svg'), ('badge-vo-fill.svg', 'badge-vo-fill.svg'), ('cloud-arrow-up-fill.svg', 'cloud-arrow-up-fill.svg')], max_length=100, verbose_name='Ãcono'),16        ),17        migrations.AlterField(18            model_name='module',19            name='url_name',20            field=models.CharField(max_length=256, unique=True),21        ),...0003_auto_20210110_1957.py
Source:0003_auto_20210110_1957.py  
1# Generated by Django 3.1.4 on 2021-01-10 19:572from django.db import migrations, models3class Migration(migrations.Migration):4    dependencies = [5        ('module', '0002_auto_20210108_1807'),6    ]7    operations = [8        migrations.AlterField(9            model_name='module',10            name='icon_name',11            field=models.CharField(blank=True, choices=[('alarm-fill.svg', 'alarm-fill.svg'), ('alarm.svg', 'alarm.svg'), ('align-bottom.svg', 'align-bottom.svg'), ('align-center.svg', 'align-center.svg'), ('align-end.svg', 'align-end.svg'), ('align-middle.svg', 'align-middle.svg'), ('align-start.svg', 'align-start.svg'), ('align-top.svg', 'align-top.svg'), ('alt.svg', 'alt.svg'), ('app-indicator.svg', 'app-indicator.svg'), ('app.svg', 'app.svg'), ('archive-fill.svg', 'archive-fill.svg'), ('archive.svg', 'archive.svg'), ('arrow-90deg-down.svg', 'arrow-90deg-down.svg'), ('arrow-90deg-left.svg', 'arrow-90deg-left.svg'), ('arrow-90deg-right.svg', 'arrow-90deg-right.svg'), ('arrow-90deg-up.svg', 'arrow-90deg-up.svg'), ('arrow-bar-down.svg', 'arrow-bar-down.svg'), ('arrow-bar-left.svg', 'arrow-bar-left.svg'), ('arrow-bar-right.svg', 'arrow-bar-right.svg'), ('arrow-bar-up.svg', 'arrow-bar-up.svg'), ('arrow-clockwise.svg', 'arrow-clockwise.svg'), ('arrow-counterclockwise.svg', 'arrow-counterclockwise.svg'), ('arrow-down-circle-fill.svg', 'arrow-down-circle-fill.svg'), ('arrow-down-circle.svg', 'arrow-down-circle.svg'), ('arrow-down-left-circle-fill.svg', 'arrow-down-left-circle-fill.svg'), ('arrow-down-left-circle.svg', 'arrow-down-left-circle.svg'), ('arrow-down-left-square-fill.svg', 'arrow-down-left-square-fill.svg'), ('arrow-down-left-square.svg', 'arrow-down-left-square.svg'), ('arrow-down-left.svg', 'arrow-down-left.svg'), ('arrow-down-right-circle-fill.svg', 'arrow-down-right-circle-fill.svg'), ('arrow-down-right-circle.svg', 'arrow-down-right-circle.svg'), ('arrow-down-right-square-fill.svg', 'arrow-down-right-square-fill.svg'), ('arrow-down-right-square.svg', 'arrow-down-right-square.svg'), ('arrow-down-right.svg', 'arrow-down-right.svg'), ('arrow-down-short.svg', 'arrow-down-short.svg'), ('arrow-down-square-fill.svg', 'arrow-down-square-fill.svg'), ('arrow-down-square.svg', 'arrow-down-square.svg'), ('arrow-down-up.svg', 'arrow-down-up.svg'), ('arrow-down.svg', 'arrow-down.svg'), ('arrow-left-circle-fill.svg', 'arrow-left-circle-fill.svg'), ('arrow-left-circle.svg', 'arrow-left-circle.svg'), ('arrow-left-right.svg', 'arrow-left-right.svg'), ('arrow-left-short.svg', 'arrow-left-short.svg'), ('arrow-left-square-fill.svg', 'arrow-left-square-fill.svg'), ('arrow-left-square.svg', 'arrow-left-square.svg'), ('arrow-left.svg', 'arrow-left.svg'), ('arrow-repeat.svg', 'arrow-repeat.svg'), ('arrow-return-left.svg', 'arrow-return-left.svg'), ('arrow-return-right.svg', 'arrow-return-right.svg'), ('arrow-right-circle-fill.svg', 'arrow-right-circle-fill.svg'), ('arrow-right-circle.svg', 'arrow-right-circle.svg'), ('arrow-right-short.svg', 'arrow-right-short.svg'), ('arrow-right-square-fill.svg', 'arrow-right-square-fill.svg'), ('arrow-right-square.svg', 'arrow-right-square.svg'), ('arrow-right.svg', 'arrow-right.svg'), ('arrow-up-circle-fill.svg', 'arrow-up-circle-fill.svg'), ('arrow-up-circle.svg', 'arrow-up-circle.svg'), ('arrow-up-down.svg', 'arrow-up-down.svg'), ('arrow-up-left-circle-fill.svg', 'arrow-up-left-circle-fill.svg'), ('arrow-up-left-circle.svg', 'arrow-up-left-circle.svg'), ('arrow-up-left-square-fill.svg', 'arrow-up-left-square-fill.svg'), ('arrow-up-left-square.svg', 'arrow-up-left-square.svg'), ('arrow-up-left.svg', 'arrow-up-left.svg'), ('arrow-up-right-circle-fill.svg', 'arrow-up-right-circle-fill.svg'), ('arrow-up-right-circle.svg', 'arrow-up-right-circle.svg'), ('arrow-up-right-square-fill.svg', 'arrow-up-right-square-fill.svg'), ('arrow-up-right-square.svg', 'arrow-up-right-square.svg'), ('arrow-up-right.svg', 'arrow-up-right.svg'), ('arrow-up-short.svg', 'arrow-up-short.svg'), ('arrow-up-square-fill.svg', 'arrow-up-square-fill.svg'), ('arrow-up-square.svg', 'arrow-up-square.svg'), ('arrow-up.svg', 'arrow-up.svg'), ('arrows-angle-contract.svg', 'arrows-angle-contract.svg'), ('arrows-angle-expand.svg', 'arrows-angle-expand.svg'), ('arrows-collapse.svg', 'arrows-collapse.svg'), ('arrows-expand.svg', 'arrows-expand.svg'), ('arrows-fullscreen.svg', 'arrows-fullscreen.svg'), ('arrows-move.svg', 'arrows-move.svg'), ('aspect-ratio-fill.svg', 'aspect-ratio-fill.svg'), ('aspect-ratio.svg', 'aspect-ratio.svg'), ('asterisk.svg', 'asterisk.svg'), ('at.svg', 'at.svg'), ('award-fill.svg', 'award-fill.svg'), ('award.svg', 'award.svg'), ('back.svg', 'back.svg'), ('backspace-fill.svg', 'backspace-fill.svg'), ('backspace-reverse-fill.svg', 'backspace-reverse-fill.svg'), ('backspace-reverse.svg', 'backspace-reverse.svg'), ('backspace.svg', 'backspace.svg'), ('badge-4k-fill.svg', 'badge-4k-fill.svg'), ('badge-4k.svg', 'badge-4k.svg'), ('badge-8k-fill.svg', 'badge-8k-fill.svg'), ('badge-8k.svg', 'badge-8k.svg'), ('badge-ad-fill.svg', 'badge-ad-fill.svg'), ('badge-ad.svg', 'badge-ad.svg'), ('badge-cc-fill.svg', 'badge-cc-fill.svg'), ('badge-cc.svg', 'badge-cc.svg'), ('badge-hd-fill.svg', 'badge-hd-fill.svg'), ('badge-hd.svg', 'badge-hd.svg'), ('badge-tm-fill.svg', 'badge-tm-fill.svg'), ('badge-tm.svg', 'badge-tm.svg'), ('badge-vo-fill.svg', 'badge-vo-fill.svg'), ('badge-vo.svg', 'badge-vo.svg'), ('bag-check-fill.svg', 'bag-check-fill.svg'), ('bag-check.svg', 'bag-check.svg'), ('bag-dash-fill.svg', 'bag-dash-fill.svg'), ('bag-dash.svg', 'bag-dash.svg'), ('bag-fill.svg', 'bag-fill.svg'), ('bag-plus-fill.svg', 'bag-plus-fill.svg'), ('bag-plus.svg', 'bag-plus.svg'), ('bag-x-fill.svg', 'bag-x-fill.svg'), ('bag-x.svg', 'bag-x.svg'), ('bag.svg', 'bag.svg'), ('bar-chart-fill.svg', 'bar-chart-fill.svg'), ('bar-chart-line-fill.svg', 'bar-chart-line-fill.svg'), ('bar-chart-line.svg', 'bar-chart-line.svg'), ('bar-chart-steps.svg', 'bar-chart-steps.svg'), ('bar-chart.svg', 'bar-chart.svg'), ('basket-fill.svg', 'basket-fill.svg'), ('basket.svg', 'basket.svg'), ('basket2-fill.svg', 'basket2-fill.svg'), ('basket2.svg', 'basket2.svg'), ('basket3-fill.svg', 'basket3-fill.svg'), ('basket3.svg', 'basket3.svg'), ('battery-charging.svg', 'battery-charging.svg'), ('battery-full.svg', 'battery-full.svg'), ('battery-half.svg', 'battery-half.svg'), ('battery.svg', 'battery.svg'), ('bell-fill.svg', 'bell-fill.svg'), ('bell.svg', 'bell.svg'), ('bezier.svg', 'bezier.svg'), ('bezier2.svg', 'bezier2.svg'), ('bicycle.svg', 'bicycle.svg'), ('binoculars-fill.svg', 'binoculars-fill.svg'), ('binoculars.svg', 'binoculars.svg'), ('blockquote-left.svg', 'blockquote-left.svg'), ('blockquote-right.svg', 'blockquote-right.svg'), ('book-fill.svg', 'book-fill.svg'), ('book-half.svg', 'book-half.svg'), ('book.svg', 'book.svg'), ('bookmark-check-fill.svg', 'bookmark-check-fill.svg'), ('bookmark-check.svg', 'bookmark-check.svg'), ('bookmark-dash-fill.svg', 'bookmark-dash-fill.svg'), ('bookmark-dash.svg', 'bookmark-dash.svg'), ('bookmark-fill.svg', 'bookmark-fill.svg'), ('bookmark-heart-fill.svg', 'bookmark-heart-fill.svg'), ('bookmark-heart.svg', 'bookmark-heart.svg'), ('bookmark-plus-fill.svg', 'bookmark-plus-fill.svg'), ('bookmark-plus.svg', 'bookmark-plus.svg'), ('bookmark-star-fill.svg', 'bookmark-star-fill.svg'), ('bookmark-star.svg', 'bookmark-star.svg'), ('bookmark-x-fill.svg', 'bookmark-x-fill.svg'), ('bookmark-x.svg', 'bookmark-x.svg'), ('bookmark.svg', 'bookmark.svg'), ('bookmarks-fill.svg', 'bookmarks-fill.svg'), ('bookmarks.svg', 'bookmarks.svg'), ('bookshelf.svg', 'bookshelf.svg'), ('bootstrap-fill.svg', 'bootstrap-fill.svg'), ('bootstrap-icons.svg', 'bootstrap-icons.svg'), ('bootstrap-reboot.svg', 'bootstrap-reboot.svg'), ('bootstrap.svg', 'bootstrap.svg'), ('border-style.svg', 'border-style.svg'), ('border-width.svg', 'border-width.svg'), ('bounding-box-circles.svg', 'bounding-box-circles.svg'), ('bounding-box.svg', 'bounding-box.svg'), ('box-arrow-down-left.svg', 'box-arrow-down-left.svg'), ('box-arrow-down-right.svg', 'box-arrow-down-right.svg'), ('box-arrow-down.svg', 'box-arrow-down.svg'), ('box-arrow-in-down-left.svg', 'box-arrow-in-down-left.svg'), ('box-arrow-in-down-right.svg', 'box-arrow-in-down-right.svg'), ('box-arrow-in-down.svg', 'box-arrow-in-down.svg'), ('box-arrow-in-left.svg', 'box-arrow-in-left.svg'), ('box-arrow-in-right.svg', 'box-arrow-in-right.svg'), ('box-arrow-in-up-left.svg', 'box-arrow-in-up-left.svg'), ('box-arrow-in-up-right.svg', 'box-arrow-in-up-right.svg'), ('box-arrow-in-up.svg', 'box-arrow-in-up.svg'), ('box-arrow-left.svg', 'box-arrow-left.svg'), ('box-arrow-right.svg', 'box-arrow-right.svg'), ('box-arrow-up-left.svg', 'box-arrow-up-left.svg'), ('box-arrow-up-right.svg', 'box-arrow-up-right.svg'), ('box-arrow-up.svg', 'box-arrow-up.svg'), ('box-seam.svg', 'box-seam.svg'), ('box.svg', 'box.svg'), ('braces.svg', 'braces.svg'), ('bricks.svg', 'bricks.svg'), ('briefcase-fill.svg', 'briefcase-fill.svg'), ('briefcase.svg', 'briefcase.svg'), ('brightness-alt-high-fill.svg', 'brightness-alt-high-fill.svg'), ('brightness-alt-high.svg', 'brightness-alt-high.svg'), ('brightness-alt-low-fill.svg', 'brightness-alt-low-fill.svg'), ('brightness-alt-low.svg', 'brightness-alt-low.svg'), ('brightness-high-fill.svg', 'brightness-high-fill.svg'), ('brightness-high.svg', 'brightness-high.svg'), ('brightness-low-fill.svg', 'brightness-low-fill.svg'), ('brightness-low.svg', 'brightness-low.svg'), ('broadcast-pin.svg', 'broadcast-pin.svg'), ('broadcast.svg', 'broadcast.svg'), ('brush-fill.svg', 'brush-fill.svg'), ('brush.svg', 'brush.svg'), ('bucket-fill.svg', 'bucket-fill.svg'), ('bucket.svg', 'bucket.svg'), ('bug-fill.svg', 'bug-fill.svg'), ('bug.svg', 'bug.svg'), ('building.svg', 'building.svg'), ('bullseye.svg', 'bullseye.svg'), ('calculator-fill.svg', 'calculator-fill.svg'), ('calculator.svg', 'calculator.svg'), ('calendar-check-fill.svg', 'calendar-check-fill.svg'), ('calendar-check.svg', 'calendar-check.svg'), ('calendar-date-fill.svg', 'calendar-date-fill.svg'), ('calendar-date.svg', 'calendar-date.svg'), ('calendar-day-fill.svg', 'calendar-day-fill.svg'), ('calendar-day.svg', 'calendar-day.svg'), ('calendar-event-fill.svg', 'calendar-event-fill.svg'), ('calendar-event.svg', 'calendar-event.svg'), ('calendar-fill.svg', 'calendar-fill.svg'), ('calendar-minus-fill.svg', 'calendar-minus-fill.svg'), ('calendar-minus.svg', 'calendar-minus.svg'), ('calendar-month-fill.svg', 'calendar-month-fill.svg'), ('calendar-month.svg', 'calendar-month.svg'), ('calendar-plus-fill.svg', 'calendar-plus-fill.svg'), ('calendar-plus.svg', 'calendar-plus.svg'), ('calendar-range-fill.svg', 'calendar-range-fill.svg'), ('calendar-range.svg', 'calendar-range.svg'), ('calendar-week-fill.svg', 'calendar-week-fill.svg'), ('calendar-week.svg', 'calendar-week.svg'), ('calendar-x-fill.svg', 'calendar-x-fill.svg'), ('calendar-x.svg', 'calendar-x.svg'), ('calendar.svg', 'calendar.svg'), ('calendar2-check-fill.svg', 'calendar2-check-fill.svg'), ('calendar2-check.svg', 'calendar2-check.svg'), ('calendar2-date-fill.svg', 'calendar2-date-fill.svg'), ('calendar2-date.svg', 'calendar2-date.svg'), ('calendar2-day-fill.svg', 'calendar2-day-fill.svg'), ('calendar2-day.svg', 'calendar2-day.svg'), ('calendar2-event-fill.svg', 'calendar2-event-fill.svg'), ('calendar2-event.svg', 'calendar2-event.svg'), ('calendar2-fill.svg', 'calendar2-fill.svg'), ('calendar2-minus-fill.svg', 'calendar2-minus-fill.svg'), ('calendar2-minus.svg', 'calendar2-minus.svg'), ('calendar2-month-fill.svg', 'calendar2-month-fill.svg'), ('calendar2-month.svg', 'calendar2-month.svg'), ('calendar2-plus-fill.svg', 'calendar2-plus-fill.svg'), ('calendar2-plus.svg', 'calendar2-plus.svg'), ('calendar2-range-fill.svg', 'calendar2-range-fill.svg'), ('calendar2-range.svg', 'calendar2-range.svg'), ('calendar2-week-fill.svg', 'calendar2-week-fill.svg'), ('calendar2-week.svg', 'calendar2-week.svg'), ('calendar2-x-fill.svg', 'calendar2-x-fill.svg'), ('calendar2-x.svg', 'calendar2-x.svg'), ('calendar2.svg', 'calendar2.svg'), ('calendar3-event-fill.svg', 'calendar3-event-fill.svg'), ('calendar3-event.svg', 'calendar3-event.svg'), ('calendar3-fill.svg', 'calendar3-fill.svg'), ('calendar3-range-fill.svg', 'calendar3-range-fill.svg'), ('calendar3-range.svg', 'calendar3-range.svg'), ('calendar3-week-fill.svg', 'calendar3-week-fill.svg'), ('calendar3-week.svg', 'calendar3-week.svg'), ('calendar3.svg', 'calendar3.svg'), ('calendar4-event.svg', 'calendar4-event.svg'), ('calendar4-range.svg', 'calendar4-range.svg'), ('calendar4-week.svg', 'calendar4-week.svg'), ('calendar4.svg', 'calendar4.svg'), ('camera-fill.svg', 'camera-fill.svg'), ('camera-reels-fill.svg', 'camera-reels-fill.svg'), ('camera-reels.svg', 'camera-reels.svg'), ('camera-video-fill.svg', 'camera-video-fill.svg'), ('camera-video-off-fill.svg', 'camera-video-off-fill.svg'), ('camera-video-off.svg', 'camera-video-off.svg'), ('camera-video.svg', 'camera-video.svg'), ('camera.svg', 'camera.svg'), ('camera2.svg', 'camera2.svg'), ('capslock-fill.svg', 'capslock-fill.svg'), ('capslock.svg', 'capslock.svg'), ('card-checklist.svg', 'card-checklist.svg'), ('card-heading.svg', 'card-heading.svg'), ('card-image.svg', 'card-image.svg'), ('card-list.svg', 'card-list.svg'), ('card-text.svg', 'card-text.svg'), ('caret-down-fill.svg', 'caret-down-fill.svg'), ('caret-down-square-fill.svg', 'caret-down-square-fill.svg'), ('caret-down-square.svg', 'caret-down-square.svg'), ('caret-down.svg', 'caret-down.svg'), ('caret-left-fill.svg', 'caret-left-fill.svg'), ('caret-left-square-fill.svg', 'caret-left-square-fill.svg'), ('caret-left-square.svg', 'caret-left-square.svg'), ('caret-left.svg', 'caret-left.svg'), ('caret-right-fill.svg', 'caret-right-fill.svg'), ('caret-right-square-fill.svg', 'caret-right-square-fill.svg'), ('caret-right-square.svg', 'caret-right-square.svg'), ('caret-right.svg', 'caret-right.svg'), ('caret-up-fill.svg', 'caret-up-fill.svg'), ('caret-up-square-fill.svg', 'caret-up-square-fill.svg'), ('caret-up-square.svg', 'caret-up-square.svg'), ('caret-up.svg', 'caret-up.svg'), ('cart-check-fill.svg', 'cart-check-fill.svg'), ('cart-check.svg', 'cart-check.svg'), ('cart-dash-fill.svg', 'cart-dash-fill.svg'), ('cart-dash.svg', 'cart-dash.svg'), ('cart-fill.svg', 'cart-fill.svg'), ('cart-plus-fill.svg', 'cart-plus-fill.svg'), ('cart-plus.svg', 'cart-plus.svg'), ('cart-x-fill.svg', 'cart-x-fill.svg'), ('cart-x.svg', 'cart-x.svg'), ('cart.svg', 'cart.svg'), ('cart2.svg', 'cart2.svg'), ('cart3.svg', 'cart3.svg'), ('cart4.svg', 'cart4.svg'), ('cash-stack.svg', 'cash-stack.svg'), ('cash.svg', 'cash.svg'), ('cast.svg', 'cast.svg'), ('chat-dots-fill.svg', 'chat-dots-fill.svg'), ('chat-dots.svg', 'chat-dots.svg'), ('chat-fill.svg', 'chat-fill.svg'), ('chat-left-dots-fill.svg', 'chat-left-dots-fill.svg'), ('chat-left-dots.svg', 'chat-left-dots.svg'), ('chat-left-fill.svg', 'chat-left-fill.svg'), ('chat-left-quote-fill.svg', 'chat-left-quote-fill.svg'), ('chat-left-quote.svg', 'chat-left-quote.svg'), ('chat-left-text-fill.svg', 'chat-left-text-fill.svg'), ('chat-left-text.svg', 'chat-left-text.svg'), ('chat-left.svg', 'chat-left.svg'), ('chat-quote-fill.svg', 'chat-quote-fill.svg'), ('chat-quote.svg', 'chat-quote.svg'), ('chat-right-dots-fill.svg', 'chat-right-dots-fill.svg'), ('chat-right-dots.svg', 'chat-right-dots.svg'), ('chat-right-fill.svg', 'chat-right-fill.svg'), ('chat-right-quote-fill.svg', 'chat-right-quote-fill.svg'), ('chat-right-quote.svg', 'chat-right-quote.svg'), ('chat-right-text-fill.svg', 'chat-right-text-fill.svg'), ('chat-right-text.svg', 'chat-right-text.svg'), ('chat-right.svg', 'chat-right.svg'), ('chat-square-dots-fill.svg', 'chat-square-dots-fill.svg'), ('chat-square-dots.svg', 'chat-square-dots.svg'), ('chat-square-fill.svg', 'chat-square-fill.svg'), ('chat-square-quote-fill.svg', 'chat-square-quote-fill.svg'), ('chat-square-quote.svg', 'chat-square-quote.svg'), ('chat-square-text-fill.svg', 'chat-square-text-fill.svg'), ('chat-square-text.svg', 'chat-square-text.svg'), ('chat-square.svg', 'chat-square.svg'), ('chat-text-fill.svg', 'chat-text-fill.svg'), ('chat-text.svg', 'chat-text.svg'), ('chat.svg', 'chat.svg'), ('check-all.svg', 'check-all.svg'), ('check-box.svg', 'check-box.svg'), ('check-circle-fill.svg', 'check-circle-fill.svg'), ('check-circle.svg', 'check-circle.svg'), ('check-square-fill.svg', 'check-square-fill.svg'), ('check-square.svg', 'check-square.svg'), ('check.svg', 'check.svg'), ('check2-all.svg', 'check2-all.svg'), ('check2-circle.svg', 'check2-circle.svg'), ('check2-square.svg', 'check2-square.svg'), ('check2.svg', 'check2.svg'), ('chevron-bar-contract.svg', 'chevron-bar-contract.svg'), ('chevron-bar-down.svg', 'chevron-bar-down.svg'), ('chevron-bar-expand.svg', 'chevron-bar-expand.svg'), ('chevron-bar-left.svg', 'chevron-bar-left.svg'), ('chevron-bar-right.svg', 'chevron-bar-right.svg'), ('chevron-bar-up.svg', 'chevron-bar-up.svg'), ('chevron-compact-down.svg', 'chevron-compact-down.svg'), ('chevron-compact-left.svg', 'chevron-compact-left.svg'), ('chevron-compact-right.svg', 'chevron-compact-right.svg'), ('chevron-compact-up.svg', 'chevron-compact-up.svg'), ('chevron-contract.svg', 'chevron-contract.svg'), ('chevron-double-down.svg', 'chevron-double-down.svg'), ('chevron-double-left.svg', 'chevron-double-left.svg'), ('chevron-double-right.svg', 'chevron-double-right.svg'), ('chevron-double-up.svg', 'chevron-double-up.svg'), ('chevron-down.svg', 'chevron-down.svg'), ('chevron-expand.svg', 'chevron-expand.svg'), ('chevron-left.svg', 'chevron-left.svg'), ('chevron-right.svg', 'chevron-right.svg'), ('chevron-up.svg', 'chevron-up.svg'), ('circle-fill.svg', 'circle-fill.svg'), ('circle-half.svg', 'circle-half.svg'), ('circle-square.svg', 'circle-square.svg'), ('circle.svg', 'circle.svg'), ('clipboard-check.svg', 'clipboard-check.svg'), ('clipboard-data.svg', 'clipboard-data.svg'), ('clipboard-minus.svg', 'clipboard-minus.svg'), ('clipboard-plus.svg', 'clipboard-plus.svg'), ('clipboard-x.svg', 'clipboard-x.svg'), ('clipboard.svg', 'clipboard.svg'), ('clock-fill.svg', 'clock-fill.svg'), ('clock-history.svg', 'clock-history.svg'), ('clock.svg', 'clock.svg'), ('cloud-arrow-down-fill.svg', 'cloud-arrow-down-fill.svg'), ('cloud-arrow-down.svg', 'cloud-arrow-down.svg'), ('cloud-arrow-up-fill.svg', 'cloud-arrow-up-fill.svg'), ('cloud-arrow-up.svg', 'cloud-arrow-up.svg'), ('cloud-check-fill.svg', 'cloud-check-fill.svg'), ('cloud-check.svg', 'cloud-check.svg'), ('cloud-download-fill.svg', 'cloud-download-fill.svg'), ('cloud-download.svg', 'cloud-download.svg'), ('cloud-fill.svg', 'cloud-fill.svg'), ('cloud-minus-fill.svg', 'cloud-minus-fill.svg'), ('cloud-minus.svg', 'cloud-minus.svg'), ('cloud-plus-fill.svg', 'cloud-plus-fill.svg'), ('cloud-plus.svg', 'cloud-plus.svg'), ('cloud-slash-fill.svg', 'cloud-slash-fill.svg'), ('cloud-slash.svg', 'cloud-slash.svg'), ('cloud-upload-fill.svg', 'cloud-upload-fill.svg'), ('cloud-upload.svg', 'cloud-upload.svg'), ('cloud.svg', 'cloud.svg'), ('code-slash.svg', 'code-slash.svg'), ('code-square.svg', 'code-square.svg'), ('code.svg', 'code.svg'), ('collection-fill.svg', 'collection-fill.svg'), ('collection-play-fill.svg', 'collection-play-fill.svg'), ('collection-play.svg', 'collection-play.svg'), ('collection.svg', 'collection.svg'), ('columns-gap.svg', 'columns-gap.svg'), ('columns.svg', 'columns.svg'), ('command.svg', 'command.svg'), ('compass-fill.svg', 'compass-fill.svg'), ('compass.svg', 'compass.svg'), ('cone-striped.svg', 'cone-striped.svg'), ('cone.svg', 'cone.svg'), ('controller.svg', 'controller.svg'), ('cpu-fill.svg', 'cpu-fill.svg'), ('cpu.svg', 'cpu.svg'), ('credit-card-2-back-fill.svg', 'credit-card-2-back-fill.svg'), ('credit-card-2-back.svg', 'credit-card-2-back.svg'), ('credit-card-2-front-fill.svg', 'credit-card-2-front-fill.svg'), ('credit-card-2-front.svg', 'credit-card-2-front.svg'), ('credit-card-fill.svg', 'credit-card-fill.svg'), ('credit-card.svg', 'credit-card.svg'), ('crop.svg', 'crop.svg'), ('cup-fill.svg', 'cup-fill.svg'), ('cup-straw.svg', 'cup-straw.svg'), ('cup.svg', 'cup.svg'), ('cursor-fill.svg', 'cursor-fill.svg'), ('cursor-text.svg', 'cursor-text.svg'), ('cursor.svg', 'cursor.svg'), ('dash-circle-fill.svg', 'dash-circle-fill.svg'), ('dash-circle.svg', 'dash-circle.svg'), ('dash-square-fill.svg', 'dash-square-fill.svg'), ('dash-square.svg', 'dash-square.svg'), ('dash.svg', 'dash.svg'), ('diagram-2-fill.svg', 'diagram-2-fill.svg'), ('diagram-2.svg', 'diagram-2.svg'), ('diagram-3-fill.svg', 'diagram-3-fill.svg'), ('diagram-3.svg', 'diagram-3.svg'), ('diamond-fill.svg', 'diamond-fill.svg'), ('diamond-half.svg', 'diamond-half.svg'), ('diamond.svg', 'diamond.svg'), ('dice-1-fill.svg', 'dice-1-fill.svg'), ('dice-1.svg', 'dice-1.svg'), ('dice-2-fill.svg', 'dice-2-fill.svg'), ('dice-2.svg', 'dice-2.svg'), ('dice-3-fill.svg', 'dice-3-fill.svg'), ('dice-3.svg', 'dice-3.svg'), ('dice-4-fill.svg', 'dice-4-fill.svg'), ('dice-4.svg', 'dice-4.svg'), ('dice-5-fill.svg', 'dice-5-fill.svg'), ('dice-5.svg', 'dice-5.svg'), ('dice-6-fill.svg', 'dice-6-fill.svg'), ('dice-6.svg', 'dice-6.svg'), ('disc-fill.svg', 'disc-fill.svg'), ('disc.svg', 'disc.svg'), ('discord.svg', 'discord.svg'), ('display-fill.svg', 'display-fill.svg'), ('display.svg', 'display.svg'), ('distribute-horizontal.svg', 'distribute-horizontal.svg'), ('distribute-vertical.svg', 'distribute-vertical.svg'), ('door-closed-fill.svg', 'door-closed-fill.svg'), ('door-closed.svg', 'door-closed.svg'), ('door-open-fill.svg', 'door-open-fill.svg'), ('door-open.svg', 'door-open.svg'), ('dot.svg', 'dot.svg'), ('download.svg', 'download.svg'), ('droplet-fill.svg', 'droplet-fill.svg'), ('droplet-half.svg', 'droplet-half.svg'), ('droplet.svg', 'droplet.svg'), ('earbuds.svg', 'earbuds.svg'), ('easel-fill.svg', 'easel-fill.svg'), ('easel.svg', 'easel.svg'), ('egg-fill.svg', 'egg-fill.svg'), ('egg-fried.svg', 'egg-fried.svg'), ('egg.svg', 'egg.svg'), ('eject-fill.svg', 'eject-fill.svg'), ('eject.svg', 'eject.svg'), ('emoji-angry-fill.svg', 'emoji-angry-fill.svg'), ('emoji-angry.svg', 'emoji-angry.svg'), ('emoji-dizzy-fill.svg', 'emoji-dizzy-fill.svg'), ('emoji-dizzy.svg', 'emoji-dizzy.svg'), ('emoji-expressionless-fill.svg', 'emoji-expressionless-fill.svg'), ('emoji-expressionless.svg', 'emoji-expressionless.svg'), ('emoji-frown-fill.svg', 'emoji-frown-fill.svg'), ('emoji-frown.svg', 'emoji-frown.svg'), ('emoji-heart-eyes-fill.svg', 'emoji-heart-eyes-fill.svg'), ('emoji-heart-eyes.svg', 'emoji-heart-eyes.svg'), ('emoji-laughing-fill.svg', 'emoji-laughing-fill.svg'), ('emoji-laughing.svg', 'emoji-laughing.svg'), ('emoji-neutral-fill.svg', 'emoji-neutral-fill.svg'), ('emoji-neutral.svg', 'emoji-neutral.svg'), ('emoji-smile-fill.svg', 'emoji-smile-fill.svg'), ('emoji-smile-upside-down-fill.svg', 'emoji-smile-upside-down-fill.svg'), ('emoji-smile-upside-down.svg', 'emoji-smile-upside-down.svg'), ('emoji-smile.svg', 'emoji-smile.svg'), ('emoji-sunglasses-fill.svg', 'emoji-sunglasses-fill.svg'), ('emoji-sunglasses.svg', 'emoji-sunglasses.svg'), ('emoji-wink-fill.svg', 'emoji-wink-fill.svg'), ('emoji-wink.svg', 'emoji-wink.svg'), ('envelope-fill.svg', 'envelope-fill.svg'), ('envelope-open-fill.svg', 'envelope-open-fill.svg'), ('envelope-open.svg', 'envelope-open.svg'), ('envelope.svg', 'envelope.svg'), ('exclamation-circle-fill.svg', 'exclamation-circle-fill.svg'), ('exclamation-circle.svg', 'exclamation-circle.svg'), ('exclamation-diamond-fill.svg', 'exclamation-diamond-fill.svg'), ('exclamation-diamond.svg', 'exclamation-diamond.svg'), ('exclamation-octagon-fill.svg', 'exclamation-octagon-fill.svg'), ('exclamation-octagon.svg', 'exclamation-octagon.svg'), ('exclamation-square-fill.svg', 'exclamation-square-fill.svg'), ('exclamation-square.svg', 'exclamation-square.svg'), ('exclamation-triangle-fill.svg', 'exclamation-triangle-fill.svg'), ('exclamation-triangle.svg', 'exclamation-triangle.svg'), ('exclamation.svg', 'exclamation.svg'), ('exclude.svg', 'exclude.svg'), ('eye-fill.svg', 'eye-fill.svg'), ('eye-slash-fill.svg', 'eye-slash-fill.svg'), ('eye-slash.svg', 'eye-slash.svg'), ('eye.svg', 'eye.svg'), ('eyeglasses.svg', 'eyeglasses.svg'), ('facebook.svg', 'facebook.svg'), ('file-arrow-down-fill.svg', 'file-arrow-down-fill.svg'), ('file-arrow-down.svg', 'file-arrow-down.svg'), ('file-arrow-up-fill.svg', 'file-arrow-up-fill.svg'), ('file-arrow-up.svg', 'file-arrow-up.svg'), ('file-bar-graph-fill.svg', 'file-bar-graph-fill.svg'), ('file-bar-graph.svg', 'file-bar-graph.svg'), ('file-binary-fill.svg', 'file-binary-fill.svg'), ('file-binary.svg', 'file-binary.svg'), ('file-break-fill.svg', 'file-break-fill.svg'), ('file-break.svg', 'file-break.svg'), ('file-check-fill.svg', 'file-check-fill.svg'), ('file-check.svg', 'file-check.svg'), ('file-code-fill.svg', 'file-code-fill.svg'), ('file-code.svg', 'file-code.svg'), ('file-diff-fill.svg', 'file-diff-fill.svg'), ('file-diff.svg', 'file-diff.svg'), ('file-earmark-arrow-down-fill.svg', 'file-earmark-arrow-down-fill.svg'), ('file-earmark-arrow-down.svg', 'file-earmark-arrow-down.svg'), ('file-earmark-arrow-up-fill.svg', 'file-earmark-arrow-up-fill.svg'), ('file-earmark-arrow-up.svg', 'file-earmark-arrow-up.svg'), ('file-earmark-bar-graph-fill.svg', 'file-earmark-bar-graph-fill.svg'), ('file-earmark-bar-graph.svg', 'file-earmark-bar-graph.svg'), ('file-earmark-binary-fill.svg', 'file-earmark-binary-fill.svg'), ('file-earmark-binary.svg', 'file-earmark-binary.svg'), ('file-earmark-break-fill.svg', 'file-earmark-break-fill.svg'), ('file-earmark-break.svg', 'file-earmark-break.svg'), ('file-earmark-check-fill.svg', 'file-earmark-check-fill.svg'), ('file-earmark-check.svg', 'file-earmark-check.svg'), ('file-earmark-code-fill.svg', 'file-earmark-code-fill.svg'), ('file-earmark-code.svg', 'file-earmark-code.svg'), ('file-earmark-diff-fill.svg', 'file-earmark-diff-fill.svg'), ('file-earmark-diff.svg', 'file-earmark-diff.svg'), ('file-earmark-easel-fill.svg', 'file-earmark-easel-fill.svg'), ('file-earmark-easel.svg', 'file-earmark-easel.svg'), ('file-earmark-excel-fill.svg', 'file-earmark-excel-fill.svg'), ('file-earmark-excel.svg', 'file-earmark-excel.svg'), ('file-earmark-fill.svg', 'file-earmark-fill.svg'), ('file-earmark-font-fill.svg', 'file-earmark-font-fill.svg'), ('file-earmark-font.svg', 'file-earmark-font.svg'), ('file-earmark-image-fill.svg', 'file-earmark-image-fill.svg'), ('file-earmark-image.svg', 'file-earmark-image.svg'), ('file-earmark-lock-fill.svg', 'file-earmark-lock-fill.svg'), ('file-earmark-lock.svg', 'file-earmark-lock.svg'), ('file-earmark-lock2-fill.svg', 'file-earmark-lock2-fill.svg'), ('file-earmark-lock2.svg', 'file-earmark-lock2.svg'), ('file-earmark-medical-fill.svg', 'file-earmark-medical-fill.svg'), ('file-earmark-medical.svg', 'file-earmark-medical.svg'), ('file-earmark-minus-fill.svg', 'file-earmark-minus-fill.svg'), ('file-earmark-minus.svg', 'file-earmark-minus.svg'), ('file-earmark-music-fill.svg', 'file-earmark-music-fill.svg'), ('file-earmark-music.svg', 'file-earmark-music.svg'), ('file-earmark-person-fill.svg', 'file-earmark-person-fill.svg'), ('file-earmark-person.svg', 'file-earmark-person.svg'), ('file-earmark-play-fill.svg', 'file-earmark-play-fill.svg'), ('file-earmark-play.svg', 'file-earmark-play.svg'), ('file-earmark-plus-fill.svg', 'file-earmark-plus-fill.svg'), ('file-earmark-plus.svg', 'file-earmark-plus.svg'), ('file-earmark-post-fill.svg', 'file-earmark-post-fill.svg'), ('file-earmark-post.svg', 'file-earmark-post.svg'), ('file-earmark-ppt-fill.svg', 'file-earmark-ppt-fill.svg'), ('file-earmark-ppt.svg', 'file-earmark-ppt.svg'), ('file-earmark-richtext-fill.svg', 'file-earmark-richtext-fill.svg'), ('file-earmark-richtext.svg', 'file-earmark-richtext.svg'), ('file-earmark-ruled-fill.svg', 'file-earmark-ruled-fill.svg'), ('file-earmark-ruled.svg', 'file-earmark-ruled.svg'), ('file-earmark-slides-fill.svg', 'file-earmark-slides-fill.svg'), ('file-earmark-slides.svg', 'file-earmark-slides.svg'), ('file-earmark-spreadsheet-fill.svg', 'file-earmark-spreadsheet-fill.svg'), ('file-earmark-spreadsheet.svg', 'file-earmark-spreadsheet.svg'), ('file-earmark-text-fill.svg', 'file-earmark-text-fill.svg'), ('file-earmark-text.svg', 'file-earmark-text.svg'), ('file-earmark-word-fill.svg', 'file-earmark-word-fill.svg'), ('file-earmark-word.svg', 'file-earmark-word.svg'), ('file-earmark-x-fill.svg', 'file-earmark-x-fill.svg'), ('file-earmark-x.svg', 'file-earmark-x.svg'), ('file-earmark-zip-fill.svg', 'file-earmark-zip-fill.svg'), ('file-earmark-zip.svg', 'file-earmark-zip.svg'), ('file-earmark.svg', 'file-earmark.svg'), ('file-easel-fill.svg', 'file-easel-fill.svg'), ('file-easel.svg', 'file-easel.svg'), ('file-excel-fill.svg', 'file-excel-fill.svg'), ('file-excel.svg', 'file-excel.svg'), ('file-fill.svg', 'file-fill.svg'), ('file-font-fill.svg', 'file-font-fill.svg'), ('file-font.svg', 'file-font.svg'), ('file-image-fill.svg', 'file-image-fill.svg'), ('file-image.svg', 'file-image.svg'), ('file-lock-fill.svg', 'file-lock-fill.svg'), ('file-lock.svg', 'file-lock.svg'), ('file-lock2-fill.svg', 'file-lock2-fill.svg'), ('file-lock2.svg', 'file-lock2.svg'), ('file-medical-fill.svg', 'file-medical-fill.svg'), ('file-medical.svg', 'file-medical.svg'), ('file-minus-fill.svg', 'file-minus-fill.svg'), ('file-minus.svg', 'file-minus.svg'), ('file-music-fill.svg', 'file-music-fill.svg'), ('file-music.svg', 'file-music.svg'), ('file-person-fill.svg', 'file-person-fill.svg'), ('file-person.svg', 'file-person.svg'), ('file-play-fill.svg', 'file-play-fill.svg'), ('file-play.svg', 'file-play.svg'), ('file-plus-fill.svg', 'file-plus-fill.svg'), ('file-plus.svg', 'file-plus.svg'), ('file-post-fill.svg', 'file-post-fill.svg'), ('file-post.svg', 'file-post.svg'), ('file-ppt-fill.svg', 'file-ppt-fill.svg'), ('file-ppt.svg', 'file-ppt.svg'), ('file-richtext-fill.svg', 'file-richtext-fill.svg'), ('file-richtext.svg', 'file-richtext.svg'), ('file-ruled-fill.svg', 'file-ruled-fill.svg'), ('file-ruled.svg', 'file-ruled.svg'), ('file-slides-fill.svg', 'file-slides-fill.svg'), ('file-slides.svg', 'file-slides.svg'), ('file-spreadsheet-fill.svg', 'file-spreadsheet-fill.svg'), ('file-spreadsheet.svg', 'file-spreadsheet.svg'), ('file-text-fill.svg', 'file-text-fill.svg'), ('file-text.svg', 'file-text.svg'), ('file-word-fill.svg', 'file-word-fill.svg'), ('file-word.svg', 'file-word.svg'), ('file-x-fill.svg', 'file-x-fill.svg'), ('file-x.svg', 'file-x.svg'), ('file-zip-fill.svg', 'file-zip-fill.svg'), ('file-zip.svg', 'file-zip.svg'), ('file.svg', 'file.svg'), ('files-alt.svg', 'files-alt.svg'), ('files.svg', 'files.svg'), ('film.svg', 'film.svg'), ('filter-circle-fill.svg', 'filter-circle-fill.svg'), ('filter-circle.svg', 'filter-circle.svg'), ('filter-left.svg', 'filter-left.svg'), ('filter-right.svg', 'filter-right.svg'), ('filter-square-fill.svg', 'filter-square-fill.svg'), ('filter-square.svg', 'filter-square.svg'), ('filter.svg', 'filter.svg'), ('flag-fill.svg', 'flag-fill.svg'), ('flag.svg', 'flag.svg'), ('flower1.svg', 'flower1.svg'), ('flower2.svg', 'flower2.svg'), ('flower3.svg', 'flower3.svg'), ('folder-check.svg', 'folder-check.svg'), ('folder-fill.svg', 'folder-fill.svg'), ('folder-minus.svg', 'folder-minus.svg'), ('folder-plus.svg', 'folder-plus.svg'), ('folder-symlink-fill.svg', 'folder-symlink-fill.svg'), ('folder-symlink.svg', 'folder-symlink.svg'), ('folder-x.svg', 'folder-x.svg'), ('folder.svg', 'folder.svg'), ('folder2-open.svg', 'folder2-open.svg'), ('folder2.svg', 'folder2.svg'), ('fonts.svg', 'fonts.svg'), ('forward-fill.svg', 'forward-fill.svg'), ('forward.svg', 'forward.svg'), ('front.svg', 'front.svg'), ('fullscreen-exit.svg', 'fullscreen-exit.svg'), ('fullscreen.svg', 'fullscreen.svg'), ('funnel-fill.svg', 'funnel-fill.svg'), ('funnel.svg', 'funnel.svg'), ('gear-fill.svg', 'gear-fill.svg'), ('gear-wide-connected.svg', 'gear-wide-connected.svg'), ('gear-wide.svg', 'gear-wide.svg'), ('gear.svg', 'gear.svg'), ('gem.svg', 'gem.svg'), ('geo-alt-fill.svg', 'geo-alt-fill.svg'), ('geo-alt.svg', 'geo-alt.svg'), ('geo-fill.svg', 'geo-fill.svg'), ('geo.svg', 'geo.svg'), ('gift-fill.svg', 'gift-fill.svg'), ('gift.svg', 'gift.svg'), ('github.svg', 'github.svg'), ('globe.svg', 'globe.svg'), ('globe2.svg', 'globe2.svg'), ('google.svg', 'google.svg'), ('graph-down.svg', 'graph-down.svg'), ('graph-up.svg', 'graph-up.svg'), ('grid-1x2-fill.svg', 'grid-1x2-fill.svg'), ('grid-1x2.svg', 'grid-1x2.svg'), ('grid-3x2-gap-fill.svg', 'grid-3x2-gap-fill.svg'), ('grid-3x2-gap.svg', 'grid-3x2-gap.svg'), ('grid-3x2.svg', 'grid-3x2.svg'), ('grid-3x3-gap-fill.svg', 'grid-3x3-gap-fill.svg'), ('grid-3x3-gap.svg', 'grid-3x3-gap.svg'), ('grid-3x3.svg', 'grid-3x3.svg'), ('grid-fill.svg', 'grid-fill.svg'), ('grid.svg', 'grid.svg'), ('grip-horizontal.svg', 'grip-horizontal.svg'), ('grip-vertical.svg', 'grip-vertical.svg'), ('hammer.svg', 'hammer.svg'), ('hand-index-thumb.svg', 'hand-index-thumb.svg'), ('hand-index.svg', 'hand-index.svg'), ('hand-thumbs-down.svg', 'hand-thumbs-down.svg'), ('hand-thumbs-up.svg', 'hand-thumbs-up.svg'), ('handbag-fill.svg', 'handbag-fill.svg'), ('handbag.svg', 'handbag.svg'), ('hash.svg', 'hash.svg'), ('hdd-fill.svg', 'hdd-fill.svg'), ('hdd-network-fill.svg', 'hdd-network-fill.svg'), ('hdd-network.svg', 'hdd-network.svg'), ('hdd-rack-fill.svg', 'hdd-rack-fill.svg'), ('hdd-rack.svg', 'hdd-rack.svg'), ('hdd-stack-fill.svg', 'hdd-stack-fill.svg'), ('hdd-stack.svg', 'hdd-stack.svg'), ('hdd.svg', 'hdd.svg'), ('headphones.svg', 'headphones.svg'), ('headset.svg', 'headset.svg'), ('heart-fill.svg', 'heart-fill.svg'), ('heart-half.svg', 'heart-half.svg'), ('heart.svg', 'heart.svg'), ('heptagon-fill.svg', 'heptagon-fill.svg'), ('heptagon-half.svg', 'heptagon-half.svg'), ('heptagon.svg', 'heptagon.svg'), ('hexagon-fill.svg', 'hexagon-fill.svg'), ('hexagon-half.svg', 'hexagon-half.svg'), ('hexagon.svg', 'hexagon.svg'), ('hourglass-bottom.svg', 'hourglass-bottom.svg'), ('hourglass-split.svg', 'hourglass-split.svg'), ('hourglass-top.svg', 'hourglass-top.svg'), ('hourglass.svg', 'hourglass.svg'), ('house-door-fill.svg', 'house-door-fill.svg'), ('house-door.svg', 'house-door.svg'), ('house-fill.svg', 'house-fill.svg'), ('house.svg', 'house.svg'), ('hr.svg', 'hr.svg'), ('image-alt.svg', 'image-alt.svg'), ('image-fill.svg', 'image-fill.svg'), ('image.svg', 'image.svg'), ('images.svg', 'images.svg'), ('inbox-fill.svg', 'inbox-fill.svg'), ('inbox.svg', 'inbox.svg'), ('inboxes-fill.svg', 'inboxes-fill.svg'), ('inboxes.svg', 'inboxes.svg'), ('info-circle-fill.svg', 'info-circle-fill.svg'), ('info-circle.svg', 'info-circle.svg'), ('info-square-fill.svg', 'info-square-fill.svg'), ('info-square.svg', 'info-square.svg'), ('info.svg', 'info.svg'), ('input-cursor-text.svg', 'input-cursor-text.svg'), ('input-cursor.svg', 'input-cursor.svg'), ('instagram.svg', 'instagram.svg'), ('intersect.svg', 'intersect.svg'), ('journal-album.svg', 'journal-album.svg'), ('journal-arrow-down.svg', 'journal-arrow-down.svg'), ('journal-arrow-up.svg', 'journal-arrow-up.svg'), ('journal-bookmark-fill.svg', 'journal-bookmark-fill.svg'), ('journal-bookmark.svg', 'journal-bookmark.svg'), ('journal-check.svg', 'journal-check.svg'), ('journal-code.svg', 'journal-code.svg'), ('journal-medical.svg', 'journal-medical.svg'), ('journal-minus.svg', 'journal-minus.svg'), ('journal-plus.svg', 'journal-plus.svg'), ('journal-richtext.svg', 'journal-richtext.svg'), ('journal-text.svg', 'journal-text.svg'), ('journal-x.svg', 'journal-x.svg'), ('journal.svg', 'journal.svg'), ('journals.svg', 'journals.svg'), ('joystick.svg', 'joystick.svg'), ('justify-left.svg', 'justify-left.svg'), ('justify-right.svg', 'justify-right.svg'), ('justify.svg', 'justify.svg'), ('kanban-fill.svg', 'kanban-fill.svg'), ('kanban.svg', 'kanban.svg'), ('key-fill.svg', 'key-fill.svg'), ('key.svg', 'key.svg'), ('keyboard-fill.svg', 'keyboard-fill.svg'), ('keyboard.svg', 'keyboard.svg'), ('ladder.svg', 'ladder.svg'), ('lamp-fill.svg', 'lamp-fill.svg'), ('lamp.svg', 'lamp.svg'), ('laptop-fill.svg', 'laptop-fill.svg'), ('laptop.svg', 'laptop.svg'), ('layers-fill.svg', 'layers-fill.svg'), ('layers-half.svg', 'layers-half.svg'), ('layers.svg', 'layers.svg'), ('layout-sidebar-inset-reverse.svg', 'layout-sidebar-inset-reverse.svg'), ('layout-sidebar-inset.svg', 'layout-sidebar-inset.svg'), ('layout-sidebar-reverse.svg', 'layout-sidebar-reverse.svg'), ('layout-sidebar.svg', 'layout-sidebar.svg'), ('layout-split.svg', 'layout-split.svg'), ('layout-text-sidebar-reverse.svg', 'layout-text-sidebar-reverse.svg'), ('layout-text-sidebar.svg', 'layout-text-sidebar.svg'), ('layout-text-window-reverse.svg', 'layout-text-window-reverse.svg'), ('layout-text-window.svg', 'layout-text-window.svg'), ('layout-three-columns.svg', 'layout-three-columns.svg'), ('layout-wtf.svg', 'layout-wtf.svg'), ('life-preserver.svg', 'life-preserver.svg'), ('lightning-fill.svg', 'lightning-fill.svg'), ('lightning.svg', 'lightning.svg'), ('link-45deg.svg', 'link-45deg.svg'), ('link.svg', 'link.svg'), ('linkedin.svg', 'linkedin.svg'), ('list-check.svg', 'list-check.svg'), ('list-nested.svg', 'list-nested.svg'), ('list-ol.svg', 'list-ol.svg'), ('list-stars.svg', 'list-stars.svg'), ('list-task.svg', 'list-task.svg'), ('list-ul.svg', 'list-ul.svg'), ('list.svg', 'list.svg'), ('lock-fill.svg', 'lock-fill.svg'), ('lock.svg', 'lock.svg'), ('mailbox.svg', 'mailbox.svg'), ('mailbox2.svg', 'mailbox2.svg'), ('map-fill.svg', 'map-fill.svg'), ('map.svg', 'map.svg'), ('markdown-fill.svg', 'markdown-fill.svg'), ('markdown.svg', 'markdown.svg'), ('menu-app-fill.svg', 'menu-app-fill.svg'), ('menu-app.svg', 'menu-app.svg'), ('menu-button-fill.svg', 'menu-button-fill.svg'), ('menu-button-wide-fill.svg', 'menu-button-wide-fill.svg'), ('menu-button-wide.svg', 'menu-button-wide.svg'), ('menu-button.svg', 'menu-button.svg'), ('menu-down.svg', 'menu-down.svg'), ('menu-up.svg', 'menu-up.svg'), ('mic-fill.svg', 'mic-fill.svg'), ('mic-mute-fill.svg', 'mic-mute-fill.svg'), ('mic-mute.svg', 'mic-mute.svg'), ('mic.svg', 'mic.svg'), ('minecart-loaded.svg', 'minecart-loaded.svg'), ('minecart.svg', 'minecart.svg'), ('moon.svg', 'moon.svg'), ('mouse.svg', 'mouse.svg'), ('mouse2.svg', 'mouse2.svg'), ('mouse3.svg', 'mouse3.svg'), ('music-note-beamed.svg', 'music-note-beamed.svg'), ('music-note-list.svg', 'music-note-list.svg'), ('music-note.svg', 'music-note.svg'), ('music-player-fill.svg', 'music-player-fill.svg'), ('music-player.svg', 'music-player.svg'), ('newspaper.svg', 'newspaper.svg'), ('node-minus-fill.svg', 'node-minus-fill.svg'), ('node-minus.svg', 'node-minus.svg'), ('node-plus-fill.svg', 'node-plus-fill.svg'), ('node-plus.svg', 'node-plus.svg'), ('nut-fill.svg', 'nut-fill.svg'), ('nut.svg', 'nut.svg'), ('octagon-fill.svg', 'octagon-fill.svg'), ('octagon-half.svg', 'octagon-half.svg'), ('octagon.svg', 'octagon.svg'), ('option.svg', 'option.svg'), ('outlet.svg', 'outlet.svg'), ('paperclip.svg', 'paperclip.svg'), ('paragraph.svg', 'paragraph.svg'), ('patch-check-fll.svg', 'patch-check-fll.svg'), ('patch-check.svg', 'patch-check.svg'), ('patch-exclamation-fll.svg', 'patch-exclamation-fll.svg'), ('patch-exclamation.svg', 'patch-exclamation.svg'), ('patch-minus-fll.svg', 'patch-minus-fll.svg'), ('patch-minus.svg', 'patch-minus.svg'), ('patch-plus-fll.svg', 'patch-plus-fll.svg'), ('patch-plus.svg', 'patch-plus.svg'), ('patch-question-fll.svg', 'patch-question-fll.svg'), ('patch-question.svg', 'patch-question.svg'), ('pause-btn-fill.svg', 'pause-btn-fill.svg'), ('pause-btn.svg', 'pause-btn.svg'), ('pause-circle-fill.svg', 'pause-circle-fill.svg'), ('pause-circle.svg', 'pause-circle.svg'), ('pause-fill.svg', 'pause-fill.svg'), ('pause.svg', 'pause.svg'), ('peace-fill.svg', 'peace-fill.svg'), ('peace.svg', 'peace.svg'), ('pen-fill.svg', 'pen-fill.svg'), ('pen.svg', 'pen.svg'), ('pencil-fill.svg', 'pencil-fill.svg'), ('pencil-square.svg', 'pencil-square.svg'), ('pencil.svg', 'pencil.svg'), ('pentagon-fill.svg', 'pentagon-fill.svg'), ('pentagon-half.svg', 'pentagon-half.svg'), ('pentagon.svg', 'pentagon.svg'), ('people-circle.svg', 'people-circle.svg'), ('people-fill.svg', 'people-fill.svg'), ('people.svg', 'people.svg'), ('percent.svg', 'percent.svg'), ('person-badge-fill.svg', 'person-badge-fill.svg'), ('person-badge.svg', 'person-badge.svg'), ('person-bounding-box.svg', 'person-bounding-box.svg'), ('person-check-fill.svg', 'person-check-fill.svg'), ('person-check.svg', 'person-check.svg'), ('person-circle.svg', 'person-circle.svg'), ('person-dash-fill.svg', 'person-dash-fill.svg'), ('person-dash.svg', 'person-dash.svg'), ('person-fill.svg', 'person-fill.svg'), ('person-lines-fill.svg', 'person-lines-fill.svg'), ('person-plus-fill.svg', 'person-plus-fill.svg'), ('person-plus.svg', 'person-plus.svg'), ('person-square.svg', 'person-square.svg'), ('person-x-fill.svg', 'person-x-fill.svg'), ('person-x.svg', 'person-x.svg'), ('person.svg', 'person.svg'), ('phone-fill.svg', 'phone-fill.svg'), ('phone-landscape-fill.svg', 'phone-landscape-fill.svg'), ('phone-landscape.svg', 'phone-landscape.svg'), ('phone-vibrate.svg', 'phone-vibrate.svg'), ('phone.svg', 'phone.svg'), ('pie-chart-fill.svg', 'pie-chart-fill.svg'), ('pie-chart.svg', 'pie-chart.svg'), ('pip-fill.svg', 'pip-fill.svg'), ('pip.svg', 'pip.svg'), ('play-btn-fill.svg', 'play-btn-fill.svg'), ('play-btn.svg', 'play-btn.svg'), ('play-circle-fill.svg', 'play-circle-fill.svg'), ('play-circle.svg', 'play-circle.svg'), ('play-fill.svg', 'play-fill.svg'), ('play.svg', 'play.svg'), ('plug-fill.svg', 'plug-fill.svg'), ('plug.svg', 'plug.svg'), ('plus-circle-fill.svg', 'plus-circle-fill.svg'), ('plus-circle.svg', 'plus-circle.svg'), ('plus-square-fill.svg', 'plus-square-fill.svg'), ('plus-square.svg', 'plus-square.svg'), ('plus.svg', 'plus.svg'), ('power.svg', 'power.svg'), ('printer-fill.svg', 'printer-fill.svg'), ('printer.svg', 'printer.svg'), ('puzzle-fill.svg', 'puzzle-fill.svg'), ('puzzle.svg', 'puzzle.svg'), ('question-circle-fill.svg', 'question-circle-fill.svg'), ('question-circle.svg', 'question-circle.svg'), ('question-diamond-fill.svg', 'question-diamond-fill.svg'), ('question-diamond.svg', 'question-diamond.svg'), ('question-octagon-fill.svg', 'question-octagon-fill.svg'), ('question-octagon.svg', 'question-octagon.svg'), ('question-square-fill.svg', 'question-square-fill.svg'), ('question-square.svg', 'question-square.svg'), ('question.svg', 'question.svg'), ('receipt-cutoff.svg', 'receipt-cutoff.svg'), ('receipt.svg', 'receipt.svg'), ('reception-0.svg', 'reception-0.svg'), ('reception-1.svg', 'reception-1.svg'), ('reception-2.svg', 'reception-2.svg'), ('reception-3.svg', 'reception-3.svg'), ('reception-4.svg', 'reception-4.svg'), ('record-btn-fill.svg', 'record-btn-fill.svg'), ('record-btn.svg', 'record-btn.svg'), ('record-circle-fill.svg', 'record-circle-fill.svg'), ('record-circle.svg', 'record-circle.svg'), ('record-fill.svg', 'record-fill.svg'), ('record.svg', 'record.svg'), ('record2-fill.svg', 'record2-fill.svg'), ('record2.svg', 'record2.svg'), ('reply-all-fill.svg', 'reply-all-fill.svg'), ('reply-all.svg', 'reply-all.svg'), ('reply-fill.svg', 'reply-fill.svg'), ('reply.svg', 'reply.svg'), ('rss-fill.svg', 'rss-fill.svg'), ('rss.svg', 'rss.svg'), ('scissors.svg', 'scissors.svg'), ('screwdriver.svg', 'screwdriver.svg'), ('search.svg', 'search.svg'), ('segmented-nav.svg', 'segmented-nav.svg'), ('server.svg', 'server.svg'), ('share-fill.svg', 'share-fill.svg'), ('share.svg', 'share.svg'), ('shield-check.svg', 'shield-check.svg'), ('shield-exclamation.svg', 'shield-exclamation.svg'), ('shield-fill-check.svg', 'shield-fill-check.svg'), ('shield-fill-exclamation.svg', 'shield-fill-exclamation.svg'), ('shield-fill-minus.svg', 'shield-fill-minus.svg'), ('shield-fill-plus.svg', 'shield-fill-plus.svg'), ('shield-fill-x.svg', 'shield-fill-x.svg'), ('shield-fill.svg', 'shield-fill.svg'), ('shield-lock-fill.svg', 'shield-lock-fill.svg'), ('shield-lock.svg', 'shield-lock.svg'), ('shield-minus.svg', 'shield-minus.svg'), ('shield-plus.svg', 'shield-plus.svg'), ('shield-shaded.svg', 'shield-shaded.svg'), ('shield-slash-fill.svg', 'shield-slash-fill.svg'), ('shield-slash.svg', 'shield-slash.svg'), ('shield-x.svg', 'shield-x.svg'), ('shield.svg', 'shield.svg'), ('shift-fill.svg', 'shift-fill.svg'), ('shift.svg', 'shift.svg'), ('shop-window.svg', 'shop-window.svg'), ('shop.svg', 'shop.svg'), ('shuffle.svg', 'shuffle.svg'), ('signpost-2-fill.svg', 'signpost-2-fill.svg'), ('signpost-2.svg', 'signpost-2.svg'), ('signpost-fill.svg', 'signpost-fill.svg'), ('signpost-split-fill.svg', 'signpost-split-fill.svg'), ('signpost-split.svg', 'signpost-split.svg'), ('signpost.svg', 'signpost.svg'), ('sim-fill.svg', 'sim-fill.svg'), ('sim.svg', 'sim.svg'), ('skip-backward-btn-fill.svg', 'skip-backward-btn-fill.svg'), ('skip-backward-btn.svg', 'skip-backward-btn.svg'), ('skip-backward-circle-fill.svg', 'skip-backward-circle-fill.svg'), ('skip-backward-circle.svg', 'skip-backward-circle.svg'), ('skip-backward-fill.svg', 'skip-backward-fill.svg'), ('skip-backward.svg', 'skip-backward.svg'), ('skip-end-btn-fill.svg', 'skip-end-btn-fill.svg'), ('skip-end-btn.svg', 'skip-end-btn.svg'), ('skip-end-circle-fill.svg', 'skip-end-circle-fill.svg'), ('skip-end-circle.svg', 'skip-end-circle.svg'), ('skip-end-fill.svg', 'skip-end-fill.svg'), ('skip-end.svg', 'skip-end.svg'), ('skip-forward-btn-fill.svg', 'skip-forward-btn-fill.svg'), ('skip-forward-btn.svg', 'skip-forward-btn.svg'), ('skip-forward-circle-fill.svg', 'skip-forward-circle-fill.svg'), ('skip-forward-circle.svg', 'skip-forward-circle.svg'), ('skip-forward-fill.svg', 'skip-forward-fill.svg'), ('skip-forward.svg', 'skip-forward.svg'), ('skip-start-btn-fill.svg', 'skip-start-btn-fill.svg'), ('skip-start-btn.svg', 'skip-start-btn.svg'), ('skip-start-circle-fill.svg', 'skip-start-circle-fill.svg'), ('skip-start-circle.svg', 'skip-start-circle.svg'), ('skip-start-fill.svg', 'skip-start-fill.svg'), ('skip-start.svg', 'skip-start.svg'), ('slack.svg', 'slack.svg'), ('slash-circle-fill.svg', 'slash-circle-fill.svg'), ('slash-circle.svg', 'slash-circle.svg'), ('slash-square-fill.svg', 'slash-square-fill.svg'), ('slash-square.svg', 'slash-square.svg'), ('slash.svg', 'slash.svg'), ('sliders.svg', 'sliders.svg'), ('smartwatch.svg', 'smartwatch.svg'), ('sort-alpha-down-alt.svg', 'sort-alpha-down-alt.svg'), ('sort-alpha-down.svg', 'sort-alpha-down.svg'), ('sort-alpha-up-alt.svg', 'sort-alpha-up-alt.svg'), ('sort-alpha-up.svg', 'sort-alpha-up.svg'), ('sort-down-alt.svg', 'sort-down-alt.svg'), ('sort-down.svg', 'sort-down.svg'), ('sort-numeric-down-alt.svg', 'sort-numeric-down-alt.svg'), ('sort-numeric-down.svg', 'sort-numeric-down.svg'), ('sort-numeric-up-alt.svg', 'sort-numeric-up-alt.svg'), ('sort-numeric-up.svg', 'sort-numeric-up.svg'), ('sort-up-alt.svg', 'sort-up-alt.svg'), ('sort-up.svg', 'sort-up.svg'), ('soundwave.svg', 'soundwave.svg'), ('speaker-fill.svg', 'speaker-fill.svg'), ('speaker.svg', 'speaker.svg'), ('spellcheck.svg', 'spellcheck.svg'), ('square-fill.svg', 'square-fill.svg'), ('square-half.svg', 'square-half.svg'), ('square.svg', 'square.svg'), ('star-fill.svg', 'star-fill.svg'), ('star-half.svg', 'star-half.svg'), ('star.svg', 'star.svg'), ('stickies-fill.svg', 'stickies-fill.svg'), ('stickies.svg', 'stickies.svg'), ('sticky-fill.svg', 'sticky-fill.svg'), ('sticky.svg', 'sticky.svg'), ('stop-btn-fill.svg', 'stop-btn-fill.svg'), ('stop-btn.svg', 'stop-btn.svg'), ('stop-circle-fill.svg', 'stop-circle-fill.svg'), ('stop-circle.svg', 'stop-circle.svg'), ('stop-fill.svg', 'stop-fill.svg'), ('stop.svg', 'stop.svg'), ('stoplights-fill.svg', 'stoplights-fill.svg'), ('stoplights.svg', 'stoplights.svg'), ('stopwatch-fill.svg', 'stopwatch-fill.svg'), ('stopwatch.svg', 'stopwatch.svg'), ('subtract.svg', 'subtract.svg'), ('suit-club-fill.svg', 'suit-club-fill.svg'), ('suit-club.svg', 'suit-club.svg'), ('suit-diamond-fill.svg', 'suit-diamond-fill.svg'), ('suit-diamond.svg', 'suit-diamond.svg'), ('suit-heart-fill.svg', 'suit-heart-fill.svg'), ('suit-heart.svg', 'suit-heart.svg'), ('suit-spade-fill.svg', 'suit-spade-fill.svg'), ('suit-spade.svg', 'suit-spade.svg'), ('sun.svg', 'sun.svg'), ('sunglasses.svg', 'sunglasses.svg'), ('table.svg', 'table.svg'), ('tablet-fill.svg', 'tablet-fill.svg'), ('tablet-landscape-fill.svg', 'tablet-landscape-fill.svg'), ('tablet-landscape.svg', 'tablet-landscape.svg'), ('tablet.svg', 'tablet.svg'), ('tag-fill.svg', 'tag-fill.svg'), ('tag.svg', 'tag.svg'), ('tags-fill.svg', 'tags-fill.svg'), ('tags.svg', 'tags.svg'), ('telephone-fill.svg', 'telephone-fill.svg'), ('telephone-forward-fill.svg', 'telephone-forward-fill.svg'), ('telephone-forward.svg', 'telephone-forward.svg'), ('telephone-inbound-fill.svg', 'telephone-inbound-fill.svg'), ('telephone-inbound.svg', 'telephone-inbound.svg'), ('telephone-minus-fill.svg', 'telephone-minus-fill.svg'), ('telephone-minus.svg', 'telephone-minus.svg'), ('telephone-outbound-fill.svg', 'telephone-outbound-fill.svg'), ('telephone-outbound.svg', 'telephone-outbound.svg'), ('telephone-plus-fill.svg', 'telephone-plus-fill.svg'), ('telephone-plus.svg', 'telephone-plus.svg'), ('telephone-x-fill.svg', 'telephone-x-fill.svg'), ('telephone-x.svg', 'telephone-x.svg'), ('telephone.svg', 'telephone.svg'), ('terminal-fill.svg', 'terminal-fill.svg'), ('terminal.svg', 'terminal.svg'), ('text-center.svg', 'text-center.svg'), ('text-indent-left.svg', 'text-indent-left.svg'), ('text-indent-right.svg', 'text-indent-right.svg'), ('text-left.svg', 'text-left.svg'), ('text-paragraph.svg', 'text-paragraph.svg'), ('text-right.svg', 'text-right.svg'), ('textarea-resize.svg', 'textarea-resize.svg'), ('textarea-t.svg', 'textarea-t.svg'), ('textarea.svg', 'textarea.svg'), ('thermometer-half.svg', 'thermometer-half.svg'), ('thermometer.svg', 'thermometer.svg'), ('three-dots-vertical.svg', 'three-dots-vertical.svg'), ('three-dots.svg', 'three-dots.svg'), ('toggle-off.svg', 'toggle-off.svg'), ('toggle-on.svg', 'toggle-on.svg'), ('toggle2-off.svg', 'toggle2-off.svg'), ('toggle2-on.svg', 'toggle2-on.svg'), ('toggles.svg', 'toggles.svg'), ('toggles2.svg', 'toggles2.svg'), ('tools.svg', 'tools.svg'), ('trash-fill.svg', 'trash-fill.svg'), ('trash.svg', 'trash.svg'), ('trash2-fill.svg', 'trash2-fill.svg'), ('trash2.svg', 'trash2.svg'), ('tree-fill.svg', 'tree-fill.svg'), ('tree.svg', 'tree.svg'), ('triangle-fill.svg', 'triangle-fill.svg'), ('triangle-half.svg', 'triangle-half.svg'), ('triangle.svg', 'triangle.svg'), ('trophy-fill.svg', 'trophy-fill.svg'), ('trophy.svg', 'trophy.svg'), ('truck-flatbed.svg', 'truck-flatbed.svg'), ('truck.svg', 'truck.svg'), ('tv-fill.svg', 'tv-fill.svg'), ('tv.svg', 'tv.svg'), ('twitch.svg', 'twitch.svg'), ('twitter.svg', 'twitter.svg'), ('type-bold.svg', 'type-bold.svg'), ('type-h1.svg', 'type-h1.svg'), ('type-h2.svg', 'type-h2.svg'), ('type-h3.svg', 'type-h3.svg'), ('type-italic.svg', 'type-italic.svg'), ('type-strikethrough.svg', 'type-strikethrough.svg'), ('type-underline.svg', 'type-underline.svg'), ('type.svg', 'type.svg'), ('ui-checks-grid.svg', 'ui-checks-grid.svg'), ('ui-checks.svg', 'ui-checks.svg'), ('ui-radios-grid.svg', 'ui-radios-grid.svg'), ('ui-radios.svg', 'ui-radios.svg'), ('union.svg', 'union.svg'), ('unlock-fill.svg', 'unlock-fill.svg'), ('unlock.svg', 'unlock.svg'), ('upc-scan.svg', 'upc-scan.svg'), ('upc.svg', 'upc.svg'), ('upload.svg', 'upload.svg'), ('vector-pen.svg', 'vector-pen.svg'), ('view-list.svg', 'view-list.svg'), ('view-stacked.svg', 'view-stacked.svg'), ('vinyl-fill.svg', 'vinyl-fill.svg'), ('vinyl.svg', 'vinyl.svg'), ('voicemail.svg', 'voicemail.svg'), ('volume-down-fill.svg', 'volume-down-fill.svg'), ('volume-down.svg', 'volume-down.svg'), ('volume-mute-fill.svg', 'volume-mute-fill.svg'), ('volume-mute.svg', 'volume-mute.svg'), ('volume-off-fill.svg', 'volume-off-fill.svg'), ('volume-off.svg', 'volume-off.svg'), ('volume-up-fill.svg', 'volume-up-fill.svg'), ('volume-up.svg', 'volume-up.svg'), ('vr.svg', 'vr.svg'), ('wallet-fill.svg', 'wallet-fill.svg'), ('wallet.svg', 'wallet.svg'), ('wallet2.svg', 'wallet2.svg'), ('watch.svg', 'watch.svg'), ('wifi-1.svg', 'wifi-1.svg'), ('wifi-2.svg', 'wifi-2.svg'), ('wifi-off.svg', 'wifi-off.svg'), ('wifi.svg', 'wifi.svg'), ('window.svg', 'window.svg'), ('wrench.svg', 'wrench.svg'), ('x-circle-fill.svg', 'x-circle-fill.svg'), ('x-circle.svg', 'x-circle.svg'), ('x-diamond-fill.svg', 'x-diamond-fill.svg'), ('x-diamond.svg', 'x-diamond.svg'), ('x-octagon-fill.svg', 'x-octagon-fill.svg'), ('x-octagon.svg', 'x-octagon.svg'), ('x-square-fill.svg', 'x-square-fill.svg'), ('x-square.svg', 'x-square.svg'), ('x.svg', 'x.svg'), ('youtube.svg', 'youtube.svg'), ('zoom-in.svg', 'zoom-in.svg'), ('zoom-out.svg', 'zoom-out.svg')], max_length=100, verbose_name='Ãcono'),12        ),...test_array.py
Source:test_array.py  
1import operator2import re3import warnings4import numpy as np5import pytest6from pandas._libs.sparse import IntIndex7from pandas.compat import range8import pandas.util._test_decorators as td9import pandas as pd10from pandas import isna11from pandas.core.sparse.api import SparseArray, SparseDtype, SparseSeries12import pandas.util.testing as tm13from pandas.util.testing import assert_almost_equal14@pytest.fixture(params=["integer", "block"])15def kind(request):16    return request.param17class TestSparseArray(object):18    def setup_method(self, method):19        self.arr_data = np.array([np.nan, np.nan, 1, 2, 3,20                                  np.nan, 4, 5, np.nan, 6])21        self.arr = SparseArray(self.arr_data)22        self.zarr = SparseArray([0, 0, 1, 2, 3, 0, 4, 5, 0, 6], fill_value=0)23    def test_constructor_dtype(self):24        arr = SparseArray([np.nan, 1, 2, np.nan])25        assert arr.dtype == SparseDtype(np.float64, np.nan)26        assert arr.dtype.subtype == np.float6427        assert np.isnan(arr.fill_value)28        arr = SparseArray([np.nan, 1, 2, np.nan], fill_value=0)29        assert arr.dtype == SparseDtype(np.float64, 0)30        assert arr.fill_value == 031        arr = SparseArray([0, 1, 2, 4], dtype=np.float64)32        assert arr.dtype == SparseDtype(np.float64, np.nan)33        assert np.isnan(arr.fill_value)34        arr = SparseArray([0, 1, 2, 4], dtype=np.int64)35        assert arr.dtype == SparseDtype(np.int64, 0)36        assert arr.fill_value == 037        arr = SparseArray([0, 1, 2, 4], fill_value=0, dtype=np.int64)38        assert arr.dtype == SparseDtype(np.int64, 0)39        assert arr.fill_value == 040        arr = SparseArray([0, 1, 2, 4], dtype=None)41        assert arr.dtype == SparseDtype(np.int64, 0)42        assert arr.fill_value == 043        arr = SparseArray([0, 1, 2, 4], fill_value=0, dtype=None)44        assert arr.dtype == SparseDtype(np.int64, 0)45        assert arr.fill_value == 046    def test_constructor_dtype_str(self):47        result = SparseArray([1, 2, 3], dtype='int')48        expected = SparseArray([1, 2, 3], dtype=int)49        tm.assert_sp_array_equal(result, expected)50    def test_constructor_sparse_dtype(self):51        result = SparseArray([1, 0, 0, 1], dtype=SparseDtype('int64', -1))52        expected = SparseArray([1, 0, 0, 1], fill_value=-1, dtype=np.int64)53        tm.assert_sp_array_equal(result, expected)54        assert result.sp_values.dtype == np.dtype('int64')55    def test_constructor_sparse_dtype_str(self):56        result = SparseArray([1, 0, 0, 1], dtype='Sparse[int32]')57        expected = SparseArray([1, 0, 0, 1], dtype=np.int32)58        tm.assert_sp_array_equal(result, expected)59        assert result.sp_values.dtype == np.dtype('int32')60    def test_constructor_object_dtype(self):61        # GH 1185662        arr = SparseArray(['A', 'A', np.nan, 'B'], dtype=np.object)63        assert arr.dtype == SparseDtype(np.object)64        assert np.isnan(arr.fill_value)65        arr = SparseArray(['A', 'A', np.nan, 'B'], dtype=np.object,66                          fill_value='A')67        assert arr.dtype == SparseDtype(np.object, 'A')68        assert arr.fill_value == 'A'69        # GH 1757470        data = [False, 0, 100.0, 0.0]71        arr = SparseArray(data, dtype=np.object, fill_value=False)72        assert arr.dtype == SparseDtype(np.object, False)73        assert arr.fill_value is False74        arr_expected = np.array(data, dtype=np.object)75        it = (type(x) == type(y) and x == y for x, y in zip(arr, arr_expected))76        assert np.fromiter(it, dtype=np.bool).all()77    @pytest.mark.parametrize("dtype", [SparseDtype(int, 0), int])78    def test_constructor_na_dtype(self, dtype):79        with pytest.raises(ValueError, match="Cannot convert"):80            SparseArray([0, 1, np.nan], dtype=dtype)81    def test_constructor_spindex_dtype(self):82        arr = SparseArray(data=[1, 2], sparse_index=IntIndex(4, [1, 2]))83        # XXX: Behavior change: specifying SparseIndex no longer changes the84        # fill_value85        expected = SparseArray([0, 1, 2, 0], kind='integer')86        tm.assert_sp_array_equal(arr, expected)87        assert arr.dtype == SparseDtype(np.int64)88        assert arr.fill_value == 089        arr = SparseArray(data=[1, 2, 3],90                          sparse_index=IntIndex(4, [1, 2, 3]),91                          dtype=np.int64, fill_value=0)92        exp = SparseArray([0, 1, 2, 3], dtype=np.int64, fill_value=0)93        tm.assert_sp_array_equal(arr, exp)94        assert arr.dtype == SparseDtype(np.int64)95        assert arr.fill_value == 096        arr = SparseArray(data=[1, 2], sparse_index=IntIndex(4, [1, 2]),97                          fill_value=0, dtype=np.int64)98        exp = SparseArray([0, 1, 2, 0], fill_value=0, dtype=np.int64)99        tm.assert_sp_array_equal(arr, exp)100        assert arr.dtype == SparseDtype(np.int64)101        assert arr.fill_value == 0102        arr = SparseArray(data=[1, 2, 3],103                          sparse_index=IntIndex(4, [1, 2, 3]),104                          dtype=None, fill_value=0)105        exp = SparseArray([0, 1, 2, 3], dtype=None)106        tm.assert_sp_array_equal(arr, exp)107        assert arr.dtype == SparseDtype(np.int64)108        assert arr.fill_value == 0109    @pytest.mark.parametrize("sparse_index", [110        None, IntIndex(1, [0]),111    ])112    def test_constructor_spindex_dtype_scalar(self, sparse_index):113        # scalar input114        arr = SparseArray(data=1, sparse_index=sparse_index, dtype=None)115        exp = SparseArray([1], dtype=None)116        tm.assert_sp_array_equal(arr, exp)117        assert arr.dtype == SparseDtype(np.int64)118        assert arr.fill_value == 0119        arr = SparseArray(data=1, sparse_index=IntIndex(1, [0]), dtype=None)120        exp = SparseArray([1], dtype=None)121        tm.assert_sp_array_equal(arr, exp)122        assert arr.dtype == SparseDtype(np.int64)123        assert arr.fill_value == 0124    def test_constructor_spindex_dtype_scalar_broadcasts(self):125        arr = SparseArray(data=[1, 2], sparse_index=IntIndex(4, [1, 2]),126                          fill_value=0, dtype=None)127        exp = SparseArray([0, 1, 2, 0], fill_value=0, dtype=None)128        tm.assert_sp_array_equal(arr, exp)129        assert arr.dtype == SparseDtype(np.int64)130        assert arr.fill_value == 0131    @pytest.mark.parametrize('data, fill_value', [132        (np.array([1, 2]), 0),133        (np.array([1.0, 2.0]), np.nan),134        ([True, False], False),135        ([pd.Timestamp('2017-01-01')], pd.NaT),136    ])137    def test_constructor_inferred_fill_value(self, data, fill_value):138        result = SparseArray(data).fill_value139        if pd.isna(fill_value):140            assert pd.isna(result)141        else:142            assert result == fill_value143    @pytest.mark.parametrize('scalar,dtype', [144        (False, SparseDtype(bool, False)),145        (0.0, SparseDtype('float64', 0)),146        (1, SparseDtype('int64', 1)),147        ('z', SparseDtype('object', 'z'))])148    def test_scalar_with_index_infer_dtype(self, scalar, dtype):149        # GH 19163150        arr = SparseArray(scalar, index=[1, 2, 3], fill_value=scalar)151        exp = SparseArray([scalar, scalar, scalar], fill_value=scalar)152        tm.assert_sp_array_equal(arr, exp)153        assert arr.dtype == dtype154        assert exp.dtype == dtype155    @pytest.mark.parametrize("fill", [1, np.nan, 0])156    def test_sparse_series_round_trip(self, kind, fill):157        # see gh-13999158        arr = SparseArray([np.nan, 1, np.nan, 2, 3],159                          kind=kind, fill_value=fill)160        res = SparseArray(SparseSeries(arr))161        tm.assert_sp_array_equal(arr, res)162        arr = SparseArray([0, 0, 0, 1, 1, 2], dtype=np.int64,163                          kind=kind, fill_value=fill)164        res = SparseArray(SparseSeries(arr), dtype=np.int64)165        tm.assert_sp_array_equal(arr, res)166        res = SparseArray(SparseSeries(arr))167        tm.assert_sp_array_equal(arr, res)168    @pytest.mark.parametrize("fill", [True, False, np.nan])169    def test_sparse_series_round_trip2(self, kind, fill):170        # see gh-13999171        arr = SparseArray([True, False, True, True], dtype=np.bool,172                          kind=kind, fill_value=fill)173        res = SparseArray(SparseSeries(arr))174        tm.assert_sp_array_equal(arr, res)175        res = SparseArray(SparseSeries(arr))176        tm.assert_sp_array_equal(arr, res)177    def test_get_item(self):178        assert np.isnan(self.arr[1])179        assert self.arr[2] == 1180        assert self.arr[7] == 5181        assert self.zarr[0] == 0182        assert self.zarr[2] == 1183        assert self.zarr[7] == 5184        errmsg = re.compile("bounds")185        with pytest.raises(IndexError, match=errmsg):186            self.arr[11]187        with pytest.raises(IndexError, match=errmsg):188            self.arr[-11]189        assert self.arr[-1] == self.arr[len(self.arr) - 1]190    def test_take_scalar_raises(self):191        msg = "'indices' must be an array, not a scalar '2'."192        with pytest.raises(ValueError, match=msg):193            self.arr.take(2)194    def test_take(self):195        exp = SparseArray(np.take(self.arr_data, [2, 3]))196        tm.assert_sp_array_equal(self.arr.take([2, 3]), exp)197        exp = SparseArray(np.take(self.arr_data, [0, 1, 2]))198        tm.assert_sp_array_equal(self.arr.take([0, 1, 2]), exp)199    def test_take_fill_value(self):200        data = np.array([1, np.nan, 0, 3, 0])201        sparse = SparseArray(data, fill_value=0)202        exp = SparseArray(np.take(data, [0]), fill_value=0)203        tm.assert_sp_array_equal(sparse.take([0]), exp)204        exp = SparseArray(np.take(data, [1, 3, 4]), fill_value=0)205        tm.assert_sp_array_equal(sparse.take([1, 3, 4]), exp)206    def test_take_negative(self):207        exp = SparseArray(np.take(self.arr_data, [-1]))208        tm.assert_sp_array_equal(self.arr.take([-1]), exp)209        exp = SparseArray(np.take(self.arr_data, [-4, -3, -2]))210        tm.assert_sp_array_equal(self.arr.take([-4, -3, -2]), exp)211    @pytest.mark.parametrize('fill_value', [0, None, np.nan])212    def test_shift_fill_value(self, fill_value):213        # GH #24128214        sparse = SparseArray(np.array([1, 0, 0, 3, 0]),215                             fill_value=8.0)216        res = sparse.shift(1, fill_value=fill_value)217        if isna(fill_value):218            fill_value = res.dtype.na_value219        exp = SparseArray(np.array([fill_value, 1, 0, 0, 3]),220                          fill_value=8.0)221        tm.assert_sp_array_equal(res, exp)222    def test_bad_take(self):223        with pytest.raises(IndexError, match="bounds"):224            self.arr.take([11])225    def test_take_filling(self):226        # similar tests as GH 12631227        sparse = SparseArray([np.nan, np.nan, 1, np.nan, 4])228        result = sparse.take(np.array([1, 0, -1]))229        expected = SparseArray([np.nan, np.nan, 4])230        tm.assert_sp_array_equal(result, expected)231        # XXX: test change: fill_value=True -> allow_fill=True232        result = sparse.take(np.array([1, 0, -1]), allow_fill=True)233        expected = SparseArray([np.nan, np.nan, np.nan])234        tm.assert_sp_array_equal(result, expected)235        # allow_fill=False236        result = sparse.take(np.array([1, 0, -1]),237                             allow_fill=False, fill_value=True)238        expected = SparseArray([np.nan, np.nan, 4])239        tm.assert_sp_array_equal(result, expected)240        msg = "Invalid value in 'indices'"241        with pytest.raises(ValueError, match=msg):242            sparse.take(np.array([1, 0, -2]), allow_fill=True)243        with pytest.raises(ValueError, match=msg):244            sparse.take(np.array([1, 0, -5]), allow_fill=True)245        with pytest.raises(IndexError):246            sparse.take(np.array([1, -6]))247        with pytest.raises(IndexError):248            sparse.take(np.array([1, 5]))249        with pytest.raises(IndexError):250            sparse.take(np.array([1, 5]), allow_fill=True)251    def test_take_filling_fill_value(self):252        # same tests as GH 12631253        sparse = SparseArray([np.nan, 0, 1, 0, 4], fill_value=0)254        result = sparse.take(np.array([1, 0, -1]))255        expected = SparseArray([0, np.nan, 4], fill_value=0)256        tm.assert_sp_array_equal(result, expected)257        # fill_value258        result = sparse.take(np.array([1, 0, -1]), allow_fill=True)259        # XXX: behavior change.260        # the old way of filling self.fill_value doesn't follow EA rules.261        # It's supposed to be self.dtype.na_value (nan in this case)262        expected = SparseArray([0, np.nan, np.nan], fill_value=0)263        tm.assert_sp_array_equal(result, expected)264        # allow_fill=False265        result = sparse.take(np.array([1, 0, -1]),266                             allow_fill=False, fill_value=True)267        expected = SparseArray([0, np.nan, 4], fill_value=0)268        tm.assert_sp_array_equal(result, expected)269        msg = ("Invalid value in 'indices'.")270        with pytest.raises(ValueError, match=msg):271            sparse.take(np.array([1, 0, -2]), allow_fill=True)272        with pytest.raises(ValueError, match=msg):273            sparse.take(np.array([1, 0, -5]), allow_fill=True)274        with pytest.raises(IndexError):275            sparse.take(np.array([1, -6]))276        with pytest.raises(IndexError):277            sparse.take(np.array([1, 5]))278        with pytest.raises(IndexError):279            sparse.take(np.array([1, 5]), fill_value=True)280    def test_take_filling_all_nan(self):281        sparse = SparseArray([np.nan, np.nan, np.nan, np.nan, np.nan])282        # XXX: did the default kind from take change?283        result = sparse.take(np.array([1, 0, -1]))284        expected = SparseArray([np.nan, np.nan, np.nan], kind='block')285        tm.assert_sp_array_equal(result, expected)286        result = sparse.take(np.array([1, 0, -1]), fill_value=True)287        expected = SparseArray([np.nan, np.nan, np.nan], kind='block')288        tm.assert_sp_array_equal(result, expected)289        with pytest.raises(IndexError):290            sparse.take(np.array([1, -6]))291        with pytest.raises(IndexError):292            sparse.take(np.array([1, 5]))293        with pytest.raises(IndexError):294            sparse.take(np.array([1, 5]), fill_value=True)295    def test_set_item(self):296        def setitem():297            self.arr[5] = 3298        def setslice():299            self.arr[1:5] = 2300        with pytest.raises(TypeError, match="assignment via setitem"):301            setitem()302        with pytest.raises(TypeError, match="assignment via setitem"):303            setslice()304    def test_constructor_from_too_large_array(self):305        with pytest.raises(TypeError, match="expected dimension <= 1 data"):306            SparseArray(np.arange(10).reshape((2, 5)))307    def test_constructor_from_sparse(self):308        res = SparseArray(self.zarr)309        assert res.fill_value == 0310        assert_almost_equal(res.sp_values, self.zarr.sp_values)311    def test_constructor_copy(self):312        cp = SparseArray(self.arr, copy=True)313        cp.sp_values[:3] = 0314        assert not (self.arr.sp_values[:3] == 0).any()315        not_copy = SparseArray(self.arr)316        not_copy.sp_values[:3] = 0317        assert (self.arr.sp_values[:3] == 0).all()318    def test_constructor_bool(self):319        # GH 10648320        data = np.array([False, False, True, True, False, False])321        arr = SparseArray(data, fill_value=False, dtype=bool)322        assert arr.dtype == SparseDtype(bool)323        tm.assert_numpy_array_equal(arr.sp_values, np.array([True, True]))324        # Behavior change: np.asarray densifies.325        # tm.assert_numpy_array_equal(arr.sp_values, np.asarray(arr))326        tm.assert_numpy_array_equal(arr.sp_index.indices,327                                    np.array([2, 3], np.int32))328        for dense in [arr.to_dense(), arr.values]:329            assert dense.dtype == bool330            tm.assert_numpy_array_equal(dense, data)331    def test_constructor_bool_fill_value(self):332        arr = SparseArray([True, False, True], dtype=None)333        assert arr.dtype == SparseDtype(np.bool)334        assert not arr.fill_value335        arr = SparseArray([True, False, True], dtype=np.bool)336        assert arr.dtype == SparseDtype(np.bool)337        assert not arr.fill_value338        arr = SparseArray([True, False, True], dtype=np.bool, fill_value=True)339        assert arr.dtype == SparseDtype(np.bool, True)340        assert arr.fill_value341    def test_constructor_float32(self):342        # GH 10648343        data = np.array([1., np.nan, 3], dtype=np.float32)344        arr = SparseArray(data, dtype=np.float32)345        assert arr.dtype == SparseDtype(np.float32)346        tm.assert_numpy_array_equal(arr.sp_values,347                                    np.array([1, 3], dtype=np.float32))348        # Behavior change: np.asarray densifies.349        # tm.assert_numpy_array_equal(arr.sp_values, np.asarray(arr))350        tm.assert_numpy_array_equal(arr.sp_index.indices,351                                    np.array([0, 2], dtype=np.int32))352        for dense in [arr.to_dense(), arr.values]:353            assert dense.dtype == np.float32354            tm.assert_numpy_array_equal(dense, data)355    def test_astype(self):356        # float -> float357        arr = SparseArray([None, None, 0, 2])358        result = arr.astype("Sparse[float32]")359        expected = SparseArray([None, None, 0, 2], dtype=np.dtype('float32'))360        tm.assert_sp_array_equal(result, expected)361        dtype = SparseDtype("float64", fill_value=0)362        result = arr.astype(dtype)363        expected = SparseArray._simple_new(np.array([0., 2.],364                                                    dtype=dtype.subtype),365                                           IntIndex(4, [2, 3]),366                                           dtype)367        tm.assert_sp_array_equal(result, expected)368        dtype = SparseDtype("int64", 0)369        result = arr.astype(dtype)370        expected = SparseArray._simple_new(np.array([0, 2], dtype=np.int64),371                                           IntIndex(4, [2, 3]),372                                           dtype)373        tm.assert_sp_array_equal(result, expected)374        arr = SparseArray([0, np.nan, 0, 1], fill_value=0)375        with pytest.raises(ValueError, match='NA'):376            arr.astype('Sparse[i8]')377    def test_astype_bool(self):378        a = pd.SparseArray([1, 0, 0, 1], dtype=SparseDtype(int, 0))379        result = a.astype(bool)380        expected = SparseArray([True, 0, 0, True],381                               dtype=SparseDtype(bool, 0))382        tm.assert_sp_array_equal(result, expected)383        # update fill value384        result = a.astype(SparseDtype(bool, False))385        expected = SparseArray([True, False, False, True],386                               dtype=SparseDtype(bool, False))387        tm.assert_sp_array_equal(result, expected)388    def test_astype_all(self, any_real_dtype):389        vals = np.array([1, 2, 3])390        arr = SparseArray(vals, fill_value=1)391        typ = np.dtype(any_real_dtype)392        res = arr.astype(typ)393        assert res.dtype == SparseDtype(typ, 1)394        assert res.sp_values.dtype == typ395        tm.assert_numpy_array_equal(np.asarray(res.values),396                                    vals.astype(typ))397    @pytest.mark.parametrize('array, dtype, expected', [398        (SparseArray([0, 1]), 'float',399         SparseArray([0., 1.], dtype=SparseDtype(float, 0.0))),400        (SparseArray([0, 1]), bool, SparseArray([False, True])),401        (SparseArray([0, 1], fill_value=1), bool,402         SparseArray([False, True], dtype=SparseDtype(bool, True))),403        pytest.param(404            SparseArray([0, 1]), 'datetime64[ns]',405            SparseArray(np.array([0, 1], dtype='datetime64[ns]'),406                        dtype=SparseDtype('datetime64[ns]',407                                          pd.Timestamp('1970'))),408            marks=[pytest.mark.xfail(reason="NumPy-7619")],409        ),410        (SparseArray([0, 1, 10]), str,411         SparseArray(['0', '1', '10'], dtype=SparseDtype(str, '0'))),412        (SparseArray(['10', '20']), float, SparseArray([10.0, 20.0])),413        (SparseArray([0, 1, 0]), object,414         SparseArray([0, 1, 0], dtype=SparseDtype(object, 0))),415    ])416    def test_astype_more(self, array, dtype, expected):417        result = array.astype(dtype)418        tm.assert_sp_array_equal(result, expected)419    def test_astype_nan_raises(self):420        arr = SparseArray([1.0, np.nan])421        with pytest.raises(ValueError, match='Cannot convert non-finite'):422            arr.astype(int)423    def test_set_fill_value(self):424        arr = SparseArray([1., np.nan, 2.], fill_value=np.nan)425        arr.fill_value = 2426        assert arr.fill_value == 2427        arr = SparseArray([1, 0, 2], fill_value=0, dtype=np.int64)428        arr.fill_value = 2429        assert arr.fill_value == 2430        # XXX: this seems fine? You can construct an integer431        # sparsearray with NaN fill value, why not update one?432        # coerces to int433        # msg = "unable to set fill_value 3\\.1 to int64 dtype"434        # with pytest.raises(ValueError, match=msg):435        arr.fill_value = 3.1436        assert arr.fill_value == 3.1437        # msg = "unable to set fill_value nan to int64 dtype"438        # with pytest.raises(ValueError, match=msg):439        arr.fill_value = np.nan440        assert np.isnan(arr.fill_value)441        arr = SparseArray([True, False, True], fill_value=False, dtype=np.bool)442        arr.fill_value = True443        assert arr.fill_value444        # coerces to bool445        # msg = "unable to set fill_value 0 to bool dtype"446        # with pytest.raises(ValueError, match=msg):447        arr.fill_value = 0448        assert arr.fill_value == 0449        # msg = "unable to set fill_value nan to bool dtype"450        # with pytest.raises(ValueError, match=msg):451        arr.fill_value = np.nan452        assert np.isnan(arr.fill_value)453    @pytest.mark.parametrize("val", [[1, 2, 3], np.array([1, 2]), (1, 2, 3)])454    def test_set_fill_invalid_non_scalar(self, val):455        arr = SparseArray([True, False, True], fill_value=False, dtype=np.bool)456        msg = "fill_value must be a scalar"457        with pytest.raises(ValueError, match=msg):458            arr.fill_value = val459    def test_copy_shallow(self):460        arr2 = self.arr.copy(deep=False)461        assert arr2.sp_values is self.arr.sp_values462        assert arr2.sp_index is self.arr.sp_index463    def test_values_asarray(self):464        assert_almost_equal(self.arr.values, self.arr_data)465        assert_almost_equal(self.arr.to_dense(), self.arr_data)466    @pytest.mark.parametrize('data,shape,dtype', [467        ([0, 0, 0, 0, 0], (5,), None),468        ([], (0,), None),469        ([0], (1,), None),470        (['A', 'A', np.nan, 'B'], (4,), np.object)471    ])472    def test_shape(self, data, shape, dtype):473        # GH 21126474        out = SparseArray(data, dtype=dtype)475        assert out.shape == shape476    @pytest.mark.parametrize("vals", [477        [np.nan, np.nan, np.nan, np.nan, np.nan],478        [1, np.nan, np.nan, 3, np.nan],479        [1, np.nan, 0, 3, 0],480    ])481    @pytest.mark.parametrize("method", ["to_dense", "get_values"])482    @pytest.mark.parametrize("fill_value", [None, 0])483    def test_dense_repr(self, vals, fill_value, method):484        vals = np.array(vals)485        arr = SparseArray(vals, fill_value=fill_value)486        dense_func = getattr(arr, method)487        res = dense_func()488        tm.assert_numpy_array_equal(res, vals)489    def test_getitem(self):490        def _checkit(i):491            assert_almost_equal(self.arr[i], self.arr.values[i])492        for i in range(len(self.arr)):493            _checkit(i)494            _checkit(-i)495    def test_getitem_arraylike_mask(self):496        arr = SparseArray([0, 1, 2])497        result = arr[[True, False, True]]498        expected = SparseArray([0, 2])499        tm.assert_sp_array_equal(result, expected)500    def test_getslice(self):501        result = self.arr[:-3]502        exp = SparseArray(self.arr.values[:-3])503        tm.assert_sp_array_equal(result, exp)504        result = self.arr[-4:]505        exp = SparseArray(self.arr.values[-4:])506        tm.assert_sp_array_equal(result, exp)507        # two corner cases from Series508        result = self.arr[-12:]509        exp = SparseArray(self.arr)510        tm.assert_sp_array_equal(result, exp)511        result = self.arr[:-12]512        exp = SparseArray(self.arr.values[:0])513        tm.assert_sp_array_equal(result, exp)514    def test_getslice_tuple(self):515        dense = np.array([np.nan, 0, 3, 4, 0, 5, np.nan, np.nan, 0])516        sparse = SparseArray(dense)517        res = sparse[4:, ]518        exp = SparseArray(dense[4:, ])519        tm.assert_sp_array_equal(res, exp)520        sparse = SparseArray(dense, fill_value=0)521        res = sparse[4:, ]522        exp = SparseArray(dense[4:, ], fill_value=0)523        tm.assert_sp_array_equal(res, exp)524        with pytest.raises(IndexError):525            sparse[4:, :]526        with pytest.raises(IndexError):527            # check numpy compat528            dense[4:, :]529    def test_boolean_slice_empty(self):530        arr = pd.SparseArray([0, 1, 2])531        res = arr[[False, False, False]]532        assert res.dtype == arr.dtype533    @pytest.mark.parametrize("op", ["add", "sub", "mul",534                                    "truediv", "floordiv", "pow"])535    def test_binary_operators(self, op):536        op = getattr(operator, op)537        data1 = np.random.randn(20)538        data2 = np.random.randn(20)539        data1[::2] = np.nan540        data2[::3] = np.nan541        arr1 = SparseArray(data1)542        arr2 = SparseArray(data2)543        data1[::2] = 3544        data2[::3] = 3545        farr1 = SparseArray(data1, fill_value=3)546        farr2 = SparseArray(data2, fill_value=3)547        def _check_op(op, first, second):548            res = op(first, second)549            exp = SparseArray(op(first.values, second.values),550                              fill_value=first.fill_value)551            assert isinstance(res, SparseArray)552            assert_almost_equal(res.values, exp.values)553            res2 = op(first, second.values)554            assert isinstance(res2, SparseArray)555            tm.assert_sp_array_equal(res, res2)556            res3 = op(first.values, second)557            assert isinstance(res3, SparseArray)558            tm.assert_sp_array_equal(res, res3)559            res4 = op(first, 4)560            assert isinstance(res4, SparseArray)561            # Ignore this if the actual op raises (e.g. pow).562            try:563                exp = op(first.values, 4)564                exp_fv = op(first.fill_value, 4)565            except ValueError:566                pass567            else:568                assert_almost_equal(res4.fill_value, exp_fv)569                assert_almost_equal(res4.values, exp)570        with np.errstate(all="ignore"):571            for first_arr, second_arr in [(arr1, arr2), (farr1, farr2)]:572                _check_op(op, first_arr, second_arr)573    def test_pickle(self):574        def _check_roundtrip(obj):575            unpickled = tm.round_trip_pickle(obj)576            tm.assert_sp_array_equal(unpickled, obj)577        _check_roundtrip(self.arr)578        _check_roundtrip(self.zarr)579    def test_generator_warnings(self):580        sp_arr = SparseArray([1, 2, 3])581        with warnings.catch_warnings(record=True) as w:582            warnings.filterwarnings(action='always',583                                    category=DeprecationWarning)584            warnings.filterwarnings(action='always',585                                    category=PendingDeprecationWarning)586            for _ in sp_arr:587                pass588            assert len(w) == 0589    def test_fillna(self):590        s = SparseArray([1, np.nan, np.nan, 3, np.nan])591        res = s.fillna(-1)592        exp = SparseArray([1, -1, -1, 3, -1], fill_value=-1, dtype=np.float64)593        tm.assert_sp_array_equal(res, exp)594        s = SparseArray([1, np.nan, np.nan, 3, np.nan], fill_value=0)595        res = s.fillna(-1)596        exp = SparseArray([1, -1, -1, 3, -1], fill_value=0, dtype=np.float64)597        tm.assert_sp_array_equal(res, exp)598        s = SparseArray([1, np.nan, 0, 3, 0])599        res = s.fillna(-1)600        exp = SparseArray([1, -1, 0, 3, 0], fill_value=-1, dtype=np.float64)601        tm.assert_sp_array_equal(res, exp)602        s = SparseArray([1, np.nan, 0, 3, 0], fill_value=0)603        res = s.fillna(-1)604        exp = SparseArray([1, -1, 0, 3, 0], fill_value=0, dtype=np.float64)605        tm.assert_sp_array_equal(res, exp)606        s = SparseArray([np.nan, np.nan, np.nan, np.nan])607        res = s.fillna(-1)608        exp = SparseArray([-1, -1, -1, -1], fill_value=-1, dtype=np.float64)609        tm.assert_sp_array_equal(res, exp)610        s = SparseArray([np.nan, np.nan, np.nan, np.nan], fill_value=0)611        res = s.fillna(-1)612        exp = SparseArray([-1, -1, -1, -1], fill_value=0, dtype=np.float64)613        tm.assert_sp_array_equal(res, exp)614        # float dtype's fill_value is np.nan, replaced by -1615        s = SparseArray([0., 0., 0., 0.])616        res = s.fillna(-1)617        exp = SparseArray([0., 0., 0., 0.], fill_value=-1)618        tm.assert_sp_array_equal(res, exp)619        # int dtype shouldn't have missing. No changes.620        s = SparseArray([0, 0, 0, 0])621        assert s.dtype == SparseDtype(np.int64)622        assert s.fill_value == 0623        res = s.fillna(-1)624        tm.assert_sp_array_equal(res, s)625        s = SparseArray([0, 0, 0, 0], fill_value=0)626        assert s.dtype == SparseDtype(np.int64)627        assert s.fill_value == 0628        res = s.fillna(-1)629        exp = SparseArray([0, 0, 0, 0], fill_value=0)630        tm.assert_sp_array_equal(res, exp)631        # fill_value can be nan if there is no missing hole.632        # only fill_value will be changed633        s = SparseArray([0, 0, 0, 0], fill_value=np.nan)634        assert s.dtype == SparseDtype(np.int64, fill_value=np.nan)635        assert np.isnan(s.fill_value)636        res = s.fillna(-1)637        exp = SparseArray([0, 0, 0, 0], fill_value=-1)638        tm.assert_sp_array_equal(res, exp)639    def test_fillna_overlap(self):640        s = SparseArray([1, np.nan, np.nan, 3, np.nan])641        # filling with existing value doesn't replace existing value with642        # fill_value, i.e. existing 3 remains in sp_values643        res = s.fillna(3)644        exp = np.array([1, 3, 3, 3, 3], dtype=np.float64)645        tm.assert_numpy_array_equal(res.to_dense(), exp)646        s = SparseArray([1, np.nan, np.nan, 3, np.nan], fill_value=0)647        res = s.fillna(3)648        exp = SparseArray([1, 3, 3, 3, 3], fill_value=0, dtype=np.float64)649        tm.assert_sp_array_equal(res, exp)650    def test_nonzero(self):651        # Tests regression #21172.652        sa = pd.SparseArray([653            float('nan'),654            float('nan'),655            1, 0, 0,656            2, 0, 0, 0,657            3, 0, 0658        ])659        expected = np.array([2, 5, 9], dtype=np.int32)660        result, = sa.nonzero()661        tm.assert_numpy_array_equal(expected, result)662        sa = pd.SparseArray([0, 0, 1, 0, 0, 2, 0, 0, 0, 3, 0, 0])663        result, = sa.nonzero()664        tm.assert_numpy_array_equal(expected, result)665class TestSparseArrayAnalytics(object):666    @pytest.mark.parametrize('data,pos,neg', [667        ([True, True, True], True, False),668        ([1, 2, 1], 1, 0),669        ([1.0, 2.0, 1.0], 1.0, 0.0)670    ])671    def test_all(self, data, pos, neg):672        # GH 17570673        out = SparseArray(data).all()674        assert out675        out = SparseArray(data, fill_value=pos).all()676        assert out677        data[1] = neg678        out = SparseArray(data).all()679        assert not out680        out = SparseArray(data, fill_value=pos).all()681        assert not out682    @pytest.mark.parametrize('data,pos,neg', [683        ([True, True, True], True, False),684        ([1, 2, 1], 1, 0),685        ([1.0, 2.0, 1.0], 1.0, 0.0)686    ])687    @td.skip_if_np_lt_115  # prior didn't dispatch688    def test_numpy_all(self, data, pos, neg):689        # GH 17570690        out = np.all(SparseArray(data))691        assert out692        out = np.all(SparseArray(data, fill_value=pos))693        assert out694        data[1] = neg695        out = np.all(SparseArray(data))696        assert not out697        out = np.all(SparseArray(data, fill_value=pos))698        assert not out699        # raises with a different message on py2.700        msg = "the \'out\' parameter is not supported"701        with pytest.raises(ValueError, match=msg):702            np.all(SparseArray(data), out=np.array([]))703    @pytest.mark.parametrize('data,pos,neg', [704        ([False, True, False], True, False),705        ([0, 2, 0], 2, 0),706        ([0.0, 2.0, 0.0], 2.0, 0.0)707    ])708    def test_any(self, data, pos, neg):709        # GH 17570710        out = SparseArray(data).any()711        assert out712        out = SparseArray(data, fill_value=pos).any()713        assert out714        data[1] = neg715        out = SparseArray(data).any()716        assert not out717        out = SparseArray(data, fill_value=pos).any()718        assert not out719    @pytest.mark.parametrize('data,pos,neg', [720        ([False, True, False], True, False),721        ([0, 2, 0], 2, 0),722        ([0.0, 2.0, 0.0], 2.0, 0.0)723    ])724    @td.skip_if_np_lt_115  # prior didn't dispatch725    def test_numpy_any(self, data, pos, neg):726        # GH 17570727        out = np.any(SparseArray(data))728        assert out729        out = np.any(SparseArray(data, fill_value=pos))730        assert out731        data[1] = neg732        out = np.any(SparseArray(data))733        assert not out734        out = np.any(SparseArray(data, fill_value=pos))735        assert not out736        msg = "the \'out\' parameter is not supported"737        with pytest.raises(ValueError, match=msg):738            np.any(SparseArray(data), out=out)739    def test_sum(self):740        data = np.arange(10).astype(float)741        out = SparseArray(data).sum()742        assert out == 45.0743        data[5] = np.nan744        out = SparseArray(data, fill_value=2).sum()745        assert out == 40.0746        out = SparseArray(data, fill_value=np.nan).sum()747        assert out == 40.0748    def test_numpy_sum(self):749        data = np.arange(10).astype(float)750        out = np.sum(SparseArray(data))751        assert out == 45.0752        data[5] = np.nan753        out = np.sum(SparseArray(data, fill_value=2))754        assert out == 40.0755        out = np.sum(SparseArray(data, fill_value=np.nan))756        assert out == 40.0757        msg = "the 'dtype' parameter is not supported"758        with pytest.raises(ValueError, match=msg):759            np.sum(SparseArray(data), dtype=np.int64)760        msg = "the 'out' parameter is not supported"761        with pytest.raises(ValueError, match=msg):762            np.sum(SparseArray(data), out=out)763    @pytest.mark.parametrize("data,expected", [764        (np.array([1, 2, 3, 4, 5], dtype=float),  # non-null data765         SparseArray(np.array([1.0, 3.0, 6.0, 10.0, 15.0]))),766        (np.array([1, 2, np.nan, 4, 5], dtype=float),  # null data767         SparseArray(np.array([1.0, 3.0, np.nan, 7.0, 12.0])))768    ])769    @pytest.mark.parametrize("numpy", [True, False])770    def test_cumsum(self, data, expected, numpy):771        cumsum = np.cumsum if numpy else lambda s: s.cumsum()772        out = cumsum(SparseArray(data))773        tm.assert_sp_array_equal(out, expected)774        out = cumsum(SparseArray(data, fill_value=np.nan))775        tm.assert_sp_array_equal(out, expected)776        out = cumsum(SparseArray(data, fill_value=2))777        tm.assert_sp_array_equal(out, expected)778        if numpy:  # numpy compatibility checks.779            msg = "the 'dtype' parameter is not supported"780            with pytest.raises(ValueError, match=msg):781                np.cumsum(SparseArray(data), dtype=np.int64)782            msg = "the 'out' parameter is not supported"783            with pytest.raises(ValueError, match=msg):784                np.cumsum(SparseArray(data), out=out)785        else:786            axis = 1  # SparseArray currently 1-D, so only axis = 0 is valid.787            msg = "axis\\(={axis}\\) out of bounds".format(axis=axis)788            with pytest.raises(ValueError, match=msg):789                SparseArray(data).cumsum(axis=axis)790    def test_mean(self):791        data = np.arange(10).astype(float)792        out = SparseArray(data).mean()793        assert out == 4.5794        data[5] = np.nan795        out = SparseArray(data).mean()796        assert out == 40.0 / 9797    def test_numpy_mean(self):798        data = np.arange(10).astype(float)799        out = np.mean(SparseArray(data))800        assert out == 4.5801        data[5] = np.nan802        out = np.mean(SparseArray(data))803        assert out == 40.0 / 9804        msg = "the 'dtype' parameter is not supported"805        with pytest.raises(ValueError, match=msg):806            np.mean(SparseArray(data), dtype=np.int64)807        msg = "the 'out' parameter is not supported"808        with pytest.raises(ValueError, match=msg):809            np.mean(SparseArray(data), out=out)810    def test_ufunc(self):811        # GH 13853 make sure ufunc is applied to fill_value812        sparse = SparseArray([1, np.nan, 2, np.nan, -2])813        result = SparseArray([1, np.nan, 2, np.nan, 2])814        tm.assert_sp_array_equal(abs(sparse), result)815        tm.assert_sp_array_equal(np.abs(sparse), result)816        sparse = SparseArray([1, -1, 2, -2], fill_value=1)817        result = SparseArray([1, 2, 2], sparse_index=sparse.sp_index,818                             fill_value=1)819        tm.assert_sp_array_equal(abs(sparse), result)820        tm.assert_sp_array_equal(np.abs(sparse), result)821        sparse = SparseArray([1, -1, 2, -2], fill_value=-1)822        result = SparseArray([1, 2, 2], sparse_index=sparse.sp_index,823                             fill_value=1)824        tm.assert_sp_array_equal(abs(sparse), result)825        tm.assert_sp_array_equal(np.abs(sparse), result)826        sparse = SparseArray([1, np.nan, 2, np.nan, -2])827        result = SparseArray(np.sin([1, np.nan, 2, np.nan, -2]))828        tm.assert_sp_array_equal(np.sin(sparse), result)829        sparse = SparseArray([1, -1, 2, -2], fill_value=1)830        result = SparseArray(np.sin([1, -1, 2, -2]), fill_value=np.sin(1))831        tm.assert_sp_array_equal(np.sin(sparse), result)832        sparse = SparseArray([1, -1, 0, -2], fill_value=0)833        result = SparseArray(np.sin([1, -1, 0, -2]), fill_value=np.sin(0))834        tm.assert_sp_array_equal(np.sin(sparse), result)835    def test_ufunc_args(self):836        # GH 13853 make sure ufunc is applied to fill_value, including its arg837        sparse = SparseArray([1, np.nan, 2, np.nan, -2])838        result = SparseArray([2, np.nan, 3, np.nan, -1])839        tm.assert_sp_array_equal(np.add(sparse, 1), result)840        sparse = SparseArray([1, -1, 2, -2], fill_value=1)841        result = SparseArray([2, 0, 3, -1], fill_value=2)842        tm.assert_sp_array_equal(np.add(sparse, 1), result)843        sparse = SparseArray([1, -1, 0, -2], fill_value=0)844        result = SparseArray([2, 0, 1, -1], fill_value=1)845        tm.assert_sp_array_equal(np.add(sparse, 1), result)846    def test_nbytes_integer(self):847        arr = SparseArray([1, 0, 0, 0, 2], kind='integer')848        result = arr.nbytes849        # (2 * 8) + 2 * 4850        assert result == 24851    def test_nbytes_block(self):852        arr = SparseArray([1, 2, 0, 0, 0], kind='block')853        result = arr.nbytes854        # (2 * 8) + 4 + 4855        # sp_values, blocs, blenghts856        assert result == 24857    def test_asarray_datetime64(self):858        s = pd.SparseArray(859            pd.to_datetime(['2012', None, None, '2013'])860        )861        np.asarray(s)862    def test_density(self):863        arr = SparseArray([0, 1])864        assert arr.density == 0.5865    def test_npoints(self):866        arr = SparseArray([0, 1])867        assert arr.npoints == 1868class TestAccessor(object):869    @pytest.mark.parametrize('attr', [870        'npoints', 'density', 'fill_value', 'sp_values',871    ])872    def test_get_attributes(self, attr):873        arr = SparseArray([0, 1])874        ser = pd.Series(arr)875        result = getattr(ser.sparse, attr)876        expected = getattr(arr, attr)877        assert result == expected878    def test_from_coo(self):879        sparse = pytest.importorskip("scipy.sparse")880        row = [0, 3, 1, 0]881        col = [0, 3, 1, 2]882        data = [4, 5, 7, 9]883        sp_array = sparse.coo_matrix((data, (row, col)))884        result = pd.Series.sparse.from_coo(sp_array)885        index = pd.MultiIndex.from_arrays([[0, 0, 1, 3], [0, 2, 1, 3]])886        expected = pd.Series([4, 9, 7, 5], index=index, dtype='Sparse[int]')887        tm.assert_series_equal(result, expected)888    def test_to_coo(self):889        sparse = pytest.importorskip("scipy.sparse")890        ser = pd.Series([1, 2, 3],891                        index=pd.MultiIndex.from_product([[0], [1, 2, 3]],892                                                         names=['a', 'b']),893                        dtype='Sparse[int]')894        A, _, _ = ser.sparse.to_coo()895        assert isinstance(A, sparse.coo.coo_matrix)896    def test_non_sparse_raises(self):897        ser = pd.Series([1, 2, 3])898        with pytest.raises(AttributeError, match='.sparse'):899            ser.sparse.density900def test_setting_fill_value_fillna_still_works():901    # This is why letting users update fill_value / dtype is bad902    # astype has the same problem.903    arr = SparseArray([1., np.nan, 1.0], fill_value=0.0)904    arr.fill_value = np.nan905    result = arr.isna()906    # Can't do direct comparison, since the sp_index will be different907    # So let's convert to ndarray and check there.908    result = np.asarray(result)909    expected = np.array([False, True, False])910    tm.assert_numpy_array_equal(result, expected)911def test_setting_fill_value_updates():912    arr = SparseArray([0.0, np.nan], fill_value=0)913    arr.fill_value = np.nan914    # use private constructor to get the index right915    # otherwise both nans would be un-stored.916    expected = SparseArray._simple_new(917        sparse_array=np.array([np.nan]),918        sparse_index=IntIndex(2, [1]),919        dtype=SparseDtype(float, np.nan),920    )921    tm.assert_sp_array_equal(arr, expected)922@pytest.mark.parametrize("arr, loc", [923    ([None, 1, 2], 0),924    ([0, None, 2], 1),925    ([0, 1, None], 2),926    ([0, 1, 1, None, None], 3),927    ([1, 1, 1, 2], -1),928    ([], -1),929])930def test_first_fill_value_loc(arr, loc):931    result = SparseArray(arr)._first_fill_value_loc()932    assert result == loc933@pytest.mark.parametrize('arr', [934    [1, 2, np.nan, np.nan],935    [1, np.nan, 2, np.nan],936    [1, 2, np.nan],937])938@pytest.mark.parametrize("fill_value", [939    np.nan, 0, 1940])941def test_unique_na_fill(arr, fill_value):942    a = pd.SparseArray(arr, fill_value=fill_value).unique()943    b = pd.Series(arr).unique()944    assert isinstance(a, SparseArray)945    a = np.asarray(a)946    tm.assert_numpy_array_equal(a, b)947def test_unique_all_sparse():948    # https://github.com/pandas-dev/pandas/issues/23168949    arr = SparseArray([0, 0])950    result = arr.unique()951    expected = SparseArray([0])952    tm.assert_sp_array_equal(result, expected)953def test_map():954    arr = SparseArray([0, 1, 2])955    expected = SparseArray([10, 11, 12], fill_value=10)956    # dict957    result = arr.map({0: 10, 1: 11, 2: 12})958    tm.assert_sp_array_equal(result, expected)959    # series960    result = arr.map(pd.Series({0: 10, 1: 11, 2: 12}))961    tm.assert_sp_array_equal(result, expected)962    # function963    result = arr.map(pd.Series({0: 10, 1: 11, 2: 12}))964    expected = SparseArray([10, 11, 12], fill_value=10)965    tm.assert_sp_array_equal(result, expected)966def test_map_missing():967    arr = SparseArray([0, 1, 2])968    expected = SparseArray([10, 11, None], fill_value=10)969    result = arr.map({0: 10, 1: 11})...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
