# Path: tabun_api/compat.py
# PY2 = sys.version_info.major == 2


import re
import sys
import time
import random
import logging
import platform
import mimetypes
import lxml
import lxml.html
import lxml.etree
import iso8601
    import warnings
        import Image
        import imp
        import importlib
        import importlib.util
    import socks
from hashlib import md5
from .compat import text, text_types, binary, urequest, PY2, BaseCookie
        from PIL import Image
    from io import BytesIO
        from urlparse import urlparse
        from urllib.parse import urlparse
# and modified by andreymal
def encode_multipart_formdata(fields, files, boundary=None):
    """Возвращает кортеж (content_type, body), готовый для отправки HTTP POST--запроса.

    Значения полей и файлов могут быть строками (закодируются в utf-8),
    bytes или числами (будут преобразованы в строку).

    :param fields: простые поля запроса
    :type fields: коллекция кортежей (название, значение) или словарь
    :param fields: файлы запроса (MIME-тип будет выбран по расширению)
    :type fields: коллекция кортежей (название, имя файла, значение)
    :param boundary: boundary (по умолчанию генерируется случайные)
    :type boundary: строка или bytes
    :rtype: (строка, bytes)
    """

    if isinstance(fields, dict):
        fields = fields.items()
    if boundary is None:
        boundary = b'----------' + md5((text(int(time.time())) + text(random.randrange(1000))).encode('utf-8')).hexdigest().encode('utf-8')
    elif isinstance(boundary, text):
        boundary = boundary.encode('utf-8')
    L = []

    for (key, value) in fields:
        key = text(key).encode('utf-8')
        if isinstance(value, text):
            value = value.encode('utf-8')
        elif isinstance(value, (int, float, complex)):
            value = text(value).encode('utf-8')

# Path: tabun_api/compat.py
# PY2 = sys.version_info.major == 2


# Path: tabun_api/utils.py
import re
import sys
import time
import random
import logging
import platform
import mimetypes
import lxml
import lxml.html
import lxml.etree
import iso8601
    import warnings
        import Image
        import imp
        import importlib
        import importlib.util
    import socks
from hashlib import md5
from .compat import text, text_types, binary, urequest, PY2, BaseCookie
        from PIL import Image
    from io import BytesIO
        from urlparse import urlparse
        from urllib.parse import urlparse

# and modified by andreymal
def encode_multipart_formdata(fields, files, boundary=None):
    """Возвращает кортеж (content_type, body), готовый для отправки HTTP POST--запроса.

    Значения полей и файлов могут быть строками (закодируются в utf-8),
    bytes или числами (будут преобразованы в строку).

    :param fields: простые поля запроса
    :type fields: коллекция кортежей (название, значение) или словарь
    :param fields: файлы запроса (MIME-тип будет выбран по расширению)
    :type fields: коллекция кортежей (название, имя файла, значение)
    :param boundary: boundary (по умолчанию генерируется случайные)
    :type boundary: строка или bytes
    :rtype: (строка, bytes)
    """

    if isinstance(fields, dict):
        fields = fields.items()
    if boundary is None:
        boundary = b'----------' + md5((text(int(time.time())) + text(random.randrange(1000))).encode('utf-8')).hexdigest().encode('utf-8')
    elif isinstance(boundary, text):
        boundary = boundary.encode('utf-8')
    L = []

    for (key, value) in fields:
        key = text(key).encode('utf-8')
        if isinstance(value, text):
            value = value.encode('utf-8')
        elif isinstance(value, (int, float, complex)):
            value = text(value).encode('utf-8')

        elif not isinstance(value, binary):