text:
OMNI_USING_NAMESPACE(omni)

static const CORBA::ULong GIOP_HEADER      = 12;
static const CORBA::ULong ZIOP_HEADER      = 12;
static const CORBA::ULong GIOP_ZIOP_HEADER = GIOP_HEADER + ZIOP_HEADER;

//
// Global policies
static CORBA::Boolean                     g_compression_enabled   = 0;
static Compression::CompressorIdLevelList g_compressor_ids;
static CORBA::ULong                       g_compression_low_value = 1024;
static CORBA::Float                       g_compression_min_ratio = 0.75;

//
// Policies

ZIOP::CompressionEnablingPolicy_ptr
omniZIOP::
create_compression_enabling_policy(CORBA::Boolean compression_enabled)
{
  return new ZIOP::CompressionEnablingPolicy(compression_enabled);
}

ZIOP::CompressionIdLevelListPolicy_ptr
omniZIOP::
create_compression_id_level_list_policy(const Compression::CompressorIdLevelList& compressor_ids)
{
  return new ZIOP::CompressionIdLevelListPolicy(compressor_ids);
}

ZIOP::CompressionLowValuePolicy_ptr
omniZIOP::
create_compression_low_value_policy(CORBA::ULong low_value)
{
  return new ZIOP::CompressionLowValuePolicy(low_value);
}

ZIOP::CompressionMinRatioPolicy_ptr
omniZIOP::
create_compression_min_ratio_policy(Compression::CompressionRatio ratio)
{
  return new ZIOP::CompressionMinRatioPolicy(ratio);
}

static void
decodePolicies(const CORBA::PolicyList&            policies,
               CORBA::Boolean&                     enabled,
               Compression::CompressorIdLevelList& compressor_ids,
               CORBA::ULong&                       low_value,
               CORBA::Float&                       min_ratio)
{
  CORBA::ULong index;

  for (index=0; index != policies.length(); ++index) {
    CORBA::Policy* policy = policies[index];

    switch (policy->policy_type()) {
    case 64: // ZIOP::COMPRESSION_ENABLING_POLICY_ID:
      {
        ZIOP::CompressionEnablingPolicy_var ep =
          ZIOP::CompressionEnablingPolicy::_narrow(policy);

        if (CORBA::is_nil(ep)) {
          omniORB::logs(1, "Invalid Policy object with id "
                        "ZIOP::COMPRESSION_ENABLING_POLICY_ID");
          OMNIORB_THROW(INV_OBJREF, INV_OBJREF_InterfaceMisMatch,
                        CORBA::COMPLETED_NO);
        }

        enabled = ep->compression_enabled();
        break;
      }

    case 65: // ZIOP::COMPRESSOR_ID_LEVEL_LIST_POLICY_ID:
      {
        ZIOP::CompressionIdLevelListPolicy_var ep =
          ZIOP::CompressionIdLevelListPolicy::_narrow(policy);

        if (CORBA::is_nil(ep)) {
          omniORB::logs(1, "Invalid Policy object with id "
                        "ZIOP::COMPRESSION_ENABLING_POLICY_ID");
          OMNIORB_THROW(INV_OBJREF, INV_OBJREF_InterfaceMisMatch,
                        CORBA::COMPLETED_NO);
        }

        Compression::CompressorIdLevelList_var cids = ep->compressor_ids();
        compressor_ids = cids;
        break;
      }

    case 66: // ZIOP::COMPRESSION_LOW_VALUE_POLICY_ID:
      {
        ZIOP::CompressionLowValuePolicy_var ep =
          ZIOP::CompressionLowValuePolicy::_narrow(policy);

        if (CORBA::is_nil(ep)) {
          omniORB::logs(1, "Invalid Policy object with id "
                        "ZIOP::COMPRESSION_LOW_VALUE_POLICY_ID");
          OMNIORB_THROW(INV_OBJREF, INV_OBJREF_InterfaceMisMatch,
                        CORBA::COMPLETED_NO);
        }
        low_value = ep->low_value();
        break;
      }

    case 67: // ZIOP::COMPRESSION_MIN_RATIO_POLICY_ID:
      {
        ZIOP::CompressionMinRatioPolicy_var ep =
          ZIOP::CompressionMinRatioPolicy::_narrow(policy);

        if (CORBA::is_nil(ep)) {
          omniORB::logs(1, "Invalid Policy object with id "
                        "ZIOP::COMPRESSION_MIN_RATIO_POLICY_ID");
          OMNIORB_THROW(INV_OBJREF, INV_OBJREF_InterfaceMisMatch,
                        CORBA::COMPLETED_NO);
        }
        min_ratio = ep->ratio();
        break;
      }
    }
  }
}

static void
setPoliciesInProfile(const CORBA::PolicyList*       policies,
                     IOP::MultipleComponentProfile& components)
{
  CORBA::Boolean enabled   = g_compression_enabled;
  CORBA::ULong   low_value = g_compression_low_value;
  CORBA::Float   min_ratio = g_compression_min_ratio;

  Compression::CompressorIdLevelList compressor_ids(g_compressor_ids);

  if (policies)
    decodePolicies(*policies, enabled, compressor_ids, low_value, min_ratio);

  if (!enabled)
    return;

  Messaging::PolicyValueSeq pvseq(2);
  pvseq.length(2);

  // Enabling policy
  {
    cdrEncapsulationStream estream;
    estream.marshalBoolean(1);

    pvseq[0].ptype = ZIOP::COMPRESSION_ENABLING_POLICY_ID;
    estream.setOctetSeq(pvseq[0].pvalue);
  }

  // ID/level list
  {
    cdrEncapsulationStream estream;
    compressor_ids >>= estream;

    pvseq[1].ptype = ZIOP::COMPRESSOR_ID_LEVEL_LIST_POLICY_ID;
    estream.setOctetSeq(pvseq[1].pvalue);
  }

  // Tagged component
  {
    IOP::TaggedComponent& c = omniIOR::newIIOPtaggedComponent(components);
    c.tag = IOP::TAG_POLICIES;

    cdrEncapsulationStream estream;
    pvseq >>= estream;

    estream.setOctetSeq(c.component_data);
  }
}

CORBA::Object_ptr
omniZIOP::
setServerPolicies(CORBA::Object_ptr obj, const CORBA::PolicyList& policies)
{
  if (CORBA::is_nil(obj))
    return obj;

  if (obj->_NP_is_pseudo())
    OMNIORB_THROW(INV_OBJREF,
                  INV_OBJREF_InvalidPseudoObject,
                  CORBA::COMPLETED_NO);

  // Get the original object reference's IOR
  omniIOR* orig_ior = obj->_PR_getobj()->_getIOR();

  if (omniORB::trace(5)) {
    omniORB::logger log;
    log << "Set server ZIOP policies for object reference type '"
        << orig_ior->repositoryID() << "'.\n";
  }

  // Copy its profiles
  IOP::TaggedProfileList_var profiles(
    new IOP::TaggedProfileList(orig_ior->iopProfiles()));

  CORBA::Long selected = orig_ior->addr_selected_profile_index();

  CORBA::Boolean done = 0;

  if (selected >= 0 && profiles[selected].tag == IOP::TAG_INTERNET_IOP) {
    IIOP::ProfileBody iiop;
    IIOP::unmarshalProfile(profiles[selected], iiop);

    if (iiop.version.major > 1 || iiop.version.minor >= 2) {
      setPoliciesInProfile(&policies, iiop.components);
      IIOP::encodeProfile(iiop, profiles[selected]);
      done = 1;
    }
  }
  if (!done)
    OMNIORB_THROW(INV_OBJREF,
                  INV_OBJREF_UnsuitableGIOPVersion,
                  CORBA::COMPLETED_NO);

  // Finally, we build a new omniIOR with the modified profiles...
  omniIOR* ior = new omniIOR(CORBA::string_dup(orig_ior->repositoryID()),
			     profiles._retn());

  // ...and build a new object reference for it.
  omniObjRef* new_ref = omni::createObjRef(CORBA::Object::_PD_repoId, ior, 0);
  return (CORBA::Object_ptr)new_ref->_ptrToObjRef(CORBA::Object::_PD_repoId);
}

void
omniZIOP::
setGlobalPolicies(const CORBA::PolicyList& policies)
{
  // Set defaults
  g_compression_enabled = 1;

  g_compressor_ids.length(1);
  g_compressor_ids[0].compressor_id     = Compression::COMPRESSORID_ZLIB;
  g_compressor_ids[0].compression_level = 6;

  decodePolicies(policies,
                 g_compression_enabled,
                 g_compressor_ids,
                 g_compression_low_value,
                 g_compression_min_ratio);
}

#undef min

static inline
CORBA::Boolean
min(Compression::CompressionLevel a, Compression::CompressionLevel b)
{
  return a < b ? a : b;
}

static
void
filterCompressors(const Compression::CompressorIdLevelList& theirs,
                  const Compression::CompressorIdLevelList& mine,
                  Compression::CompressorIdLevelList&       combined)
{
  CORBA::ULong tidx, midx, cidx;

  combined.length(theirs.length());
  cidx = 0;

  for (tidx=0; tidx != theirs.length(); ++tidx) {
    Compression::CompressorId cid = theirs[tidx].compressor_id;

    for (midx=0; midx != mine.length(); ++midx) {

      if (mine[midx].compressor_id == cid) {
        combined[cidx].compressor_id     = cid;
        combined[cidx].compression_level = min(theirs[tidx].compression_level,
                                               mine[midx].compression_level);
        ++cidx;
      }
    }
  }
  combined.length(cidx);
}

OMNI_NAMESPACE_BEGIN(omni)

//
// Standard CompressionManager

omniCompressionManager::~omniCompressionManager()
{
}

void
omniCompressionManager::
register_factory(Compression::CompressorFactory_ptr compressor_factory)
{
  omni_tracedmutex_lock l(pd_lock);

  Compression::CompressorId new_id = compressor_factory->compressor_id();

  CORBA::ULong idx;
  for (idx=0; idx != pd_factories.length(); ++idx) {
    if (pd_factories[idx]->compressor_id() == new_id) {
      throw Compression::FactoryAlreadyRegistered();
    }
  }

  pd_factories.length(idx + 1);
  pd_factories[idx] =
    Compression::CompressorFactory::_duplicate(compressor_factory);
}

void
omniCompressionManager::
unregister_factory(Compression::CompressorId compressor_id)
{
  omni_tracedmutex_lock l(pd_lock);

  CORBA::ULong idx;
  for (idx=0; idx != pd_factories.length(); ++idx) {
    if (pd_factories[idx]->compressor_id() == compressor_id) {
      CORBA::ULong last = pd_factories.length() - 1;
      if (idx != last) {
        // Swap last item
        pd_factories[idx] = pd_factories[last];
      }
      pd_factories.length(last);
      return;
    }
  }
  throw Compression::UnknownCompressorId();
}

Compression::CompressorFactory_ptr
omniCompressionManager::
get_factory(Compression::CompressorId compressor_id)
{
  omni_tracedmutex_lock l(pd_lock);

  CORBA::ULong idx;
  for (idx=0; idx != pd_factories.length(); ++idx) {
    if (pd_factories[idx]->compressor_id() == compressor_id) {
      return Compression::CompressorFactory::_duplicate(pd_factories[idx]);
    }
  }
  throw Compression::UnknownCompressorId();
}

Compression::Compressor_ptr
omniCompressionManager::
get_compressor(Compression::CompressorId     compressor_id,
               Compression::CompressionLevel compression_level)
{
  Compression::CompressorFactory_var factory = get_factory(compressor_id);
  return factory->get_compressor(compression_level);
}

Compression::CompressorFactorySeq*
omniCompressionManager::
get_factories()
{
  omni_tracedmutex_lock l(pd_lock);
  return new Compression::CompressorFactorySeq(pd_factories);
}

void
omniCompressionManager::_add_ref()
{
  omni_tracedmutex_lock l(pd_lock);
  ++pd_refcount;
}

void
omniCompressionManager::_remove_ref()
{
  {
    omni_tracedmutex_lock l(pd_lock);
    if (--pd_refcount != 0)
      return;
  }
  delete this;
}

static Compression::CompressionManager_var the_manager;

static CORBA::Object_ptr resolveCompressionManagerFn()
{
  return CORBA::Object::_duplicate(the_manager);
}

//
// Internal giopCompressor implementation

static inline CORBA::ULong byteSwap(CORBA::ULong l) {
  return (((l & 0xff000000) >> 24) |
          ((l & 0x00ff0000) >> 8)  |
          ((l & 0x0000ff00) << 8)  |
          ((l & 0x000000ff) << 24));
}

static inline CORBA::UShort byteSwap(CORBA::UShort s) {
  return (((s & 0xff00) >> 8) |
          ((s & 0x00ff) << 8));
}

giopCompressorImpl::
giopCompressorImpl()
  : pd_min_size(g_compression_enabled ? g_compression_low_value : 0xffffffff),
    pd_ratio(g_compression_min_ratio)
{
}

giopCompressorImpl::
giopCompressorImpl(const Compression::CompressorIdLevelList& compressor_ids)
{
  setPolicies(compressor_ids,
              g_compression_enabled ? g_compression_low_value : 0xffffffff,
              g_compression_min_ratio);
}

giopCompressorImpl::
giopCompressorImpl(const Compression::CompressorIdLevelList& compressor_ids,
                   CORBA::ULong low_value, CORBA::Float min_ratio)
  : pd_min_size(low_value),
    pd_ratio(min_ratio)
{
  setPolicies(compressor_ids, low_value, min_ratio);
}

void
giopCompressorImpl::
setPolicies(const Compression::CompressorIdLevelList& compressor_ids,
            CORBA::ULong low_value, CORBA::Float min_ratio)
{
  pd_compressor_ids = compressor_ids;
  pd_compressors.length(compressor_ids.length());

  for (CORBA::ULong idx=0; idx != compressor_ids.length(); ++idx) {
    const Compression::CompressorIdLevel& cid = compressor_ids[idx];
    try {
      pd_compressors[idx] = the_manager->get_compressor(cid.compressor_id,
                                                        cid.compression_level);
    }
    catch (Compression::UnknownCompressorId&) {
      if (omniORB::trace(1)) {
        omniORB::logger log;
        log << "Unknown compressor id " << cid.compressor_id << "\n";
      }
      OMNIORB_THROW(BAD_PARAM,
                    BAD_PARAM_InvalidCompressionLevel,
                    CORBA::COMPLETED_NO);
    }
  }
  pd_min_size = low_value;
  pd_ratio    = min_ratio;
}

giopCompressorImpl::~giopCompressorImpl() {}

giopStream_Buffer*
giopCompressorImpl::compressBuffer(giopStream*        stream,
                                   giopStream_Buffer* g_buf)
{
  CORBA::ULong  g_buf_len   = g_buf->last - g_buf->start;
  if (g_buf_len < pd_min_size)
    return 0;

  CORBA::ULong  g_data_len  = g_buf_len - GIOP_HEADER;
  CORBA::Octet* g_buf_start = (CORBA::Octet*)g_buf + g_buf->start;
  CORBA::Octet* g_data      = g_buf_start + GIOP_HEADER;

  if (omniORB::trace(25)) {
    omniORB::logger log;
    log << "Compress GIOP message of " << g_buf_len << " bytes\n";
  }
  if (omniORB::trace(30)) {
    giopStream::dumpbuf(g_buf_start, g_buf_len);
  }

  OMNIORB_ASSERT(g_buf_start[0] == 'G' &&
                 g_buf_start[1] == 'I' &&
                 g_buf_start[2] == 'O' &&
                 g_buf_start[3] == 'P');

  // Allocate new buffer
  giopStream_Buffer* z_buf  = giopStream_Buffer::newBuffer(
    g_buf_len + ZIOP_HEADER <= giopStream::bufferSize ?
    giopStream::bufferSize : g_buf_len + ZIOP_HEADER);

  CORBA::ULong  z_buf_len   = z_buf->last - z_buf->start;
  CORBA::ULong  z_data_len  = z_buf_len - GIOP_ZIOP_HEADER;
  CORBA::Octet* z_buf_start = (CORBA::Octet*)z_buf + z_buf->start;
  CORBA::Octet* z_data      = z_buf_start + GIOP_ZIOP_HEADER;

  Compression::Buffer source_seq(g_data_len, g_data_len, g_data);
  Compression::Buffer target_seq(z_data_len, z_data_len, z_data);

  // Compress it
  try {
    pd_compressors[0]->compress(source_seq, target_seq);
  }
  catch (Compression::CompressionException& ex) {
    if (omniORB::trace(10)) {
      omniORB::logger log;
      log << "CompressionException: " << ex.reason << " : " << ex.description
          << "\n";
    }
    giopStream_Buffer::deleteBuffer(z_buf);
    return 0;
  }
  catch (...) {
    omniORB::logs(1, "Unexpected exception from compressor.");
    giopStream_Buffer::deleteBuffer(z_buf);
    return 0;
  }

  if (target_seq.NP_data() != z_data) {
    omniORB::logs(10, "Compressor replaced target buffer, "
                  "so it cannot be used.");
    giopStream_Buffer::deleteBuffer(z_buf);
    return 0;
  }

  z_data_len = target_seq.length();

  if (z_data_len > g_data_len * pd_ratio) {
    if (omniORB::trace(25)) {
      omniORB::logger log;
      log << "Message body of " << g_data_len
          << " bytes compressed insufficiently to " << z_data_len
          << " bytes.\n";
    }
    giopStream_Buffer::deleteBuffer(z_buf);
    return 0;
  }

  // Copy and update GIOP (now ZIOP) header
  memcpy(z_buf_start, g_buf_start, GIOP_HEADER);

  *z_buf_start = 'Z';
  *((CORBA::ULong*) (z_buf_start +  8)) = z_data_len + GIOP_HEADER;
  *((CORBA::UShort*)(z_buf_start + 12)) = pd_compressor_ids[0].compressor_id;
  *((CORBA::ULong*) (z_buf_start + 16)) = g_buf_len - ZIOP_HEADER;
  *((CORBA::ULong*) (z_buf_start + 20)) = z_data_len;

  z_buf->last = z_buf->start + GIOP_ZIOP_HEADER + z_data_len;

  return z_buf;
}

CORBA::ULong
giopCompressorImpl::compressorIndex(giopStream*               stream,
                                    Compression::CompressorId compressor_id)
{
  CORBA::ULong idx;

  // Is there an existing compressor for this id?
  for (idx = 0; idx != pd_compressors.length(); ++idx) {
    if (pd_compressor_ids[idx].compressor_id == compressor_id)
      return idx;
  }

  try {
    Compression::Compressor_ptr compressor;
    compressor = the_manager->get_compressor(compressor_id, 6);

    pd_compressors.length(idx+1);
    pd_compressor_ids.length(idx+1);

    pd_compressors[idx]                  = compressor;
    pd_compressor_ids[idx].compressor_id     = compressor_id;
    pd_compressor_ids[idx].compression_level = 6;
  }
  catch (Compression::UnknownCompressorId&) {
    if (omniORB::trace(10)) {
      omniORB::logger log;
      log << "Unknown compressor id " << compressor_id << "\n";
    }
    OMNIORB_THROW(MARSHAL, MARSHAL_InvalidCompressedData,
                  (CORBA::CompletionStatus)stream->completion());
  }
  return 0;
}

giopStream_Buffer*
giopCompressorImpl::decompressBuffer(giopStream*        stream,
                                     giopStream_Buffer* z_buf)
{
  CORBA::ULong  z_buf_len   = z_buf->last - z_buf->start;
  CORBA::ULong  z_data_len  = z_buf_len - GIOP_ZIOP_HEADER;
  CORBA::Octet* z_buf_start = (CORBA::Octet*)z_buf + z_buf->start;
  CORBA::Octet* z_data      = z_buf_start + GIOP_ZIOP_HEADER;

  OMNIORB_ASSERT(z_buf_start[0] == 'Z' &&
                 z_buf_start[1] == 'I' &&
                 z_buf_start[2] == 'O' &&
                 z_buf_start[3] == 'P');

  CORBA::UShort compressor_id = *((CORBA::UShort*)(z_buf_start + 12));
  CORBA::ULong  g_data_len    = *((CORBA::ULong*) (z_buf_start + 16));

  if ((z_buf_start[6] & 0x1) != _OMNIORB_HOST_BYTE_ORDER_) {
    compressor_id = byteSwap(compressor_id);
    g_data_len    = byteSwap(g_data_len);
  }

  // Allocate new buffer
  giopStream_Buffer* g_buf  = giopStream_Buffer::newBuffer(
    g_data_len + GIOP_HEADER <= giopStream::bufferSize ?
    giopStream::bufferSize : g_data_len + GIOP_HEADER);

  CORBA::ULong  g_buf_len   = g_buf->last - g_buf->start;
  CORBA::Octet* g_buf_start = (CORBA::Octet*)g_buf + g_buf->start;
  CORBA::Octet* g_data      = g_buf_start + GIOP_HEADER;

  Compression::Buffer source_seq(z_data_len, z_data_len, z_data);
  Compression::Buffer target_seq(g_data_len, g_data_len, g_data);

  if (z_buf_len < z_buf->size) {
    // Buffer does not contain the whole message. Resize the sequence
    // and read the rest in.
    source_seq.length(z_buf->size - GIOP_HEADER);
    stream->inputCopyChunk(source_seq.NP_data() + z_data_len,
                           z_buf->size - z_buf_len);
  }

  CORBA::ULong compressor_index = compressorIndex(stream, compressor_id);

  // Decompress it
  try {
    pd_compressors[compressor_index]->decompress(source_seq, target_seq);
  }
  catch (Compression::CompressionException& ex) {
    if (omniORB::trace(1)) {
      omniORB::logger log;
      log << "CompressionException: " << ex.reason << " : " << ex.description
          << "\n";
    }
    giopStream_Buffer::deleteBuffer(g_buf);
    OMNIORB_THROW(MARSHAL, MARSHAL_InvalidCompressedData,
                  (CORBA::CompletionStatus)stream->completion());
  }
  catch (...) {
    omniORB::logs(1, "Unexpected exception from compressor.");
    giopStream_Buffer::deleteBuffer(g_buf);
    OMNIORB_THROW(MARSHAL, MARSHAL_InvalidCompressedData,
                  (CORBA::CompletionStatus)stream->completion());
  }

  if (target_seq.NP_data() != g_data) {
    omniORB::logs(1, "Compressor replaced target buffer, "
                  "so it cannot be used.");
    giopStream_Buffer::deleteBuffer(g_buf);
    OMNIORB_THROW(MARSHAL, MARSHAL_InvalidCompressedData,
                  (CORBA::CompletionStatus)stream->completion());
  }

  if (target_seq.length() != g_data_len) {
    if (omniORB::trace(10)) {
      omniORB::logger log;
      log << "ZIOP message decompressed to " << target_seq.length()
          << " bytes; expecting " << g_data_len << "\n";
    }
    g_data_len = target_seq.length();
  }

  // Copy and update header
  memcpy(g_buf_start, z_buf_start, GIOP_HEADER);

  *g_buf_start = 'G';

  if ((z_buf_start[6] & 0x1) != _OMNIORB_HOST_BYTE_ORDER_)
    *((CORBA::ULong*)(g_buf_start + 8)) = byteSwap(g_data_len);
  else
    *((CORBA::ULong*)(g_buf_start + 8)) = g_data_len;

  g_buf->size = g_data_len + GIOP_HEADER;
  g_buf->last = g_buf->start + g_data_len + GIOP_HEADER;

  if (omniORB::trace(25)) {
    omniORB::logger log;
    log << "Decompressed ZIOP message to " << g_buf->last - g_buf->start
        << " bytes\n";
  }
  if (omniORB::trace(30)) {
    giopStream::dumpbuf((unsigned char*)g_buf + g_buf->start,
                        g_buf->last - g_buf->start);
  }
  return g_buf;
}

//
// Internal giopCompressorFactory implementation

giopCompressorFactoryImpl::~giopCompressorFactoryImpl() {}

giopCompressor*
giopCompressorFactoryImpl::newCompressor()
{
  return new giopCompressorImpl();
}

//
// IOR info

class ZIOPInfo : public omniIOR::IORExtraInfo {
public:
  ZIOPInfo(Messaging::PolicyValueSeq& pvseq)
    : omniIOR::IORExtraInfo(IOP::TAG_POLICIES)
  {
    for (CORBA::ULong idx=0; idx != pvseq.length(); ++idx) {
      Messaging::PolicyValue& pv = pvseq[idx];

      switch (pv.ptype) {
      case ZIOP::COMPRESSOR_ID_LEVEL_LIST_POLICY_ID:
        {
          cdrEncapsulationStream pstream(pv.pvalue, 1);

          Compression::CompressorIdLevelList cids;
          cids <<= pstream;

          filterCompressors(cids, g_compressor_ids, compressor_ids);
        }
        break;
      }
    }
  }

  virtual ~ZIOPInfo() {}

  Compression::CompressorIdLevelList compressor_ids;

private:
  ZIOPInfo(const ZIOPInfo&);
  ZIOPInfo& operator=(const ZIOPInfo&);
  // Not implemented
};

static CORBA::Boolean
decodeIORInterceptor(omniInterceptors::decodeIOR_T::info_T& iinfo)
{
  const IIOP::ProfileBody& iiop = iinfo.iiop;
  omniIOR&                 ior  = iinfo.ior;

  const IOP::MultipleComponentProfile& components = iiop.components;

  CORBA::ULong index;

  try {
    for (index=0; index < components.length(); ++index) {
      if (components[index].tag == IOP::TAG_POLICIES) {
	omniORB::logs(30, "Found a Messaging Policies IOR component.");

	const IOP::TaggedComponent& c = components[index];
	cdrEncapsulationStream stream(c.component_data, 1);

        Messaging::PolicyValueSeq pvseq;
        pvseq <<= stream;

        CORBA::Boolean enable_ziop = 0;

        // Is there a ZIOP enabling policy?
        for (CORBA::ULong pvidx = 0; pvidx != pvseq.length(); ++pvidx) {
          if (pvseq[pvidx].ptype == ZIOP::COMPRESSION_ENABLING_POLICY_ID) {

            cdrEncapsulationStream pstream(pvseq[pvidx].pvalue, 1);
            enable_ziop = pstream.unmarshalBoolean();
            break;
          }
        }
        if (!enable_ziop) {
          omniORB::logs(30, "Messaging Policies IOR component does not "
                        "enable ZIOP.");
          return 1;
        }

        ZIOPInfo* zinfo = new ZIOPInfo(pvseq);

        if (zinfo->compressor_ids.length()) {
          // Add the information to the omniIOR's extra info list.
          omniIOR::IORInfo* info = ior.getIORInfo();

          info->flags(info->flags() | GIOPSTRAND_COMPRESSION);

          omniIOR::IORExtraInfoList& infolist = info->extraInfo();
          CORBA::ULong i = infolist.length();
          infolist.length(i+1);
          infolist[i] = (omniIOR::IORExtraInfo*)zinfo;
        }
        else {
          delete zinfo;
          omniORB::logs(25, "No matching compressors found in "
                        "Messaging Policies IOR component.");
        }
        return 1;
      }
    }
  }
  catch (CORBA::SystemException&) {
    omniORB::logs(10, "Invalid Messaging Policies IOR component encountered.");
  }
  return 1;
}

static CORBA::Boolean
encodeIORInterceptor(omniInterceptors::encodeIOR_T::info_T& iinfo)
{
  const GIOP::Version&           version    = iinfo.iiop.version;
  IOP::MultipleComponentProfile& components = iinfo.iiop.components;
  const CORBA::PolicyList*       policies   = iinfo.hints.policies;

  // Only run if version is 1.2+
  if (!(version.major > 1 || version.minor >= 2))
    return 1;

  setPoliciesInProfile(policies, components);

  return 1;
}

static
CORBA::Boolean
clientSendRequestInterceptor(omniInterceptors::
                             clientSendRequest_T::info_T& iinfo)
{
  GIOP_C&     giop_c = iinfo.giop_c;
  giopStrand& strand = giop_c.strand();

  if (!(strand.first_call && strand.flags & GIOPSTRAND_COMPRESSION)) {
    // Only consider strands on the first call and if the compression
    // flag is set.
    return 1;
  }

  omniORB::logs(25, "Send ZIOP enabling service context");

  OMNIORB_ASSERT(!strand.compressor);

  CORBA::ULong idx;

  // Send service context and create compressor
  Messaging::PolicyValueSeq pvseq(2);

  {
    // Enabling policy
    cdrEncapsulationStream pvstream;
    pvstream.marshalBoolean(1);

    pvseq.length(1);
    pvseq[0].ptype = ZIOP::COMPRESSION_ENABLING_POLICY_ID;
    pvstream.setOctetSeq(pvseq[0].pvalue);
  }

  {
    // Compressor ids
    const omniIOR::IORInfo*          info     = giop_c.ior()->getIORInfo();
    const omniIOR::IORExtraInfoList& infolist = info->extraInfo();

    for (idx = 0; idx != infolist.length(); ++idx) {
      if (infolist[idx]->compid == IOP::TAG_POLICIES) {
        const ZIOPInfo* zinfo = (const ZIOPInfo*)infolist[idx];

        cdrEncapsulationStream pvstream;
        zinfo->compressor_ids >>= pvstream;

        pvseq.length(2);
        pvseq[1].ptype = ZIOP::COMPRESSOR_ID_LEVEL_LIST_POLICY_ID;
        pvstream.setOctetSeq(pvseq[1].pvalue);

        strand.compressor = new giopCompressorImpl(zinfo->compressor_ids);
        break;
      }
    }
  }

  OMNIORB_ASSERT(pvseq.length() == 2);

  cdrEncapsulationStream scstream;
  pvseq >>= scstream;

  idx = iinfo.service_contexts.length();
  iinfo.service_contexts.length(idx+1);
  iinfo.service_contexts[idx].context_id = IOP::INVOCATION_POLICIES;
  scstream.setOctetSeq(iinfo.service_contexts[idx].context_data);

  return 1;
}

static
CORBA::Boolean
serverReceiveRequestInterceptor(omniInterceptors::
                                serverReceiveRequest_T::info_T& iinfo)
{
  GIOP_S&     giop_s = iinfo.giop_s;
  giopStrand& strand = giop_s.strand();

  if (strand.flags & GIOPSTRAND_COMPRESSION) {
    // Already set up for compression
    return 1;
  }

  IOP::ServiceContextList& svc_ctxts = giop_s.service_contexts();

  CORBA::ULong total = svc_ctxts.length();

  for (CORBA::ULong idx = 0; idx != total; ++idx) {

    if (svc_ctxts[idx].context_id == IOP::INVOCATION_POLICIES) {
      omniORB::logs(30, "Unmarshal invocation policies service context.");

      cdrEncapsulationStream pvstream(svc_ctxts[idx].context_data, 1);

      Messaging::PolicyValueSeq pvseq;
      pvseq <<= pvstream;

      CORBA::Boolean                     enable_ziop = 0;
      Compression::CompressorIdLevelList compressor_ids;

      // Is there a ZIOP enabling policy?
      for (CORBA::ULong pvidx = 0; pvidx != pvseq.length(); ++pvidx) {
        Messaging::PolicyValue& pv = pvseq[pvidx];

        switch (pv.ptype) {
        case ZIOP::COMPRESSION_ENABLING_POLICY_ID:
          {
            cdrEncapsulationStream pstream(pv.pvalue, 1);
            enable_ziop = pstream.unmarshalBoolean();
            break;
          }
        case ZIOP::COMPRESSOR_ID_LEVEL_LIST_POLICY_ID:
          {
            cdrEncapsulationStream pstream(pv.pvalue, 1);
            compressor_ids <<= pstream;
            break;
          }
        }
      }
      if (!enable_ziop) {
        omniORB::logs(30, "Invocations Policies service context does not "
                      "enable ZIOP.");
        continue;
      }

      // Check serverTransportRule to see if we should allow ziop from
      // this client.
      {
	CORBA::StringSeq actions;
	CORBA::ULong     matched_rule;
	CORBA::Boolean   accept_ziop;
	CORBA::Boolean   dump_rule = 0;
	const char*      why;

        transportRules&  rules = transportRules::serverRules();

	if ((accept_ziop = rules.match(strand.connection->peeraddress(),
                                       actions, matched_rule))) {
	  CORBA::ULong i;
	  for (i = 0; i != actions.length(); ++i) {
	    if (strcmp(actions[i], "ziop") == 0) {
	      break;
	    }
	  }
	  if (i == actions.length()) {
	    accept_ziop = 0;
	    dump_rule   = 1;
	    why = (const char*)"\"ziop\" is not found in the matched rule: ";
	  }
	}
	else {
	  why = (const char*)"no matching rule is found";
	}

	if (!accept_ziop) {
	  if (omniORB::trace(5)) {
	    omniORB::logger log;
	    log << "Request from " << strand.connection->peeraddress()
		<< " to enable ZIOP is rejected because "
		<< why;

	    if (dump_rule) {
	      CORBA::String_var rule;
	      rule = rules.dumpRule(matched_rule);
	      log << "\"" << (const char*)rule << "\"";
	    }
	    log << "\n";
	  }
	  continue;
	}

        // Filter compressor_ids according to our policies.

        Compression::CompressorIdLevelList my_ids(g_compressor_ids);
        CORBA::ULong low_value = g_compression_low_value;
        CORBA::Float min_ratio = g_compression_min_ratio;

        omniOrbPOA* poa =
          omniOrbPOA::_downcast(omniObjAdapter::getAdapter(giop_s.key(),
                                                           giop_s.keysize()));

        if (poa) {
          CORBA::Boolean enabled;
          decodePolicies(*poa->policy_list(), enabled, my_ids,
                         low_value, min_ratio);
        }

        Compression::CompressorIdLevelList selected_ids;
        filterCompressors(compressor_ids, my_ids, selected_ids);

        if (!selected_ids.length()) {
	  if (omniORB::trace(5)) {
	    omniORB::logger log;
	    log << "Request from " << strand.connection->peeraddress()
		<< " to enable ZIOP is rejected because there are no"
                << " matching compressors.\n";
	  }
	  continue;
	}

	if (omniORB::trace(5)) {
	  CORBA::String_var rule;
	  rule = transportRules::serverRules().dumpRule(matched_rule);

	  omniORB::logger log;
	  log << "Accepted request from "
	      << strand.connection->peeraddress()
	      << " to enable ZIOP because of this rule: \""
	      << (const char*)rule << "\"\n";
	}

        // Set the strand's compressor
        if (strand.compressor) {
          giopCompressorImpl* compressor =
            (giopCompressorImpl*)strand.compressor;

          compressor->setPolicies(selected_ids, low_value, min_ratio);
        }
        else {
          strand.compressor = new giopCompressorImpl(selected_ids, low_value,
                                                     min_ratio);
        }

        strand.flags |= GIOPSTRAND_COMPRESSION;

        return 1;
      }
    }
  }
  return 1;
}

//
// Module initialiser

class omniZIOP_initialiser : public omniInitialiser {
public:
  inline omniZIOP_initialiser() {
    omniInitialiser::install(this);

    omniInitialReferences::registerPseudoObjFn("CompressionManager",
					       resolveCompressionManagerFn);
  }
  void attach() {
    the_manager = new omniCompressionManager();

    Compression::CompressorFactory_var zf = new zlibCompressorFactory();
    the_manager->register_factory(zf);

    giopStream::compressorFactory = new giopCompressorFactoryImpl();

    // Register interceptors
    omniInterceptors* interceptors = omniORB::getInterceptors();

    interceptors->decodeIOR           .add(decodeIORInterceptor);
    interceptors->encodeIOR           .add(encodeIORInterceptor);
    interceptors->clientSendRequest   .add(clientSendRequestInterceptor);
    interceptors->serverReceiveRequest.add(serverReceiveRequestInterceptor);

    omniORB::logs(2, "omniZIOP activated.");
  }

  void detach() {
    omniORB::logs(2, "Deactivate omniZIOP.");
    delete giopStream::compressorFactory;
    giopStream::compressorFactory = 0;

    omniInterceptors* interceptors = omniORB::getInterceptors();

    interceptors->decodeIOR           .remove(decodeIORInterceptor);
    interceptors->encodeIOR           .remove(encodeIORInterceptor);
    interceptors->clientSendRequest   .remove(clientSendRequestInterceptor);
    interceptors->serverReceiveRequest.remove(serverReceiveRequestInterceptor);

    the_manager = 0;
    omniORB::logs(2, "omniZIOP deactivated.");
  }
};

static omniZIOP_initialiser the_omniZIOP_initialiser;

OMNI_NAMESPACE_END(omni)


text:
Command & Conquer (Series)
In the year 2062, humanity found itself on the brink of extinction. Tiberium, the mysterious, alien crystalline structure that infested Earth for decades and caused years of relentless conflict between the...
Платно Windows
Альтернативы приложению Command & Conquer (Series)
— Windows • 19 — macOS • 10 — Linux • 5
— Бесплатно • 2 — Условно-бесплатно • 1 — Открытое ПO • 4 — Платно • 13
Starcraft II 17 альтернатив
War Craft
StarCraft II: Wings of Liberty is a science fiction strategy game where you play in the distant future as Jim Raynor, a marshal-turned-rebel on a vigilante crusade to bring down …
Starcraft 19 альтернатив
Wing Of Liberty
Starcraft is a strategy game by Blizzard Entertainment. Based in the distant future, you must gather resources and expand your forces to lead them to victory. The newly formed Terran …
Age of Empires (series) 26 альтернатив
Historical Game
Age of Empires is an epic real-time strategy game spanning 10,000 years, in which players are the guiding spirit in the evolution of small stone age tribes. Starting with minimal …
Warcraft III 15 альтернатив
Set a generation before the events of the original Warcraft began, Warcraft II is a real-time strategy game by Blizzard Entertainment. Cunning, sinister, and seemingly unstoppable, the demonic Burning Legion...
Warzone 2100 13 альтернатив
War Game
Warzone 2100 is a real-time strategy game, originally developed by Pumpkin Studios and published by Eidos Interactive, now developed by the Warzone 2100 Project. Compared to other real-time strategy games, …
Age of Empires Online 25 альтернатив
Age of Empires Online is the next chapter in the best-selling Age of Empires PC game franchise.The game features two of the greatest ancient civilizations–the Greeks and Egyptians–and offers more …
Age of Mythology 23 альтернативы
Age of Mythology is based on building towns, gathering resources, creating armies, and ultimately destroying enemy units and buildings. In this way, players are able to defeat and conquer rival …
Zero-K 17 альтернатив
Do you want epic battles? Do you want breathtakingly gigantic scenes of glorious destruction and heart-pounding action? The graphics on this game are amazing, especially given the infinite scalability....
Stronghold Crusader 21 альтернатива
Stronghold Crusader is a RTS game from the series from Stronghold. In Stronghold Crusader the player can play as either the legendary Richard the Lionheart or the formidable Saladin. A …
ANNO 2070 16 альтернатив
The Deluxe Edition includes two in-game items, Breona Ibori and Sonic modulator, two game soundtracks, a 152-page art book, and the Tree of Technology poster. In-Game Items: Breona Ibori - …
A unique and award-winning combination of construction, economy, discovery, diplomacy, and combat. Create your own nation with a unique blend of simulation and real-time strategy as you journey across the...
Globulation 2 19 альтернатив
Globulation 2 is an innovative Real-Time Strategy (RTS) game which reduces micro-management by automatically assigning tasks to units. Globulation 2 is Free Software, licensed and distributed under the GNU...
Caesar 3 17 альтернатив
City Creation
As a provincial governor charged with spreading the glory of Rome your mission is clear – build cities, foster trade and industry, make money. How you accomplish this is up …
Supreme Commander (Series) 7 альтернатив
This is a real-time RTS, on steroids. All the normal limiting factors on RTS games, like un-replenishable resources, unit limits, size and range limits have all been stripped away, leaving …
OpenRA 20 альтернатив
OpenRA is an open-source reimplementation of Westwood's Command & Conquer: Red Alert game engine, updated to use the hardware acceleration of modern video cards using OpenGL.
Empire Earth (Series) 25 альтернатив
Empire Earth, also known as EE, is a real-time strategy video game developed by Stainless Steel Studios and released on November 23, 2001. It is the first game in the …
Знаете другую альтернативу Command & Conquer (Series)?
LandGrabbers 23 альтернативы
Feel the thrill of a captivating combination of strategy, simulation and time management game LandGrabbers - named Casual Game of the Year at the 2011 Russian Game Developers Conference (KRI …
Warhammer 40000: Dawn of War (series) 19 альтернатив
The games are set in the Warhammer 40,000 universe, a dystopian vision of the future. Humanity has forged a galaxy-spanning empire, The Imperium, with the Immortal Emperor as humanity's leader …
Priority: Survive 10 альтернатив
Priority: Survive is a real-time strategic game. The story is placed into the future to a distant planet. The game features: 3 unique groups (army, pirates, aliens), 24 units, 15 …
Frozen Hearth 14 альтернатив
In Frozen Hearth, you will guide the fate of an entire people, known as the Danaan, as they face the greatest threat of all – extinction – as their homelands …
Этот список содержит 20 альтернатив приложению Command & Conquer (Series), для таких платформ как: Windows, macOS, Linux, Java, iPad, Android Tablet и многих других. Список альтернатив можно фильтровать по типу лицензии, платформе и тегам. Поддерживается сортировка по количеству пользователей которые уже используют альтернативу, или дате добавления приложения.
— Стратегия В Реальном Времени • 16
— Игры Стратегии • 7
— Игры • 6
— Стратегии • 6
— Исторические Игры • 4
— Один Игрок • 3
— Войны Игры • 3
— Цивилизации • 3
— Мультиплеер • 3
— Город, Здание • 2
— Анно 1503 • 1
— Крыло Свободы • 1
— Боги • 1
— Варкрафт • 1
— Макс Дизайн • 1
— Бесплатно Играть • 1
— Подсолнухи • 1
— Анно • 1
— Война Ремесло • 1
— Научная Фантастика • 1
— Пространство • 1
— Создание Города • 1
— РПГ • 1
— Симулятор • 1
— Робот • 1
— Ирк • 1
— Связанные Проекты • 1
— Фирмой • 1
— Поселенцы • 1
— Старкрафт Второй • 1
добавил приложение Command & Conquer (Series)

redpajama_set_name: RedPajamaCommonCrawl


Dude from Richmond & He got $65M for signing his contract🤷🏾♂ #greatness #champ #reallife #balancedlife God Family Career Fun WHATS WRONG WITH IT??????
Marvelous Monday everyone!! Hope the day shines bright for you!


text:
"The Child Remains" is a Chilling Supernatural Thriller
Check in if you dare. You'll sleep like a baby
by LAZombieGirl June 5, 2019
The Child Remains is a haunting, twisted supernatural tale about evil personified. The suspenseful thriller written and directed by Michael Melski, is loosely based on the horrific real-life tale of the "Butterbox Babies" in Canada. Spanning almost 20 years from the 1920s to the 1940s, Lila and William Young ran a maternity home that resulted in the illegal adoption of many children and caused the death of hundreds of infants not deemed perfect or marketable. The babies were then buried in small wooden boxes that usually contained dairy products, the "butterbox".
The Child Remains brings to life the unthinkable horrors of that house, adds to the story and keeps us on the edge of our seats.
Off to vacation in a quiet and secluded Bed and Breakfast, news reporter Rae (Suzanne Clément) and unemployed musician hubby Liam (Allan Hawco) want nothing more than some rest and relaxation. But forces beyond their control have brought them to the Mersey Inn and this will not be the vacation of their dreams – more likely, it will be the making of a nightmare!
Rae is suffering from PTSD and is on leave from her job because of a mental breakdown. She is immediately affected deeply by the house. Visions of a ghostly woman, a door smeared in blood and horrible smells make her sick. Her husband, who is a bit of a jerk, dismisses everything. They are there for her birthday, she is not to be doing any investigating, and can't they just relax and have fun? Oh wait, there is one more complication: did I mention that Rae is pregnant?
The innkeeper Monica (Shelley Thompson) is a strange lady, with poor boundaries, a fake cheery attitude and a very keen eye for the fact that Rae is pregnant. She informs them that they are the only guests, which should have tipped them off right there. As they go upstairs to their room there are baby portraits on the wall, which are never mentioned, but I recognized them as being port-mortem photos that were very popular in Victorian times. Dead baby photos? Run! At dinner, Monica does share about her mother Rose, who ran the house for many years as a place for young girls to have their illegitimate babies. She admits that many of them died and that her mother was an herbalist and chemist who created her own elixirs. Probably very helpful when you are stealing babies. It was easy to understand they need to get out of this place now! But of course, they don't.
Rae is a reporter, and those instincts drive her to try to piece together the secrets in the house and figure out what her nightmare hallucinations mean. And wow what secrets she finds. The creepy groundskeeper Talbot, (Played by an amazing actor you may remember from some '80s horror, Geza Kovak) warns her to leave and stay out of the woods, which of course makes her want to go in worse. Inside the forest, she finds a graveyard full of homemade headstones and dolls sitting on all the graves. At the local library, she is greeted by disdain when she starts asking about the horrible things the former owner of the house was accused of, and the police want nothing to do with it if there is no eyewitness.
Liam, in the meantime, sets up his keyboard and recording stuff in a room upstairs full of creepy dolls, a chair that rocks by itself and an ominous antique ghost box, that comes to life when he plays music. A ghostly entity named Simon wants to play Simon Says and we learn that Liam had been to this home before when he brought a girlfriend there to play. So, right there Liam becomes the first one I want to see get killed. What a jerk to bring his wife to the same place. Yes, to be fair, they are being manipulated by forces beyond the grave, but still…
As the story unfolds, we find out there is still a horrible thing living in the very soul of the house and it seems like Monica may want to step into her mother's shoes; she is quite the chemist herself. When the big secrets are revealed, the film takes off with a lot of help from the supernatural forces in the house.
Rae herself is the one who is in danger. Having been saved as a baby by a kindly soul, she starts understanding what the ghosts are trying to tell her and that it is no coincidence that she is at that house. The horrors that have laid dormant there for so long are finally unearthed. At that point, the audience and Rae herself are totally caught off guard. Horrible and gruesome things have happened in this place, so it was not hard to root for the mother and her baby to survive!
Beautifully moody cinematography, well-done SPX and talented actors paired with a great story, made this a movie I really enjoyed. This is not a gory film, but it's full of suspense, unspeakable violence and the darkest of evils.
What seems like a simple story at first, The Child Remains becomes more complex and compelling the longer you watch it. I wasn't sure at first, but I got sucked in about halfway through. A long film, at over 2 hours, it might be a lot for some people. With homage to films like Rosemary's Baby, Psycho, and The Conjuring, the film gives you much to think about and surprises you at the end. The beginning is a slow burn, but when the film picks up, it really starts moving, all the way to the twisted cliff-hanger finale. Will there be a sequel?
The Child Remains will be available at selected theaters and on digital June 7th, 2019. For more information, you can check out the website here.


Designed to envelope three burner flatbed barbecues, this durable UV proof and hard-wearing cover will protect your equipment during the bad weather of the British summer.
Boasting the Outback logo, this barbecue cover is an accessory not to miss. The double seamed stitches helps keep the BBQ protected from the rain whilst the velcro straps keeps the cover in place on the BBQ during windy weather. This cover will keep your BBQ free from dirt, grime and also help prevent germs and infections from getting onto the grill.
Designed to fit SOME 3 burner flatbed models and more specifically the Outback Classic 3 Burner Flatbed, Spectrum 3 Burner Flatbed and JLF3B barbecues. Please double check the dimensions of the cover against your BBQ before ordering to ensure the correct cover is to be ordered.
Dimensions 142cm x 62cm x 77cm.


Hi everyone. I'm Elana, originally from The Ukraine and I teach Polish and Russian to anyone who wants to learn. I've been teaching adults for about four years here, but I was a teacher of children in middle school in The Ukraine, ages 9 to 11. I am a very patient teacher and I know that Eastern Bloc languages are very difficult to learn, but I really believe that with hard work and a positive attitude, anyone can become a perfect speaker. Spaseeba (Thank you in Russian) for reading about me and I hope to see you in my classes. Do widzenia (Polish for goodbye).
Nee how students. I am teacher Li Min Lao from the Beijing Province in China. I came to this country to help people learn about the culture of my country, and the beautiful and musical language that I speak. I hold a degree in Chinese cultural studies and am currently working towards getting my Masters degree. I hope to teach everyone about all of the history of China, and we can even learn about Chinese food together. I hope you will join my class, from the youngest student to the oldest, and we can all become lovers of China together.
Zdravo, kako ste vi danas? Welcome to my teacher profile. My name is Adrijana – pronounced: ahd-ree-ah-nah – from beautiful Croatia. I only came to this country recently but I have already met many students who want to learn to speak in Serbo-Croat. I was a teacher of geography in my country, and I love to explain how beautiful Croatia is, and the deep and rich history is has built over many thousands of years. I hope you will join to my class, even if you already speak the language, because I have many things to teach you that you maybe don't already know. Good to you in your studies and I hope vidimo se uskoro, which means, I will see you soon.


text:
Indian union calls for wider discussion on media ownership recommendations
The International Federation of Journalists (IFJ) joins its affiliate the Indian Union of Journalists (IJU) in calling on the government to hold wide-ranging discussions with all media stakeholders and civil society leaders on the amendments to the Press Council of India (PCI) Act and other recommendations put forward by the Telecom Regulatory Authority of India (TRAI).
The recommendations were put forward in the report, "Issues Related to Media Ownership", released on August 12 which aims to dealing with the issue of corporates entering the media arena. While the IFJ and IJU welcome the move to amend the PCI Act to bring journalists working in electronic media under the Act, there are other recommendations also proposed that IJU says would negatively impact the operations of the media.
SN Sinha, the IJU President, and D Amar, the Secretary General, said: "We have been demanding the government to amend the PCI Act to bring the electronic media in to its ambit and the Working Journalists (Other Newspaper Employees Regulation of Service) Act to bring the journalists working in the electronic media within the definition of working journalist."
"However, the recommendation on appointment of predominantly eminent non-media person goes against the self-regulation of the media. The PCI which consists of numerous media and non-media workers is the best mechanism in the present circumstances."
On the directive of the Information & Broadcasting Ministry, TRAI developed the series of recommendations to amend the PCI Act and suggested the formation of the single regulatory authority for all media stating that 'government should not control the media'. It however stated that the 'regulatory body should be manned predominantly by eminent non-media persons'.
The PCI is an independent regulator of the press in India, prescribing norms of journalistic conduct and other guidelines. The recommendations put forward by TRAI also aim to curb unhealthy media practices, including reducing non-media company ownership to 20%, assist with maintaining democracy and minimising the opportunity for 'paid news' stories.
India has more than 850 television channels catering to the country's population of more than 1.2 billion population. Close to half of the channels are news and current affairs channels.
The IFJ Acting Director, Jane Worthington, said: "While the recommendation of the inclusion of the electronic media into the Press Council of India Act is clearly a long-awaited development, this progress should not be overshadowed by a draconian move to oust working journalists, editors and managers as the primary position holders on any future press council. The standard around the globe is that press councils must comprise primarily of the industry they represent. India should be no exception if the press council is to fulfil its duties to the wider public."
The IFJ calls on TRAI to take heed of the recommendations of India's media in this matter and hold wider discussions on the issue.
For further information contact IFJ Asia-Pacific on +61 2 9333 0950
The IFJ represents more than 600,000 journalists in 131 countries
Find the IFJ on Twitter: @ifjasiapacific
Find the IFJ on Facebook: www.facebook.com/IFJAsiaPacific
IFJ Safety


Home / news / Underway in Antigua!
Racing at the 9th edition of the Superyacht Challenge Antigua is underway with the fleet enjoying spectacular conditions off the south coast of Antigua. Race One was approximately 23 nautical miles with seven legs providing a full range of wind angles in solid trade winds. In the Corsairs Class, Nilaya won the first race by just 64 seconds after ORCsy time correction after a great battle with Rebecca. The 112ft (34m) German Frers designed sloop Spiip was third. In the Buccaneers Class, Kawil made the best start of the day and went on to win from Catalina. John McMonigall's Oyster 82 Zig Zag was third.
Nilaya and Rebecca both made strategically good moves during the race, especially in Rendezvous Bay, Rebecca made one good call to stay offshore early in the race, with Nilaya making the right call inshore on the second beat in the same area.
A Pre-regatta Briefing was held at the Admiral's Inn, Nelson's Dockyard, Antigua. Principal Race Officer John Coveney opened proceedings by welcoming the sailors, announcing the schedule for racing, and answering questions . International Judge Gordon Stredwick, emphasised that safety was the primary concern of everyone involved with the regatta.


Slap has a contest going on right now in their forum to make the best photoshop picture of Justin Bieber. It was inspired from the video he had of him doing a switch 180 over Rob Dyrdek, Greg Lutzka, and Terry Kennedy. I photoshopped Bieber's face on Ryan Sheckler's Got Milk? ad and added some of his favorite things in the caption.
Rockstock is an annual party that goes down up in Northern Maine that Lowcard always sponsors.
BEST TRICK CONTEST AT WINDHAM SKATEPARK IN WINDHAM MAINE TOMORROW (THURSDAY JULY 22nd) @ 6:00 BOARDROOMS' GIVING OUT PRIZES!
Here's a skate documentary that show's the 3 big aspects of skateboarding. The photographer, the videographer, and of course the skater. This documentary was filmed by the same crews that help out with the Thanks Camera videos and Shape videos.
Skateboarding Documentary: Pt. 1 of 3 from beastman on Vimeo.
Skateboarding Documentary: Pt. 2 of 3 from beastman on Vimeo.
Mixed Effect from JayBrown on Vimeo.
Go over to the Dirty Shire site and check out how they posted our Name Drop for Thomas Dupere from Breaking Ground skate parks. It's sick how our neighbors are looking out for us so we do the same!


text:
All notable changes to this project will be documented in this file.

## [Unreleased]
### Added
- Initial release.

redpajama_set_name: RedPajamaGithub


text:
Kingsjester's Blog
Opinions from a Christian American Conservative
« Republicans Introduce Resolution to Force Pelosi to Hand Over the Articles of Impeachment or Face Dismissal of Them
Pelosi Announces House War Powers Resolution Vote Thursday to Attempt to Limit Trump's Military Action Against Iran »
Iran Fires 15 Ballistic Missiles at U.S. Forces at 2 Bases in Iraq, No Casualties…Incompetence or Strategy?
What's different now is we have a president, we have a leader who has the gonads to use both of these — the economy and the military — to protect this country from little maggots around the world like this General Soleimani and ISIS and all the rest of them, 'cause that's what they were. They're not even in our league. It is only our restraint and our acknowledgment of our status as the world's lone superpower and our morality — the fact that we are the good guys — that stops us from literally wiping the world out of these people.
But if you hit us, we now have a leader who is going to make you pay the price for it, and this is frightening and scary to children on the left, frightening and scary to adults who are children on the left. They have no comprehension of deterrence, no comprehension of strength. – Rush Limbaugh, 1/7/2020
FoxNews.com reports that
Iran fired as many as 15 ballistic missiles into Iraq, targeting U.S. military and coalition forces early Wednesday, officials said, in a major retaliation by the rogue regime after the U.S. airstrike that killed Iranian Quds Force Gen. Qassem Soleimani last week.
Ten missiles hit Al-Assad Air Base, one missile hit a military base in Erbil and four missiles failed to hit their targets, according to a U.S. military spokesman for Central Command, responsible for American forces in the Middle East. The attacks unfolded in two waves, each about an hour apart.
Initial assessments showed "no U.S. casualties," a U.S. military official in Baghdad told Fox News.
President Trump tweeted a response late Tuesday evening: "All is well! Missiles launched from Iran at two military bases located in Iraq. Assessment of casualties & damages taking place now. So far, so good! We have the most powerful and well equipped military anywhere in the world, by far! I will be making a statement tomorrow morning."
The White House previously said he would not make an address to the nation Tuesday.
White House press secretary Stephanie Grisham said right after the attack: "We are aware of the reports of attacks on U.S. facilities in Iraq. The president has been briefed and is monitoring the situation closely and consulting with his national security team." It was not immediately clear how the U.S. may respond.
The Pentagon added: "In recent days and in response to Iranian threats and actions, the Department of Defense has taken all appropriate measures to safeguard our personnel and partners. These bases have been on high alert due to indications that the Iranian regime planned to attack our forces and interests in the region. As we evaluate the situation and our response, we will take all necessary measures to protect and defend U.S. personnel, partners, and allies in the region."
Meantime, Iran state TV claimed Tehran launched "tens" of surface-to-surface missiles at the Al Assad Air Base. State TV described it as Tehran's revenge operation over the killing of Soleimani.
Iran's Revolutionary Guard then warned the U.S. and its regional allies against retaliating over the missile attack in Iraq.
The Guard issued the warning via a statement carried by Iran's state-run IRNA news agency: "We are warning all American allies, who gave their bases to its terrorist army, that any territory that is the starting point of aggressive acts against Iran will be targeted." The Guard in the warning also threatened Israel.
The latest U.S. intelligence assessment showed Iran had more than 2,000 ballistic missiles, Pentagon officials told Fox News.
The USS Harry Truman aircraft carrier strike group has been in the Gulf of Oman along with guided-missile destroyers, a guided-missile cruiser and at least one submarine. The Navy warships and submarine together had hundreds of Tomahawk cruise missiles with pre-planned targets locked into the missiles.
The ships would be ready to fire if given the order, two senior Pentagon officials told Fox News.
As I sit down to write this post, it is around 9:30 p.m. Central.
All of the guests which Sean Hannity and Laura Ingraham have had on have had some interesting theories, including the theory that Iran missed on purpose, in order to show "strength" while not torqueing off "The Great Satan" too much.
I do not know if that is the case of not.
I am sure that President Trump will give us more information when he addresses the nation.
Here is what I know:
Iran hates every single American, including Nancy Pelosi and the Democrats. Like Neville Chamberlain and the Nazis, Pelosi and the Democrats are too blinded by their own arrogance to realize that they are being played.
There are no sane and intelligent people left among both the religious and secular leadership of Iran. They were all killed during the Iranian Revolution. That's why wealthy Iranians sent their sons to American Colleges at the time, where most of them majored in engineering while romancing and marrying American coeds in order to stay in American where it was safe.
Iran is a Rogue Nation of Radical Islamic Barbarians which is widely acknowledged to be the leading sponsor of terrorism.
Iran has continued to work of the development of a nuclear weapon, laughing at the stupid naivete of Former President Barack Hussein Obama, while using his gift of $150,000,000,000 weapons, such as the missiles which they fired at those Air Bases in Iraq.
Finally, I know that I am glad that Donald J. Trump sits in the Oval Office and not Hillary Clinton.
Because, if the way that Pelosi and the Democrats are taking the side of Iran against the country which they are supposed to be loyal to is any indication, we would be royally screwed.
Until He Comes,
Tags: Al-Assad Air Base, Donald J. Trump, Gen. Qassem Soleimani, Iran, Iran Missile Attack
This entry was posted on January 8, 2020 at 7:00 am and is filed under Politics.	You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.


text:
Q: Using Select2 in Ember.js I'm really having difficulty integrating select2 in ember.
I want to transform this:
<input type="hidden" value=user />

into a search input with ajax using select2 and bind the selected result to the user attribute in model.
Please help.

A: {{view}} is deprecated in ember 2.0 +
I found this project that emberfies select2 into a component
ember install ember-select-2

or this one
ember install ember-select-guru

Edit 1:
There is also a more active nativley built one and you should probably use this one
ember install ember-power-select

repo

A: You must first give a normal select box and apply select2 after that.
To create a select box in ember,
{{view Ember.Select viewName="select2View"
                contentBinding="optionList"
        optionLabelPath="content.label"
        optionValuePath="content.value"
        prompt=""
        valueBinding="user"}}

where "optionsList" is the list to be populated in select. See the example below

[{"label": "label1", "value":1}, {"label": "label2", "value":2}]

Then if label1 is selected, "user" will have a value 1.
OR
alternatively you can also refer this Git

A: I know you're specifically asking for Select2 help, but if the exact library you're using isn't that important, you might want to try the select widget by Addepar. It's based off of Select2, so it's very similar. It will provide the search functionality for you and will bind the selected value for you. It's also fairly easy to customize the styling of it.

redpajama_set_name: RedPajamaStackExchange


text:
Home News Unprecedented 75th UNGA unwavering despite pandemic
Unprecedented 75th UNGA unwavering despite pandemic
The world's largest annual diplomatic event, the UN General Assembly (UNGA), will take place this year in an unprecedented fashion as world leaders for the first time will gather virtually due to the coronavirus pandemic.
The session will be led by Turkish Ambassador Volkan Bozkir, who officially assumed the presidency of the General Assembly on Tuesday.
In their opening remarks, Bozkir urged UN member states to uphold multilateralism to address collective challenges, and UN chief Antonio Guterres for his part said the pandemic will not halt the continuous work of the international organization on a full range of issues.
Although the virus may distract attention from other topics on the agenda, world leaders and representatives are expected to address climate change, racism, intolerance, inequality, poverty, hunger, and armed conflict while overcoming the obstacles of working virtually.
Only one representative for each UN member state will be able to attend the assembly in-person while world leaders are set to deliver pre-recorded statements that will begin to air on Sept. 22.
Despite US President Donald Trump's earlier intention to address the General Assembly in person, the White House and the State Department this week said neither the US president nor Secretary of State Mike Pompeo would go to New York for the UNGA.
U.N. Spokesperson Stephane Dujarric also said Thursday that the organization was not expecting any head of state or government to visit New York this year.
As planned by the UN, this year's high-level meetings will focus on its 75th anniversary, COVID-19 pandemic, multilateralism, biodiversity, gender equality, sustainable development goals and nuclear disarmament.
The UN will celebrate its 75th birthday on Sept. 21 with the theme of The Future We Want, the UN We Need: Reaffirming our Collective Commitment to Multilateralism, and Secretary-General Guterres will deliver a virtual address.
The General Debate will take place on Sept. 22-29, a week of high-level speeches on global issues.
Brazilian President Jair Bolsonaro will make the first address, followed by Trump, Turkey's President Recep Tayyip Erdogan, and China's President Xi Jinping.
Iran, Cuba, France and Egypt will also deliver speeches Tuesday, while Iraq, Afghanistan, and Venezuela will address the assembly on Wednesday, Libya on Thursday, Palestine and Pakistan on Friday, and India on Saturday.
Israel, Saudi Arabia, and Germany will speak on Sept. 29.
A summit on biodiversity will be held on Sept. 30, a day before the 25th anniversary of the 4th World Conference on Women.
A high-level meeting to commemorate and promote the International Day for the Total Elimination of Nuclear Weapons will take place on Oct. 2.
Previous articleAfghanistan, Tajikistan agree to enhance ties
Next article'French President Macron adds fuel to fire in E.Med'
2 pilots killed in Pakistan's training jet crash
US Federal Reserve cuts rates amid coronavirus fears
Iraq prime minister visits Erbil for talks


Safety: If your tire tread is wearing down, the overall strength of your tires are compromised which increases your chance of a blowout or flat. At certain speeds a blow-out can cause a bad car accident so think of your safety first.
Better Performance: New tires have the best grip and this is especially needed during those rainy days and winter months. They also contribute to fuel efficiency and allow for a smoother ride.
Fuel Efficiency: Most people don't know that the friction from their tires can contribute to whether or not their vehicle is fuel efficient. So in a nutshell, buying the right tires can help you save money at the pump!
How do you know you need new tires? Ever heard of a bald tire? You never want to wait until this happens to you because you put your life in danger every time you get on the road. The lifespan of a tire can be measured in miles but may need to be replaced earlier depending on your individual driving style and habits. Other reasons you may need to replace your tire/tires is road damage. Anytime you visit us for service, we are happy to check your tires for you.
If you think it is time to replace your tires, we are happy to check and confirm for you. We have some of the most competitive pricing on all nationally recognized brands. Come in to the service department at McDavid Honda in Frisco and we will take care of you. We also have an awesome wheel alignment special for $79.95. See more here.
You can conveniently schedule yourappointment online by clicking here. If you have questions, please call us at 866-749-0514. We look forward to serving you.


text:
Features Golf Turf Care Equipment
Turf tarping made simpler
Assistant golf superintendent conceives a better method for putting covers down.
December 18, 2017 By Mike Jiggens
Jordan Kitchen, assistant superintendent at the Hamilton Golf & Country Club, conceived the idea for TarpDevil.
An assistant golf superintendent has come up with an idea that simplifies the deployment and collection of turf covers, reduces the amount of labour involved in their implementation, and significantly extends their shelf life.
TarpDevil is the brainchild of Jordan Kitchen, assistant superintendent at the Hamilton Golf & Country Club, who began to think there had to be a better way of putting down covers, rolling them back up again and storing them during the playing season. He had become accustomed to the standard practice of being among eight to 12 people who would roll out, unfold and tack down covers to protect greens during the winter months and then rolling them back up again in the spring and storing them for another year. It was a labour intensive process that often proved challenging.
"Rolling them up and collecting them in the spring was a lesson in and of itself," he said.
Many golf courses in Canada use turf covers to protect their greens from winter injury. The polar vortex of 2014 that hit Ontario and Eastern Canada reminded several superintendents of the value of covers after many courses with predominantly poa annua greens suffered extensive ice damage and death.
Kitchen said Hamilton experienced about 70 per cent turf loss that year. Not wanting the calamity to repeat itself, the club's membership was told that solid covers were the answer to more effective winter protection.
Putting the new covers out for the first time was a relatively easy process because they were dry, Kitchen said, but collecting them afterwards and storing them would be another story. Weighing about 300 pounds apiece when spring moisture was factored in, repeating the process of deployment and collection each fall and spring left Kitchen contemplating a more effective means to put down covers and roll them back up.
After doing some research online and discussing concepts with the team at Hamilton, an idea for a hydraulically-driven attachment that could be affixed to the back of any tractor came to bear. From there, he asked an engineer friend to listen to his idea and conceive a workable design. Ian Trepte, a friend of Kitchen's since their childhood, put his engineering expertise to work with some CAD (computer-aided drafting) designs that led to the development of a prototype.
"He came down and drew it out, and that was the beginning of TarpDevil."
The two collaborated on the project "for months and months and months and months" until an operable design concept was achieved. Working with a skilled welder, a prototype of the TarpDevil attachment was produced and, in July of 2017, an introductory product video was recorded that launched in August.
"That's the value that Ian brings as an engineer. He's very familiar with how you develop CAD drawings and welding assemblies."
The attachment is constructed of two-inch-square tube steel and plate, cut to size and welded together. Kitchen said the goal was to minimize the number of materials needed, adding Trepte's professional expertise ensured their objective was met.
"It's a simple concept that achieves a great purpose. That was really one of the goals we had in mind when we designed the unit. We wanted it to be structurally strong, but we didn't want it to be too heavy or too complex. We wanted it to be functional and durable."
Video on Internet
The introductory product video to demonstrate the efficiency of TarpDevil was posted to TarpDevil's website and then on Twitter, "and the response to that prototype was absolutely overwhelming." Kitchen said it generated about 14,000 impressions and 9,000 engagements, plus several "likes" and re-tweets.
In addition to the promotional video, the TarpDevil was also demonstrated at the Ottawa Valley Turfgrass Association's annual golf tournament.
TarpDevil attaches to a tractor's three-point hitch and runs off its hydraulic system. Kitchen said the design concept was purposely tailored with a light weight in mind. Because greens are the most valuable surfaces on a golf course, it is important that minimal weight be placed on them and their surrounds, especially in the spring when they are traditionally wet. He said he and Trepte – who holds the title of vice-president of engineering – designed the unit so that it could be mounted to tractors that, outfitted with turf tires, would leave a lighter footprint around the putting surface.
"You don't have to have a certain size tractor to use the TarpDevil. It works on every modern tractor."
Most golf courses have a least one tractor among their fleet of equipment, he said, adding adapting it for a three-point hitch mount and run off the machine's hydraulic system made a lot of sense.
Currently, the system is designed with a six-foot width for rolling covers, but efforts are underway to produce a 10-foot and 20-foot configurations.
"I'm convinced the unit will work for other applications (besides golf)," Kitchen said. "But if someone so chooses, it can be offered in 10-foot and potentially 20-foot options. We're working on those solutions now."
The wider options are designed with agriculture and sports field applications in mind.
With TarpDevil's original design, Kitchen said a cover is folded to six feet in width, placed on a spindle and held in position with a pinching arm. The roller of the Tarp Devil allows the cover to be off the ground, acting as a squeegee to extract moisture from the tarp and enabling it to be rolled up into an air-tightened, compact package for easier storage.
"All of those things add to its useful life."
Rolling up covers manually, especially those upward in size of 60 feet by 100 feet, is typically a daunting task. The covers are usually cold, wet and heavy in the spring, and workers are on their hands and knees, shoulder to shoulder, rolling it up after it has been folded into a six-foot width. Kitchen said as the rolling process moves further along while a cover's bulkiness increases, workers start to "huff and puff" and experience slippage while trying to achieve a compact bundle.
By using the TarpDevil, the number of people required for the collection process can be reduced to about six or seven, Kitchen said, instead of upward of 12 people. It allows the process to be performed by two crews. One will un-tack the covers and fold them up to the proper width while two individuals can operate the TarpDevil to roll them up into a more compact size for storage.
The rolling process, when done manually, is the most labour intensive part of the process, Kitchen said.
Invention saves money
Based on data he and the shareholders have, a golf course with 18 covers (or 19 with a practice putting green) can save between $1,200 and $2,000 per collection or deployment by using the TarpDevil.
"You can use the unit to collect covers, but you can also use it to deploy them."
Kitchen said the TarpDevil is gentler on covers because it allows them to be rolled up more evenly, and they are tighter and easier to manage, contributing to a cover's effective, useful life. When folded up manually, covers tend to be bulky and can often snag on other things when stored. He estimates the life expectancy of a cover can be extended by about 20 per cent when using the TarpDevil. When the labour savings is factored in, the unit provides good value, he added.
"We've had an overwhelming response to the video and to the concept. People can really see how it improves their lives and their operations. If I can do something that makes the lives of those employees and superintendents in the industry better, and I can bring value or improve the process to someone else, then that makes me happy."
The TarpDevil is patent pending. Kitchen is also working with an intellectual property lawyer, and the brand name has become trademarked.
"Our lawyers worked really hard with us to get us to that stage."
He and the shareholder group are also in the process of establishing distribution partners in both Canada and the United States.
"One of the things we're proud to say is that this is a Canadian product."
Among the university courses he studied at the University of Guelph in his pursuit of his masters degree was one on sustainability "which is a really hot topic now." Kitchen said when ideas are created that make people's lives easier and processes more efficient, they become popular and significantly change the marketplace.
"In that vein, I think TarpDevil has a very sustainable approach to improving operations for farmers, sports fields managers and golf courses."
Kitchen estimates he has spent an average of 15 to 20 hours a week of his own time with TarpDevil, dating back to March, but added he's had "a lot of fun" doing it. He credits John Bladon, a mentor of his, and Bladon's Chimera Group for their help in commercializing the concept, marketing and channel development, and collaborating on a plan for TarpDevil.
"He (Bladon) was the guy who planted that seed in my mind."
Kitchen said he was raised in an "innovative, industrious and entrepreneurial" family. His stepfather is a cash crop and dairy farmer who insisted his children try their hand in another field before following his footsteps in agriculture. Heeding that advice, Kitchen began working at Century Pines Golf Club in Troy, Ont. at the age of 16, pursuing his love for the outdoors.
"That's when I fell in love with golf. I didn't come to this industry because I was a golf buff. I came to this because I love the outdoors, I like the people, and then I came to love the game."
After finishing high school, he studied political science in Ottawa before returning to Century Pines. In 2011, he completed the turfgrass managers' short course at the University of Guelph and then took the university's diploma course the following year. For his internship, he applied to both the Hamilton Golf & Country Club as well as a golf course in China, but Hamilton superintendent Rhod Trainor was the first to respond with an offer.
Today, he is only a few credits shy of attaining his master's degree with a specialization in food and agri-business.
New Canadian distributors
TarpDevil has formed exclusive distribution partnerships with two well-known Canadian brands to cover the provinces from British Columbia to Quebec.
BrettYoung has partnered with TarpDevil in British Columbia, Alberta, Saskatchewan and Manitoba while Turf Care Products Canada will look after the Ontario and Quebec markets.
"We are thrilled to forge partnerships with progressive industry leaders in BrettYoung and Turf Care Products," TarpDevil president Jordan Kitchen said. "They have long standing reputations of serving their clients with best-of-class solutions and we couldn't think of better partners."
Travis Unger, vice-president of professional turf and reclamation for BrettYoung, said, "BrettYoung has always sought to bring leading solutions to its customer base, and this solution-based and Canadian-made innovation is something we are now proud to represent in Western Canada."
Turf Care Products Canada sales manager Tom Fisher was equally enthusiastic about his company's new partnership.
"I couldn't be more pleased to announce our relationship with this innovative company and product. Turf Care has always sought to bring leading-edge solutions to its customer base, and TarpDevil fits that description flawlessly. We are proud to add this unique and Canadian product to our distribution portfolio."
The first of its kind, TarpDevil reduces the burden of collecting and deploying covers on the golf course and in the sports turf and equestrian arenas. The tractor-mounted, hydraulically controlled cover management system significantly reduces the labour required to manage tarps in the spring and fall.
To view a video of TarpDevil, visit www.tarpdevil.com/tarp-devil-product-video-live/.
TarpDevil's offices and manufacturing facilities are in Puslinch, Ont.
BrettYoung is based in Winnipeg and produces forage and turf products that serve domestic and international markets around the world.
Turf Care Products Canada is based in Newmarket, Ont. with offices in London, Milton, Scarborough, Ottawa and Montreal, and is a leading supplier to golf courses, municipalities and landscape contractors.
Assistant's invention helps ease turf cover work
TarpDevil receives first in series of patents
GreenJacket to distribute TarpDevil in U.S.A.
GreenJacket Sport Turf Covers
assistant golf superintendent
Hamilton Golf & Country Club
Jordan Kitchen
TarpDevil
turf covers
CIB still growing as milestone nears
Choosing a profitable blade for snow removal
NFL Players Association files grievance against league, Carolina Panthers over artificial turf surface. Claim surface violates agreement's protocols.
https://bit.ly/3GzvCIk


text:
Applebee's Accepting Entries For 4th Annual Above and 'BEE'yond Teacher Essay Contest
Credits: TAPinto.net File Photo
HACKENSACK, NJ – Applebee's Neighborhood Grill & Bar has announced the launch of its 4th Annual Above and "BEE"yond Teacher Essay Contest, which will recognize top teachers — as nominated by their students — by awarding them with a sponsorship check and end-of-year class party, courtesy of Applebee's. The contest is being offered at Applebee's restaurants in New Jersey, owned and operated by local franchisee Doherty Enterprises.
Applebee's will award four deserving teachers from 13 counties with a $500 sponsorship check to use toward their classroom for the upcoming 2020-2021 school year, along with an end-of-year party for their current class. To nominate a teacher, students must submit an essay in-person at their local Applebee's explaining why their teacher deserves to be "Teacher of the Year." To sweeten the deal, students who enter an essay will receive a free ice cream certificate for Applebee's. Contest submissions will be accepted at participating Applebee's restaurants from January 6 through March 1, and winners will be announced on Monday, April 6, 2020.
"We are thrilled to be holding our fourth annual Above and BEEyond Teacher Essay Contest at our New Jersey restaurants," said Kevin Coughlin, director of operations, Applebee's New Jersey. "Our restaurants are committed to giving back to the local community, especially schools within the communities we serve. The overwhelming support from last year's campaign reminded us what an integral role teachers play in building a better community."
Doherty Enterprises is committed to involvement in the communities it serves and is proud to support education year-round through its "A is for Applebee's" program, which was created for teachers, libraries and scout leaders to use as an incentive for children to succeed and be rewarded. The program gives children an incentive to go the extra mile to help other students, read more books and make the Honor Roll. By obtaining the certificate from Applebee's, children also gain a sense of accomplishment. Through this, and several other initiatives including donations, fundraisers, sponsorships and participation in community events, Doherty Enterprises gives back to local causes, helping organizations grow and flourish.
For more information about how Doherty Enterprises and its restaurants support local communities, or to get involved in one of the youth programs, visit dohertyinc.com/community-connection.
Applebee's Above and "BEE"yond Teacher Essay Contest entries will be accepted at the following locations owned and operated by Doherty Enterprises in New Jersey: Brick, Bridgewater, Butler, Clark, Clifton, Edison, Flemington, Garfield, Hackensack, Hackettstown, Hillsborough, Howell, Jersey City, Jersey Gardens, Kearny, Lacey, Linden, Manahawkin, Manalapan, Manchester, Middletown, Milltown, Mt. Olive, Newark, Newton, North Bergen, Northvale, Ocean, Paramus, Parsippany, Phillipsburg, Piscataway, Rockaway, Tinton Falls, Totowa, Union, and Wall.
*One winner will be selected from each set of counties, grouped together by the following geographic areas, (Bergen, Passaic, Hudson), (Warren, Hunterdon, Somerset, Union), (Morris, Sussex, Essex), (Middlesex, Monmouth, Ocean).
Limit one per person. Valid only at participating Applebee's locations owned and operated by Doherty Enterprises.
Wearing white chef's jackets and toques, about 30 men are bustling about the ...
Talks On Banning Single-Use Plastic Carry Out Bags Begin In ...
At Annual Swearing-In Ceremony, Officers Bestowed With Lifesaving ...
Hackensack Recognized For Being A Veteran Friendly Municipality
By TAPINTO HACKENSACK STAFF
HACKENSACK, NJ -- City officials on Tuesday, Jan. 14 received a certificate of recognition from Peter Lupo, a Veteran and Vice President of Public Affairs and Legislative Outreach for the NJ Veterans Chamber, recognizing Hackensack's efforts to support veteran-owned businesses.
The Veteran Friendly Municipality certification is earned by passing a resolution to award 6% of public contract ...
HACKENSACK, NJ -- City officials on Tuesday, Jan. 14 received a certificate of recognition from ...
No Stress Here! Pediatric Patients Roll Into Surgery In Style At Hackensack Meridian Palisades Medical Center
By LIANNA ALBRIZIO
HACKENSACK, NJ — For the children heading into surgery at Hackensack Meridian Palisades Medical Center in North Bergen, fear and anxiety are taking a backseat. Literally.
Children have begun driving themselves into surgery in style via an electric motorized Mercedes-Benz and a Land Rover. The miniature electric cruisers were donated by Carpet Etcetera to the 206-bed nonprofit medical center ...
HACKENSACK, NJ — For the children heading into surgery at Hackensack Meridian Palisades Medical ...
Five New Physicians Join John Theurer Cancer Center At Hackensack University Medical Center
By HACKENSACK UNIVERSITY MEDICAL CENTER
HACKENSACK, N.J. — Five new physicians have joined the medical staff at John Theurer Cancer Center at Hackensack University Cancer Center in New Jersey.
Hyung C. Suh, MD, PhD, is a hematologist-oncologist who joined the Stem Cell Transplantation and Cellular Therapy program. Dr. Suh specializes in the care of people with blood cancers (such as leukemia, lymphoma, and multiple myeloma) and in ...
HACKENSACK, N.J. — Five new physicians have joined the medical staff at John Theurer Cancer Center ...
Holocaust Survivor To Share His Story At Chadbad Of Hackensack On Holocaust Remembrance Day
HACKENSACK, NJ -- Chabad of Hackensack will host Dr. Moshe Avital, a Holocaust survivor, who will tell his story, "A Year After My Bar Mitzvah I Was Sent To Auschwitz -- A Tale of Fear, Survival, and Faith," on January 27 at 7:30 p.m. for International Holocaust Remembrance Day.
As a young child of a family of 11, Avital lost close to 200 relatives during the Holocaust. He managed to survive, ...
HACKENSACK, NJ -- Chabad of Hackensack will host Dr. Moshe Avital, a Holocaust survivor, who will ...
20 New Jersey Counties Share $7.8 Million In Government Funding To 'Turn The Tide' Of The Opioid Epidemic
HACKENSACK, NJ — Bergen County will receive a half-million dollars as part of Governor Murphy's $7.8 million opioid initiative that will help county correctional facilities to provide medication-assisted opioid treatment to individuals with such addictions in county jails. The funds will also create the critical community partnerships to ensure post-release continuation of treatment.
According ...
HACKENSACK, NJ — Bergen County will receive a half-million dollars as part of Governor Murphy's ...
Fourth Annual MLK Day of Service Event 'We the People' Is Monday, January 20
PARAMUS, NJ -- We the People, a nonprofit organization started by Bergen County Freeholder Tracy Silna Zur, will hold its Fourth Annual "Martin Luther King Day of Service" in the Bergen Community College gymnasium, 400 Paramus Road, on Monday, January 20 from 12:30 to 3:30 p.m.
The event welcomes 800 students from Bergen County's diverse religious and cultural communities to celebrate Dr.
PARAMUS, NJ -- We the People, a nonprofit organization started by Bergen County Freeholder Tracy ...
New Jersey Date Night: Lettuce Eat Salad
By CRAIG ROGERS
New Jersey Date Night is a series on NJ Flavor by relationship writer Craig Rogers.
The days following the holiday season can be rather heavy — we're heavy hearted that the celebrations are all over and heavier in the waistline from enjoying every last bite of the festivities.
In New Jersey it's difficult to say no to tasty treats like Christmas cookies and, frankly, you shouldn't because ...
The days ...
Volunteers Sought For Regional Team To Respond To Domestic Violence At Police Departments
HACKENSACK, NJ -- Bergen County Department of Human Services, division of Alternatives to Domestic Violence is currently recruiting volunteers for a regional team that will respond to victims of domestic violence at police departments located in Bergen County municipalities.
Volunteers from the community are trained to offer necessary information and referrals to victims at a time when they ...
HACKENSACK, NJ -- Bergen County Department of Human Services, division of Alternatives to Domestic ...
Bergen County Board of Chosen Freeholders Welcome Back Incumbents At Annual Reorganization Meeting
HACKENSACK, NJ — The Bergen County Board of Chosen Freeholders welcomed the return of incumbents Tom Sullivan, Mary Amoroso, and Germaine Ortiz at its annual reorganization meeting on January 7.
Amoroso, Joan Voss and Steven Tanelli took oaths of leadership as chairwoman, vice chairwoman and chair pro tempore, respectively.
Dignitaries in attendance of the meeting held on the fifth-floor of ...
HACKENSACK, NJ — The Bergen County Board of Chosen Freeholders welcomed the return of incumbents ...
NJ's Anthony Fontanez Advances in Food Network's 'Kids Baking Championship'
By CATHY GOETZ
UPDATE: Anthony Fontanez created a 1970s-inspired shag cake, complete with bright pink strawberry buttercream frosting and cherry cream cheese filling, that won him praise from the judges — and the opportunity to advance to the next round in "Kids Baking Championship."
Click here to watch the "Beyond the Fringe" episode, which airs this week on Food Network. The competition continues on ...
UPDATE: Anthony Fontanez created a 1970s-inspired shag cake, complete with bright pink strawberry ...


text:
What We've Already Learned From the Blake Griffin Experiment
Micah Reum
Micah Reum is a passionate follower of the NBA. He enjoys writing about top storylines from around the league.
Andre Drummond was named Eastern Conference Player of the Week in Griffin's first week on the roster.
The Detroit Pistons are 4-0 since they traded for Blake Griffin on January 29th. At the time of the trade, the Pistons were two and a half games out of the final playoff position in the Eastern Conference. Now, just one week later, they are tied with the Philadelphia 76ers for the final spot in the playoffs. The excitement is back in Detroit, and the Pistons are playing with more energy than they have had since the first couple weeks of the season. In only three games, Griffin has already changed the performance of the team. How has he done so?
Van Gundy Is Utilizing the Big Men
Stan Van Gundy has been a master of the lineup rotation since the arrival of Griffin. Van Gundy has utilized the size advantage that Griffin offers, as opposed to what Tobias Harris did. Griffin has the ability to play the center position when Andre Drummond isn't on the floor, and Van Gundy hasn't hesitated to exploit that option in the slightest way.
In both the 111-107 victory over the Miami Heat on February 3rd and the 111-91 victory over the Portland Trail Blazers on February 5th, Van Gundy chose to sit Drummond early in both the first and third quarters, while keeping Griffin on the floor as the center, with Anthony Tolliver playing the power forward position. Van Gundy played Griffin until about one or two minutes to go in the quarters, before reinserting Drummond for Griffin.
This has had a positive impact in multiple ways for the Pistons. The most obvious, there is an All-Star caliber player on the floor at all times with either Griffin or Drummond. With the lack of depth at the center position, the Pistons had seen problems finding life when Drummond was on the bench. Now, there is always a matchup nightmare on the floor. This is something Tobias Harris was unable to offer from the power forward position.
Second, this gives both Drummond and Griffin time on the floor to be the focal point of the offense. The offense can run through Drummond the way it has all season, while Griffin is on the bench, and Griffin can have the freedom to run the offense his own way, while Drummond is on the bench. In this perfect world that Van Gundy has seemingly already created, neither Drummond nor Griffin will complain about losing touches to the other player, as they are receiving an abundance of minutes without the other on the court.
That's not to say Drummond and Griffin aren't enjoying playing at the same time, however. It is, rather, the opposite. The two have found instant chemistry together. Perhaps the fact that they each receive time without the other on the floor allows them to be more sharing of the ball when they are together. Or, maybe, their playing styles actually somehow gel perfectly with each other. Whatever the case is, Van Gundy has found a way to allow both Drummond and Griffin to be unleashed in this new offense.
Stan Van Gundy has utilized multiple lineup combinations since the arrival of Blake Griffin.
Lineup Combinations
Along with the ability to have either Griffin or Drummond or both on the floor for the complete duration of the 48 minute game, Van Gundy has also gone wild with utilizing a multitude of lineup combinations. His starting lineup, currently consisting of Ish Smith, Reggie Bullock, Stanley Johnson, Blake Griffin, and Andre Drummond, is more of a defensive minded, power lineup. Apart from Bullock (45% 3pt.), the starting lineup lacks in outside shooting talent.
However, as much as they lack in outside shooting, they make up for it in their ability to defend and drive to the basket, while Bullock, the only true shooter, seems to always be open when one of the four other players drive to the basket. Each of Smith, Johnson, Griffin, and Drummond have above average passing abilities. Neither of the four are a good one on one matchup for defenses, and they each also possess the ability to find the open man when doubled by help side defense.
Once Van Gundy goes to the bench, a whole new style of play introduces itself, as the bench is filled with pure shooters. Luke Kennard (42% 3pt.), Anthony Tolliver (41% 3pt.), and Langston Galloway (36% 3pt.) are deadly from range, when left open. Van Gundy has gone with an eight man rotation, with starting point guard Reggie Jackson still injured. All three bench players getting consistent minutes add an outside shooting touch to the offense, as it suddenly transitions from a driving the lane offense to a three point shooting offense. Defense have to prepare for every possible situation with just the eight players Van Gundy is consistently playing.
Van Gundy, all of a sudden, has the ability to put any lineup combination he wants on the floor to counter that of the opposing defense. He can go with a lineup of up to four pure shooters, or a lineup in which every player on the floor can drive the lane and get to the free throw line. When he needs defense, his starting lineup possesses five defensive minded players. At the moment, it seems Van Gundy has the complete package.
Andre Drummond has flourished since the arrival of Blake Griffin.
Andre Drummond's Increase in Productivity
Andre Drummond has been effected more than anyone else on the roster with the addition of Griffin. However, he hasn't been effected in the way many experts assumed he would. Most people were predicting growing pains, as the two big men tried to learn how to play with each other. They were supposed to clog the lane and steal touches from one another. Well, that hasn't happened yet. In fact, the two big men have only thrived playing with one another.
Andre Drummond has been playing so well since the Griffin trade that he was named Eastern Conference Player of the Week in Griffin's first week with the team. In four games since the departure of Tobias Harris, Avery Bradley, and Boban Marjanovic, Drummond is averaging 18.8 points, 18.5 rebounds, four assists, and 2.8 blocks per game. He has been an absolute animal.
The offense has opened up with the both the arrival of Griffin, as well as the departure of Bradley and Harris, who ate up most of the shot attempts for the Pistons. Griffin is a much better passer and playmaker than both Bradley and Harris, and that has made life easier for Drummond. Meanwhile, Griffin is adding 20 points, nine rebounds, and six assists per game since joining the Pistons.
It seems that the two are having no trouble playing together, as many expected they would. The sky is the limit for the potential they have lining up next to each other. Add to that the fact that Van Gundy has the ability to keep an All-Star on the floor at all time, while utilizing different lineups, and this whole Blake Griffin experiment might just work out after all.
© 2018 Micah Reum
Debriefing the NBA Trade Deadline Insanity
by Micah Reum2
Offensive and Defensive Football Positions Explained
by Eric Dockett3
The 15 Largest Hand Sizes in NBA History
7 Tall NBA Players Who Had Relatively Short Parents
Michael Jordan Versus LeBron James: Who Is the GOAT?
by Jesse Unk33
23 months ago from Hamburg, Germany
It's looking like they'll make a run through the Eastern Conference rankings to end the season. Should make for some exciting playoff matchups.
Jan Michael Ong
23 months ago from Metro Manila, Philippines
If they can stay healthy Griffin and Drummond can be dominant in a weak Eastern Conference.


FinSMEs.com provides information on venture capital/private equity and debt financing deals taking place daily across the planet.
Launched in August 2009 by Ermanno Cece, FinSMEs is a fast-growing blog and represents a realiable and trusted source of information for would-be, young and established entrepreneurs, angel investors, venture capitalists, technologists, analysts, journalists and bloggers from the five continents.
It currently focuses on providing real-time funding/M&A deal news as well as interviews with industry leaders.
FinSMEs aims to create an ecosystem where readers can stay instantly updated and get ideas needed for their projects and investments, as well as for their studies and initiatives.
It is country and sector agnostic and followed worldwide, mainly in the USA, the UK, Australia, India, Germany, France, Philippines, and Scandinavia.
2013: Voted Best Blog for Entrepreneurs by Broadview Networks, Inc.