text:
"""
    Provides high-level Python objects for HDF5 files, groups, and datasets.

    Objects in this module are designed to provide a friendly, Python-style
    interface to native HDF5 concepts like files, datasets, groups and
    attributes.  The module is written in pure Python and uses the standard
    h5py low-level interface exclusively.

    Most components defined here are re-exported into the root h5py package
    namespace, because they are the most straightforward and intuitive
    way to interact with HDF5.
"""

from __future__ import with_statement

import os
import sys
import weakref
import threading
import warnings
import os.path as op
import posixpath as pp
import numpy

from h5py import h5, h5f, h5g, h5s, h5t, h5d, h5a, \
                 h5p, h5r, h5z, h5i, h5fd, h5o, h5l, \
                 version, filters, _extras
import h5py.selections as sel

from h5py.h5e import register_thread

config = h5.get_config()
phil = threading.RLock()

def is_hdf5(fname):
    """ Determine if a file is valid HDF5 (False if it doesn't exist). """
    register_thread()
    fname = os.path.abspath(fname)

    if os.path.isfile(fname):
        try:
            fname = fname.encode(sys.getfilesystemencoding())
        except (UnicodeError, LookupError):
            pass
        return h5f.is_hdf5(fname)
    return False

def _guess_dtype(data):
    """ Attempt to guess an appropriate dtype for the object, returning None
    if nothing is appropriate (or if it should be left up the the array
    constructor to figure out)
    """
    if isinstance(data, h5r.RegionReference):
        return h5t.special_dtype(ref=h5r.RegionReference)
    if isinstance(data, h5r.Reference):
        return h5t.special_dtype(ref=h5r.Reference)
    return None

# === Base classes ============================================================

class HLObject(object):

    """
        Base class for high-level interface objects.

        All objects of this class support the following properties:

        id:     Low-level identifer, compatible with the h5py.h5* modules.
        name:   Name of this object in the HDF5 file.  May not be unique.
        attrs:  HDF5 attributes of this object.  See AttributeManager class.
        file:   The File instance associated with this object
        parent: (A) parent of this object, according to dirname(obj.name)
        ref:    An HDF5 reference to this object.

        Equality comparison and hashing are based on native HDF5 object
        identity.
    """

    @property
    def file(self):
        """Return a File instance associated with this object"""
        return self._file

    @property
    def _lapl(self):
        """Default link access property list (1.8)"""

        lapl = h5p.create(h5p.LINK_ACCESS)
        fapl = h5p.create(h5p.FILE_ACCESS)
        fapl.set_fclose_degree(h5f.CLOSE_STRONG)
        lapl.set_elink_fapl(fapl)
        return lapl

    @property
    def _lcpl(self):
        """Default link creation property list (1.8)"""
        lcpl = h5p.create(h5p.LINK_CREATE)
        lcpl.set_create_intermediate_group(True)
        return lcpl

    @property
    def id(self):
        """ Low-level identifier appropriate for this object """
        return self._id

    @property
    def name(self):
        """Name of this object in the HDF5 file.  Not necessarily unique."""
        register_thread()
        return h5i.get_name(self.id)

    @property
    def attrs(self):
        """Provides access to HDF5 attributes. See AttributeManager."""
        return AttributeManager(self)

    @property
    def parent(self):
        """Return the parent group of this object.

        This is always equivalent to file[posixpath.basename(obj.name)].
        """
        if self.name is None:
            raise ValueError("Parent of an anonymous object is undefined")
        return self.file[pp.dirname(self.name)]

    @property
    def ref(self):
        """ An (opaque) HDF5 reference to this object """
        register_thread()
        return h5r.create(self.id, '.', h5r.OBJECT)

    def __init__(self, oid):
        """ Setup this object, given its low-level identifier """
        register_thread()
        self._id = oid
        if not isinstance(self, File):
            fid = h5i.get_file_id(oid)
            self._file = File(None, bind=fid)

    def __nonzero__(self):
        register_thread()
        return self.id.__nonzero__()

    def __hash__(self):
        register_thread()
        return hash(self.id)
    def __eq__(self, other):
        register_thread()
        if hasattr(other, 'id'):
            return self.id == other.id
        return False
    def __ne__(self, other):
        return not self.__eq__(other)

class _DictCompat(object):

    """
        Contains dictionary-style compatibility methods for groups and
        attributes.
    """

    def keys(self):
        """ Get a list containing member names """
        with phil:
            return list(self)

    def iterkeys(self):
        """ Get an iterator over member names """
        with phil:
            return iter(self)

    def values(self):
        """ Get a list containing member objects """
        with phil:
            return [self[x] for x in self]

    def itervalues(self):
        """ Get an iterator over member objects """
        with phil:
            for x in self:
                yield self[x]

    def items(self):
        """ Get a list of tuples containing (name, object) pairs """
        with phil:
            return [(x, self[x]) for x in self]

    def iteritems(self):
        """ Get an iterator over (name, object) pairs """
        with phil:
            for x in self:
                yield (x, self[x])

    def get(self, name, default=None):
        """ Retrieve the member, or return default if it doesn't exist """
        with phil:
            if name in self:
                return self[name]
            return default

    # Compatibility methods
    def listnames(self):
        """ Deprecated alias for keys() """
        warnings.warn("listnames() is deprecated; use keys() instead", DeprecationWarning)
        return self.keys()
    def iternames(self):
        """ Deprecated alias for iterkeys() """
        warnings.warn("iternames() is deprecated; use iterkeys() instead", DeprecationWarning)
        return self.iterkeys()
    def listobjects(self):
        """ Deprecated alias for values() """
        warnings.warn("listobjects() is deprecated; use values() instead", DeprecationWarning)
        return self.values()
    def iterobjects(self):
        """ Deprecated alias for itervalues() """
        warnings.warn("iterobjects() is deprecated; use itervalues() instead", DeprecationWarning)
        return self.itervalues()
    def listitems(self):
        """ Deprecated alias for items() """
        warnings.warn("listitems() is deprecated; use items() instead", DeprecationWarning)
        return self.items()

class Group(HLObject, _DictCompat):

    """ Represents an HDF5 group.

        It's recommended to use the Group/File method create_group to create
        these objects, rather than trying to create them yourself.

        Groups implement a basic dictionary-style interface, supporting
        __getitem__, __setitem__, __len__, __contains__, keys(), values()
        and others.

        They also contain the necessary methods for creating new groups and
        datasets.  Group attributes can be accessed via <group>.attrs.
    """

    def __init__(self, parent_object, name, create=False, _rawid=None):
        """ Create a new Group object, from a parent object and a name.

        If "create" is False (default), try to open the given group,
        raising an exception if it doesn't exist.  If "create" is True,
        create a new HDF5 group and link it into the parent group.

        It's recommended to use __getitem__ or create_group() rather than
        calling the constructor directly.
        """
        register_thread()
        with phil:
            if _rawid is not None:
                id = _rawid
            elif create:
                if config.API_18:
                    id = h5g.create(parent_object.id, name, lcpl=self._lcpl)
                else:
                    id = h5g.create(parent_object.id, name)
            else:
                id = h5g.open(parent_object.id, name)
            HLObject.__init__(self, id)

    def _set18(self, name, obj):
        """ HDF5 1.8 __setitem__.  PHIL should already be held.

        Distinct from 1.6 version in that it uses the proper link creation
        and access property lists, which enable creation of intermediate
        groups and proper handling of external links.
        """
        plists = {'lcpl': self._lcpl, 'lapl': self._lapl}

        if isinstance(obj, HLObject):
            h5o.link(obj.id, self.id, name, **plists)

        elif isinstance(obj, SoftLink):
            self.id.links.create_soft(name, obj.path, **plists)
        elif isinstance(obj, ExternalLink):
            self.id.links.create_external(name, obj.filename, obj.path, **plists)

        elif isinstance(obj, numpy.dtype):
            htype = h5t.py_create(obj)
            htype.commit(self.id, name, lcpl=self._lcpl)

        else:
            ds = self.create_dataset(None, data=obj, dtype=_guess_dtype(obj))
            h5o.link(ds.id, self.id, name, **plists)

    def _set16(self, name, obj):
        """ HDF5 1.6 __setitem__.  PHIL should already be held. """
        if isinstance(obj, HLObject):
            self.id.link(h5i.get_name(obj.id), name, link_type=h5g.LINK_HARD)

        elif isinstance(obj, SoftLink):
            self.id.link(obj.path, name, link_type=h5g.LINK_SOFT)

        elif isinstance(obj, numpy.dtype):
            htype = h5t.py_create(obj)
            htype.commit(self.id, name)

        else:
            self.create_dataset(name, data=obj)

    def __setitem__(self, name, obj):
        """ Add an object to the group.  The name must not already be in use.

        The action taken depends on the type of object assigned:

        Named HDF5 object (Dataset, Group, Datatype)
            A hard link is created at "name" which points to the
            given object.

        SoftLink or ExternalLink
            Create the corresponding link.

        Numpy ndarray
            The array is converted to a dataset object, with default
            settings (contiguous storage, etc.).

        Numpy dtype
            Commit a copy of the datatype as a named datatype in the file.

        Anything else
            Attempt to convert it to an ndarray and store it.  Scalar
            values are stored as scalar datasets. Raise ValueError if we
            can't understand the resulting array dtype.
        """
        register_thread()
        with phil:
            if config.API_18:
                self._set18(name, obj)
            else:
                self._set16(name, obj)

    def _get18(self, name):
        """ HDF5 1.8 __getitem__

        Works with string names.  Respects link access properties.
        """

        objinfo = h5o.get_info(self.id, name, lapl=self._lapl)

        cls = {h5o.TYPE_GROUP: Group, h5o.TYPE_DATASET: Dataset,
               h5o.TYPE_NAMED_DATATYPE: Datatype}.get(objinfo.type)
        if cls is None:
            raise TypeError("Unknown object type")

        oid = h5o.open(self.id, name, lapl=self._lapl)
        return cls(self, None, _rawid=oid)

    def _get16(self, name):
        """ HDF5 1.6 __getitem__ """
        objinfo = h5g.get_objinfo(self.id, name)

        cls = {h5g.DATASET: Dataset, h5g.GROUP: Group,
               h5g.TYPE: Datatype}.get(objinfo.type)
        if cls is None:
            raise TypeError("Unknown object type")

        return cls(self, name)

    def _getref(self, ref):
        """ Dereference and open (1.6 and 1.8) """
        cls = {h5g.DATASET: Dataset, h5g.GROUP: Group,
               h5g.TYPE: Datatype}.get(h5r.get_obj_type(ref, self.id))
        if cls is None:
            raise ValueError("Unrecognized object type")

        return cls(self, None, _rawid=h5r.dereference(ref, self.id))

    def __getitem__(self, name):
        """ Open an object attached to this group.
        """
        register_thread()
        with phil:

            if isinstance(name, h5r.Reference):
                return self._getref(name)
            elif config.API_18:
                return self._get18(name)
            else:
                return self._get16(name)

    def __delitem__(self, name):
        """ Delete (unlink) an item from this group. """
        register_thread()
        self.id.unlink(name)

    def __len__(self):
        """ Number of members attached to this group """
        register_thread()
        return self.id.get_num_objs()

    def __contains__(self, name):
        """ Test if a member name exists """
        register_thread()
        return name in self.id

    def __iter__(self):
        """ Iterate over member names """
        register_thread()
        return self.id.__iter__()

    def create_group(self, name):
        """ Create and return a subgroup. Fails if the group already exists.
        """
        return Group(self, name, create=True)

    def require_group(self, name):
        """ Check if a group exists, and create it if not.  TypeError if an
        incompatible object exists.
        """
        with phil:
            if not name in self:
                return self.create_group(name)
            grp = self[name]
            if not isinstance(grp, Group):
                raise TypeError("Incompatible object (%s) already exists" % grp.__class__.__name__)
            return grp

    def create_dataset(self, name, *args, **kwds):
        """ Create and return a new dataset.  Fails if "name" already exists.

        create_dataset(name, shape, [dtype=<Numpy dtype>], **kwds)
        create_dataset(name, data=<Numpy array>, **kwds)

        The default dtype is '=f4' (single-precision float).

        Additional keywords ("*" is default):

        chunks
            Tuple of chunk dimensions or None*

        maxshape
            None* or a tuple giving maximum dataset size.  An element of None
            indicates an unlimited dimension.  Dataset can be expanded by
            calling resize()

        compression
            Compression strategy; None*, 'gzip', 'szip' or 'lzf'.  An integer
            is interpreted as a gzip level.

        compression_opts
            Optional compression settings; for gzip, this may be an int.  For
            szip, it should be a 2-tuple ('ec'|'nn', int(0-32)).

        shuffle
            Use the shuffle filter (increases compression performance for
            gzip and LZF).  True/False*.

        fletcher32
            Enable error-detection.  True/False*.
        """
        return Dataset(self, name, *args, **kwds)

    def require_dataset(self, name, shape, dtype, exact=False, **kwds):
        """Open a dataset, or create it if it doesn't exist.

        Checks if a dataset with compatible shape and dtype exists, and
        creates one if it doesn't.  Raises TypeError if an incompatible
        dataset (or group) already exists.

        By default, datatypes are compared for loss-of-precision only.
        To require an exact match, set keyword "exact" to True.  Shapes
        are always compared exactly.

        Keyword arguments are only used when creating a new dataset; they
        are ignored if an dataset with matching shape and dtype already
        exists.  See create_dataset for a list of legal keywords.
        """
        dtype = numpy.dtype(dtype)

        with phil:
            if not name in self:
                return self.create_dataset(name, *(shape, dtype), **kwds)

            dset = self[name]
            if not isinstance(dset, Dataset):
                raise TypeError("Incompatible object (%s) already exists" % dset.__class__.__name__)

            if not shape == dset.shape:
                raise TypeError("Shapes do not match (existing %s vs new %s)" % (dset.shape, shape))

            if exact:
                if not dtype == dset.dtype:
                    raise TypeError("Datatypes do not exactly match (existing %s vs new %s)" % (dset.dtype, dtype))
            elif not numpy.can_cast(dtype, dset.dtype):
                raise TypeError("Datatypes cannot be safely cast (existing %s vs new %s)" % (dset.dtype, dtype))

            return dset

    def get(self, name, default=None, getclass=False, getlink=False):
        """ Retrieve item "name", or "default" if it's not in this group.

        getclass
            If True, returns the class of object (Group, Dataset, etc.)
            instead of the object itself.

        getlink
            If True, return SoftLink and ExternalLink instances instead
            of the objects they point to.
        """
        register_thread()
        with phil:

            if not name in self:
                return default

            if config.API_18:

                linkinfo = self.id.links.get_info(name)

                if linkinfo.type == h5l.TYPE_HARD or not getlink:

                    objinfo = h5o.get_info(self.id, name)
                    cls = {h5o.TYPE_GROUP: Group, h5o.TYPE_DATASET: Dataset,
                           h5o.TYPE_NAMED_DATATYPE: Datatype}.get(objinfo.type)
                    if cls is None:
                        raise TypeError("Unknown object type")

                    return cls if getclass else cls(self, name)

                else:
                    if linkinfo.type == h5l.TYPE_SOFT:
                        return SoftLink if getclass else SoftLink(self.id.links.get_val(name))
                    elif linkinfo.type == h5l.TYPE_EXTERNAL:
                        return ExternalLink if getclass else ExternalLink(*self.id.links.get_val(name))

                    raise TypeError("Unknown link class")

            # API 1.6
            info = h5g.get_objinfo(self.id, name, follow_link=(not getlink))

            cls = {h5g.DATASET: Dataset, h5g.GROUP: Group,
                   h5g.TYPE: Datatype}.get(info.type)

            if cls is not None:
                return cls if getclass else cls(self, name)

            if getlink and info.type == h5g.LINK:
                return SoftLink if getclass else SoftLink(self.id.get_linkval(name))

            raise TypeError("Unknown object type")

    # New 1.8.X methods

    def copy(self, source, dest, name=None):
        """ Copy an object or group (Requires HDF5 1.8).

        The source can be a path, Group, Dataset, or Datatype object.  The
        destination can be either a path or a Group object.  The source and
        destinations need not be in the same file.

        If the source is a Group object, all objects contained in that group
        will be copied recursively.

        When the destination is a Group object, by default the target will
        be created in that group with its current name (basename of obj.name).
        You can override that by setting "name" to a string.

        Example:

        >>> f = File('myfile.hdf5')
        >>> f.listnames()
        ['MyGroup']
        >>> f.copy('MyGroup', 'MyCopy')
        >>> f.listnames()
        ['MyGroup', 'MyCopy']

        """
        register_thread()
        if not config.API_18:
            raise NotImplementedError("This feature is only available with HDF5 1.8.0 and later")

        with phil:

            if isinstance(source, HLObject):
                source_path = '.'
            else:
                # Interpret source as a path relative to this group
                source_path = source
                source = self

            if isinstance(dest, Group):
                if name is not None:
                    dest_path = name
                else:
                    dest_path = pp.basename(h5i.get_name(source[source_path].id))

            elif isinstance(dest, HLObject):
                raise TypeError("Destination must be path or Group object")
            else:
                # Interpret destination as a path relative to this group
                dest_path = dest
                dest = self

            h5o.copy(source.id, source_path, dest.id, dest_path)

    def visit(self, func):
        """ Recursively visit all names in this group and subgroups (HDF5 1.8).

        You supply a callable (function, method or callable object); it
        will be called exactly once for each link in this group and every
        group below it. Your callable must conform to the signature:

            func(<member name>) => <None or return value>

        Returning None continues iteration, returning anything else stops
        and immediately returns that value from the visit method.  No
        particular order of iteration within groups is guranteed.

        Example:

        >>> # List the entire contents of the file
        >>> f = File("foo.hdf5")
        >>> list_of_names = []
        >>> f.visit(list_of_names.append)
        """
        register_thread()
        if not config.API_18:
            raise NotImplementedError("This feature is only available with HDF5 1.8.0 and later")

        with phil:
            return h5o.visit(self.id, func)

    def visititems(self, func):
        """ Recursively visit names and objects in this group (HDF5 1.8).

        You supply a callable (function, method or callable object); it
        will be called exactly once for each link in this group and every
        group below it. Your callable must conform to the signature:

            func(<member name>, <object>) => <None or return value>

        Returning None continues iteration, returning anything else stops
        and immediately returns that value from the visit method.  No
        particular order of iteration within groups is guranteed.

        Example:

        # Get a list of all datasets in the file
        >>> mylist = []
        >>> def func(name, obj):
        ...     if isinstance(obj, Dataset):
        ...         mylist.append(name)
        ...
        >>> f = File('foo.hdf5')
        >>> f.visititems(func)
        """
        register_thread()
        if not config.API_18:
            raise NotImplementedError("This feature is only available with HDF5 1.8.0 and later")

        with phil:
            def call_proxy(name):
                return func(name, self[name])
            return h5o.visit(self.id, call_proxy)

    def __repr__(self):
        if not self:
            return "<Closed HDF5 group>"
        namestr = '"%s"' % self.name if self.name is not None else "(anonymous)"
        return '<HDF5 group %s (%d members)>' % \
            (namestr, len(self))

class File(Group):

    """ Represents an HDF5 file on disk.

        File(name, mode=None, driver=None, **driver_kwds)

        Legal modes: r, r+, w, w-, a (default)

        File objects inherit from Group objects; Group-like methods all
        operate on the HDF5 root group ('/').  Like Python file objects, you
        must close the file ("obj.close()") when you're done with it. File
        objects may also be used as context managers in Python "with" blocks.

        The HDF5 file driver may also be specified:

        None
            Use the standard HDF5 driver appropriate for the current platform.
            On UNIX, this is the H5FD_SEC2 driver; on Windows, it is
            H5FD_WINDOWS.

        'sec2'
            Unbuffered, optimized I/O using standard POSIX functions.

        'stdio'
            Buffered I/O using functions from stdio.h.

        'core'
            Memory-map the entire file; all operations are performed in
            memory and written back out when the file is closed.  Keywords:

            backing_store:  If True (default), save changes to a real file
                            when closing.  If False, the file exists purely
                            in memory and is discarded when closed.

            block_size:     Increment (in bytes) by which memory is extended.
                            Default is 64k.

        'family'
            Store the file on disk as a series of fixed-length chunks.  Useful
            if the file system doesn't allow large files.  Note: the filename
            you provide *must* contain a printf-style integer format code
            (e.g. %d"), which will be replaced by the file sequence number.
            Keywords:

            memb_size:  Maximum file size (default is 2**31-1).
    """

    _modes = weakref.WeakKeyDictionary()

    @property
    def filename(self):
        """File name on disk"""
        register_thread()
        name = h5f.get_name(self.fid)
        # Note the exception can happen in one of two ways:
        # 1. The name doesn't comply with the file system encoding;
        #    return the raw byte string
        # 2. The name can't be encoded down to ASCII; return it as
        #    a Unicode string object
        try:
            name = name.decode(sys.getfilesystemencoding())
            return name.encode('ascii')
        except (UnicodeError, LookupError):
            return name

    @property
    def file(self):
        return self

    @property
    def mode(self):
        """Python mode used to open file"""
        register_thread()
        mode = self._modes.get(self)
        if mode is None and config.API_18:
            mode = {h5f.ACC_RDONLY: 'r', h5f.ACC_RDWR: 'r+'}.get(self.fid.get_intent())
        return mode

    @property
    def driver(self):
        """Low-level HDF5 file driver used to open file"""
        register_thread()
        drivers = {h5fd.SEC2: 'sec2', h5fd.STDIO: 'stdio',
                   h5fd.CORE: 'core', h5fd.FAMILY: 'family',
                   h5fd.WINDOWS: 'windows'}
        return drivers.get(self.fid.get_access_plist().get_driver(), 'unknown')

    # --- Public interface (File) ---------------------------------------------

    def __init__(self, name, mode=None, driver=None, **kwds):
        """ Create a new file object.

        Valid modes (like Python's file() modes) are:
        - r   Readonly, file must exist
        - r+  Read/write, file must exist
        - w   Create file, truncate if exists
        - w-  Create file, fail if exists
        - a   Read/write if exists, create otherwise (default)

        Valid drivers are:
        - None      Use default driver ('sec2' on UNIX, 'windows' on Win32)
        - 'sec2'    Standard UNIX driver
        - 'stdio'   Stdio (buffered) driver
        - 'core'    mmap driver
        - 'family'  Multi-part file driver
        """
        register_thread()
        if "bind" in kwds:
            self.fid = kwds["bind"]
        else:
            if driver == 'core' and mode=='w-' and version.hdf5_version_tuple[0:2] == (1,6):
                raise NotImplementedError("w- flag does not work on 1.6 for CORE driver")
            try:
                # If the byte string doesn't match the default encoding, just
                # pass it on as-is.  Note Unicode objects can always be encoded.
                name = name.encode(sys.getfilesystemencoding())
            except (UnicodeError, LookupError):
                pass

            plist = self._generate_access_plist(driver, **kwds)
            self.fid = self._generate_fid(name, mode, plist)
            self._modes[self] = mode

        if config.API_18:
            gid = h5o.open(self.fid, '/', lapl=self._lapl)
        else:
            gid = h5g.open(self.fid, '/')
        Group.__init__(self, None, None, _rawid=gid)

    def _generate_access_plist(self, driver, **kwds):
        """ Set up file access property list """
        plist = h5p.create(h5p.FILE_ACCESS)
        plist.set_fclose_degree(h5f.CLOSE_STRONG)

        if driver is None or (driver=='windows' and sys.platform=='win32'):
            return plist

        if(driver=='sec2'):
            plist.set_fapl_sec2(**kwds)
        elif(driver=='stdio'):
            plist.set_fapl_stdio(**kwds)
        elif(driver=='core'):
            plist.set_fapl_core(**kwds)
        elif(driver=='family'):
            plist.set_fapl_family(memb_fapl=plist.copy(), **kwds)
        else:
            raise ValueError('Unknown driver type "%s"' % driver)

        return plist

    def _generate_fid(self, name, mode, plist):
        """ Get a new FileID by opening or creating a file.
        Also validates mode argument."""
        if mode == 'r':
            fid = h5f.open(name, h5f.ACC_RDONLY, fapl=plist)
        elif mode == 'r+':
            fid = h5f.open(name, h5f.ACC_RDWR, fapl=plist)
        elif mode == 'w-':
            fid = h5f.create(name, h5f.ACC_EXCL, fapl=plist)
        elif mode == 'w':
            fid = h5f.create(name, h5f.ACC_TRUNC, fapl=plist)
        elif mode == 'a' or mode is None:
            try:
                fid = h5f.open(name, h5f.ACC_RDWR, fapl=plist)
            except IOError:
                fid = h5f.create(name, h5f.ACC_EXCL, fapl=plist)
        else:
            raise ValueError("Invalid mode; must be one of r, r+, w, w-, a")
        return fid

    def close(self):
        """ Close this HDF5 file.  All open objects will be invalidated.
        """
        register_thread()
        with phil:
            while self.fid:
                self.fid.close()

    def flush(self):
        """ Tell the HDF5 library to flush its buffers.
        """
        register_thread()
        h5f.flush(self.fid)

    def __enter__(self):
        return self

    def __exit__(self,*args):
        register_thread()
        with phil:
            if self.id._valid:
                self.close()

    def __repr__(self):
        register_thread()
        if not self:
            return "<Closed HDF5 file>"
        return '<HDF5 file "%s" (mode %s, %s)>' % \
            (os.path.basename(self.filename), self.mode,
             _extras.sizestring(self.fid.get_filesize()))

    def __hash__(self):
        register_thread()
        return hash(self.fid)
    def __eq__(self, other):
        # Python requires that objects which compare equal hash the same.
        # Therefore comparison to generic Group objects is impossible
        register_thread()
        if hasattr(other, 'fid'):
            return self.fid == other.fid
        return False

class _RegionProxy(object):

    def __init__(self, dset):
        self.id = dset.id

    def __getitem__(self, args):
        register_thread()
        selection = sel.select(self.id.shape, args, dsid=self.id)
        return h5r.create(self.id, '.', h5r.DATASET_REGION, selection._id)

class Dataset(HLObject):

    """ High-level interface to an HDF5 dataset.

        Datasets can be opened via the syntax Group[<dataset name>], and
        created with the method Group.create_dataset().

        Datasets behave superficially like Numpy arrays.  NumPy "simple"
        slicing is fully supported, along with a subset of fancy indexing
        and indexing by field names (dataset[0:10, "fieldname"]).

        The standard NumPy properties "shape" and "dtype" are also available.
    """

    # Internal properties

    def _g_shape(self):
        """Numpy-style shape tuple giving dataset dimensions"""
        register_thread()
        return self.id.shape

    def _s_shape(self, shape):
        self.resize(shape)

    shape = property(_g_shape, _s_shape)

    @property
    def dtype(self):
        """Numpy dtype representing the datatype"""
        register_thread()
        return self.id.dtype

    @property
    def value(self):
        """  Deprecated alias for dataset[...] and dataset[()] """
        with phil:
            arr = self[...]
            #if arr.shape == ():
            #    return numpy.asscalar(arr)
            return arr

    @property
    def _dcpl(self):
        return self.id.get_create_plist()

    @property
    def _filters(self):
        return filters.get_filters(self._dcpl)

    @property
    def chunks(self):
        """Dataset chunks (or None)"""
        register_thread()
        dcpl = self._dcpl
        if dcpl.get_layout() == h5d.CHUNKED:
            return dcpl.get_chunk()
        return None

    @property
    def compression(self):
        """Compression strategy (or None)"""
        for x in ('gzip','lzf','szip'):
            if x in self._filters:
                return x
        return None

    @property
    def compression_opts(self):
        """ Compression setting.  Int(0-9) for gzip, 2-tuple for szip. """
        return self._filters.get(self.compression, None)

    @property
    def shuffle(self):
        """Shuffle filter present (T/F)"""
        return 'shuffle' in self._filters

    @property
    def fletcher32(self):
        """Fletcher32 filter is present (T/F)"""
        return 'fletcher32' in self._filters

    @property
    def maxshape(self):
        register_thread()
        with phil:
            space = self.id.get_space()
            dims = space.get_simple_extent_dims(True)
            return tuple(x if x != h5s.UNLIMITED else None for x in dims)

    @property
    def regionref(self):
        return _RegionProxy(self)

    def __init__(self, group, name,
                    shape=None, dtype=None, data=None,
                    chunks=None, compression=None, shuffle=None,
                    fletcher32=None, maxshape=None, compression_opts=None,
                    _rawid = None):
        """ Open or create a new dataset in the file.

        It's recommended you use the Group methods (open via Group["name"],
        create via Group.create_dataset), rather than calling the constructor.

        There are two modes of operation for this constructor:

        1.  Open an existing dataset:
              Dataset(group, name)

        2.  Create a dataset:
              Dataset(group, name, shape, [dtype=<Numpy dtype>], **kwds)
            or
              Dataset(group, name, data=<Numpy array>, **kwds)

              If "dtype" is not specified, the default is single-precision
              floating point, with native byte order ("=f4").

        Creating a dataset will fail if another of the same name already
        exists.  Also, chunks/compression/shuffle/fletcher32 may only be
        specified when creating a dataset.

        Creation keywords (* is default):

        chunks:        Tuple of chunk dimensions, True, or None*
        compression:   "gzip", "lzf", or "szip" (if available)
        shuffle:       Use the shuffle filter? (requires compression) T/F*
        fletcher32:    Enable Fletcher32 error detection? T/F*
        maxshape:      Tuple giving dataset maximum dimensions or None*.
                       You can grow each axis up to this limit using
                       resize().  For each unlimited axis, provide None.

        compress_opts: Optional setting for the compression filter

        All these options require chunking.  If a chunk tuple is not
        provided, the constructor will guess an appropriate chunk shape.
        Please note none of these are allowed for scalar datasets.
        """
        register_thread()
        with phil:
            if _rawid is not None:
                id = _rawid
            elif data is None and shape is None:
                if any((dtype,chunks,compression,shuffle,fletcher32)):
                    raise ValueError('You cannot specify keywords when opening a dataset.')
                id = h5d.open(group.id, name)
            else:

                # Convert data to a C-contiguous ndarray
                if data is not None:
                    data = numpy.asarray(data, order="C")

                # Validate shape
                if shape is None:
                    if data is None:
                        raise TypeError("Either data or shape must be specified")
                    shape = data.shape
                else:
                    shape = tuple(shape)
                    if data is not None and (numpy.product(shape) != numpy.product(data.shape)):
                        raise ValueError("Shape tuple is incompatible with data")

                # Validate dtype
                if dtype is None and data is None:
                    dtype = numpy.dtype("=f4")
                elif dtype is None and data is not None:
                    dtype = data.dtype
                else:
                    dtype = numpy.dtype(dtype)

                # Legacy
                if any((compression, shuffle, fletcher32, maxshape)):
                    if chunks is False:
                        raise ValueError("Chunked format required for given storage options")

                # Legacy
                if compression in range(10) or compression is True:
                    if compression_opts is None:
                        if compression is True:
                            compression_opts = 4
                        else:
                            compression_opts = compression
                    else:
                        raise TypeError("Conflict in compression options")
                    compression = 'gzip'

                # Generate the dataset creation property list
                # This also validates the keyword arguments
                plist = filters.generate_dcpl(shape, dtype, chunks, compression,
                            compression_opts, shuffle, fletcher32, maxshape)

                if maxshape is not None:
                    maxshape = tuple(x if x is not None else h5s.UNLIMITED for x in maxshape)

                space_id = h5s.create_simple(shape, maxshape)
                type_id = h5t.py_create(dtype, logical=True)

                if config.API_18:
                    id = h5d.create(group.id, name, type_id, space_id, dcpl=plist, lcpl=self._lcpl)
                else:
                    id = h5d.create(group.id, name, type_id, space_id, dcpl=plist)
                if data is not None:
                    id.write(h5s.ALL, h5s.ALL, data)
            HLObject.__init__(self, id)

    def resize(self, size, axis=None):
        """ Resize the dataset, or the specified axis (HDF5 1.8 only).

        The dataset must be stored in chunked format; it can be resized up to
        the "maximum shape" (keyword maxshape) specified at creation time.
        The rank of the dataset cannot be changed.

        "Size" should be a shape tuple, or if an axis is specified, an integer.

        BEWARE: This functions differently than the NumPy resize() method!
        The data is not "reshuffled" to fit in the new shape; each axis is
        grown or shrunk independently.  The coordinates of existing data is
        fixed.
        """
        register_thread()
        with phil:

            if not config.API_18:
                raise NotImplementedError("Resizing is only available with HDF5 1.8.")

            if self.chunks is None:
                raise TypeError("Only chunked datasets can be resized")

            if axis is not None:
                if not axis >=0 and axis < self.id.rank:
                    raise ValueError("Invalid axis (0 to %s allowed)" % self.id.rank-1)
                try:
                    newlen = int(size)
                except TypeError:
                    raise TypeError("Argument must be a single int if axis is specified")
                size = list(self.shape)
                size[axis] = newlen

            size = tuple(size)
            self.id.set_extent(size)
            h5f.flush(self.id)  # THG recommends

    def __len__(self):
        """ The size of the first axis.  TypeError if scalar.

        Limited to 2**32 on 32-bit systems; Dataset.len() is preferred.
        """
        size = self.len()
        if size > sys.maxint:
            raise OverflowError("Value too big for Python's __len__; use Dataset.len() instead.")
        return size

    def len(self):
        """ The size of the first axis.  TypeError if scalar.

        Use of this method is preferred to len(dset), as Python's built-in
        len() cannot handle values greater then 2**32 on 32-bit systems.
        """
        shape = self.shape
        if len(shape) == 0:
            raise TypeError("Attempt to take len() of scalar dataset")
        return shape[0]

    def __iter__(self):
        """ Iterate over the first axis.  TypeError if scalar.

        BEWARE: Modifications to the yielded data are *NOT* written to file.
        """
        shape = self.shape
        if len(shape) == 0:
            raise TypeError("Can't iterate over a scalar dataset")
        for i in xrange(shape[0]):
            yield self[i]

    def __getitem__(self, args):
        """ Read a slice from the HDF5 dataset.

        Takes slices and recarray-style field names (more than one is
        allowed!) in any order.  Obeys basic NumPy rules, including
        broadcasting.

        Also supports:

        * Boolean "mask" array indexing
        * Advanced dataspace selection via the "selections" module
        """
        register_thread()
        with phil:

            args = args if isinstance(args, tuple) else (args,)

            # Sort field indices from the rest of the args.
            names = tuple(x for x in args if isinstance(x, str))
            args = tuple(x for x in args if not isinstance(x, str))

            # Create NumPy datatype for read, using only the named fields
            # as specified by the user.
            basetype = self.id.dtype
            if len(names) == 0:
                new_dtype = basetype
            elif basetype.names is None:
                raise ValueError("Field names only allowed for compound types")
            else:
                for name in names:
                    if not name in basetype.names:
                        raise ValueError("Field %s does not appear in this type." % name)
                new_dtype = numpy.dtype([(name, basetype.fields[name][0]) for name in names])

            # Perform the dataspace selection.
            selection = sel.select(self.shape, args, dsid=self.id)

            if selection.nselect == 0:
                return numpy.ndarray((0,), dtype=new_dtype)

            # Create the output array using information from the selection.
            arr = numpy.ndarray(selection.mshape, new_dtype, order='C')

            # This is necessary because in the case of array types, NumPy
            # discards the array information at the top level.
            mtype = h5t.py_create(new_dtype)

            # HDF5 has a bug where if the memory shape has a different rank
            # than the dataset, the read is very slow
            mshape = selection.mshape
            if len(mshape) < len(self.shape):
                # pad with ones
                mshape = (1,)*(len(self.shape)-len(mshape)) + mshape

            # Perfom the actual read
            mspace = h5s.create_simple(mshape)
            fspace = selection._id
            self.id.read(mspace, fspace, arr, mtype)

            # Patch up the output for NumPy
            if len(names) == 1:
                arr = arr[names[0]]     # Single-field recarray convention
            if arr.shape == ():
                arr = numpy.asscalar(arr)
            return arr

    def __setitem__(self, args, val):
        """ Write to the HDF5 dataset from a Numpy array.

        NumPy's broadcasting rules are honored, for "simple" indexing
        (slices and integers).  For advanced indexing, the shapes must
        match.

        Classes from the "selections" module may also be used to index.
        """
        register_thread()
        with phil:

            args = args if isinstance(args, tuple) else (args,)

            # Sort field indices from the slicing
            names = tuple(x for x in args if isinstance(x, str))
            args = tuple(x for x in args if not isinstance(x, str))

            if len(names) != 0:
                raise TypeError("Field name selections are not allowed for write.")

            # Generally we try to avoid converting the arrays on the Python
            # side.  However, for compound literals this is unavoidable.
            if self.dtype.kind == 'V' and \
            (not isinstance(val, numpy.ndarray) or val.dtype.kind != 'V'):
                val = numpy.asarray(val, dtype=self.dtype, order='C')
            else:
                val = numpy.asarray(val, order='C')

            # Check for array dtype compatibility and convert
            if self.dtype.subdtype is not None:
                shp = self.dtype.subdtype[1]
                if val.shape[-len(shp):] != shp:
                    raise TypeError("Can't broadcast to array dimension %s" % (shp,))
                mtype = h5t.py_create(numpy.dtype((val.dtype, shp)))
                mshape = val.shape[0:len(val.shape)-len(shp)]
            else:
                mshape = val.shape
                mtype = None

            # Perform the dataspace selection
            selection = sel.select(self.shape, args, dsid=self.id)

            if selection.nselect == 0:
                return

            # Broadcast scalars if necessary.
            if (mshape == () and selection.mshape != ()):
                if self.dtype.subdtype is not None:
                    raise NotImplementedError("Scalar broadcasting is not supported for array dtypes")
                val2 = numpy.empty(selection.mshape[-1], dtype=val.dtype)
                val2[...] = val
                val = val2
                mshape = val.shape

            # Perform the write, with broadcasting
            # Be careful to pad memory shape with ones to avoid HDF5 chunking
            # glitch, which kicks in for mismatched memory/file selections
            if(len(mshape) < len(self.shape)):
                mshape_pad = (1,)*(len(self.shape)-len(mshape)) + mshape
            else:
                mshape_pad = mshape
            mspace = h5s.create_simple(mshape_pad, (h5s.UNLIMITED,)*len(mshape_pad))
            for fspace in selection.broadcast(mshape):
                self.id.write(mspace, fspace, val, mtype)

    def read_direct(self, dest, source_sel=None, dest_sel=None):
        """ Read data directly from HDF5 into an existing NumPy array.

        The destination array must be C-contiguous and writable.
        Selections may be any operator class (HyperSelection, etc) in
        h5py.selections, or the output of numpy.s_[<args>].

        Broadcasting is supported for simple indexing.
        """
        register_thread()
        if source_sel is None:
            source_sel = sel.SimpleSelection(self.shape)
        else:
            source_sel = sel.select(self.shape, source_sel, self.id)  # for numpy.s_
        fspace = source_sel._id

        if dest_sel is None:
            dest_sel = sel.SimpleSelection(dest.shape)
        else:
            dest_sel = sel.select(dest.shape, dest_sel, self.id)

        for mspace in dest_sel.broadcast(source_sel.mshape):
            self.id.read(mspace, fspace, dest)

    def write_direct(self, source, source_sel=None, dest_sel=None):
        """ Write data directly to HDF5 from a NumPy array.

        The source array must be C-contiguous.  Selections may be any
        operator class (HyperSelection, etc) in h5py.selections, or
        the output of numpy.s_[<args>].

        Broadcasting is supported for simple indexing.
        """
        register_thread()
        if source_sel is None:
            source_sel = sel.SimpleSelection(source.shape)
        else:
            source_sel = sel.select(source.shape, source_sel, self.id)  # for numpy.s_
        mspace = source_sel._id

        if dest_sel is None:
            dest_sel = sel.SimpleSelection(self.shape)
        else:
            dest_sel = sel.select(self.shape, dest_sel, self.id)

        for fspace in dest_sel.broadcast(source_sel.mshape):
            self.id.write(mspace, fspace, source)

    def __array__(self, dtype=None):
        with phil:
            arr = numpy.empty(self.shape, dtype=self.dtype if dtype is None else dtype)
            self.read_direct(arr)
            return arr

    def __repr__(self):
        if not self:
            return "<Closed HDF5 dataset>"
        namestr = '"%s"' % _extras.basename(self.name) if self.name is not None else "(anonymous)"
        return '<HDF5 dataset %s: shape %s, type "%s">' % \
            (namestr, self.shape, self.dtype.str)

class AttributeManager(_DictCompat):

    """
        Allows dictionary-style access to an HDF5 object's attributes.

        These are created exclusively by the library and are available as
        a Python attribute at <object>.attrs

        Like the members of groups, attributes provide a minimal dictionary-
        style interface.  Anything which can be reasonably converted to a
        Numpy array or Numpy scalar can be stored.

        Attributes are automatically created on assignment with the
        syntax <obj>.attrs[name] = value, with the HDF5 type automatically
        deduced from the value.  Existing attributes are overwritten.

        To modify an existing attribute while preserving its type, use the
        method modify().  To specify an attribute of a particular type and
        shape (or to create an empty attribute), use create().

    """

    def __init__(self, parent):
        """ Private constructor.
        """
        self._id = parent.id

    def __getitem__(self, name):
        """ Read the value of an attribute.
        """
        register_thread()
        with phil:
            attr = h5a.open(self._id, name)

            arr = numpy.ndarray(attr.shape, dtype=attr.dtype, order='C')
            attr.read(arr)

            if len(arr.shape) == 0:
                return numpy.asscalar(arr)
            return arr

    def __setitem__(self, name, value):
        """ Set a new attribute, overwriting any existing attribute.

        The type and shape of the attribute are determined from the data.  To
        use a specific type or shape, or to preserve the type of an attribute,
        use the methods create() and modify().

        Broadcasting isn't supported for attributes.
        """
        with phil:
            self.create(name, data=value, dtype=_guess_dtype(value))

    def __delitem__(self, name):
        """ Delete an attribute (which must already exist). """
        register_thread()
        h5a.delete(self._id, name)

    def create(self, name, data, shape=None, dtype=None):
        """ Create a new attribute, overwriting any existing attribute.

        name
            Name of the new attribute (required)
        data
            An array to initialize the attribute (required)
        shape
            Shape of the attribute.  Overrides data.shape if both are
            given.  The total number of points must be unchanged.
        dtype
            Data type of the attribute.  Overrides data.dtype if both
            are given.  Must be conversion-compatible with data.dtype.
        """
        register_thread()
        with phil:
            if data is not None:
                data = numpy.asarray(data, order='C', dtype=dtype)
                if shape is None:
                    shape = data.shape
                elif numpy.product(shape) != numpy.product(data.shape):
                    raise ValueError("Shape of new attribute conflicts with shape of data")

                if dtype is None:
                    dtype = data.dtype

            if dtype is None:
                dtype = numpy.dtype('f')
            if shape is None:
                raise ValueError('At least one of "shape" or "data" must be given')

            data = data.reshape(shape)

            space = h5s.create_simple(shape)
            htype = h5t.py_create(dtype, logical=True)

            if name in self:
                h5a.delete(self._id, name)

            attr = h5a.create(self._id, name, htype, space)
            if data is not None:
                attr.write(data)

    def modify(self, name, value):
        """ Change the value of an attribute while preserving its type.

        Differs from __setitem__ in that the type of an existing attribute
        is preserved.  Useful for interacting with externally generated files.

        If the attribute doesn't exist, it will be automatically created.
        """
        register_thread()
        with phil:
            if not name in self:
                self[name] = value
            else:
                value = numpy.asarray(value, order='C')

                attr = h5a.open(self._id, name)

                # Allow the case of () <-> (1,)
                if (value.shape != attr.shape) and not \
                   (numpy.product(value.shape)==1 and numpy.product(attr.shape)==1):
                    raise TypeError("Shape of data is incompatible with existing attribute")
                attr.write(value)

    def __len__(self):
        """ Number of attributes attached to the object. """
        # I expect we will not have more than 2**32 attributes
        register_thread()
        return h5a.get_num_attrs(self._id)

    def __iter__(self):
        """ Iterate over the names of attributes. """
        register_thread()
        with phil:
            attrlist = []
            def iter_cb(name, *args):
                attrlist.append(name)
            h5a.iterate(self._id, iter_cb)

            for name in attrlist:
                yield name

    def __contains__(self, name):
        """ Determine if an attribute exists, by name. """
        register_thread()
        return h5a.exists(self._id, name)

    def __repr__(self):
        if not self._id:
            return "<Attributes of closed HDF5 object>"
        return "<Attributes of HDF5 object at %s>" % id(self._id)

class Datatype(HLObject):

    """
        Represents an HDF5 named datatype stored in a file.

        To store a datatype, simply assign it to a name in a group:

        >>> MyGroup["name"] = numpy.dtype("f")
        >>> named_type = MyGroup["name"]
        >>> assert named_type.dtype == numpy.dtype("f")
    """

    @property
    def dtype(self):
        """Numpy dtype equivalent for this datatype"""
        register_thread()
        return self.id.dtype

    def __init__(self, grp, name, _rawid=None):
        """ Private constructor.
        """
        register_thread()
        with phil:
            id = _rawid if _rawid is not None else h5t.open(grp.id, name)
            HLObject.__init__(self, id)

    def __repr__(self):
        if not self.id:
            return "<Closed HDF5 named type>"
        namestr = '"%s"' % _extras.basename(self.name) if self.name is not None else "(anonymous)"
        return '<HDF5 named type %s (dtype %s)>' % \
            (namestr, self.dtype.str)

class SoftLink(object):

    """
        Represents a symbolic ("soft") link in an HDF5 file.  The path
        may be absolute or relative.  No checking is performed to ensure
        that the target actually exists.
    """

    @property
    def path(self):
        return self._path

    def __init__(self, path):
        self._path = str(path)

    def __repr__(self):
        return '<SoftLink to "%s">' % self.path

class ExternalLink(object):

    """
        Represents an HDF5 external link.  Paths may be absolute or relative.
        No checking is performed to ensure either the target or file exists.
    """

    @property
    def path(self):
        return self._path

    @property
    def filename(self):
        return self._filename

    def __init__(self, filename, path):
        if not config.API_18:
            raise NotImplementedError("External links are only available as of HDF5 1.8")
        self._filename = str(filename)
        self._path = str(path)

    def __repr__(self):
        return '<ExternalLink to "%s" in file "%s"' % (self.path, self.filename)


Beautiful individual hand made shoes from Laura Vita, featuring floral motifs Betsy in grey are great for the summer. With leather uppers and a hidden Velcro fastening on the rear strap, they adjust perfectly to your foot.

 Heel height : 5cm

 Also available in lime.
Beautiful individual hand made shoes from Laura Vita, featuring floral motifs Betsy in grey are great for the summer. With leather uppers and a hidden Velcro fastening on the rear strap, they adjust perfectly to your foot.


The national aerobatic team of the Hashemite Kingdom of Jordan, the Royal Jordanian Falcons were formed in 1976 at the behest of the late His Majesty King Hussein, a pilot and aviation enthusiast of great renown and a great supporter of the Air Tattoo. Then they flew the Pitts Special - today the Falcons use a competition aerobatic aircraft of the modern generation, the German-designed Extra EA300L. The four-ship formation is made up of former Royal Jordanian Air Force fighter pilots. Based at King Hussein International Airport in the Red Sea resort of Aqaba, the team acts as a 'roving ambassador' for Jordan, and undertakes an extensive European tour every summer.


Fixed: Issue with poll options in template.
New: Added choose prefix of the first post of the thread.
Fixed: Language file with ACP settings strings.
Fixed: Parser - thanks Omar G.
Fixed: Issue with CheckBox "Send Notice To Author" - now remember "checked/unchecked" after preview with error.
Fixed: Renamed from ModNotice+ to ModNotice Plus.
Fixed: Thread Title changes after changing the subject of the first post.
New: Added a checkbox "Send Notice To Author" to the template if posting of notice is enabled in Admin CP.


text:
ESN director new Home Office lead at TCCA
Steve Whatson (left), product director for the much-delayed Emergency Services Network (ESN), is the new Home Office representative on the board of TCCA (The Critical Communications Association).
By Paul Jacques
Steve Whatson
Mr Whatson joined the Home Office in January 2014 as deputy director for the Emergency Services Mobile Communications Programme (ESMCP), which aims to deliver the world's first 'second generation' integrated critical communications system.
However, amid mounting delays – with the project at least 15 months behind schedule – the Home Office has now been forced to adopt a "phased" roll-out for the ESN under a new "strategic direction" following in-depth review.
Meg Hillier, chair of the Public Accounts Committee, has criticised the programme to replace the existing Airwave communications system as "over-ambitious" and beset with "endless complications".
She intends to question Home Office Permanent Secretary Sir Philip Rutnam later this month after the committee had been "repeatedly assured" the roll-out of the new ESN would be completed before the end of 2019.
Mr Whatson joined the ESMCP with responsibility for Technical Solutions, including the delivery of the user services and mobile services, and dependent programmes such as Crossrail and London Underground, and latterly was in charge of user engagement.
Mr Whatson, who has more than 20 years' experience in IT, joined the Home Office from the Metropolitan Police Service (MPS) where he managed the ICT security for the London 2012 Olympic and Paralympic Games.
After the Games, he continued to manage the MPS's biggest ICT projects, including leading the replacement of the UK's largest emergency services call handling system, driving the force's mobility programme and replacing the MPS's legacy systems with a single solution.
TCCA represents all standard mobile critical communications technologies and complementary applications across the world.
Mr Whatson replaces Ari Toivonen as the Home Office representative on the board.
Force goes live with 'web chat'
New software gives instant access to CCTV
New code of practice for digital evidence
Video game-style training for crisis incident management

redpajama_set_name: RedPajamaCommonCrawl


text:
Mobile Phones Menu
Sky Mobile
Top 6 Ways to Save on Your Phone Deal
Switching and Keeping Your Number
Mobile Phones - Jargon Buster
Everything You Need to Know About SIM Only Deals
View all help & advice
Home / Mobile Phones / Apple / iPhone 8 Plus
The iPhone 8 Plus is the best version of the new iPhone, blending the sophisticated technology of the new device with a larger display, better battery and improved dual-camera. Read more
Free from £41.00 a month
Screen size 5.5"
Camera 12 megapixels
Find your perfect iPhone 8 Plus deal:
Featured Cheapest monthly cost Cheapest average monthly cost Cheapest phone cost
Order by our algorithm which ranks tariffs based on the bundle, cost and supplier.
Order by the cheapest monthly tariff cost available including any discounts. This does not include upfront costs and standard tariff costs outside of any discounted period and therefore may not be the cheapest average monthly cost overall for the length of the contract.
Ordered by the cheapest average monthly cost for the contract. This is all upfront costs and all monthly charges, both in and out of any discounted period, for the length of the contract added together and then divided by the number of months of the contract.
Order by the cheapest handset cost available.
Any minutes... At least 250 minutes At least 500 minutes At least 750 minutes At least 1,000 minutes At least 2,000 minutes At least 2,500 minutes At least 5,000 minutes Unlimited
Any texts... At least 500 texts At least 1,000 texts At least 2,000 texts At least 5,000 texts Unlimited
Any internet... At least 250 MB data At least 500 MB data At least 1 GB data At least 1.5 GB data At least 2 GB data At least 3 GB data At least 4 GB data At least 5 GB data At least 6 GB data At least 8 GB data At least 10 GB data At least 15 GB data At least 20 GB data At least 25 GB data At least 30 GB data At least 40 GB data At least 50 GB data At least 60 GB data At least 100 GB data Unlimited
Include data only... Show just data only Hide data only
Cost details
Any upfront cost... No upfront cost Up to £10 upfront Up to £25 upfront Up to £50 upfront Up to £100 upfront Up to £150 upfront Up to £200 upfront Up to £250 upfront
Any monthly cost... Up to £10 per month Up to £15 per month Up to £20 per month Up to £25 per month Up to £30 per month Up to £35 per month Up to £40 per month Up to £50 per month Up to £55 per month Up to £60 per month Up to £65 per month Up to £70 per month
Any contract length... Up to 36 months Up to 30 months Up to 24 months Up to 12 months Up to 6 months
We have pre-selected a colour for you
Choose capacity:
Hide existing customer deals
Include refurbished phones
Include resellers
128GB Space Grey
on EE
Apple iPhone 8 Plus 128GB Space Grey
24 month contract on EE
Unlimited minutes
4 GB internet
Avg monthly cost: £40.58 Total cost: £973.99
Free WiFi on the London Underground
See deal More info
EE Tickets
EE Film Club
Clone your phone app
EE website
EE coverage checker
EE fair usage policy
EE traffic management policy
Cost breakdown
Upfront Phone Cost: £37.99
Total Monthly Cost: £39.00
Average Monthly Cost: £40.58
Total Contract Length: 24 months
Total Contract Cost: £973.99
First Year Cost: £505.99
Out of bundle charges
Mins: Unlimited
Texts: Unlimited
Data: Various data 'add-ons' available.
Picture messages: £0.40 per MMS
Voicemail: £0.40 per min
10 GB internet
FREE device
Upfront Phone Cost: FREE
Avg monthly cost: £41.75 Total cost: £1,002.00
Free WiFi on the London Underground. £30.00 Cashback paid automatically.
Automatic Cashback: £30.00
Total Contract Cost: £1,002.00
125 GB internet
125 GB data
£48 Redemption Cashback
£10 Automatic Cashback
£8.99 upfront
Upfront Phone Cost: £8.99
Oh no! No deals? You probably chose options that we can't find any deals for, sorry!
Take a look at the things you clicked on again and try to change some options, or start fresh!
Load more deals
If you buy a product through our website we sometimes earn commission. You can find out more on our About page.
We always aim to provide accurate information but if there's anything we've missed then please get in touch and let us know.
We aim to display as many tariffs available on the market as possible, depending on the data available to Mobile Phones. Legacy tariffs are excluded as well as some more granular tariff information such as international out of bundle rates.
We aim to display as many existing customer tariffs as possible, depending on the data available to Mobile Phones. Existing customers should check with their current provider for additional customer tariffs.
We aim to display as many promotional extras with tariffs as possible, depending on the data available to Mobile Phones. Some promotional extras may not be displayed.
Many discounts and promotions on Mobile Phones will be included in the tariff pricing structure. Automatic cashback is included in the average monthly cost, first-year cost and total contract cost calculations. Some promotions such as gift cards and redemption cashback will need to be claimed by the customer after the tariff is purchased, therefore, we do not include these in our pricing structures. The tariff supplier will be able to give full details of how these promotional extras should be claimed.
Tariffs featuring 'unlimited' allowances may be subject to traffic management or fair usage policies. Please see our guide for more information on how this works.
SIM only deals are limited to 30 day or longer, excluding shorter plans and 'Pay as you go' tariffs.
All prices shown are inclusive of VAT.
Prices shown are based on the assumption a user will not exceed their inclusive allowance. Costs for additional out-of-allowance usage are provided for information only.
If you choose to pay via a method other than direct debit or you would like itemised or paper billing, you may incur additional charges to those displayed on Mobile Phones.
A supplier may increase the price during your contract, but if this is excessive you should be able to exit without penalty. Ofcom has more information on how to complain about your provider and comparative information on complaints handling.
Last updated on the 19th of January at 4:13am with 388,968 deals.
Our Apple iPhone 8 Plus Review
As you'll know if you've been following the pre-release hype of the iPhone X, this phone is expensive. Buying it outright will cost you a whopping £1000 if you buy it from Apple, so that option isn't really recommended unless you have a huge budget for your smartphone. As this is a brand-new, premium device, it's recommended that you get it as part of a Pay Monthly contract, as you can consolidate the phone's cost with your monthly text, calls and data bill.
Apple's iPhone 8 Plus is a masterclass in design, offering powerful technology combined with a look that you'll want to show off. The improved camera alongside the A11 Bionic chip make is a powerhouse in performance and style.
Apple iPhone 8 Plus: Display
The iPhone 8 Plus features a stunning 5.5-inch Retina HD Display, much like the previous version of the iPhone. What's different this time is the improvements that Apple has made to the screen that made the the iPhone so compelling in the first place. True Tone gives an improved viewing experience by using a light sensor to change the white balance as the light around you changes, reducing eye strain as you're reading.
The iPhone 8 Plus also features the best colour accuracy on an iPhone ever, making colours lifelike and offering a high contrast on all the media you have on your phone. This makes viewing photos, watching movies, playing games and reading articles better and more visually impressive than ever before.
Apple iPhone 8 Plus: Camera
The camera is one of the best reasons to choose the iPhone 8 Plus over the standard iPhone 8. The Plus features a dual-camera system, offering 2 12-megapixel lenses that open up a whole new range of photo opportunities when you're taking shots on the move. The 2 cameras means that zooming is improved, allowing you to zoom further without compromising on photo quality.
Portrait mode also allows you to take photos with far more depth than the standard iPhone 8. Using this, you can give your subject sharper detail whilst keeping the background blurred as well as utilise face detection to give your photos the best conditions even before you take them.
Apple iPhone 8 Plus: Design
The iPhone 8 Plus has been designed from the ground up to be one of the most stylish phones on the market. Whilst the phone takes the classic rounded design of the iPhone 7, it has a number of additions that make it well worth the upgrade. The biggest of these is the glass backing, which harkens to the very popular iPhone 4 and gives the phone a premium feel. Despite the use of glass, the 8 Plus is still very sturdy and durable.
The glass backing also allows for the new wireless charging feature - a first for the iPhone. Users will be able to charge their iPhone wirelessly for the first time, and using Apple's wireless charger, can also charge their Apple Watch and Air Buds simultaneously.
Apple iPhone 8 Plus: Performance
The iPhone 8 Plus is the most powerful iPhone yet (at least for a few more months) and this is down to the new A11 Bionic chip that Apple has utilised to create a smoother and more impressive experience. Users can enjoy up to 70% more efficiency when using their phone for day-to-day tasks, with the chip using more or less power depending on what you're doing.
The new processor is also up to 30% faster than that found in the iPhone 7 Plus, meaning you'll have all the speed you need for the latest high-powered games. You'll also be able to use the new Augmented Reality technology which allows for new and exciting AR games and experiences.
Apple iPhone 8 Plus: Features & OS
The 8 Plus comes side-by-side with the new iOS 11. This versatile mobile OS is more user-friendly than ever before, with enhanced features that allow users to get the most from their iPhone. This includes an improved version of Siri, which can now open apps for you and even play music. Apple Music also has a more social layout, allowing you to keep up with what your friends are listening to.
iOS 11 also improves upon Apple's multitasking system, giving users a faster and easier experience. The new control centre allows for more to be customised, so you can get to your notifications faster. You can also use the improved 3D touch, which allows you to access app features in new and interesting ways.
How much is the Apple iPhone 8 Plus?
The iPhone 8 Plus is the brand new smartphone from Apple - meaning it demands a premium price no matter how you get it. Buying it outright from Apple will cost you £799, which is obviously expensive if you want to buy the phone upfront and use it with a SIM only contract. Most will instead want to opt for getting the phone as part of a contract with an operator, as you'll be able to cover the cost of the phone, texts, minutes and mobile data in one handy monthly cost. Most operators will ask for an upfront payment, but this is rarely over £100 so is therefore a much cheaper option.
Apple iPhone 8 Plus: Our verdict
The iPhone 8 Plus is one of the nicest phablet devices on the market, giving you a premium, modern design mixed in with a powerful processor, one of the best cameras on a smartphone and a mobile OS that beats the rest.
"The iPhone 8 Plus is the best version of the new iPhone, blending the sophisticated technology of the new device with a larger display, better battery and improved dual-camera.
More Apple Phones
How to Unlock Your Phone
Apple iPhone 8 Plus Specification
Display Size: 5.5"
Display Type: Retina HD display
Primary Camera Flash: Quad-LED
Primary Camera Resolution: 4032 x 3024
Primary Camera Megapixels: 12
Secondary Camera Megapixels: 7
Memory Card Slot: None
2G Connectivity: GSM 850/900/1800/1900
3G Connectivity: HSDPA 850/900/1700/1900/2100
4G Connectivity: LTE 700/800/850/900/1700/1800/1900/2100/2600
Bluetooth: 5.0 with A2DP, LE
GPS: A-GPS, GLONASS, Galileo and QZSS
Wi-Fi: 802.11 b/g/n/ac
Processor: Hexa-core
Chipset: Apple A11 Bionic
Talk Time: Up to 21 hours
Weight (grams): 202
IP Rating: IP67 - Dust and water resistant
Sim Type: Nano SIM
Operating System: iOS
Compare Apple iPhone 8 Plus packages
For offline comparisons or other support, contact us at:
help@mobile-phones.co.uk
Compare the latest phones from leading manufacturers
Find some of the best prices on major network tariffs
Why compare with Mobile Phones?
Compare phones and tablets and get accurate, unbiased results
Easy filtering so you can see a range of ideal plans and tariffs
Find offers on pay monthly handsets and SIM Only
In-depth reviews of the latest smartphones and tablets
Start searching now to see all the latest deals and offers.
Copyright © Mobile Phones 2020. All rights reserved.
About Contact Terms & Conditions Privacy & Cookie Policy


Background & purpose: Hypertension is a common, chronic, age-related disease, which often leads to cardiovascular complications. The purpose of this study was to investigate the effect of moderate intensity aerobic exercises on blood coagulation and fibrinolysis factors in elderly hypertensive patients. Methods: fifty hypertensive male patients participated in the study with age range(55-65 years old), body mass index from 25 to 34.9 kg/m2. The patients divided into study group and control group randomly. The study group performed moderate intensity aerobic exercises in the form of walking on electronic treadmill for 30 to 40 min., 3 session per week for 8 consecutive weeks plus medical treatment with fixed dose throughout the study period. while the control group took the medical treatment only without exercises. Laboratory investigation for measuring clotting time, plasminogen activator inhibitor-1 pre and post study, also recording systolic & diastolic blood pressure pre and post the study. Results: there was significant increase in the clotting time of both groups in favor of the study group by 5.22% post study and there was significant decreasing effect in PAI-1 (P<0.05) in study and control groups in favor of the study group by 19.32%. while the study group had significant reduction of systolic and diastolic blood pressure compared with the control group (p<0.05). Conclusion: there is a beneficial effect of moderate intensity aerobic exercises in improving fibrinolysis process via reducing the plasminogen activator inhibitor-1, and increasing the clotting time as well as moderate aerobic exercises had a significant effect in lowering arterial blood pressure in elderly hypertensives.


text:
Soojidaara Movie Review: Hariprriya all the way!
by Nesara V Jagannatha | May 10, 2019 | Reviews
Critic's Rating:
Very few movies make the right noise from the very start of the promotional activities. Soojidaara is one such flick which managed achieve this feat as the expectations were taken sky-high after the poster, teaser and the trailer was released in the last month. Directed by Mounish Badiger, Soojidaara has Hariprriya, Yashwanth Shetty and Achyuth Kumar playing prominent roles in the movie. With so many expectations around the movie, let's now find out if the flick manages to impress the audience at the theatres.
Firstly, an extremely challenging subject has been selected by the makers. The film is basically an adaptation of Ramayana in the modern era. There are three main characters in the movie and the happenings around them take the proceedings forward in the movie.
While one character is that of an aspiring actress, the other two involve a person who is on the run and a housewife who is in an abusive relationship. All these characters have definite arcs and hence, at the end of the movie, you feel satisfied with the experience.
The story has been weaved nicely around incidents involving these characters which manage to keep hold of your attention throughout the run-time. Soojidara does possess one of the best stories in Kannada films releases this year.
Hariprriya is a wonderful performer and with Soojidaara, she has taken her performance a notch higher. A character with a lot of inner struggles was portrayed easily by the "Beauty Queen" and a lot of awards could follow her next year. Although most of the other actors are from the theatre background, they have done well too.
Music has been handled well in the movie and elevates the impact of the movie. The camera work is neat and the tone of the film has been brought out beautifully. Editing is also decent.
Overall, Soojidaara is definitely the movie to watch this weekend.
Londonalli Lambodara Movie Review: Do Lambodara's antics in London impress the audience?
Critic's Rating: Directed by Raj Surya, Londonalli Lambodara has hit the theatres this Friday. With newcomers Santhosh and Big Boss fame Shruthi Prakash in the…
Premier Padmini Movie Review : Does the car drive you towards a cinematic experience?
Critic's Rating: Television producer Shruthi Naidu has entered the movie industry and Premier Padmini is her first offering. A lot of has been discussed about…
Panchatantra Movie Review: How does Yograj Bhat's latest offering perform at the theatres?
Critic's Rating: Whenever Yograj Bhat comes with a bunch of new faces, he strikes gold at the Box-Office. With Panchatantra, Vihaan Gowda and Sonal have…
Soori's best gangster film till date?
Kaddipudi
Tagaru
Duniya


text:
Amy Pollock, MEd
Academic Success Coach for the College of Chiropractic|Office: Suite 150
Amy Pollock joined the Logan University team in September of 2016 as an Academic Success Coach. She earned a bachelor's degree in interdisciplinary studies with concentrations in sociology, psychology and human development and family studies from the University of Missouri-Columbia. Amy also earned her master's degree in education with an emphasis in counseling from Missouri Baptist University.
Amy has spent most of her career working with students of all ages. Most recently, she managed BJC HealthCare's learning partnerships with local colleges and universities whose programs were available to BJC employees. She also conducted career counseling and facilitated personal development workshops.
Amy is passionate about serving the University as an Academic Success Coach because she loves building relationships with her students and helping them reach their full potential.


Each integration must present a manifest at a known public URL. The manifest describes the capabilities of the integration and provides information that Zendesk Support needs to interact with the integration.
You specify the manifest's URL in the app you build to install the integration in Zendesk Support. For more information, see Channel installer app.
Changes to your manifest are not applied immediately. Zendesk Support polls your manifest, and changes are applied after a poll. For example, if you change the pull_url for your integration, Zendesk Support may continue to connect to the old URL for multiple hours. To avoid outages, when you make changes to your service, you should maintain backwards compatibility for at least a few days. Zendesk Support will follow 301 Moved Permanently redirects for your manifest URL.
The manifest is represented as a JSON object with the following keys.
channelback_files boolean no Does this integration support Channelbacks with file attachments?
URLs are represented as a JSON object with the following keys. All URLs must be SSL. Relative URLs are supported, and will be interpreted as being relative to the URL of the manifest itself.
Not specifying an optional URL disables the feature in the integration.


text:
Mid-Day Memories: Extra Time at Playoff Time
Where we look at some odd facts about overtime in Washington Capitals history.
By ThePeerless@ThePeerless Jun 9, 2020, 12:00pm EDT
Share All sharing options for: Mid-Day Memories: Extra Time at Playoff Time
Photo by Jeanine Leech/Icon Sportswire via Getty Images
With the Washington Capitals having just celebrated the second anniversary of winning their first Stanley Cup, we thought we might look back at a peculiar aspect of playoff hockey and the Caps' experience in it – overtime playoff hockey. For instance, did you know…
The Capitals played their first postseason overtime game in 1984 against the New York Islanders, dropping a 5-4 decision in Game 2 of the Patrick Division final. Starting with that first overtime game in franchise history, no team in the league has played more overtime playoff games since the 1983-1984 season than the Caps (69).
The Caps are 32-37 in those 69 overtime games overall. They have done slightly better in single overtime games 27-27) than they have when the contest goes past a first overtime (5-10), and the Caps have never won a game that went past a second overtime (0-4).
Home or road, it seems to make no difference. The Caps are 14-17 on home ice in overtime playoff games, 18-20 on the road in overtime playoff games.
Twice in franchise playoff history the Caps went to overtime in a scoreless game. On April 12, 2012, the Caps lost a 1-0 decision in overtime in Boston in Game 1 of the Eastern Conference quarter-final. The Caps went on to defeat the Bruins in seven games, winning that series in overtime of Game 7. On May 4, 2013, the Caps beat the New York Rangers, 1-0, in overtime of Game 2 of their Eastern Conference quarter-final series. Mike Green scored the game winner at the eight-minute mark of overtime for the win at Verizon Center. The Rangers went on to win that series in seven games.
At the other end, the Caps scored six goals in regulation time in a postseason game that went to overtime only once. They lost. On April 19, 1991, the Caps lost a 7-6 decision to the Pittsburgh Penguins in Game 2 of the Patrick Division final. The Caps feel behind by two goals three times in that game before taking a 6-5 lead mid-way through the third period. The Pens scored on a Randy Gilhen goal with less than five minutes left to tie it and won it overtime on a Kevin Stevens goal eight minutes into the extra period at Mellon Arena.
Of the ten longest games played in NHL history, two were played in Washington, one of three cities to host two top-ten longest NHL playoff games (Montreal and Dallas are the others). The Caps and Stars are the only clubs on that list to have lost both of their top-ten longest games. The Caps lost to the New York Islanders on April 19, 1987 (the game started on April 18th) in the "Easter Epic," when Pat Lafontaine scored at the 128:47 mark of the game to give the Islanders a 3-2 win in the tenth-longest overtime game in NHL postseason history. The Caps lost a 3-2 decision to the Pittsburgh Penguins in Game 4 of their Eastern Conference quarter-final on April 24, 1996, when Petr Nedved scored on a power play at the 139:15 mark of the game, the fifth longest postseason game in NHL history.
The "Easter Epic" overtime game against the Islanders remains the longest Game 7 in Stanley Cup playoff history.
Seven of the Caps' overtime wins in the playoffs were in series-clinching games:
- 1988: Game 7 of the Patrick Division semi-final. Capitals 5 - Flyers 4 (Dale Hunter).
- 1990: Game 5 of the Patrick Division final. Capitals 2 - at Rangers 1 (John Druce).
- 1998: Game 6 of the Eastern Conference quarter-final. Capitals 3 - at Bruins 2 (Brian Bellows).
- 1998: Game 6 of the Eastern Conference final. Capitals 3 - at Sabres 2 (Joe Juneau).
- 2012: Game 7 of the Eastern Conference quarter-final. Capitals 2 - at Bruins 1 (Joel Ward).
- 2017: Game 6 of the Eastern Conference quarter-final. Capitals 2 - at Maple Leafs 1 (Marcus Johansson).
- 2018: Game 6 of the Eastern Conference semi-final. Capitals 2 - at Penguins 1 (Evgeny Kuznetsov).
Washington has dropped six series-clinching games in overtime:
- 1987: Game 7 of the Patrick Division semi-final. Capitals 2 - Islanders 3 (Pat Lafontaine).
- 2001: Game 6 of the Eastern Conference quarter-final. Capitals 3 - at Penguins 4 (Martin Straka).
- 2003: Game 6 of the Eastern Conference quarter-final. Capitals 1 - Lightning 2 (Martin St. Louis)
- 2015: Game 7 of the Eastern Conference semi-final. Capitals 1 - at Rangers 2 (Derek Stepan).
- 2016: Game 6 of the Eastern Conference semi-final. Capitals 3 - at Penguins 4 (Nick Bonino)
- 2019: Game 7 of the Eastern Conference quarter-final. Capitals 3 - Hurricanes 4 (Brock McGinn).
There are 27 players in Caps postseason history with at least one overtime game-winning goal. Nicklas Backstrom is the leader with four. Alex Ovechkin is not in that group, but Brooks Orpik is, as is Rod Langway. Orpik and Langway combined for four playoff goals in their respective careers with the Caps (two apiece).
There are 35 opponents who account for the 37 overtime goals scored against the Caps in the postseason. Two players have done it twice. Ray Ferraro did it and has the distinction of doing in in consecutive playoff games. He did 4:46 into overtime of Game 3 of the 1993 Patrick Division semi-final in a 4-3 New York Islanders win at Nassau Veterans Memorial Coliseum. Two nights later, Ferraro scored 5:40 into a second overtime in another 4-3 Islanders win on Long Island. It was the third consecutive overtime game of that series, all of them won by the Islanders (two in double-overtime), who won the series in six games.
Vincent Lecavalier also beat the Caps twice in overtime, both times in Washington. He did it 2:29 into overtime of Game 3 of the 2003 Eastern Conference quarter-final, the first of four straight wins for the Tampa Bay Lightning in that series after dropping the first two games. Naturally, the deciding game of that series went to extra time – three overtimes, in fact, a 2-1 Lightning win in Washington. Lecavalier did it to the Caps again in Game 2 of the 2011 Eastern Conference semi-final, 6:19 into overtime of a 3-2 Lightning win. The Lightning swept the Caps in four games.
Three future Capitals scored overtime goals against Washington before arriving in DC. Jaromir Jagr did it 5:49 into overtime of Game 2 of the 2000 Eastern Conference quarter-final series, a 2-1 win for the Pittsburgh Penguins, who won the series in five games. Caps fans might remember that as the series that required a change in scheduling due to conflicts at Mellon Arena. Instead of hosting the first two games at home (the Caps had the best home record in the league), they hosted Game 1 at home and then went to Pittsburgh for Games 2 and 3. That Caps were blown out at home, 7-0, in Game 1, and then they dropped Games 2 (on the Jagr goal) and 3 in Pittsburgh. They lost the series in five games. Jagr would become a Capital in July 2001. We won't go into that.
Mike Knuble scored an overtime goal against the Caps in Game 4 of the 2008 Eastern Conference quarter-final, 6:40 into a 4-3 Philadelphia Flyer win that put the Flyers up, three games to one, in the series. The Caps forced a seventh game in that series but lost Game 7 in, what else…overtime. Knuble joined the Caps in 2009 and played three seasons in Washington before returning to Philadelphia for his last NHL season.
The third "future Capital" to score an overtime goal against the Caps in the postseason never played for the Caps. Current general manager Brian MacLellan scored just 76 seconds into overtime of Game 1 of the 1986 Patrick Division final, a 4-3 new York Rangers win over the Caps at Capital Centre. It was his second goal of the game, the only time in his career he scored two goals in a postseason game.
Braden Holtby has 14 overtime wins as a Capitals goaltender, almost as many as the other eight goalies with overtime wins combined (18). Three of those wins came in series clinching games. The first was in Game 7 of the 2012 Eastern Conference quarter-final, a 2-1 Caps win that ended the Boston Bruins' chance to repeat as Stanley Cup champion. He did it again in Game 6 of the 2017 Eastern Conference quarterfinal against the Toronto Maple Leafs, a 2-1 win in Toronto to clinch the series. It was the fifth game in six in that series that went to overtime, the Caps winning three of them. No one needs reminding about the third one…
Hagelin? How About Hagelout? When every dollar matters, every dollar matters
Capitals Revised Schedule Released The NHL released the revised schedule for the remainder of the regular season on Wednesday
The Noon Number: Deficit Dismissed A look at a big comeback for the good guys


In this twilight zone, the individual is unwilling to consider solutions that could restore his vitality. He's already opted for a lower level of life.
In particular, he's unwilling to explore the one aspect of his capability that works like magic: imagination.
That's out. No dice. Preposterous. Absurd.
After all, imagination is just that spring rain he felt as a child, that unknown space that held all the promise in the world.
Now is sober reflection. Now is routine. Now is habit. Now is empty.
Once upon a time, he read a science fiction novel and, at the end of it, he felt as if he were standing, triumphant, in deep space at the crossroad of a hundred solar systems.
Now he knows there is no such place. Now he is intelligent.
And now he has no energy.
The light that once flared is gone.
The idea that his own imagination could lead him to discoveries beyond anything he knows is fool's gold.
Yes, once when he was twenty, he woke up in the middle of the night and walked to his window and looked out over a city and knew he was on the cusp of an endless future…but what can he do about that now? There is no returning.
So his imagination waits. It idles.
Yet…if he took a chance, if he began to dream again, if he started up the engine, if he considered offloading the interlocking systems that have become his daily life, what might happen?
What layers of dead thought might peel away?
What abiding convictions might dissolve?
What energies might be restored?
Is there a huge space beyond his common neurological impulses and rigid survival habits, where Vision can be played out on a vast scale?
Is there a different kind of life he can enter, crossing the threshold from tired knowledge into mystery?
Can he take a route around the banners and facades of his former reality after opening the door to his imagination?
There is, in fact, a silent channel that winds through the entire time-scale of the human race.
History does not officially record it, because history is written by winners for losers, and this channel has nothing to do with pedestrian notions of victory or defeat.
The route of imagination has no truck with conventional space or time. It invents its own, and eventually introduces them into the world.
How many stories are there about journeying knights who cross the boundary from ordinary events into a realm of magic?
The stories are messages…sent to ourselves, to remember. This place, this day, this moment is a platform from which to embark.


text:
English News সর্বশেষ
Sheikh Hasina is working towards a beautiful Bangladesh: Minister M A Mannan at Jagannathpur
Ansar Ahmed Ullah: Honourable Planning Minister of the Government of the People's Republic of Bangladesh, M. A Mannan MP said, the government of Bangladesh led by Prime Minister Sheikh Hasina is the government of development working towards an educated friendly vibrant Bangladesh. Sheikh Hasina is working for establishing a beautiful Bangladesh for the next generation.
The Minister said that he was encouraged and motivated to work under the leadership of the Prime Minister. He said, I primarily want to work for the people, especially those who are victims of injustice, those without a voice, those who work hard and the labourers. He added he was working for the welfare of the downtrodden poor people under the directive of the Prime Minister Sheikh Hasina.
Planning Minister M A Mannan MP was speaking on Friday 21 June 2015 at the Shaharpara Shah Kamal High School premises in Jagannathpur Upazilla as the chief guest at the Reception & distribution of scholarships by Shaharpara Jubo Shongo, under the chairmanship of Akter Kamali, Vice President of Greater Shaharpara Jubo Shongo, and conducted by General Secretary, writer and journalist, former Principal of Syedpur Model College, Muhammad Shahed Rahman.
The Minister said steps are being taken to construct connecting road for Jagannathpur Upazilla and construction of a new building for Shaharpara Shah Kamal High School, while mentioning that the government will start the work on the railway line in Sunamganj this year.
The Minister congratulated all the members of the programme organisers, including Principal Mohammed Shahed Rahman, Akhtar Kamali, Honourable Vice Chairmen of Greater Shaharpara Jubo Shongo, UK, and said that due to his age, this will be his last endeavour for the next generation ensuring health care in the rural areas and providing education opportunities for all.
Pointing out that the government is successfully implementing big projects like Padma bridge, nuclear power plant & Bangabandhu satellite, he said that a great development is undergoing in the country. We are working to create an educated science-based nation for the next generation. The work of the medical college of Haor, Sunamganj has started. Now the work of implementing a science and technology university is going on.
Former Chairman of Jagannathpur Upazilla Parishad Akmal Hossain, Upazilla Nirbahi Officer Mahfuzul Alam Masum, General Secretary of the Upazilla Awami League Rezaul Karim Rizu, Headmaster of Shaharpara Shah Kamal High School and President of Upazilla Secondary Teachers Association Mohammad Ataur Rahman Kamali spoke on the occasion as special guests. Jubo League General Secretary & former student of Shaharpara Shah Kamal High School, Abul Hossain Lalon made opening remarks.
Vice Chairman of Jagannathpur Upazilla Parishad Bijan Kumar Deb, Officer-in-Charge of Jagannathpur Police Station Md. Ikhtiar Uddin Chowdhury, Vice Chairman Upazilla Awami League Sirajul Haque, Vice President Abdul Qaiyum Moshahid, Forest and Environment Secretary Jalal Hossain Kuddus Kamali, Shaharpara Chairman of Shahkamal High School Management Committee, Modabbir Hossain kamali and Mukit Miah Kamali were present on the occasion. Hafeez Nazmus Shakib recited from the Quran at the beginning of the ceremony.
On the occasion of Shaharpara Jubo Sangha the Planning Minister M A Mannan MP presented students with certificates of merit, scholarship and crests among the high achieving students of class 5, 6, 7, 8, 9, 10 and SSC examinations 2019.
At the event the planning minister was given a Public Reception. On behalf of the organisation, crests, gifts and flowers were gifted to the Minister.
← সিলেট থেকে ঢাকাগামী ট্রেন লাইনচ্যুত,অনেক হতাহত
ঈদের পরে নয়,এবার ঈদের আগেই বিএনপি'র দুর্বার আন্দোলনের ঘোষণা →
উপজেলা নির্বাচনে শুধুমাত্র তৃণমূলের রিপোর্টে সিদ্ধান্ত হবেনা ॥ কাদের
পঞ্চাশ দিন জেল খেটে মুক্তি পেলেন নিপুণ রায় চৌধুরী
অবশেষে মাঠে ফিরলেন সেই আশরাফুল
January 5, 2019 admin 0


text:
Home/World
150,000 Sign Petition to Honour a Hero from the French Siege
"We are brothers. It's not a question of Jews, of Christians or of Muslims. We're all in the same boat, we have to help each other to get out of this crisis." - Lassana Bathily With [...]
150,000 Sign Petition to Honour a Hero from the French Siegezyubej2016-10-20T01:12:07+00:00
How The World United for Charlie Hebdo
"I felt it was important to be there. It was one of those moments where the usually silent majority made it's voice heard. The core principles of freedom of expression, humour, togetherness, stoic resolve to move [...]
How The World United for Charlie Hebdozyubej2016-10-20T01:12:07+00:00


We feel fortunate for the progress we have made and the community around us. We get asked all the time, "How did you build your team and move so fast?" The short answer is the community but let me explain in a little more detail.
When Emil and I (Tommy) made enough progress on our own, we decided to go "public" with our company and our idea. Going "public" of course is meant in the sense of going out into the community, not an IPO 😊. "How did you do that?" you might ask. It's simple – we went out and started networking constantly.
During this networking process (which we are still active in), we discovered lots of amazing people, organizations, and gems of insight which helped us grow.
In Team and Community – Part 2, I will explain and explore this idea in detail!


The Arri 650 Watt Plus Tungsten Fresnel features smooth focusing, and a bright, even beam. The beam angle in the flood position is 52°, and a narrow 14.5° in the spot position. This light is available individually or in portable kits. This fixture is equipped for 120 Volt AC operation. It will also function with 220-240 AC Voltage, with the appropriate bulb and plug adapter, available separately.
Dimensions: 9 x 12 x 7.5"