text:
// Copyright (c) 2011-2021 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#include <node/blockstorage.h>

#include <chain.h>
#include <chainparams.h>
#include <clientversion.h>
#include <consensus/validation.h>
#include <flatfile.h>
#include <fs.h>
#include <hash.h>
#include <pow.h>
#include <reverse_iterator.h>
#include <shutdown.h>
#include <signet.h>
#include <streams.h>
#include <undo.h>
#include <util/syscall_sandbox.h>
#include <util/system.h>
#include <validation.h>

namespace node {
std::atomic_bool fImporting(false);
std::atomic_bool fReindex(false);
bool fHavePruned = false;
bool fPruneMode = false;
uint64_t nPruneTarget = 0;

static FILE* OpenUndoFile(const FlatFilePos& pos, bool fReadOnly = false);
static FlatFileSeq BlockFileSeq();
static FlatFileSeq UndoFileSeq();

CBlockIndex* BlockManager::LookupBlockIndex(const uint256& hash) const
{
    AssertLockHeld(cs_main);
    BlockMap::const_iterator it = m_block_index.find(hash);
    return it == m_block_index.end() ? nullptr : it->second;
}

CBlockIndex* BlockManager::AddToBlockIndex(const CBlockHeader& block)
{
    AssertLockHeld(cs_main);

    // Check for duplicate
    uint256 hash = block.GetHash();
    BlockMap::iterator it = m_block_index.find(hash);
    if (it != m_block_index.end()) {
        return it->second;
    }

    // Construct new block index object
    CBlockIndex* pindexNew = new CBlockIndex(block);
    // We assign the sequence id to blocks only when the full data is available,
    // to avoid miners withholding blocks but broadcasting headers, to get a
    // competitive advantage.
    pindexNew->nSequenceId = 0;
    BlockMap::iterator mi = m_block_index.insert(std::make_pair(hash, pindexNew)).first;
    pindexNew->phashBlock = &((*mi).first);
    BlockMap::iterator miPrev = m_block_index.find(block.hashPrevBlock);
    if (miPrev != m_block_index.end()) {
        pindexNew->pprev = (*miPrev).second;
        pindexNew->nHeight = pindexNew->pprev->nHeight + 1;
        pindexNew->BuildSkip();
    }
    pindexNew->nTimeMax = (pindexNew->pprev ? std::max(pindexNew->pprev->nTimeMax, pindexNew->nTime) : pindexNew->nTime);
    pindexNew->nChainWork = (pindexNew->pprev ? pindexNew->pprev->nChainWork : 0) + GetBlockProof(*pindexNew);
    pindexNew->RaiseValidity(BLOCK_VALID_TREE);
    if (pindexBestHeader == nullptr || pindexBestHeader->nChainWork < pindexNew->nChainWork)
        pindexBestHeader = pindexNew;

    m_dirty_blockindex.insert(pindexNew);

    return pindexNew;
}

void BlockManager::PruneOneBlockFile(const int fileNumber)
{
    AssertLockHeld(cs_main);
    LOCK(cs_LastBlockFile);

    for (const auto& entry : m_block_index) {
        CBlockIndex* pindex = entry.second;
        if (pindex->nFile == fileNumber) {
            pindex->nStatus &= ~BLOCK_HAVE_DATA;
            pindex->nStatus &= ~BLOCK_HAVE_UNDO;
            pindex->nFile = 0;
            pindex->nDataPos = 0;
            pindex->nUndoPos = 0;
            m_dirty_blockindex.insert(pindex);

            // Prune from m_blocks_unlinked -- any block we prune would have
            // to be downloaded again in order to consider its chain, at which
            // point it would be considered as a candidate for
            // m_blocks_unlinked or setBlockIndexCandidates.
            auto range = m_blocks_unlinked.equal_range(pindex->pprev);
            while (range.first != range.second) {
                std::multimap<CBlockIndex*, CBlockIndex*>::iterator _it = range.first;
                range.first++;
                if (_it->second == pindex) {
                    m_blocks_unlinked.erase(_it);
                }
            }
        }
    }

    m_blockfile_info[fileNumber].SetNull();
    m_dirty_fileinfo.insert(fileNumber);
}

void BlockManager::FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeight, int chain_tip_height)
{
    assert(fPruneMode && nManualPruneHeight > 0);

    LOCK2(cs_main, cs_LastBlockFile);
    if (chain_tip_height < 0) {
        return;
    }

    // last block to prune is the lesser of (user-specified height, MIN_BLOCKS_TO_KEEP from the tip)
    unsigned int nLastBlockWeCanPrune = std::min((unsigned)nManualPruneHeight, chain_tip_height - MIN_BLOCKS_TO_KEEP);
    int count = 0;
    for (int fileNumber = 0; fileNumber < m_last_blockfile; fileNumber++) {
        if (m_blockfile_info[fileNumber].nSize == 0 || m_blockfile_info[fileNumber].nHeightLast > nLastBlockWeCanPrune) {
            continue;
        }
        PruneOneBlockFile(fileNumber);
        setFilesToPrune.insert(fileNumber);
        count++;
    }
    LogPrintf("Prune (Manual): prune_height=%d removed %d blk/rev pairs\n", nLastBlockWeCanPrune, count);
}

void BlockManager::FindFilesToPrune(std::set<int>& setFilesToPrune, uint64_t nPruneAfterHeight, int chain_tip_height, int prune_height, bool is_ibd)
{
    LOCK2(cs_main, cs_LastBlockFile);
    if (chain_tip_height < 0 || nPruneTarget == 0) {
        return;
    }
    if ((uint64_t)chain_tip_height <= nPruneAfterHeight) {
        return;
    }

    unsigned int nLastBlockWeCanPrune{(unsigned)std::min(prune_height, chain_tip_height - static_cast<int>(MIN_BLOCKS_TO_KEEP))};
    uint64_t nCurrentUsage = CalculateCurrentUsage();
    // We don't check to prune until after we've allocated new space for files
    // So we should leave a buffer under our target to account for another allocation
    // before the next pruning.
    uint64_t nBuffer = BLOCKFILE_CHUNK_SIZE + UNDOFILE_CHUNK_SIZE;
    uint64_t nBytesToPrune;
    int count = 0;

    if (nCurrentUsage + nBuffer >= nPruneTarget) {
        // On a prune event, the chainstate DB is flushed.
        // To avoid excessive prune events negating the benefit of high dbcache
        // values, we should not prune too rapidly.
        // So when pruning in IBD, increase the buffer a bit to avoid a re-prune too soon.
        if (is_ibd) {
            // Since this is only relevant during IBD, we use a fixed 10%
            nBuffer += nPruneTarget / 10;
        }

        for (int fileNumber = 0; fileNumber < m_last_blockfile; fileNumber++) {
            nBytesToPrune = m_blockfile_info[fileNumber].nSize + m_blockfile_info[fileNumber].nUndoSize;

            if (m_blockfile_info[fileNumber].nSize == 0) {
                continue;
            }

            if (nCurrentUsage + nBuffer < nPruneTarget) { // are we below our target?
                break;
            }

            // don't prune files that could have a block within MIN_BLOCKS_TO_KEEP of the main chain's tip but keep scanning
            if (m_blockfile_info[fileNumber].nHeightLast > nLastBlockWeCanPrune) {
                continue;
            }

            PruneOneBlockFile(fileNumber);
            // Queue up the files for removal
            setFilesToPrune.insert(fileNumber);
            nCurrentUsage -= nBytesToPrune;
            count++;
        }
    }

    LogPrint(BCLog::PRUNE, "Prune: target=%dMiB actual=%dMiB diff=%dMiB max_prune_height=%d removed %d blk/rev pairs\n",
           nPruneTarget/1024/1024, nCurrentUsage/1024/1024,
           ((int64_t)nPruneTarget - (int64_t)nCurrentUsage)/1024/1024,
           nLastBlockWeCanPrune, count);
}

CBlockIndex* BlockManager::InsertBlockIndex(const uint256& hash)
{
    AssertLockHeld(cs_main);

    if (hash.IsNull()) {
        return nullptr;
    }

    // Return existing
    BlockMap::iterator mi = m_block_index.find(hash);
    if (mi != m_block_index.end()) {
        return (*mi).second;
    }

    // Create new
    CBlockIndex* pindexNew = new CBlockIndex();
    mi = m_block_index.insert(std::make_pair(hash, pindexNew)).first;
    pindexNew->phashBlock = &((*mi).first);

    return pindexNew;
}

bool BlockManager::LoadBlockIndex(
    const Consensus::Params& consensus_params,
    ChainstateManager& chainman)
{
    if (!m_block_tree_db->LoadBlockIndexGuts(consensus_params, [this](const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { return this->InsertBlockIndex(hash); })) {
        return false;
    }

    // Calculate nChainWork
    std::vector<std::pair<int, CBlockIndex*>> vSortedByHeight;
    vSortedByHeight.reserve(m_block_index.size());
    for (const std::pair<const uint256, CBlockIndex*>& item : m_block_index) {
        CBlockIndex* pindex = item.second;
        vSortedByHeight.push_back(std::make_pair(pindex->nHeight, pindex));
    }
    sort(vSortedByHeight.begin(), vSortedByHeight.end());

    // Find start of assumed-valid region.
    int first_assumed_valid_height = std::numeric_limits<int>::max();

    for (const auto& [height, block] : vSortedByHeight) {
        if (block->IsAssumedValid()) {
            auto chainstates = chainman.GetAll();

            // If we encounter an assumed-valid block index entry, ensure that we have
            // one chainstate that tolerates assumed-valid entries and another that does
            // not (i.e. the background validation chainstate), since assumed-valid
            // entries should always be pending validation by a fully-validated chainstate.
            auto any_chain = [&](auto fnc) { return std::any_of(chainstates.cbegin(), chainstates.cend(), fnc); };
            assert(any_chain([](auto chainstate) { return chainstate->reliesOnAssumedValid(); }));
            assert(any_chain([](auto chainstate) { return !chainstate->reliesOnAssumedValid(); }));

            first_assumed_valid_height = height;
            break;
        }
    }

    for (const std::pair<int, CBlockIndex*>& item : vSortedByHeight) {
        if (ShutdownRequested()) return false;
        CBlockIndex* pindex = item.second;
        pindex->nChainWork = (pindex->pprev ? pindex->pprev->nChainWork : 0) + GetBlockProof(*pindex);
        pindex->nTimeMax = (pindex->pprev ? std::max(pindex->pprev->nTimeMax, pindex->nTime) : pindex->nTime);

        // We can link the chain of blocks for which we've received transactions at some point, or
        // blocks that are assumed-valid on the basis of snapshot load (see
        // PopulateAndValidateSnapshot()).
        // Pruned nodes may have deleted the block.
        if (pindex->nTx > 0) {
            if (pindex->pprev) {
                if (pindex->pprev->nChainTx > 0) {
                    pindex->nChainTx = pindex->pprev->nChainTx + pindex->nTx;
                } else {
                    pindex->nChainTx = 0;
                    m_blocks_unlinked.insert(std::make_pair(pindex->pprev, pindex));
                }
            } else {
                pindex->nChainTx = pindex->nTx;
            }
        }
        if (!(pindex->nStatus & BLOCK_FAILED_MASK) && pindex->pprev && (pindex->pprev->nStatus & BLOCK_FAILED_MASK)) {
            pindex->nStatus |= BLOCK_FAILED_CHILD;
            m_dirty_blockindex.insert(pindex);
        }
        if (pindex->IsAssumedValid() ||
                (pindex->IsValid(BLOCK_VALID_TRANSACTIONS) &&
                 (pindex->HaveTxsDownloaded() || pindex->pprev == nullptr))) {

            // Fill each chainstate's block candidate set. Only add assumed-valid
            // blocks to the tip candidate set if the chainstate is allowed to rely on
            // assumed-valid blocks.
            //
            // If all setBlockIndexCandidates contained the assumed-valid blocks, the
            // background chainstate's ActivateBestChain() call would add assumed-valid
            // blocks to the chain (based on how FindMostWorkChain() works). Obviously
            // we don't want this since the purpose of the background validation chain
            // is to validate assued-valid blocks.
            //
            // Note: This is considering all blocks whose height is greater or equal to
            // the first assumed-valid block to be assumed-valid blocks, and excluding
            // them from the background chainstate's setBlockIndexCandidates set. This
            // does mean that some blocks which are not technically assumed-valid
            // (later blocks on a fork beginning before the first assumed-valid block)
            // might not get added to the background chainstate, but this is ok,
            // because they will still be attached to the active chainstate if they
            // actually contain more work.
            //
            // Instead of this height-based approach, an earlier attempt was made at
            // detecting "holistically" whether the block index under consideration
            // relied on an assumed-valid ancestor, but this proved to be too slow to
            // be practical.
            for (CChainState* chainstate : chainman.GetAll()) {
                if (chainstate->reliesOnAssumedValid() ||
                        pindex->nHeight < first_assumed_valid_height) {
                    chainstate->setBlockIndexCandidates.insert(pindex);
                }
            }
        }
        if (pindex->nStatus & BLOCK_FAILED_MASK && (!chainman.m_best_invalid || pindex->nChainWork > chainman.m_best_invalid->nChainWork)) {
            chainman.m_best_invalid = pindex;
        }
        if (pindex->pprev) {
            pindex->BuildSkip();
        }
        if (pindex->IsValid(BLOCK_VALID_TREE) && (pindexBestHeader == nullptr || CBlockIndexWorkComparator()(pindexBestHeader, pindex)))
            pindexBestHeader = pindex;
    }

    return true;
}

void BlockManager::Unload()
{
    m_blocks_unlinked.clear();

    for (const BlockMap::value_type& entry : m_block_index) {
        delete entry.second;
    }

    m_block_index.clear();

    m_blockfile_info.clear();
    m_last_blockfile = 0;
    m_dirty_blockindex.clear();
    m_dirty_fileinfo.clear();
}

bool BlockManager::WriteBlockIndexDB()
{
    AssertLockHeld(::cs_main);
    std::vector<std::pair<int, const CBlockFileInfo*>> vFiles;
    vFiles.reserve(m_dirty_fileinfo.size());
    for (std::set<int>::iterator it = m_dirty_fileinfo.begin(); it != m_dirty_fileinfo.end();) {
        vFiles.push_back(std::make_pair(*it, &m_blockfile_info[*it]));
        m_dirty_fileinfo.erase(it++);
    }
    std::vector<const CBlockIndex*> vBlocks;
    vBlocks.reserve(m_dirty_blockindex.size());
    for (std::set<CBlockIndex*>::iterator it = m_dirty_blockindex.begin(); it != m_dirty_blockindex.end();) {
        vBlocks.push_back(*it);
        m_dirty_blockindex.erase(it++);
    }
    if (!m_block_tree_db->WriteBatchSync(vFiles, m_last_blockfile, vBlocks)) {
        return false;
    }
    return true;
}

bool BlockManager::LoadBlockIndexDB(ChainstateManager& chainman)
{
    if (!LoadBlockIndex(::Params().GetConsensus(), chainman)) {
        return false;
    }

    // Load block file info
    m_block_tree_db->ReadLastBlockFile(m_last_blockfile);
    m_blockfile_info.resize(m_last_blockfile + 1);
    LogPrintf("%s: last block file = %i\n", __func__, m_last_blockfile);
    for (int nFile = 0; nFile <= m_last_blockfile; nFile++) {
        m_block_tree_db->ReadBlockFileInfo(nFile, m_blockfile_info[nFile]);
    }
    LogPrintf("%s: last block file info: %s\n", __func__, m_blockfile_info[m_last_blockfile].ToString());
    for (int nFile = m_last_blockfile + 1; true; nFile++) {
        CBlockFileInfo info;
        if (m_block_tree_db->ReadBlockFileInfo(nFile, info)) {
            m_blockfile_info.push_back(info);
        } else {
            break;
        }
    }

    // Check presence of blk files
    LogPrintf("Checking all blk files are present...\n");
    std::set<int> setBlkDataFiles;
    for (const std::pair<const uint256, CBlockIndex*>& item : m_block_index) {
        CBlockIndex* pindex = item.second;
        if (pindex->nStatus & BLOCK_HAVE_DATA) {
            setBlkDataFiles.insert(pindex->nFile);
        }
    }
    for (std::set<int>::iterator it = setBlkDataFiles.begin(); it != setBlkDataFiles.end(); it++) {
        FlatFilePos pos(*it, 0);
        if (CAutoFile(OpenBlockFile(pos, true), SER_DISK, CLIENT_VERSION).IsNull()) {
            return false;
        }
    }

    // Check whether we have ever pruned block & undo files
    m_block_tree_db->ReadFlag("prunedblockfiles", fHavePruned);
    if (fHavePruned) {
        LogPrintf("LoadBlockIndexDB(): Block files have previously been pruned\n");
    }

    // Check whether we need to continue reindexing
    bool fReindexing = false;
    m_block_tree_db->ReadReindexing(fReindexing);
    if (fReindexing) fReindex = true;

    // Check whether we have the name history
    m_block_tree_db->ReadFlag("namehistory", fNameHistory);
    LogPrintf("LoadBlockIndexDB(): name history %s\n", fNameHistory ? "enabled" : "disabled");

    return true;
}

CBlockIndex* BlockManager::GetLastCheckpoint(const CCheckpointData& data)
{
    const MapCheckpoints& checkpoints = data.mapCheckpoints;

    for (const MapCheckpoints::value_type& i : reverse_iterate(checkpoints)) {
        const uint256& hash = i.second;
        CBlockIndex* pindex = LookupBlockIndex(hash);
        if (pindex) {
            return pindex;
        }
    }
    return nullptr;
}

bool IsBlockPruned(const CBlockIndex* pblockindex)
{
    AssertLockHeld(::cs_main);
    return (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0);
}

// If we're using -prune with -reindex, then delete block files that will be ignored by the
// reindex.  Since reindexing works by starting at block file 0 and looping until a blockfile
// is missing, do the same here to delete any later block files after a gap.  Also delete all
// rev files since they'll be rewritten by the reindex anyway.  This ensures that m_blockfile_info
// is in sync with what's actually on disk by the time we start downloading, so that pruning
// works correctly.
void CleanupBlockRevFiles()
{
    std::map<std::string, fs::path> mapBlockFiles;

    // Glob all blk?????.dat and rev?????.dat files from the blocks directory.
    // Remove the rev files immediately and insert the blk file paths into an
    // ordered map keyed by block file index.
    LogPrintf("Removing unusable blk?????.dat and rev?????.dat files for -reindex with -prune\n");
    fs::path blocksdir = gArgs.GetBlocksDirPath();
    for (fs::directory_iterator it(blocksdir); it != fs::directory_iterator(); it++) {
        const std::string path = fs::PathToString(it->path().filename());
        if (fs::is_regular_file(*it) &&
            path.length() == 12 &&
            path.substr(8,4) == ".dat")
        {
            if (path.substr(0, 3) == "blk") {
                mapBlockFiles[path.substr(3, 5)] = it->path();
            } else if (path.substr(0, 3) == "rev") {
                remove(it->path());
            }
        }
    }

    // Remove all block files that aren't part of a contiguous set starting at
    // zero by walking the ordered map (keys are block file indices) by
    // keeping a separate counter.  Once we hit a gap (or if 0 doesn't exist)
    // start removing block files.
    int nContigCounter = 0;
    for (const std::pair<const std::string, fs::path>& item : mapBlockFiles) {
        if (LocaleIndependentAtoi<int>(item.first) == nContigCounter) {
            nContigCounter++;
            continue;
        }
        remove(item.second);
    }
}

CBlockFileInfo* BlockManager::GetBlockFileInfo(size_t n)
{
    LOCK(cs_LastBlockFile);

    return &m_blockfile_info.at(n);
}

static bool UndoWriteToDisk(const CBlockUndo& blockundo, FlatFilePos& pos, const uint256& hashBlock, const CMessageHeader::MessageStartChars& messageStart)
{
    // Open history file to append
    CAutoFile fileout(OpenUndoFile(pos), SER_DISK, CLIENT_VERSION);
    if (fileout.IsNull()) {
        return error("%s: OpenUndoFile failed", __func__);
    }

    // Write index header
    unsigned int nSize = GetSerializeSize(blockundo, fileout.GetVersion());
    fileout << messageStart << nSize;

    // Write undo data
    long fileOutPos = ftell(fileout.Get());
    if (fileOutPos < 0) {
        return error("%s: ftell failed", __func__);
    }
    pos.nPos = (unsigned int)fileOutPos;
    fileout << blockundo;

    // calculate & write checksum
    CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION);
    hasher << hashBlock;
    hasher << blockundo;
    fileout << hasher.GetHash();

    return true;
}

bool UndoReadFromDisk(CBlockUndo& blockundo, const CBlockIndex* pindex)
{
    const FlatFilePos pos{WITH_LOCK(::cs_main, return pindex->GetUndoPos())};

    if (pos.IsNull()) {
        return error("%s: no undo data available", __func__);
    }

    // Open history file to read
    CAutoFile filein(OpenUndoFile(pos, true), SER_DISK, CLIENT_VERSION);
    if (filein.IsNull()) {
        return error("%s: OpenUndoFile failed", __func__);
    }

    // Read block
    uint256 hashChecksum;
    CHashVerifier<CAutoFile> verifier(&filein); // We need a CHashVerifier as reserializing may lose data
    try {
        verifier << pindex->pprev->GetBlockHash();
        verifier >> blockundo;
        filein >> hashChecksum;
    } catch (const std::exception& e) {
        return error("%s: Deserialize or I/O error - %s", __func__, e.what());
    }

    // Verify checksum
    if (hashChecksum != verifier.GetHash()) {
        return error("%s: Checksum mismatch", __func__);
    }

    return true;
}

void BlockManager::FlushUndoFile(int block_file, bool finalize)
{
    FlatFilePos undo_pos_old(block_file, m_blockfile_info[block_file].nUndoSize);
    if (!UndoFileSeq().Flush(undo_pos_old, finalize)) {
        AbortNode("Flushing undo file to disk failed. This is likely the result of an I/O error.");
    }
}

void BlockManager::FlushBlockFile(bool fFinalize, bool finalize_undo)
{
    LOCK(cs_LastBlockFile);
    FlatFilePos block_pos_old(m_last_blockfile, m_blockfile_info[m_last_blockfile].nSize);
    if (!BlockFileSeq().Flush(block_pos_old, fFinalize)) {
        AbortNode("Flushing block file to disk failed. This is likely the result of an I/O error.");
    }
    // we do not always flush the undo file, as the chain tip may be lagging behind the incoming blocks,
    // e.g. during IBD or a sync after a node going offline
    if (!fFinalize || finalize_undo) FlushUndoFile(m_last_blockfile, finalize_undo);
}

uint64_t BlockManager::CalculateCurrentUsage()
{
    LOCK(cs_LastBlockFile);

    uint64_t retval = 0;
    for (const CBlockFileInfo& file : m_blockfile_info) {
        retval += file.nSize + file.nUndoSize;
    }
    return retval;
}

void UnlinkPrunedFiles(const std::set<int>& setFilesToPrune)
{
    for (std::set<int>::iterator it = setFilesToPrune.begin(); it != setFilesToPrune.end(); ++it) {
        FlatFilePos pos(*it, 0);
        fs::remove(BlockFileSeq().FileName(pos));
        fs::remove(UndoFileSeq().FileName(pos));
        LogPrint(BCLog::BLOCKSTORE, "Prune: %s deleted blk/rev (%05u)\n", __func__, *it);
    }
}

static FlatFileSeq BlockFileSeq()
{
    return FlatFileSeq(gArgs.GetBlocksDirPath(), "blk", gArgs.GetBoolArg("-fastprune", false) ? 0x4000 /* 16kb */ : BLOCKFILE_CHUNK_SIZE);
}

static FlatFileSeq UndoFileSeq()
{
    return FlatFileSeq(gArgs.GetBlocksDirPath(), "rev", UNDOFILE_CHUNK_SIZE);
}

FILE* OpenBlockFile(const FlatFilePos& pos, bool fReadOnly)
{
    return BlockFileSeq().Open(pos, fReadOnly);
}

/** Open an undo file (rev?????.dat) */
static FILE* OpenUndoFile(const FlatFilePos& pos, bool fReadOnly)
{
    return UndoFileSeq().Open(pos, fReadOnly);
}

fs::path GetBlockPosFilename(const FlatFilePos& pos)
{
    return BlockFileSeq().FileName(pos);
}

bool BlockManager::FindBlockPos(FlatFilePos& pos, unsigned int nAddSize, unsigned int nHeight, CChain& active_chain, uint64_t nTime, bool fKnown)
{
    LOCK(cs_LastBlockFile);

    unsigned int nFile = fKnown ? pos.nFile : m_last_blockfile;
    if (m_blockfile_info.size() <= nFile) {
        m_blockfile_info.resize(nFile + 1);
    }

    bool finalize_undo = false;
    if (!fKnown) {
        while (m_blockfile_info[nFile].nSize + nAddSize >= (gArgs.GetBoolArg("-fastprune", false) ? 0x10000 /* 64kb */ : MAX_BLOCKFILE_SIZE)) {
            // when the undo file is keeping up with the block file, we want to flush it explicitly
            // when it is lagging behind (more blocks arrive than are being connected), we let the
            // undo block write case handle it
            finalize_undo = (m_blockfile_info[nFile].nHeightLast == (unsigned int)active_chain.Tip()->nHeight);
            nFile++;
            if (m_blockfile_info.size() <= nFile) {
                m_blockfile_info.resize(nFile + 1);
            }
        }
        pos.nFile = nFile;
        pos.nPos = m_blockfile_info[nFile].nSize;
    }

    if ((int)nFile != m_last_blockfile) {
        if (!fKnown) {
            LogPrint(BCLog::BLOCKSTORE, "Leaving block file %i: %s\n", m_last_blockfile, m_blockfile_info[m_last_blockfile].ToString());
        }
        FlushBlockFile(!fKnown, finalize_undo);
        m_last_blockfile = nFile;
    }

    m_blockfile_info[nFile].AddBlock(nHeight, nTime);
    if (fKnown) {
        m_blockfile_info[nFile].nSize = std::max(pos.nPos + nAddSize, m_blockfile_info[nFile].nSize);
    } else {
        m_blockfile_info[nFile].nSize += nAddSize;
    }

    if (!fKnown) {
        bool out_of_space;
        size_t bytes_allocated = BlockFileSeq().Allocate(pos, nAddSize, out_of_space);
        if (out_of_space) {
            return AbortNode("Disk space is too low!", _("Disk space is too low!"));
        }
        if (bytes_allocated != 0 && fPruneMode) {
            m_check_for_pruning = true;
        }
    }

    m_dirty_fileinfo.insert(nFile);
    return true;
}

bool BlockManager::FindUndoPos(BlockValidationState& state, int nFile, FlatFilePos& pos, unsigned int nAddSize)
{
    pos.nFile = nFile;

    LOCK(cs_LastBlockFile);

    pos.nPos = m_blockfile_info[nFile].nUndoSize;
    m_blockfile_info[nFile].nUndoSize += nAddSize;
    m_dirty_fileinfo.insert(nFile);

    bool out_of_space;
    size_t bytes_allocated = UndoFileSeq().Allocate(pos, nAddSize, out_of_space);
    if (out_of_space) {
        return AbortNode(state, "Disk space is too low!", _("Disk space is too low!"));
    }
    if (bytes_allocated != 0 && fPruneMode) {
        m_check_for_pruning = true;
    }

    return true;
}

static bool WriteBlockToDisk(const CBlock& block, FlatFilePos& pos, const CMessageHeader::MessageStartChars& messageStart)
{
    // Open history file to append
    CAutoFile fileout(OpenBlockFile(pos), SER_DISK, CLIENT_VERSION);
    if (fileout.IsNull()) {
        return error("WriteBlockToDisk: OpenBlockFile failed");
    }

    // Write index header
    unsigned int nSize = GetSerializeSize(block, fileout.GetVersion());
    fileout << messageStart << nSize;

    // Write block
    long fileOutPos = ftell(fileout.Get());
    if (fileOutPos < 0) {
        return error("WriteBlockToDisk: ftell failed");
    }
    pos.nPos = (unsigned int)fileOutPos;
    fileout << block;

    return true;
}

bool BlockManager::WriteUndoDataForBlock(const CBlockUndo& blockundo, BlockValidationState& state, CBlockIndex* pindex, const CChainParams& chainparams)
{
    AssertLockHeld(::cs_main);
    // Write undo information to disk
    if (pindex->GetUndoPos().IsNull()) {
        FlatFilePos _pos;
        if (!FindUndoPos(state, pindex->nFile, _pos, ::GetSerializeSize(blockundo, CLIENT_VERSION) + 40)) {
            return error("ConnectBlock(): FindUndoPos failed");
        }
        if (!UndoWriteToDisk(blockundo, _pos, pindex->pprev->GetBlockHash(), chainparams.MessageStart())) {
            return AbortNode(state, "Failed to write undo data");
        }
        // rev files are written in block height order, whereas blk files are written as blocks come in (often out of order)
        // we want to flush the rev (undo) file once we've written the last block, which is indicated by the last height
        // in the block file info as below; note that this does not catch the case where the undo writes are keeping up
        // with the block writes (usually when a synced up node is getting newly mined blocks) -- this case is caught in
        // the FindBlockPos function
        if (_pos.nFile < m_last_blockfile && static_cast<uint32_t>(pindex->nHeight) == m_blockfile_info[_pos.nFile].nHeightLast) {
            FlushUndoFile(_pos.nFile, true);
        }

        // update nUndoPos in block index
        pindex->nUndoPos = _pos.nPos;
        pindex->nStatus |= BLOCK_HAVE_UNDO;
        m_dirty_blockindex.insert(pindex);
    }

    return true;
}

/* Generic implementation of block reading that can handle
   both a block and its header.  */

template<typename T>
static bool ReadBlockOrHeader(T& block, const FlatFilePos& pos, const Consensus::Params& consensusParams)
{
    block.SetNull();

    // Open history file to read
    CAutoFile filein(OpenBlockFile(pos, true), SER_DISK, CLIENT_VERSION);
    if (filein.IsNull()) {
        return error("ReadBlockFromDisk: OpenBlockFile failed for %s", pos.ToString());
    }

    // Read block
    try {
        filein >> block;
    } catch (const std::exception& e) {
        return error("%s: Deserialize or I/O error - %s at %s", __func__, e.what(), pos.ToString());
    }

    // Check the header
    if (!CheckProofOfWork(block, consensusParams)) {
        return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString());
    }

    // Signet only: check block solution
    if (consensusParams.signet_blocks && !CheckSignetBlockSolution(block, consensusParams)) {
        return error("ReadBlockFromDisk: Errors in block solution at %s", pos.ToString());
    }

    return true;
}

template<typename T>
static bool ReadBlockOrHeader(T& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams)
{
    const FlatFilePos block_pos{WITH_LOCK(cs_main, return pindex->GetBlockPos())};

    if (!ReadBlockOrHeader(block, block_pos, consensusParams)) {
        return false;
    }
    if (block.GetHash() != pindex->GetBlockHash()) {
        return error("ReadBlockFromDisk(CBlock&, CBlockIndex*): GetHash() doesn't match index for %s at %s",
                     pindex->ToString(), block_pos.ToString());
    }
    return true;
}

bool ReadBlockFromDisk(CBlock& block, const FlatFilePos& pos, const Consensus::Params& consensusParams)
{
    return ReadBlockOrHeader(block, pos, consensusParams);
}

bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams)
{
    return ReadBlockOrHeader(block, pindex, consensusParams);
}

bool ReadBlockHeaderFromDisk(CBlockHeader& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams)
{
    return ReadBlockOrHeader(block, pindex, consensusParams);
}

bool ReadRawBlockFromDisk(std::vector<uint8_t>& block, const FlatFilePos& pos, const CMessageHeader::MessageStartChars& message_start)
{
    FlatFilePos hpos = pos;
    hpos.nPos -= 8; // Seek back 8 bytes for meta header
    CAutoFile filein(OpenBlockFile(hpos, true), SER_DISK, CLIENT_VERSION);
    if (filein.IsNull()) {
        return error("%s: OpenBlockFile failed for %s", __func__, pos.ToString());
    }

    try {
        CMessageHeader::MessageStartChars blk_start;
        unsigned int blk_size;

        filein >> blk_start >> blk_size;

        if (memcmp(blk_start, message_start, CMessageHeader::MESSAGE_START_SIZE)) {
            return error("%s: Block magic mismatch for %s: %s versus expected %s", __func__, pos.ToString(),
                    HexStr(blk_start),
                    HexStr(message_start));
        }

        if (blk_size > MAX_SIZE) {
            return error("%s: Block data is larger than maximum deserialization size for %s: %s versus %s", __func__, pos.ToString(),
                    blk_size, MAX_SIZE);
        }

        block.resize(blk_size); // Zeroing of memory is intentional here
        filein.read(MakeWritableByteSpan(block));
    } catch (const std::exception& e) {
        return error("%s: Read from block file failed: %s for %s", __func__, e.what(), pos.ToString());
    }

    return true;
}

/** Store block on disk. If dbp is non-nullptr, the file is known to already reside on disk */
FlatFilePos BlockManager::SaveBlockToDisk(const CBlock& block, int nHeight, CChain& active_chain, const CChainParams& chainparams, const FlatFilePos* dbp)
{
    unsigned int nBlockSize = ::GetSerializeSize(block, CLIENT_VERSION);
    FlatFilePos blockPos;
    if (dbp != nullptr) {
        blockPos = *dbp;
    }
    if (!FindBlockPos(blockPos, nBlockSize + 8, nHeight, active_chain, block.GetBlockTime(), dbp != nullptr)) {
        error("%s: FindBlockPos failed", __func__);
        return FlatFilePos();
    }
    if (dbp == nullptr) {
        if (!WriteBlockToDisk(block, blockPos, chainparams.MessageStart())) {
            AbortNode("Failed to write block");
            return FlatFilePos();
        }
    }
    return blockPos;
}

struct CImportingNow {
    CImportingNow()
    {
        assert(fImporting == false);
        fImporting = true;
    }

    ~CImportingNow()
    {
        assert(fImporting == true);
        fImporting = false;
    }
};

void ThreadImport(ChainstateManager& chainman, std::vector<fs::path> vImportFiles, const ArgsManager& args)
{
    SetSyscallSandboxPolicy(SyscallSandboxPolicy::INITIALIZATION_LOAD_BLOCKS);
    ScheduleBatchPriority();

    {
        CImportingNow imp;

        // -reindex
        if (fReindex) {
            int nFile = 0;
            while (true) {
                FlatFilePos pos(nFile, 0);
                if (!fs::exists(GetBlockPosFilename(pos))) {
                    break; // No block files left to reindex
                }
                FILE* file = OpenBlockFile(pos, true);
                if (!file) {
                    break; // This error is logged in OpenBlockFile
                }
                LogPrintf("Reindexing block file blk%05u.dat...\n", (unsigned int)nFile);
                chainman.ActiveChainstate().LoadExternalBlockFile(file, &pos);
                if (ShutdownRequested()) {
                    LogPrintf("Shutdown requested. Exit %s\n", __func__);
                    return;
                }
                nFile++;
            }
            WITH_LOCK(::cs_main, chainman.m_blockman.m_block_tree_db->WriteReindexing(false));
            fReindex = false;
            LogPrintf("Reindexing finished\n");
            // To avoid ending up in a situation without genesis block, re-try initializing (no-op if reindexing worked):
            chainman.ActiveChainstate().LoadGenesisBlock();
        }

        // -loadblock=
        for (const fs::path& path : vImportFiles) {
            FILE* file = fsbridge::fopen(path, "rb");
            if (file) {
                LogPrintf("Importing blocks file %s...\n", fs::PathToString(path));
                chainman.ActiveChainstate().LoadExternalBlockFile(file);
                if (ShutdownRequested()) {
                    LogPrintf("Shutdown requested. Exit %s\n", __func__);
                    return;
                }
            } else {
                LogPrintf("Warning: Could not open blocks file %s\n", fs::PathToString(path));
            }
        }

        // scan for better chains in the block chain database, that are not yet connected in the active best chain

        // We can't hold cs_main during ActivateBestChain even though we're accessing
        // the chainman unique_ptrs since ABC requires us not to be holding cs_main, so retrieve
        // the relevant pointers before the ABC call.
        for (CChainState* chainstate : WITH_LOCK(::cs_main, return chainman.GetAll())) {
            BlockValidationState state;
            if (!chainstate->ActivateBestChain(state, nullptr)) {
                LogPrintf("Failed to connect best block (%s)\n", state.ToString());
                StartShutdown();
                return;
            }
        }

        if (args.GetBoolArg("-stopafterblockimport", DEFAULT_STOPAFTERBLOCKIMPORT)) {
            LogPrintf("Stopping after block import\n");
            StartShutdown();
            return;
        }
    } // End scope of CImportingNow
    chainman.ActiveChainstate().LoadMempool(args);
}
} // namespace node

redpajama_set_name: RedPajamaGithub


The giving away of jerseys, shoes, and other accessories by players after games or practices is nothing new. It's a kind gesture from the athlete to his or her fans that helps strengthen loyalty and gives them a piece of memorabilia that they can cherish or toss on eBay for some extra coin.
For Redskins' cornerback, DeAngelo Hall, he played the role of good guy athlete and gave away a pair of his cleats to a fan after the end of a recent practice in Richmond, Virginia. Unfortunately for Hall, he forgot those cleats contained something he really needed, his custom insoles. So Hall took to Twitter to reach out to the person asking for his cleats back and in exchange, Hall promised to give the fan a little something extra for their troubles. Hopefully, the fan does the right thing and gives Hall back his insoles.
I'll give you something extra special like a game jersey or tics to a game. Thanks and sorry for the inconvenience.


text:
Science Chemistry Reaction rate
What are examples of the rate of reaction?
Measuring Reactions:
There are many parameters that influence how quickly reactions take place. Some can be very fast, such as during chemical explosions, and some can take millions of years, such as the the radioactive decay of uranium to lead. How fast things happen is referred to as the rate of reaction.
Rates of reaction or reaction rates are related to the progression in time towards completion of a chemical reaction. An example is how fast aqueous...
Rate of a Chemical Reaction: Modifying Factors
Chapter 12 / Lesson 1
Learn about the rate of reaction. Understand the factors affecting the rate of reaction and see how catalyst, concentration, temperature and surface area affect it.
What is the rate of reaction?
What is an example of a coupled reaction?
What are the units for rate of reaction?
What is the definition of reaction rate in chemistry?
What does a chemical reaction rate measure?
What information does a reaction rate give?
What can change the rate of a reaction?
How is rate of reaction measured?
What is a chemical reaction and what are some examples?
What are some examples of zero-order reactions?
What is meant by the rate of a chemical reaction?
What is an example of an equilibrium reaction?
What is the rate constant of a chemical reaction?
How is the rate of a chemical reaction expressed?
What are examples of a decomposition reaction?
If the rate of a reaction at 20 C is 0.0400 mol/s, what is the rate at 30 C?
In a chemical reaction, under what conditions would pressure affect the reaction rate?
What is an example of the heat of reaction?
Which is an example of a chemical reaction?
What is an example of a first order reaction?
What is an example of a synthesis reaction?
What is an example of a third-order reaction?
How do reaction rates change with time?
How do you determine the rate of a chemical reaction?
What are examples of neutralization reactions?
What will speed up a chemical reaction?
How does temperature affect the rate of reaction?
How can you change the rate of a chemical reaction?
How is the rate of a chemical reaction measured?
What is an example of an exothermic reaction?
What are examples of inhibitors in chemical reactions?
What can cause an increase in the rate of a chemical reaction?
How to calculate the rate of reaction in chemistry?
What are examples of a reversible reaction?
What would the reaction mechanism be for the reaction below?
How can one increase the rate of a chemical reaction?
List four factors that affect the reaction rate of a homogeneous reaction.
What are two examples of chemical reactions at different speeds?
How does concentration affect reaction rate?
How does concentration affect the rate of reaction?
How do you find the rate constant of a reaction?
What are examples of activation energy in chemistry?
What is an action reaction pair?
What factors influence the rate of a chemical reaction?
Discuss the different factors affecting the rate of reaction.
What are examples of spontaneous and nonspontaneous reactions?
What is the chemical rate law?
What is an example of a redox reaction?
What is a coupled reaction used for?
What is an example of a reversible chemical reaction?
What substance speeds up a chemical reaction?
The overall reaction of A to D can be described by the following equation: A goes to B fast, B goes to C slow, and C goes to D fast. What would be the rate law for the overall reaction of A to D? a. Rate = k D/A b. Rate = kB c. Rate = B d. Rate = kC/B
What is reaction yield?
What is the product of the reaction given below?
What is the product of the reaction given?
How does a decrease in the temperature of a chemical reaction affect the reaction rate?
What are the products of this reaction?
How does temperature affect the rate of a chemical reaction?
What are the products in a chemical reaction?
Explain this reaction.
Give an example of a precipitation reaction.
How does concentration affect the rate of a chemical reaction?
What are the basic chemical reactions?
What is/are the major product(s) of this reaction?
What are chemical reactions used for?
How does an increase in reactant concentration affect the rate of reaction?
Give an example of a common chemical reaction that occurs in nature.
The reactant concentration in a second-order reaction was 0.210 M after 290 s and 2.10 x 10-2 M after 735 s. What is the rate constant for this reaction? Express your answer with the appropriate units.
What is a chemical reaction?
What do chemical reactions produce?
From the data, determine the rate law for the reaction.
What are the reagents in a chemical reaction?
What accelerates a chemical reaction?
In 75 seconds, a certain first-order reaction A --> B is 40% complete (i.e., with 60% of the reactant remaining). What is the rate constant, k, of the reaction?
What is kinetics in physical chemistry?
What does a catalyst do in a chemical reaction?
What is a catalyst in a chemical reaction?
Identify what reaction mechanism occurs in the reaction shown below.
What are three observations that would indicate a chemical reaction has taken place?
What is the mechanism for the reaction below?
What is the mechanism for this reaction?
What is the major product of the reaction below?
Define order of reaction
What is a concise representation of a chemical reaction?
What is a physical reaction in chemistry?
What is an intermediate in a chemical reaction?
What is the activation energy of a chemical reaction?
What is the order of the reaction in NO2?
What is order of reaction?
Identify what occurs in the reaction shown below.
What can you decrease to speed up a chemical reaction?
Discuss the various factors that may alter the rate of a chemical reaction.
What are some examples of oxidation reduction reactions?
Express the rate of the following reaction: CH_4(g) + 2O_2(g) \to CO_2(g) + 2H_2O(g)
What does a chemical reaction do?
What quantitively measurements would be appropriate in order to determine a rate of reaction in the following
What is the definition of a second-order reaction?
What is the overall order of the reaction?
How does increasing the pressure affect the reaction rate?
What is the heat of a reaction?

redpajama_set_name: RedPajamaCommonCrawl


text:
/Yeahhh
Essay by 24 • December 4, 2010 • 728 Words (3 Pages) • 1,025 Views
Essay Preview: Yeahhh
The Jackson democrats attempted to amplify the strength of lower classes' poor, while decreasing the influence of the rich and powerful. Economically, they benefited from governing during a time of leading advances in transportation, which boosted commerce and helped the common man. Politically, they invested power into an overwhelmingly powerful executive branch. The Jacksonian democrats portrayed themselves as saviors of the common people and ruled via a powerful executive who attempted to destroy aristocracy in America. However, they were atypically wealthy, supported equality between white men only, enacted disastrous economic policies and disregarded the capability of the federal government. Further, they did not introduce democracy in America, rather merely used it and benefited from it.
During the first half of the 19th century numerous advancements enhanced the growth of the United States. A market revolution occurred as a yeoman and cash crop agriculture and capitalist manufacturing replaced artisan economy. Despite the prosperity, a split was emerging between the industrializing urban north, rural South, and the expanding West. The Jacksonians passed the Tariff of 1828, which opened opportunity for western agriculture and New England manufacturing, but was detrimental to the South. Andrew Jackson and Jacksonian democrats believed that the US bank placed too much control into the hands of a wealthy few. Due to this fact, Jackson vetoed the bank's recharter in 1832. In attempt to benefit the lower, working classes, he placed the federal money in "pet" state banks. This attempt destabilized the national currency, decreased currency in markets, and displayed favoritism in Jacksonian policies. Like most Jacksonian economic policies it failed and the reduction in currency spread inflation which the Treasury Act of 1840 could not stop. Jacksonians tried to assist whites through economic policies but failed.
Foreign observers viewed that in America, every man is free and independent, but there was great division in American attitude. Disturbances and insurrections broke out across the country by minorities, because they were not helped by egalitarian efforts which were focused on white males. Jackson's hypocrisy and cruelty in his Indian removal practices (after his decisive victory at Horseshoe Bend, Alabama, March 1814) showed the non-universal principles held by the democrats. Fearful of angering Southern voters, Jacksonians veered away from extending egalitarian policies to slaves. Women received little improvement. Although viewed as defenders of all common men, Jacksonian democrats shunned minorities and only assisted white men.
Andrew Jackson was the first president to fully utilize the powers of the executive branch and establish it as an equal, if not superior branch. Henry Clay viewed Jackson as dictatorial and unconstitutional and persuaded the Congress to discipline him in 1834, but Jacksonian propaganda
Download as: txt (4.8 Kb) pdf (76.8 Kb) docx (10.2 Kb)
(2010, 12). Yeahhh. Essays24.com. Retrieved 12, 2010, from https://www.essays24.com/essay/Yeahhh/17157.html
"Yeahhh" Essays24.com. 12 2010. 2010. 12 2010 <https://www.essays24.com/essay/Yeahhh/17157.html>.
"Yeahhh." Essays24.com. Essays24.com, 12 2010. Web. 12 2010. <https://www.essays24.com/essay/Yeahhh/17157.html>.
"Yeahhh." Essays24.com. 12, 2010. Accessed 12, 2010. https://www.essays24.com/essay/Yeahhh/17157.html.


Our goal is to have very satisfied customers and we go to great lengths to ensure all products we manufacture and send out get to you in perfect condition. However mistakes can and do sometimes happen, and in every instance we will do everything we can so you are totally satisfied with your purchase and our service. We replace all incorrectly supplied orders or orders damaged in transit.
1.1. Inform us within two days of signature of goods and allow us the time to re-collect the goods, inspect the goods & replace the goods.
1.3. Inform us within two days of signature of goods and allow us the time to re-collect the goods, inspect the goods & replace the goods.
2. In the case of personalised goods we do not offer refunds or accept return on correctly supplied products.
2.1. Any other product we supply which we do not manufacture may be returned to us within 7 days at your expense in the original packaging, if we then deem the items to be in perfect condition and ready for re-sale, we will refund the cost of the item(s) back onto the payment method within 30 days.
3. If goods are returned because they are thought to be not of satisfactory standard in opinion but we the Manufacturer believe the goods to be of a satisfactory standard we reserve the right to refund only part of the amount paid to cover our expenses such as postage, re-collection, manufacture and re-manufacture (if applicable).
4. We do not accept returns unless agreed and or arranged by us.
4.1. In the event of goods being returned without our written consent the goods will be held in their returned condition in despatch for a period of 4 weeks, when this 4 week period expires the goods will be disposed of.
All of the above sounds pretty daunting and formal, however you will find us very easy to deal with and no problem is too small or big for us to work with you to sort out.
We undertstand that sometimes an order might be placed in haste or even in error, if an order is placed and not manufactured we will cancel the order and refund the total value of the order.
1. If an order / quote is placed and not manufactured (e.g. personalised) and not dispatched, we will cancel the order and refund all monies paid if applicable.
1. 1. If an order is placed and manufactured (e.g. personalised) and then cancelled (for any reason) you are to pay us the full current retail value.
1.2 If we fail to manufacture and or deliver (without contact and or explanation ) within a reasonable time, you may cancel the order.
2. Cancellations must be given in writing / email and also verbally over the phone.
We use PayPal and Stripe payment platforms and therefore we do not store or have access to any sensitive payment information. We do store order information for administrative purpose only.
You may not copy any content contained within this entire website without the written consent of Santa Sacks.
When making a purchase you will be agreeing to our terms and conditions. You may be notified of future Santa Sacks news and offers. If you would like to unsubscribe from this simply email your request to info@santasacks.co.uk. There will also be an unsubscribe option on any emails that we send to you.


text:
The Gallery Space
Ag Samhlú Athruithe
burren college of art Gallery
Opening Reception | Thursday | August 20 | 6-8pm
Please wear masks and observe safety measures and social distancing within the gallery.
Visualizar a Mudança
Visualizando Cambio
تصور التغيير
Visualizing Change
Joana Alarcão
Duaa Bilbeisi
Herminia Ayala Reyes
Burren College of Art is pleased to host an exhibition of our MA in Art & Ecology graduates, Joana Alarcão and Herminia Ayala Reyes, and Post Baccalaureate in Studio Art, Duaa Bilbeisi. The exhibition, Ag Samhlú Athruithe, (Visualizing Change) is a prescient description of current times. The works by each of these artists from Portugal, Spain and Jordan employ a range of media to investigate concepts of strength, gender, the environment and new directions for the future.
Please join us for the opening reception of the exhibition on Thursday, August 20th. The exhibition will run until Friday, September 11, and the Gallery will be open to the public Monday-Friday from 9:30am – 5:00pm.
Contact: Lisa Newman at lisa@burrencollege.ie
Joana Alarcão is a Portuguese artist based in Lisbon. She has a degree in Sculpture from The University of Fine Arts in Lisbon, a diploma of Level IV technician in Ceramic and is currently completing her MA in Art & Ecology at Burren College of Art, Ireland. She had her work showcased in collective exhibitions and recently exhibited solo at the Faculty of Science & Technology in Caparica, Portugal. She also has her work featured in online galleries, Wotisart and A5 Magazines, and has taken part in various residencies and workshops, such as residences of land art and Rural painting workshops.
By creating sculptures and charcoal drawings influenced by environmental practices, she explores human behaviour and climate change from multiple lenses and brings awareness to the corrosive social alienation toward the environment, and even human beings. The contrast of how nature is consecutively part of the human species, and our reaction toward it, led her sculptures and drawings to be mostly human-referenced and made with naturally made materials. The friction behind these two arguments is a major aspect of her practice.
Nature is perfect, but not beautiful, and that includes humans.
Assessing the impact of climate change goes beyond economic, political and social lens; the real threat to the environment is the individual even though it can also begin to be the solution. Human society evolved around myths and social hierarchies that can provide an answer to unravel the question of climate change standpoints. Researching these patterns and the human cognitive system has been the primal goal of my practice. I work primarily with sculpture, charcoal drawings, documentary photography and installation.
My sculptures are made with raw materials – clay, wood and stone – mostly found in non- industrial areas, using the traditional way of carving, as the physicality of the body in space and it is own self-sufficiency is my way of relating more intimately with the materials. Carving intuitively is a direct approach to deep ecology theories and by using the human body as a subject I can relate to social behaviours, alienation of the self and anthropomorphic views.
As a drawing practice, I create alternative realities where the subject is confronted when reaching insanity, doing grotesque or dramatized actions. These actions are a reflection of our current ways of thinking and are meant to be understood as a possible outcome, using exaggeration as a medium. To explore the physicality of drawing, the charcoal used is fabricated personally, to become as involved with the methods used and their emotional charged concepts.
Duaa Bilbeisi a Jordanian artist based in Amman, who comes from a business academic background with an MBA in Business Administration and 16 years of professional experience in Finance. Duaa found herself in art since 2008 and took many steps toward studying art to graduate recently as a Post Baccalaureate at the Burren College of Art. Her main focus is to give examples of strong determinant women who inspired her, and to promote these examples for the benefit of women's wellbeing and as main contributors to the society; giving them hope and strength to stand for themselves and others from all sorts of oppression, injustice and iniquity.
I'm interested in highlighting the importance of women in society and their unique role in shaping communities, standing for their gender, society and humanity as a whole as well as empowering women and raising their self-esteem. Of special interest are those who struggle through inspiration to work on themselves, never give up, and who fight for their existence, rights, beliefs and freedom to achieve equity and, accordingly, long-term prosperity and social welfare.
This series focuses on character, strength, struggles, determination, and risk-taking. Fighting for rights is of great importance as we are still facing oppression around the world, overtly and hidden, with the media or against it. Giving hope through strong examples is what we need to enhance our lives and morals, and to bring our humanity back in full meaning and practice by participating in raising the effort toward equity. As I quote here: Prophet Mohammed- Messenger of Allah (ﷺ) said, "Whoever amongst you sees an evil, he must change it with his hand; if he is unable to do so, then with his tongue; and if he is unable to do so, then with his heart; and that is the weakest form of Faith").
This project contributes to changing the cultural and classical role of women as objects through focusing on their concepts, strengths, capabilities and achievements. By drawing their faces and shoulders, I refer only to their feeling of power, determination and confidence, rather than depicting them as physical objects.
Herminia Ayala Reyes is a graduate of the GMIT Fine Arts Honors degree in (Textiles). Her research and artistic practices draw upon fashion design, traditional crafts, textile arts, costume, set design, and her experience working with theatre companies such as 'Fibin', 'Macnas' and the 'Galway Circus Community'. Utilizing hand weaving, tapestry, and natural fibers, Ayala Reyes's work focuses on eco-textile processes that minimize damage to the environment and highlight both the potentials of ethical traditional crafts. Through investigating and experimenting, Ayala Reyes adapted a personal and unique contemporary aesthetic. Her daily living relationship with Nature and Art guided her to study the MA in Art and Ecology, and live in The Burren.
Respect for tradition, heritage, community, mentors and formative influences form a strong pillar of Herminia's work. In this regard, the continuing guidance of her tutors at the Burren College of Art is gratefully acknowledged along with artists discovered there, such as Ernesto Neto, Ana Mendieta, Pipilotti Rist, Louise Bourgeois, Carl Gustav Jung, and many others, who resonated deeply and provided a better understanding of communication through Art expression. Herminia's travels to South America and Morroco, along with her studies of the artists Andy Goldsworthy, Alice Maher, Anni Albers, Sheila Hicks, Judith Scott, as well as her research of traditional crafts from Ireland, Spain and Europe, all inform her body of work. She shares these influences in the hope of inspiring others to explore these pathways of creative tradition and experimentation.
Her current research and creative approaches include a widening interest in performance art, conceptual methodologies, photography, video, community, and sculpture. Involving her body in the articulation of inner states, Herminia's intuitive work focuses on what is intimate and sensitive, yet transcendental.
"Every human being is an artist, a freedom being called to participate in transforming and reshaping the conditions, thinking, and structures that shape and inform our lives."
― Joseph Beuys
My artistic practice is based around listening to natural cycles, looking for the balance and identity between the animal, vegetable, and rational world. Into the ancestral legacy of my DNA, I feed the traditions, folklore, craft techniques, archaeological remains, shamanism and natural medicines I encounter. These internalized and personal understandings are to be shared with the wider community.
In nature, I find the antidote that reconnects me to the authentic voice of my body and soul. Art occurs for me when my spontaneity flows, connecting my conscience and unconscious through my senses and intuition. Through movement, transformation, repetition and gesture applied to my materials, every creation becomes alive.
Through performance, sculpture, video, photography, installation and the use of recycled, natural, and found materials, concepts like symbiosis-mutation, fertility, shamanism, ancestral rituals, celebration and preservation are expressed. The intention of my work is to transmit a positive ecological message of awareness to the viewer and the community, to aid in the restoration and preservation of the biosphere during this age of the anthropocene.
The realization of natural and wild dyes in my artistic practice is very relevant. Following the cycles of the seasons while searching for plants in the field, I adapt myself to finding the balance between my needs and the needs that the earth offers, in an appropriate way. The plants used for dyes also contain medicinal properties that I also use for my own consumption.
The environment influences all the plants that inhabit it, leaving a unique message in each dye applied to natural fabric. I use vinegar or alum as a mordant by putting the garment in contact with metals – codes, symbols and patterns, appear differently in the fabric.
Through reshaping and mixing found objects, feathers and sticks, I transform a flat garment into tri-dimensional forms.
The ancestral practices of shamanic women involved gatherings and the celebration of the lunar cycles, connected and linked to, menstruation. Through celebration and ritual, they offered their blood as a symbol of fertility to the earth. Such blood also painted caves and objects, marking important moments that occurred in life. My work is an analogy and homage to fertility and life, which inhabits every woman, and a demystification of social arguments, which state that menstruation is to be hidden and dirty.
I gather my menstruation from different moon cycles, and paint on the surface of bones I have found in different ecosystems of the Burren, while also weaving bones with copper, a metal associated with the planet Venus and love. Copper is a transmitter and conductor metal; an earth element used for heat and electricity.
My intention with my art is to create a dialogue between myself, material, space, and the viewer – celebrating with love and respect the planet Earth.


Where else can you find amazing white designs that make you 'wow', if not in Sweden? What you're about to see is no exception. Built in 'wagon' style, this charming attic loft has a living area of 63sqm, and a terrace that occupies 10sqm out of that. Speaking of the terrace, you get out directly from your bedroom making it a must for those thinking of a romantic breakfast with their loved one. One other thing worth mentioning is the amazing contrast of colors that really gets the eye. The red sofa, the plants, the desk and all the little things add up to a very bright interior (lots of windows) with plenty of natural sunlight.


text:
Boys Squash Sports Winter Sports
Lillie Cooper
Andover's Young Talent Shines in Victory Over Milton
Boys Squash • Dec 14, 2018
Andover Suffers Back-to-Back Losses
Girls Squash • Jan 11, 2019
O.Tung/The Phillipian
Dropping only four games over the course of the entire match, Andover Boys Squash earned a 6-1 victory over Brooks on Monday. On Wednesday, the team played at Noble and Greenough, where it fell 4-3 in the close match up. The team's record now stands at 4-2.
In preparation for both matches, the team strategized and played many competitive games during practice, according to Siddhant Sinha '21 and Erik Wang '21.
According to Sinha, the team worked to maximize the use of its practices and discussed strategy to implement in its matches after returning from Winter Break.
Wang added, "In practice, we played a lot of challenge matches and condition games where there is definitely some pressure on ourselves to play our best squash, so emulating these match scenarios helped us deal with actual opponents on court."
Against Brooks, Andover was able to control points and stay focused, according to Arthur Nguyen '22. This enabled the team to secure an early win, according to Head Coach John Roberts.
Nguyen said, "What the team did well was playing good quality shots and controlling the game. We didn't give our opponents any chance to come back. Brooks had a team that never gave up. They definitely did not make the games easy and capitalized on any mistake we made. However, we mentally prepared ourselves for a tough match and were able to deal with Brooks."
In an email to The Phillipian, Coach Roberts wrote, "Brooks has been very strong for a few years but graduated a few players last year. Our boys played at a high pace against Brooks and did a great job of never letting their opponents settle into the match. From the start, they began racking up the games quickly with clinical squash and never let them gain any foothold in the match. In the end, we managed to secure the four crucial wins relatively quickly which was our ultimate goal."
Nguyen commended Captain Alex Bernhard '19 in the Brooks match for his poise and determination on court.
Nguyen said, "What stood out to me [about Bernhard's match] was how he reacted when he lost rallies. He showed no emotion and gave nothing away to his opponent. After the match, Alex was very optimistic and wanted to get better."
The team welcomed three new players to the roster this year. According to Sinha and Roberts, the depth of the team has factored into the success of its matches.
Coach Roberts wrote, "Our greatest strength has been our depth and consistency. Overall as a team, the drop off as you go down the ladder is rather small which makes it very difficult for teams to secure any easy individual matches against, let alone the four needed to win a contest. Our individual performances, thus far, have remained consistent which is a testament to the hard work they've put in during practice time and in the off season."
On Wednesday the team travelled to Nobles, where it faced a challenging, high pace game from its opponents. Despite the loss, the team did well keeping focus and hitting deep shots, according to Wang.
Wang said, "Nobles' top four were all pretty strong, they had a good home crowd going, and also it was hard to deal with their style of play because their general team style was to hit the ball pretty hard and hit at a high pace, which is something Coach Roberts doesn't really like us to do. Keeping up with their pace and not letting them get their strategy into our strategy was pretty difficult."
"Still, we kept our heads in the game with a tough opposing crowd and stuck in the matches for some tough opponents. We dealt with fast courts well, and managed to put them under constant pressure through good deep length and tight rails," continued Wang.
In preparation for its upcoming matches, the team works to reduce unforced errors and improve its movement and mental game, according to Nguyen and Coach Roberts.
Nguyen said, "What I hope for the team to do better is to improve our focus when easy opportunities arise. There were some rallies where my teammates, including me, lost the point by making unforced errors, which we need to fix."
Coach Roberts wrote, "We enter a busy six weeks now with a lot of matches and some tournament play. From a technical standpoint, we're trying to work on moving the ball around the court more efficiently utilizing the height of the wall. From a mental standpoint, trying to instill the belief that they are more than capable of winning matches against opponents who would maybe be heavy favorites on paper but can be broken on the court."
Andover will play Groton at home on Saturday.
Editor's Note: Alex Bernhard is an Eighth Page Editor for The Phillipian.


The meat of the book is a half dozen case studies of protest movements in the early 2010s, from around the world, wherein vocal & active but otherwise ordinary people complained loudly about a failure they attributed to official institutions. As such protesters were reluctant to create or endorse formal organizations or parties, and were much less interested in policy details, they mostly had limited impacts such as getting people to quit or reversing recent policy changes.
Gurri's day job is intelligence analyst, and he seems good at that. That is, he's good at describing concrete events in ways that give the impression that he understands what is going on and could roughly predict what will happen next. Though hard to be sure of that, as he offers no track record of predictions. But the more Gurri generalizes, the more doubts I have. And as the above quotes suggest, he goes quite far in generalization.
First, Gurri claims that the pattern of these early 2010s events shows a fundamental social change from previous decades. But he doesn't actually show this. He only discusses one prior event, Kennedy's Bay of Pigs scandal, where he notes that the media and public mostly forgave Kennedy. Yet the public doesn't scream about most things authorities do today; that doesn't show a change.
Second, Gurri attributes the changes he sees to lower costs of sharing information. Clearly this is right at the finest scales, in the sense that in these events social media often allowed a very rapid transition from a few people complaining online to large groups shouting in big plazas together. But it is much less obvious that cheaper info is the key cause of a less docile, more complainy, less organized public that is less supportive of formal hierarchies. I do find it plausible that the public is getting more polarized, egalitarian, and complainy over decades, but I see other plausible causes of such trends, if in fact these are real trends. Gurri didn't convince me that info costs are more than a minor contributing factor here.


text:
The prognosis of mid-range ejection fraction heart failure: a systematic review and meta-analysis
Saif Altaie, Wissam Khalife
Aims: Mid-range ejection fraction is a new entity of heart failure (HF) with undetermined prognosis till now. In our systematic review and meta-analysis, we assess the mortality and hospitalization rates in mid-range ejection fraction HF (HFmrEF) and compare them with those of reduced ejection fraction heart failure (HFrEF) and preserved ejection fraction HF (HFpEF). Methods and results: We conducted our search in March 2018 in the following databases for relevant articles: PubMed, CENTRAL, Google Scholar, Web of Science, Scopus, NYAM, SIEGLE, GHL, VHL, and POPLINE. Our primary endpoint was assessing all-cause mortality and all-cause hospital re-admission rates in HFmrEF in comparison with HFrEF and HFpEF. Secondary endpoints were the possible causes of death and hospital re-admission. Twenty-five articles were included in our meta-analysis with a total of 606 762 adult cardiac patients. Our meta-analysis showed that HFmrEF had a lower rate of all-cause death than had HFrEF [relative risk (RR), 0.9; 95% confidence interval (CI), 0.85–0.94]. HFpEF showed a higher rate of cardiac mortality than did HFmrEF (RR, 1.09; 95% CI, 1.02–1.16). Also, HFrEF had a higher rate of non-cardiac mortality than had HFmrEF (RR, 1.31; 95% CI, 1.22–1.41). Conclusions: We detected a significant difference between HFrEF and HFmrEF regarding all-cause death, and non-cardiac death, while HFpEF differed significantly from HFmrEF regarding cardiac death.
ESC heart failure
https://doi.org/10.1002/ehf2.12353
Heart failure with mid-range ejection fraction
Altaie, S., & Khalife, W. (Accepted/In press). The prognosis of mid-range ejection fraction heart failure: a systematic review and meta-analysis. ESC heart failure. https://doi.org/10.1002/ehf2.12353
The prognosis of mid-range ejection fraction heart failure : a systematic review and meta-analysis. / Altaie, Saif; Khalife, Wissam.
In: ESC heart failure, 01.01.2018.
Altaie, S & Khalife, W 2018, 'The prognosis of mid-range ejection fraction heart failure: a systematic review and meta-analysis', ESC heart failure. https://doi.org/10.1002/ehf2.12353
Altaie S, Khalife W. The prognosis of mid-range ejection fraction heart failure: a systematic review and meta-analysis. ESC heart failure. 2018 Jan 1. https://doi.org/10.1002/ehf2.12353
Altaie, Saif ; Khalife, Wissam. / The prognosis of mid-range ejection fraction heart failure : a systematic review and meta-analysis. In: ESC heart failure. 2018.
@article{8cbdd9020b73449d91cdedacd548f84e,
title = "The prognosis of mid-range ejection fraction heart failure: a systematic review and meta-analysis",
abstract = "Aims: Mid-range ejection fraction is a new entity of heart failure (HF) with undetermined prognosis till now. In our systematic review and meta-analysis, we assess the mortality and hospitalization rates in mid-range ejection fraction HF (HFmrEF) and compare them with those of reduced ejection fraction heart failure (HFrEF) and preserved ejection fraction HF (HFpEF). Methods and results: We conducted our search in March 2018 in the following databases for relevant articles: PubMed, CENTRAL, Google Scholar, Web of Science, Scopus, NYAM, SIEGLE, GHL, VHL, and POPLINE. Our primary endpoint was assessing all-cause mortality and all-cause hospital re-admission rates in HFmrEF in comparison with HFrEF and HFpEF. Secondary endpoints were the possible causes of death and hospital re-admission. Twenty-five articles were included in our meta-analysis with a total of 606 762 adult cardiac patients. Our meta-analysis showed that HFmrEF had a lower rate of all-cause death than had HFrEF [relative risk (RR), 0.9; 95{\%} confidence interval (CI), 0.85–0.94]. HFpEF showed a higher rate of cardiac mortality than did HFmrEF (RR, 1.09; 95{\%} CI, 1.02–1.16). Also, HFrEF had a higher rate of non-cardiac mortality than had HFmrEF (RR, 1.31; 95{\%} CI, 1.22–1.41). Conclusions: We detected a significant difference between HFrEF and HFmrEF regarding all-cause death, and non-cardiac death, while HFpEF differed significantly from HFmrEF regarding cardiac death.",
keywords = "Heart failure with mid-range ejection fraction, Hospitalization, Meta-analysis, Mortality",
author = "Saif Altaie and Wissam Khalife",
doi = "10.1002/ehf2.12353",
journal = "ESC heart failure",
publisher = "The Heart Failure Association of the European Society of Cardiology",
T1 - The prognosis of mid-range ejection fraction heart failure
T2 - a systematic review and meta-analysis
AU - Altaie, Saif
AU - Khalife, Wissam
N2 - Aims: Mid-range ejection fraction is a new entity of heart failure (HF) with undetermined prognosis till now. In our systematic review and meta-analysis, we assess the mortality and hospitalization rates in mid-range ejection fraction HF (HFmrEF) and compare them with those of reduced ejection fraction heart failure (HFrEF) and preserved ejection fraction HF (HFpEF). Methods and results: We conducted our search in March 2018 in the following databases for relevant articles: PubMed, CENTRAL, Google Scholar, Web of Science, Scopus, NYAM, SIEGLE, GHL, VHL, and POPLINE. Our primary endpoint was assessing all-cause mortality and all-cause hospital re-admission rates in HFmrEF in comparison with HFrEF and HFpEF. Secondary endpoints were the possible causes of death and hospital re-admission. Twenty-five articles were included in our meta-analysis with a total of 606 762 adult cardiac patients. Our meta-analysis showed that HFmrEF had a lower rate of all-cause death than had HFrEF [relative risk (RR), 0.9; 95% confidence interval (CI), 0.85–0.94]. HFpEF showed a higher rate of cardiac mortality than did HFmrEF (RR, 1.09; 95% CI, 1.02–1.16). Also, HFrEF had a higher rate of non-cardiac mortality than had HFmrEF (RR, 1.31; 95% CI, 1.22–1.41). Conclusions: We detected a significant difference between HFrEF and HFmrEF regarding all-cause death, and non-cardiac death, while HFpEF differed significantly from HFmrEF regarding cardiac death.
AB - Aims: Mid-range ejection fraction is a new entity of heart failure (HF) with undetermined prognosis till now. In our systematic review and meta-analysis, we assess the mortality and hospitalization rates in mid-range ejection fraction HF (HFmrEF) and compare them with those of reduced ejection fraction heart failure (HFrEF) and preserved ejection fraction HF (HFpEF). Methods and results: We conducted our search in March 2018 in the following databases for relevant articles: PubMed, CENTRAL, Google Scholar, Web of Science, Scopus, NYAM, SIEGLE, GHL, VHL, and POPLINE. Our primary endpoint was assessing all-cause mortality and all-cause hospital re-admission rates in HFmrEF in comparison with HFrEF and HFpEF. Secondary endpoints were the possible causes of death and hospital re-admission. Twenty-five articles were included in our meta-analysis with a total of 606 762 adult cardiac patients. Our meta-analysis showed that HFmrEF had a lower rate of all-cause death than had HFrEF [relative risk (RR), 0.9; 95% confidence interval (CI), 0.85–0.94]. HFpEF showed a higher rate of cardiac mortality than did HFmrEF (RR, 1.09; 95% CI, 1.02–1.16). Also, HFrEF had a higher rate of non-cardiac mortality than had HFmrEF (RR, 1.31; 95% CI, 1.22–1.41). Conclusions: We detected a significant difference between HFrEF and HFmrEF regarding all-cause death, and non-cardiac death, while HFpEF differed significantly from HFmrEF regarding cardiac death.
KW - Heart failure with mid-range ejection fraction
KW - Hospitalization
KW - Meta-analysis
KW - Mortality
U2 - 10.1002/ehf2.12353
DO - 10.1002/ehf2.12353
JO - ESC heart failure
JF - ESC heart failure
10.1002/ehf2.12353


text:
Q: Xcode 8 Storyboard - Updating existing storyboards. App republish required? I just updated to Xcode 8. On selecting any of the devices at bottom, constraints are to be reset. Since the view is now not accommodating on the screens. Earlier to this, I was using wAny hAny window and also supplied the constraints. These constrains are even there now but need to be changed.
I am assuming the only way I see is to update the frames and constraints for all devices (wondering it is a boon or curse). But since a single constraint will be same for all devices, how will it's value be retained considering it has to be used in code.
How to update the existing storyboards to fit Xcode 8 ?
Having said this, storyboard needs to be restructured which means app needs to be published again as the current build would give layout issues on iOS 10.
Is my reason valid enough ?

A: I am not sure I understand your question, but I ran into a situation that I think may have been similar. After upgrading a project to Xcode 8 my storyboards did not appear to have the correct constraints obeyed. Everything would still work when I compiled and tested, but Xcode storyboards would look all wrong.
In addition to this, Xcode presented a whole bunch of warnings that "Frame for XYZ will be different at run time."
I found that I could click in the small yellow warning arrow next to the scene in the structure pane and then click on the small yellow warning icon next to one of the misplaced views. From the popup I selected Update frames and Apply to all views in this container and then I clicked the Fix misplacements button.
This seemed to clean up the storyboard and remove all the warnings.

redpajama_set_name: RedPajamaStackExchange


Dreaming about deepening your yoga practice for your next escape? Are you also interested in green living and would like to experience the benefits of an eco-lodge? Then, joining an eco yoga retreat is definitely the best idea! Minimize your impact on the environment without sacrificing comfort. Yoga eco holidays are all about relaxation, and at the same time being in total unity with your surroundings. Join one of our many eco yoga retreats and get ready to learn how to live responsibly, eat fresh organic foods, have fun, and relax!


Asia Pacific modacrylic fiber market is projected to contribute a large share during forecast time. Rapid industrialization, rising population, and growing textile industry are the promising factor stimulating demand. Regional growth is majorly driven by India, China, Vietnam, Pakistan and Bangladesh due to the strong presence of textile industry. The major companies have manufacturing facilities, trade and export capabilities of synthetic polymer in an international trade fueling modacrylic fiber market.
Modacrylic Fiber Market Size is projected to witness high demand owing to its mechanical property associated to the flame resistant, acid & base resistant and microbial resistant features. It is a synthetic polymer synthesized from acrylonitrile long-chain polymer.
The product is gaining popularity across various applications due to their very soft, high strength, and dimensionally stable characteristics. Synthetic polymers have a prominent ability that doesn't support microbial or bacterial infection growth. Increasing consumer awareness for non-contagious fabrics are positively encouraging modacrylic fiber demand in the apparel industry. Thereby, escalating adoption in commercial applications such as apparel lining, wigs, work clothing, scatter rugs, paint roller covers and carpets.
Rapid industrialization and expansion in various industries including chemical processing, military, medical, healthcare, steel, agriculture, oil & energy will encourage market expansion. Need to adopt protective measures for workers while dealing with chemicals, biological contaminants, heat, and radiation risk will instigate demand. Presence of antimicrobial and flame-resistant properties of modacrylic fiber makes the product ideal for protective clothing.
The product has major applications in hair accessory product, protective clothing, pile, and apparel. Benefits associated with the ability to be easily stretched and molded into any shapes make a product superficial for industrial applications. Pile is expected to be the fast-growing segment owing to its usage as a wool replacement in the textile market. The fabric is fur-like, warm and resilient materials majorly used in jackets, covers, furs, carpets, and clothing, thus propelling market share.
Modacrylic materials are categorized into vinyl chloride, vinyl bromide, vinylidene chloride. Vinyl chloride is expected to be the fastest growing segment among other polymers owing to its high durability and high acid & base resistant properties. Manufacturing companies produce from wet and spinning methods to enhance dyeing ability and flexibility for further usage. Shifting adoption of synthetic materials in the apparel and clothing production owing to its thermal resistance advantages driving modacrylic fiber market share during the forecast period.
Global modacrylic fiber market share includes Kaneka Corporation, Fushun Rayva, Jiangsu Blue Peacock Chemical Fiber, Zhejiang Wangzhuo Knitting, Shanghai Changjie Textile, Nantong Xufeng Textile, and Zhangjiagang Hengfeng Textile. These companies are focused on new product development by a combination of materials to attract consumers attention and to gain market share. In addition, strategic collaborations and long-term contracts with suppliers are adopting prominent strategies. Other companies are Tianjin GT New Material Technology, Shanghai Modacrylic flame retardant textile, Formosa Chemicals & Fiber Corporation, Fushun Huifu Fire Resistant Fiber, Xinke special textile, and Fushun Rayva Fiber.


Five Guys Burgers and Fries is an American hamburger chain with a location on the corner of Airport and 9th Ave.
More than one follower asked us this week "Why are you going to Five Guys!?" with a look of disgust.
We get it, Five Guys is a chain restaurant- but with over a thousand franchise locations nationwide- they must be doing something right.
Besides, any restaurant that's making burgers and nothing else, deserves an opportunity to show their stuff.
The friendly staff at Five Guys create a hamburger assembly line that's fascinating to watch. Well organized, efficient and energetic- there's something hypnotic about watching the folks at FGBF make your burger. But as you know, we're only concerned with one thing; TASTE.
Let's start with the bun; the poppy seed bun is soft and delicious. Perfect in size, the bun is substantial enough to keep your fingers from sinking into delicious beef- but not too big.
There are a lot of fancy toppings available at FGBF, but as always- we stick to the basics (lettuce, tomato, onion, pickle.) The produce is above average and features a slice of perfectly ripened tomato, diced onion, a crispy leaf of iceberg lettuce and ordinary dill pickle chips.
The condiments were applied generously which had a few judges scraping excess mustard off their burger. But, no harm done. Someone in the kitchen just got carried away with the yellow squirt bottle.
The standard burger at FGBF includes two patties- and we weren't complaining. It made for just the right amount of beef in every bite. The patties were cooked perfectly- juicy and hot with delicious melted American cheese on top.
Five Guys is a "fast casual" dining experience, not fast food. Our judges agree their burgers are hands down better than what you'd find at a fast food chain.
The Five Guys burger finished with a final score of 7.31 which is good enough to land it in our top spot (for now) but we're not ready to crown it Best in Pensacola this early in the competition.


text:
Does Working From Home Actually Work?
Studies suggest remote working could be the solution both employers and employees had been looking for
By Vaibhav Joshi October 17, 2018
You're reading Entrepreneur Asia Pacific, an international franchise of Entrepreneur Media.
'Working from home' conjures up different images in different peoples' minds. For employees, it's a dream situation, a restful day spent in the comfort of their own home without the boss breathing down their neck. Employers view it more as a nightmare, picturing no work getting done as employees while away the day watching TV. So the question remains, is working from home a viable option? Science has its say.
Does It Actually Help?
How does working from home impact employee productivity? Stanford professor Nicholas Bloom and his team attempted to provide an answer in their March 2013 paper entitled 'Does Working from Home Work? Evidence from a Chinese Experiment'. The subject of their research was Chinese travel agency CTrip, where call centre employees who volunteered were randomly assigned to work from home or in the office for 9 months.
Bloom revealed in his findings that remote working led to a 13 per cent increase in performance, with a 9 per cent rise in minutes per shift and a 4 per cent increase in calls per minute (attributed to a quieter working environment). Home workers also reported improved work satisfaction, experienced less turnover and took fewer breaks and sick days.
The success of the experiment prompted CTrip to offer the remote working option to the whole firm and allowed the experimental employees to re-select between the home or office. Over half of them switched, leading to gains almost doubling to 22 per cent. This highlights the benefits of learning and selection effects when adopting modern management practices like WFH.
Similar research was carried out by Flex+Strategy Group in which 595 full-time FSG employees were surveyed. It revealed that remote working actually improves communication, creativity, productivity, and engagement when employees are properly trained in how to operate in a work from home situation.
"Organizations that blame flexibility for their performance challenges risk missing out on the very business gains they're trying to achieve," said flexible workplace strategist Cali Williams Yost, CEO of the Flex+Strategy Group in a press release. "The flexibility is not the problem. It's that organizations don't know how to use the flexibility and remote work strategically to transform their business."
No Office=No Stress? Not Quite
Having established the benefits of remote working, it's important for organisations to identify which employees would thrive in this situation. Most employees would view working from home as the opportunity to work stress-free, but recent research conducted by researchers at Baylor University suggests otherwise. Published in European Journal of Work and Organizational Psychology in June 2018, their study looks at the impact of remote work on employee well-being and offers several options to tailor remote working opportunities to be as useful to the organisation as possible.
"Any organization, regardless of the extent to which people work remotely, needs to consider the wellbeing of their employees as they implement more flexible working practices," the researchers wrote. They studied 403 working adults, measuring their autonomy (the level of a worker's independence), strain (defined in this study as exhaustion, disengagement, and dissatisfaction) and emotional stability.
"If something stressful happens at work, a person who is high on emotional stability would take it in stride, remain positive and figure out how to address it. A person low on emotional stability might get frustrated and discouraged, expending energy with those emotions instead of on the issue at hand," explained lead author Sara Perry in a press release.
The research found that working from home seemed to suit those employees reporting high levels of autonomy and emotional stability the best, with employees reporting high levels of job autonomy with lower levels of emotional stability appearing to be more susceptible to strain. Apparently working from home isn't the stress-free mini-vacation it seems!
Simply put, an employee that gets easily stressed out at work is more likely to get stressed out at work as well, which is why managers need to make sure to make adequate resources available to them if the need arises for them to work from home. On the other hand, emotionally stable employees were much more suitable candidates for work from home opportunities.
Work From Home Is Here To Stay
Whether your company embraces it or not, remote working is growing at a remarkable rate. A study released by Switzerland-based serviced office provider IWG in May 2018 found that 70 per cent of professionals work remotely at least one day a week, while 53 per cent work remotely for at least half of the week.
"If you offer workers the chance to work where they need to be, and not where they are told to go to, it completely transforms their view of the company, they are more productive," said IWG Chief Executive Mark Dixon in an interview to CNBC. "If they can work at an office near to where they live or near to where they need to be, it's totally transformational."
More About Work From Home
'It's Just Human Nature:' A New Book Examines Why Our Work Is Better When We Work Less
Frances Dodds
An insider's view from the growth fund within Google's parent company
Punita Sabharwal
Daring CEOs
Ankur Jain on Building a High Performance Culture at Bira 91
Latest on Asia Pacific
Quadria Capital Invests $90 Million Into Con Cung
Shrabona Ghosh
Why this Canadian-Israeli Stock Grew 121% This Year
Josh Horowitz
This Crypto Project Is Brewing a Storm
Ayon Bhattacharje


Keen is taking work and safety shoes to the next level! Impress your coworkers with a shoe that looks casual but is ready to take on whatever your workday brings. These protective steel toe shoes feature many of Keen's technologies that are essential for a high-performance work shoe; their water repellent technology provides you with a breathable membrane that will promote air flow but keep you dry. Keen.Protect is their patented wrap-around outsole that goes up and over the toe. Their steel toes are asymmetrical and designed especially to accommodate each foot's unique shape. These work boots provide oil- and slip-resistance to keep you upright even in the messiest of conditions. Whatever line of work you're in, Keen has got you covered.


This little Stingray wrapped flask is the ultimate subtle accessory for the fine gentleman or lady in your life. The textured surface is both luxurious and durable. Flask set includes a shot glass and a funnel for easy top ups. Available in charcoal and ivory.


Three years on from its adoption, the Optional Protocol to the International Covenant on Economic, Social and Cultural Rights needs five more countries to become parties to it before it comes into force. Rosalind McKenna, Amnesty International Ireland's Human Rights in Ireland Coordinator, reflects on three years of campaigning – and the progress that is being made.
"We hope to be in a position to sign the Optional Protocol to the International Convention on Economic, Social and Cultural Rights before the end of this year." So spoke Ireland's Justice Minister at the Human Rights Council on 6 October, to the delight of myself and everyone else who has been campaigning for this.
When it comes into force, the Optional Protocol will ensure that everyone can access the rights enshrined in the Convention. This includes the right to healthcare for pregnant women, the right to adequate housing for people living in slums and the right to education for children from minority communities.
Amnesty International Ireland has been campaigning for the Optional Protocol since 2007, ensuring that this brand new piece of international law is on the political, public and media agenda.
We worked to ensure the wording of the Optional Protocol would not restrict human rights. We made the Irish government aware that international treaty negotiations cannot be hidden from the public, that people in Ireland care about the human rights agreed to in their name.
For the last three years we have been asking the Irish government to sign and become party to the Optional Protocol. And we have not been alone. We have mobilized around 30 other organizations to call on the Irish Taoiseach (Prime Minister) to commit to the Optional Protocol.
We also engaged the public by launching a social media campaign. Emails were sent marked "The Irish Government doesn't want you to read this", asking people to write to the government. The Taoiseach subsequently went on record saying the government was "positively disposed" to signing.
Unfortunately, it continued to stall. In March, Ireland got a new government, and then in October – breakthrough! The commitment from the Minister was a great victory. We will continue to pressure the government until it actually puts pen to paper!
Amnesty International's global Demand Dignity campaign continues to call on governments worldwide to sign and become party to the Optional Protocol to the International Covenant on Economic, Social and Cultural Rights. Check out the recent declaration made by jurists and other human rights experts here.


This is a surround sound speaker designed to reproduce sound for also very capable of reproducing great sound for Movies and Music with all the great dynamics and fine detail.
Some of the outstanding features that make this speaker outstanding is it's dispersion for surround sound systems and it's high sensitivity allowing for lower distortion, dynamics and finesse. Due to the high sensitivity, the speaker will be able to perform very well even in high demands without running into thermal compression. The less heat produced the more output.


Puzzling Adventures™ are a cross between a scavenger hunt, an informative self-guided tour, and The Amazing Race®. A fun and interactive way to explore a city, each adventure sends you to a series of locations where you answer questions or solve puzzles to receive your next instruction. The goal is to have fun outdoors, and learn some interesting things along the way.
Price is per team, not individual. A team can be up to 6 people.
What time does this start?
You can start at any time of your choosing. We recommend going out during daylight hours. You should expect the adventure to take about 1 hour to complete.
No, there are no age requirements. These adventures are appropriate for participants of all ages, from young kids to grandparents.
Each adventure will have a starting location that is either a parking lot or parking garage. You may use the recommended parking, but it is not required. You will need to show up to the location to begin the adventure.
You may send an email to support@puzzlingadventures.com, or call us at 888-433-8966.
We will accept all refunds as long as the adventure has not been started.
You will only need a mobile device with internet connection. All registration is done via our website, you will not have to check in with anyone before you start your adventure.