text:
#include "qdeclarativeparticles_p.h"

#include <qdeclarativeinfo.h>
#include <private/qdeclarativeitem_p.h>

#include <private/qdeclarativepixmapcache_p.h>
#include <QtCore/QAbstractAnimation>

#include <QPainter>
#include <QtGui/qdrawutil.h>
#include <QVarLengthArray>

#include <stdlib.h>
#include <math.h>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#define M_PI_2 (M_PI / 2.)
#endif
#ifndef INT_MAX
#define INT_MAX 2147483647
#endif

QT_BEGIN_NAMESPACE
#define PI_SQR 9.8696044
// parabolic approximation
inline qreal fastSin(qreal theta)
{
    const qreal b = 4 / M_PI;
    const qreal c = -4 / PI_SQR;

    qreal y = b * theta + c * theta * qAbs(theta);
    return y;
}

inline qreal fastCos(qreal theta)
{
    theta += M_PI_2;
    if (theta > M_PI)
        theta -= 2 * M_PI;

    return fastSin(theta);
}

class QDeclarativeParticle
{
public:
    QDeclarativeParticle(int time) : lifeSpan(1000), fadeOutAge(800)
        , opacity(0), birthTime(time), x_velocity(0), y_velocity(0)
        , state(FadeIn), data(0)
    {
    }

    int lifeSpan;
    int fadeOutAge;
    qreal x;
    qreal y;
    qreal opacity;
    int birthTime;
    qreal x_velocity;
    qreal y_velocity;
    enum State { FadeIn, Solid, FadeOut };
    State state;
    void *data;
};

//---------------------------------------------------------------------------

/*!
    \class QDeclarativeParticleMotion
    \ingroup group_effects
    \brief The QDeclarativeParticleMotion class is the base class for particle motion.
    \internal

    This class causes the particles to remain static.
*/

/*!
    Constructs a QDeclarativeParticleMotion with parent object \a parent.
*/
QDeclarativeParticleMotion::QDeclarativeParticleMotion(QObject *parent) :
    QObject(parent)
{
}

/*!
    Move the \a particle to its new position.  \a interval is the number of
    milliseconds elapsed since it was last moved.
*/
void QDeclarativeParticleMotion::advance(QDeclarativeParticle &particle, int interval)
{
    Q_UNUSED(particle);
    Q_UNUSED(interval);
}

/*!
    The \a particle has just been created.  Some motion strategies require
    additional state information.  This can be allocated by this function.
*/
void QDeclarativeParticleMotion::created(QDeclarativeParticle &particle)
{
    Q_UNUSED(particle);
}

/*!
    The \a particle is about to be destroyed.  Any additional memory
    that has been allocated for the particle should be freed.
*/
void QDeclarativeParticleMotion::destroy(QDeclarativeParticle &particle)
{
    Q_UNUSED(particle);
}

/*!
    \qmlclass ParticleMotionLinear QDeclarativeParticleMotionLinear
    \ingroup qml-particle-elements
    \since 4.7
    \brief The ParticleMotionLinear object moves particles linearly.

    \sa Particles

    This is the default motion, and moves the particles according to the
    properties specified in the Particles element.

    It has no further properties.
*/
void QDeclarativeParticleMotionLinear::advance(QDeclarativeParticle &p, int interval)
{
    p.x += interval * p.x_velocity;
    p.y += interval * p.y_velocity;
}

/*!
    \qmlclass ParticleMotionGravity QDeclarativeParticleMotionGravity
    \ingroup qml-particle-elements
    \since 4.7
    \brief The ParticleMotionGravity object moves particles towards a point.

    This motion attracts the particles to the specified point with the specified acceleration.
    To mimic earth gravity, set yattractor to -6360000 and acceleration to 9.8.

    The defaults are all 0, not earth gravity, and so no motion will occur without setting
    at least the acceleration property.

    \sa Particles
*/

/*!
    \qmlproperty real ParticleMotionGravity::xattractor
    \qmlproperty real ParticleMotionGravity::yattractor
    These properties hold the x and y coordinates of the point attracting the particles.
*/

/*!
    \qmlproperty real ParticleMotionGravity::acceleration
    This property holds the acceleration to apply to the particles.
*/

/*!
    \property QDeclarativeParticleMotionGravity::xattractor
    \brief the x coordinate of the point attracting the particles.
*/

/*!
    \property QDeclarativeParticleMotionGravity::yattractor
    \brief the y coordinate of the point attracting the particles.
*/

/*!
    \property QDeclarativeParticleMotionGravity::acceleration
    \brief the acceleration to apply to the particles.
*/

void QDeclarativeParticleMotionGravity::setXAttractor(qreal x)
{
    if (qFuzzyCompare(x, _xAttr))
        return;
    _xAttr = x;
    emit xattractorChanged();
}

void QDeclarativeParticleMotionGravity::setYAttractor(qreal y)
{
    if (qFuzzyCompare(y, _yAttr))
        return;
    _yAttr = y;
    emit yattractorChanged();
}

void QDeclarativeParticleMotionGravity::setAcceleration(qreal accel)
{
    qreal scaledAccel = accel/1000000.0;
    if (qFuzzyCompare(scaledAccel, _accel))
        return;
    _accel = scaledAccel;
    emit accelerationChanged();
}

void QDeclarativeParticleMotionGravity::advance(QDeclarativeParticle &p, int interval)
{
    qreal xdiff = _xAttr - p.x;
    qreal ydiff = _yAttr - p.y;
    qreal absXdiff = qAbs(xdiff);
    qreal absYdiff = qAbs(ydiff);

    qreal xcomp = xdiff / (absXdiff + absYdiff);
    qreal ycomp = ydiff / (absXdiff + absYdiff);

    p.x_velocity += xcomp * _accel * interval;
    p.y_velocity += ycomp * _accel * interval;

    p.x += interval * p.x_velocity;
    p.y += interval * p.y_velocity;
}

/*!
    \qmlclass ParticleMotionWander QDeclarativeParticleMotionWander
    \ingroup qml-particle-elements
    \since 4.7
    \brief The ParticleMotionWander object moves particles in a somewhat random fashion.

    The particles will continue roughly in the original direction, however will randomly
    drift to each side.

    The code below produces an effect similar to falling snow.

    \qml
Rectangle {
    width: 240
    height: 320
    color: "black"

    Particles {
        y: 0
        width: parent.width
        height: 30
        source: "star.png"
        lifeSpan: 5000
        count: 50
        angle: 70
        angleDeviation: 36
        velocity: 30
        velocityDeviation: 10
        ParticleMotionWander {
            xvariance: 30
            pace: 100
        }
    }
}
    \endqml

    \sa Particles
*/

/*!
    \qmlproperty real ParticleMotionWander::xvariance
    \qmlproperty real ParticleMotionWander::yvariance

    These properties set the amount to wander in the x and y directions.
*/

/*!
    \qmlproperty real ParticleMotionWander::pace
    This property holds how quickly the paricles will move from side to side.
*/

void QDeclarativeParticleMotionWander::advance(QDeclarativeParticle &p, int interval)
{
    if (!particles)
        particles = qobject_cast<QDeclarativeParticles*>(parent());
    if (particles) {
        Data *d = (Data*)p.data;
        if (_xvariance != 0.) {
            qreal xdiff = p.x_velocity - d->x_targetV;
            if ((xdiff > d->x_peak && d->x_var > 0.0) || (xdiff < -d->x_peak && d->x_var < 0.0)) {
                d->x_var = -d->x_var;
                d->x_peak = _xvariance + _xvariance * qreal(qrand()) / RAND_MAX;
            }
            p.x_velocity += d->x_var * interval;
        }
        p.x += interval * p.x_velocity;

        if (_yvariance != 0.) {
            qreal ydiff = p.y_velocity - d->y_targetV;
            if ((ydiff > d->y_peak && d->y_var > 0.0) || (ydiff < -d->y_peak && d->y_var < 0.0)) {
                d->y_var = -d->y_var;
                d->y_peak = _yvariance + _yvariance * qreal(qrand()) / RAND_MAX;
            }
            p.y_velocity += d->y_var * interval;
        }
        p.y += interval * p.y_velocity;
    }
}

void QDeclarativeParticleMotionWander::created(QDeclarativeParticle &p)
{
    if (!p.data) {
        Data *d = new Data;
        p.data = (void*)d;
        d->x_targetV = p.x_velocity;
        d->y_targetV = p.y_velocity;
        d->x_peak = _xvariance;
        d->y_peak = _yvariance;
        d->x_var = _pace * qreal(qrand()) / RAND_MAX / 1000.0;
        d->y_var = _pace * qreal(qrand()) / RAND_MAX / 1000.0;
    }
}

void QDeclarativeParticleMotionWander::destroy(QDeclarativeParticle &p)
{
    if (p.data)
        delete (Data*)p.data;
}

void QDeclarativeParticleMotionWander::setXVariance(qreal var)
{
    qreal scaledVar = var / 1000.0;
    if (qFuzzyCompare(scaledVar, _xvariance))
        return;
    _xvariance = scaledVar;
    emit xvarianceChanged();
}

void QDeclarativeParticleMotionWander::setYVariance(qreal var)
{
    qreal scaledVar = var / 1000.0;
    if (qFuzzyCompare(scaledVar, _yvariance))
        return;
    _yvariance = scaledVar;
    emit yvarianceChanged();
}

void QDeclarativeParticleMotionWander::setPace(qreal pace)
{
    qreal scaledPace = pace / 1000.0;
    if (qFuzzyCompare(scaledPace, _pace))
        return;
    _pace = scaledPace;
    emit paceChanged();
}

//---------------------------------------------------------------------------
class QDeclarativeParticlesPainter : public QDeclarativeItem
{
public:
    QDeclarativeParticlesPainter(QDeclarativeParticlesPrivate *p, QDeclarativeItem* parent)
        : QDeclarativeItem(parent), d(p)
    {
        setFlag(QGraphicsItem::ItemHasNoContents, false);
        maxX = minX = maxY = minY = 0;
    }

    void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);

    void updateSize();

    qreal maxX;
    qreal minX;
    qreal maxY;
    qreal minY;
    QDeclarativeParticlesPrivate* d;
};

//an animation that just gives a tick
template<class T, void (T::*method)(int)>
class TickAnimationProxy : public QAbstractAnimation
{
public:
    TickAnimationProxy(T *p, QObject *parent = 0) : QAbstractAnimation(parent), m_p(p) {}
    virtual int duration() const { return -1; }
protected:
    virtual void updateCurrentTime(int msec) { (m_p->*method)(msec); }

private:
    T *m_p;
};

//---------------------------------------------------------------------------
class QDeclarativeParticlesPrivate : public QDeclarativeItemPrivate
{
    Q_DECLARE_PUBLIC(QDeclarativeParticles)
public:
    QDeclarativeParticlesPrivate()
        : count(1), emissionRate(-1), emissionVariance(0.5), lifeSpan(1000)
        , lifeSpanDev(1000), fadeInDur(200), fadeOutDur(300)
        , angle(0), angleDev(0), velocity(0), velocityDev(0), emissionCarry(0.)
        , addParticleTime(0), addParticleCount(0), lastAdvTime(0)
        , motion(0), clock(this)
    {
    }

    ~QDeclarativeParticlesPrivate()
    {
    }

    void init()
    {
        Q_Q(QDeclarativeParticles);
        paintItem = new QDeclarativeParticlesPainter(this, q);
    }

    void tick(int time);
    void createParticle(int time);
    void updateOpacity(QDeclarativeParticle &p, int age);

    QUrl url;
    QDeclarativePixmap image;
    int count;
    int emissionRate;
    qreal emissionVariance;
    int lifeSpan;
    int lifeSpanDev;
    int fadeInDur;
    int fadeOutDur;
    qreal angle;
    qreal angleDev;
    qreal velocity;
    qreal velocityDev;
    qreal emissionCarry;
    int addParticleTime;
    int addParticleCount;
    int lastAdvTime;
    QDeclarativeParticleMotion *motion;
    QDeclarativeParticlesPainter *paintItem;

    QList<QPair<int, int> > bursts;//countLeft, emissionRate pairs
    QList<QDeclarativeParticle> particles;
    TickAnimationProxy<QDeclarativeParticlesPrivate, &QDeclarativeParticlesPrivate::tick> clock;

};

void QDeclarativeParticlesPrivate::tick(int time)
{
    Q_Q(QDeclarativeParticles);
    if (!motion)
        motion = new QDeclarativeParticleMotionLinear(q);

    int oldCount = particles.count();
    int removed = 0;
    int interval = time - lastAdvTime;
    for (int i = 0; i < particles.count(); ) {
        QDeclarativeParticle &particle = particles[i];
        int age = time - particle.birthTime;
        if (age >= particle.lifeSpan)  {
            QDeclarativeParticle part = particles.takeAt(i);
            motion->destroy(part);
            ++removed;
        } else {
            updateOpacity(particle, age);
            motion->advance(particle, interval);
            ++i;
        }
    }

    if(emissionRate == -1)//Otherwise leave emission to the emission rate
        while(removed-- && ((count == -1) || particles.count() < count))
            createParticle(time);

    if (!addParticleTime)
        addParticleTime = time;

    //Possibly emit new particles
    if (((count == -1) || particles.count() < count) && emissionRate
            && !(count==-1 && emissionRate==-1)) {
        int emissionCount = -1;
        if (emissionRate != -1){
            qreal variance = 1.;
            if (emissionVariance > 0.){
                variance += (qreal(qrand())/RAND_MAX) * emissionVariance * (qrand()%2?-1.:1.);
            }
            qreal emission = emissionRate * (qreal(interval)/1000.);
            emission = emission * variance + emissionCarry;
            double tmpDbl;
            emissionCarry = modf(emission, &tmpDbl);
            emissionCount = (int)tmpDbl;
            emissionCount = qMax(0,emissionCount);
        }
        while(((count == -1) || particles.count() < count) &&
                (emissionRate==-1 || emissionCount--))
            createParticle(time);
    }

    //Deal with emissions from requested bursts
    for(int i=0; i<bursts.size(); i++){
        int emission = 0;
        if(bursts[i].second == -1){
            emission = bursts[i].first;
        }else{
            qreal variance = 1.;
            if (emissionVariance > 0.){
                variance += (qreal(qrand())/RAND_MAX) * emissionVariance * (qrand()%2?-1.:1.);
            }
            qreal workingEmission = bursts[i].second * (qreal(interval)/1000.);
            workingEmission *= variance;
            emission = (int)workingEmission;
            emission = qMax(emission, 0);
        }
        emission = qMin(emission, bursts[i].first);
        bursts[i].first -= emission;
        while(emission--)
            createParticle(time);
    }
    for(int i=bursts.size()-1; i>=0; i--)
        if(bursts[i].first <= 0)
            bursts.removeAt(i);

    lastAdvTime = time;
    paintItem->updateSize();
    paintItem->update();
    if (!(oldCount || particles.count()) && (!count || !emissionRate) && bursts.isEmpty()) {
        lastAdvTime = 0;
        clock.stop();
    }
}

void QDeclarativeParticlesPrivate::createParticle(int time)
{
    Q_Q(QDeclarativeParticles);
    QDeclarativeParticle p(time);
    p.x = q->x() + q->width() * qreal(qrand()) / RAND_MAX - image.width()/2.0;
    p.y = q->y() + q->height() * qreal(qrand()) / RAND_MAX - image.height()/2.0;
    p.lifeSpan = lifeSpan;
    if (lifeSpanDev)
        p.lifeSpan += int(lifeSpanDev/2 - lifeSpanDev * qreal(qrand()) / RAND_MAX);
    p.fadeOutAge = p.lifeSpan - fadeOutDur;
    if (fadeInDur == 0.) {
        p.state= QDeclarativeParticle::Solid;
        p.opacity = 1.0;
    }
    qreal a = angle;
    if (angleDev)
        a += angleDev/2 - angleDev * qreal(qrand()) / RAND_MAX;
    if (a > M_PI)
        a = a - 2 * M_PI;
    qreal v = velocity;
    if (velocityDev)
        v += velocityDev/2 - velocityDev * qreal(qrand()) / RAND_MAX;
    p.x_velocity = v * fastCos(a);
    p.y_velocity = v * fastSin(a);
    particles.append(p);
    motion->created(particles.last());
}

void QDeclarativeParticlesPrivate::updateOpacity(QDeclarativeParticle &p, int age)
{
    switch (p.state) {
    case QDeclarativeParticle::FadeIn:
        if (age <= fadeInDur) {
            p.opacity = qreal(age) / fadeInDur;
            break;
        } else {
            p.opacity = 1.0;
            p.state = QDeclarativeParticle::Solid;
            // Fall through
        }
    case QDeclarativeParticle::Solid:
        if (age <= p.fadeOutAge) {
            break;
        } else {
            p.state = QDeclarativeParticle::FadeOut;
            // Fall through
        }
    case QDeclarativeParticle::FadeOut:
        p.opacity = qreal(p.lifeSpan - age) / fadeOutDur;
        break;
    }
}

/*!
    \qmlclass Particles QDeclarativeParticles
    \ingroup qml-particle-elements
    \since 4.7
    \brief The Particles object generates and moves particles.
    \inherits Item

    Particles are available in the \bold{Qt.labs.particles 1.0} module.
    \e {Elements in the Qt.labs module are not guaranteed to remain compatible
    in future versions.}

    This element provides preliminary support for particles in QML,
    and may be heavily changed or removed in later versions.

    The particles created by this object cannot be dealt with
    directly, they can only be controlled through the parameters of
    the Particles object. The particles are all the same pixmap,
    specified by the user.

    The particles are painted relative to the parent of the Particles
    object.  Moving the Particles object will not move the particles
    already emitted.

    The below example creates two differently behaving particle
    sources.  The top one has particles falling from the top like
    snow, the lower one has particles expelled up like a fountain.

    \qml
import QtQuick 1.0
import Qt.labs.particles 1.0

Rectangle {
    width: 240
    height: 320
    color: "black"
    Particles {
        y: 0
        width: parent.width
        height: 30
        source: "star.png"
        lifeSpan: 5000
        count: 50
        angle: 70
        angleDeviation: 36
        velocity: 30
        velocityDeviation: 10
        ParticleMotionWander {
            xvariance: 30
            pace: 100
        }
    }
    Particles {
        y: 300
        x: 120
        width: 1
        height: 1
        source: "star.png"
        lifeSpan: 5000
        count: 200
        angle: 270
        angleDeviation: 45
        velocity: 50
        velocityDeviation: 30
        ParticleMotionGravity {
            yattractor: 1000
            xattractor: 0
            acceleration: 25
        }
    }
}
    \endqml
    \image particles.gif
*/

QDeclarativeParticles::QDeclarativeParticles(QDeclarativeItem *parent)
    : QDeclarativeItem(*(new QDeclarativeParticlesPrivate), parent)
{
    Q_D(QDeclarativeParticles);
    d->init();
}

QDeclarativeParticles::~QDeclarativeParticles()
{
}

/*!
    \qmlproperty string Particles::source
    This property holds the URL of the particle image.
*/

/*!
    \property QDeclarativeParticles::source
    \brief the URL of the particle image.
*/
QUrl QDeclarativeParticles::source() const
{
    Q_D(const QDeclarativeParticles);
    return d->url;
}

void QDeclarativeParticles::imageLoaded()
{
    Q_D(QDeclarativeParticles);
    if (d->image.isError())
        qmlInfo(this) << d->image.error();
    d->paintItem->updateSize();
    d->paintItem->update();
}

void QDeclarativeParticles::setSource(const QUrl &name)
{
    Q_D(QDeclarativeParticles);

    if ((d->url.isEmpty() == name.isEmpty()) && name == d->url)
        return;

    if (name.isEmpty()) {
        d->url = name;
        d->image.clear(this);
        d->paintItem->updateSize();
        d->paintItem->update();
    } else {
        d->url = name;
        Q_ASSERT(!name.isRelative());
        d->image.load(qmlEngine(this), d->url);
        if (d->image.isLoading()) {
            d->image.connectFinished(this, SLOT(imageLoaded()));
        } else {
            if (d->image.isError())
                qmlInfo(this) << d->image.error();
            //### unify with imageLoaded
            d->paintItem->updateSize();
            d->paintItem->update();
        }
    }
    emit sourceChanged();
}

/*!
    \qmlproperty int Particles::count
    This property holds the maximum number of particles

    The particles element emits particles until it has count active
    particles. When this number is reached, new particles are not emitted until
    some of the current particles reach the end of their lifespan.

    If count is -1 then there is no maximum number of active particles, and
    particles will be constantly emitted at the rate specified by emissionRate.

    The default value for count is 1.

    If both count and emissionRate are set to -1, nothing will be emitted.

*/

/*!
    \property QDeclarativeParticles::count
    \brief the maximum number of particles
*/
int QDeclarativeParticles::count() const
{
    Q_D(const QDeclarativeParticles);
    return d->count;
}

void QDeclarativeParticles::setCount(int cnt)
{
    Q_D(QDeclarativeParticles);
    if (cnt == d->count)
        return;

    int oldCount = d->count;
    d->count = cnt;
    d->addParticleTime = 0;
    d->addParticleCount = d->particles.count();
    if (!oldCount && d->clock.state() != QAbstractAnimation::Running && d->count && d->emissionRate) {
        d->clock.start();
    }
    d->paintItem->updateSize();
    d->paintItem->update();
    emit countChanged();
}

/*!
    \qmlproperty int Particles::emissionRate
    This property holds the target number of particles to emit every second.

    The particles element will emit up to emissionRate particles every
    second. Fewer particles may be emitted per second if the maximum number of
    particles has been reached.

    If emissionRate is set to -1 there is no limit to the number of
    particles emitted per second, and particles will be instantly emitted to
    reach the maximum number of particles specified by count.

    The default value for emissionRate is -1.

    If both count and emissionRate are set to -1, nothing will be emitted.
*/

/*!
    \property QDeclarativeParticles::emissionRate
    \brief the emission rate of particles
*/
int QDeclarativeParticles::emissionRate() const
{
    Q_D(const QDeclarativeParticles);
    return d->emissionRate;
}
void QDeclarativeParticles::setEmissionRate(int er)
{
    Q_D(QDeclarativeParticles);
    if(er == d->emissionRate)
        return;
    d->emissionRate = er;
    if (d->clock.state() != QAbstractAnimation::Running && d->count && d->emissionRate) {
            d->clock.start();
    }
    emit emissionRateChanged();
}

/*!
    \qmlproperty real Particles::emissionVariance
    This property holds how inconsistent the rate of particle emissions are.
    It is a number between 0 (no variance) and 1 (some variance).

    The expected number of particles emitted per second is emissionRate. If
    emissionVariance is 0 then particles will be emitted consistently throughout
    each second to reach that number. If emissionVariance is greater than 0 the
    rate of particle emission will vary randomly throughout the second, with the
    consequence that the actual number of particles emitted in one second will
    vary randomly as well.

    emissionVariance is the maximum deviation from emitting
    emissionRate particles per second. An emissionVariance of 0 means you should
    get exactly emissionRate particles emitted per second,
    and an emissionVariance of 1 means you will get between zero and two times
    emissionRate particles per second, but you should get emissionRate particles
    per second on average.

    Note that even with an emissionVariance of 0 there may be some variance due
    to performance and hardware constraints.

    The default value of emissionVariance is 0.5
*/

/*!
    \property QDeclarativeParticles::emissionVariance
    \brief how much the particle emission amounts vary per tick
*/

qreal QDeclarativeParticles::emissionVariance() const
{
    Q_D(const QDeclarativeParticles);
    return d->emissionVariance;
}

void QDeclarativeParticles::setEmissionVariance(qreal ev)
{
    Q_D(QDeclarativeParticles);
    if(d->emissionVariance == ev)
        return;
    d->emissionVariance = ev;
    emit emissionVarianceChanged();
}

/*!
    \qmlproperty int Particles::lifeSpan
    \qmlproperty int Particles::lifeSpanDeviation

    These properties describe the life span of each particle.

    The default lifespan for a particle is 1000ms.

    lifeSpanDeviation randomly varies the lifeSpan up to the specified variation.  For
    example, the following creates particles whose lifeSpan will vary
    from 150ms to 250ms:

    \qml
Particles {
    source: "star.png"
    lifeSpan: 200
    lifeSpanDeviation: 100
}
    \endqml
*/

/*!
    \property QDeclarativeParticles::lifeSpan
    \brief the life span of each particle.

    Default value is 1000ms.

    \sa QDeclarativeParticles::lifeSpanDeviation
*/
int QDeclarativeParticles::lifeSpan() const
{
    Q_D(const QDeclarativeParticles);
    return d->lifeSpan;
}

void QDeclarativeParticles::setLifeSpan(int ls)
{
    Q_D(QDeclarativeParticles);
    if(d->lifeSpan == ls)
        return;
    d->lifeSpan = ls;
    emit lifeSpanChanged();
}

/*!
    \property QDeclarativeParticles::lifeSpanDeviation
    \brief the maximum possible deviation from the set lifeSpan.

    Randomly varies the lifeSpan up to the specified variation.  For
    example, the following creates particles whose lifeSpan will vary
    from 150ms to 250ms:

\qml
Particles {
    source: "star.png"
    lifeSpan: 200
    lifeSpanDeviation: 100
}
\endqml

    \sa QDeclarativeParticles::lifeSpan
*/
int QDeclarativeParticles::lifeSpanDeviation() const
{
    Q_D(const QDeclarativeParticles);
    return d->lifeSpanDev;
}

void QDeclarativeParticles::setLifeSpanDeviation(int dev)
{
    Q_D(QDeclarativeParticles);
    if(d->lifeSpanDev == dev)
        return;
    d->lifeSpanDev = dev;
    emit lifeSpanDeviationChanged();
}

/*!
    \qmlproperty int Particles::fadeInDuration
    \qmlproperty int Particles::fadeOutDuration
    These properties hold the time taken to fade the particles in and out.

    By default fade in is 200ms and fade out is 300ms.
*/

/*!
    \property QDeclarativeParticles::fadeInDuration
    \brief the time taken to fade in the particles.

    Default value is 200ms.
*/
int QDeclarativeParticles::fadeInDuration() const
{
    Q_D(const QDeclarativeParticles);
    return d->fadeInDur;
}

void QDeclarativeParticles::setFadeInDuration(int dur)
{
    Q_D(QDeclarativeParticles);
    if (dur < 0.0 || dur == d->fadeInDur)
        return;
    d->fadeInDur = dur;
    emit fadeInDurationChanged();
}

/*!
    \property QDeclarativeParticles::fadeOutDuration
    \brief the time taken to fade out the particles.

    Default value is 300ms.
*/
int QDeclarativeParticles::fadeOutDuration() const
{
    Q_D(const QDeclarativeParticles);
    return d->fadeOutDur;
}

void QDeclarativeParticles::setFadeOutDuration(int dur)
{
    Q_D(QDeclarativeParticles);
    if (dur < 0.0 || d->fadeOutDur == dur)
        return;
    d->fadeOutDur = dur;
    emit fadeOutDurationChanged();
}

/*!
    \qmlproperty real Particles::angle
    \qmlproperty real Particles::angleDeviation

    These properties control particle direction.

    angleDeviation randomly varies the direction up to the specified variation.  For
    example, the following creates particles whose initial direction will
    vary from 15 degrees to 105 degrees:

    \qml
Particles {
    source: "star.png"
    angle: 60
    angleDeviation: 90
}
    \endqml
*/

/*!
    \property QDeclarativeParticles::angle
    \brief the initial angle of direction.

    \sa QDeclarativeParticles::angleDeviation
*/
qreal QDeclarativeParticles::angle() const
{
    Q_D(const QDeclarativeParticles);
    return d->angle * 180.0 / M_PI;
}

void QDeclarativeParticles::setAngle(qreal angle)
{
    Q_D(QDeclarativeParticles);
    qreal radAngle = angle * M_PI / 180.0;
    if(radAngle == d->angle)
        return;
    d->angle = radAngle;
    emit angleChanged();
}

/*!
    \property QDeclarativeParticles::angleDeviation
    \brief the maximum possible deviation from the set angle.

    Randomly varies the direction up to the specified variation.  For
    example, the following creates particles whose initial direction will
    vary from 15 degrees to 105 degrees:

\qml
Particles {
    source: "star.png"
    angle: 60
    angleDeviation: 90
}
\endqml

    \sa QDeclarativeParticles::angle
*/
qreal QDeclarativeParticles::angleDeviation() const
{
    Q_D(const QDeclarativeParticles);
    return d->angleDev * 180.0 / M_PI;
}

void QDeclarativeParticles::setAngleDeviation(qreal dev)
{
    Q_D(QDeclarativeParticles);
    qreal radDev = dev * M_PI / 180.0;
    if(radDev == d->angleDev)
        return;
    d->angleDev = radDev;
    emit angleDeviationChanged();
}

/*!
    \qmlproperty real Particles::velocity
    \qmlproperty real Particles::velocityDeviation

    These properties control the velocity of the particles.

    velocityDeviation randomly varies the velocity up to the specified variation.  For
    example, the following creates particles whose initial velocity will
    vary from 40 to 60.

    \qml
Particles {
    source: "star.png"
    velocity: 50
    velocityDeviation: 20
}
    \endqml
*/

/*!
    \property QDeclarativeParticles::velocity
    \brief the initial velocity of the particles.

    \sa QDeclarativeParticles::velocityDeviation
*/
qreal QDeclarativeParticles::velocity() const
{
    Q_D(const QDeclarativeParticles);
    return d->velocity * 1000.0;
}

void QDeclarativeParticles::setVelocity(qreal velocity)
{
    Q_D(QDeclarativeParticles);
    qreal realVel = velocity / 1000.0;
    if(realVel == d->velocity)
        return;
    d->velocity = realVel;
    emit velocityChanged();
}

/*!
    \property QDeclarativeParticles::velocityDeviation
    \brief the maximum possible deviation from the set velocity.

    Randomly varies the velocity up to the specified variation.  For
    example, the following creates particles whose initial velocity will
    vary from 40 to 60.

\qml
Particles {
    source: "star.png"
    velocity: 50
    velocityDeviation: 20
}
\endqml

    \sa QDeclarativeParticles::velocity
*/
qreal QDeclarativeParticles::velocityDeviation() const
{
    Q_D(const QDeclarativeParticles);
    return d->velocityDev * 1000.0;
}

void QDeclarativeParticles::setVelocityDeviation(qreal velocity)
{
    Q_D(QDeclarativeParticles);
    qreal realDev = velocity / 1000.0;
    if(realDev == d->velocityDev)
        return;
    d->velocityDev = realDev;
    emit velocityDeviationChanged();
}

/*!
    \qmlproperty ParticleMotion Particles::motion
    This property sets the type of motion to apply to the particles.

    When a particle is created it will have an initial direction and velocity.
    The motion of the particle during its lifeSpan is then influenced by the
    motion property.

    Default motion is ParticleMotionLinear.
*/

/*!
    \property QDeclarativeParticles::motion
    \brief sets the type of motion to apply to the particles.

    When a particle is created it will have an initial direction and velocity.
    The motion of the particle during its lifeSpan is then influenced by the
    motion property.

    Default motion is QDeclarativeParticleMotionLinear.
*/
QDeclarativeParticleMotion *QDeclarativeParticles::motion() const
{
    Q_D(const QDeclarativeParticles);
    return d->motion;
}

void QDeclarativeParticles::setMotion(QDeclarativeParticleMotion *motion)
{
    Q_D(QDeclarativeParticles);
    if (motion == d->motion)
        return;
    d->motion = motion;
    emit motionChanged();
}

/*!
    \qmlmethod Particles::burst(int count, int emissionRate)

    Initiates a burst of particles.

    This method takes two arguments. The first argument is the number
    of particles to emit and the second argument is the emissionRate for the
    burst. If the second argument is omitted, it is treated as -1. The burst
    of particles has a separate emissionRate and count to the normal emission of
    particles. The burst uses the same values as normal emission for all other
    properties, including emissionVariance.

    The normal emission of particles will continue during the burst, however
    the particles created by the burst count towards the maximum number used by
    normal emission. To avoid this behavior, use two Particles elements.

*/
void QDeclarativeParticles::burst(int count, int emissionRate)
{
    Q_D(QDeclarativeParticles);
    d->bursts << qMakePair(count, emissionRate);
    if (d->clock.state() != QAbstractAnimation::Running)
        d->clock.start();
}

void QDeclarativeParticlesPainter::updateSize()
{
    if (!d->componentComplete)
        return;

    const int parentX = parentItem()->x();
    const int parentY = parentItem()->y();
    for (int i = 0; i < d->particles.count(); ++i) {
        const QDeclarativeParticle &particle = d->particles.at(i);
        if(particle.x > maxX)
            maxX = particle.x;
        if(particle.x < minX)
            minX = particle.x;
        if(particle.y > maxY)
            maxY = particle.y;
        if(particle.y < minY)
            minY = particle.y;
    }

    int myWidth = (int)(maxX-minX+0.5)+d->image.width();
    int myX = (int)(minX - parentX);
    int myHeight = (int)(maxY-minY+0.5)+d->image.height();
    int myY = (int)(minY - parentY);
    setWidth(myWidth);
    setHeight(myHeight);
    setX(myX);
    setY(myY);
}

void QDeclarativeParticles::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
{
    Q_UNUSED(p);
    //painting is done by the ParticlesPainter, so it can have the right size
}

void QDeclarativeParticlesPainter::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
{
    if (d->image.isNull() || d->particles.isEmpty())
        return;

    const int myX = x() + parentItem()->x();
    const int myY = y() + parentItem()->y();

    QVarLengthArray<QPainter::PixmapFragment, 256> pixmapData;
    pixmapData.resize(d->particles.count());

    const QRectF sourceRect = d->image.rect();
    qreal halfPWidth = sourceRect.width()/2.;
    qreal halfPHeight = sourceRect.height()/2.;
    for (int i = 0; i < d->particles.count(); ++i) {
        const QDeclarativeParticle &particle = d->particles.at(i);
        pixmapData[i].x = particle.x - myX + halfPWidth;
        pixmapData[i].y = particle.y - myY + halfPHeight;
        pixmapData[i].opacity = particle.opacity;

        //these never change
        pixmapData[i].rotation = 0;
        pixmapData[i].scaleX = 1;
        pixmapData[i].scaleY = 1;
        pixmapData[i].sourceLeft = sourceRect.left();
        pixmapData[i].sourceTop = sourceRect.top();
        pixmapData[i].width = sourceRect.width();
        pixmapData[i].height = sourceRect.height();
    }
    p->drawPixmapFragments(pixmapData.data(), d->particles.count(), d->image);
}

void QDeclarativeParticles::componentComplete()
{
    Q_D(QDeclarativeParticles);
    QDeclarativeItem::componentComplete();
    if (d->count && d->emissionRate) {
        d->paintItem->updateSize();
        d->clock.start();
    }
    if (d->lifeSpanDev > d->lifeSpan)
        d->lifeSpanDev = d->lifeSpan;
}

QT_END_NAMESPACE

redpajama_set_name: RedPajamaGithub


text:
FactoryGirl.define do
  factory :user do
    external_id       "Fake.User-ucop.edu@ucop.edu"
    created_at        "2014-07-08 22:18:52"
    updated_at        "2014-07-08 22:18:52"
    email             nil
  end

  factory :institution do
    abbreviation        "UC"
    short_name          "UC Office of the president"
    long_name           "University of California, Office of the President"
    landing_page        ".cdlib.org"
    #external_id_strip   ".@.ucop.edu"
    external_id_strip   ".*@.*ucop.edu$"
    created_at          "2014-08-08 03:32:00"
    updated_at          "2014-08-08 03:32:00"
    campus              "cdl"
    logo                "blank_institution_logo.png"
  end

  factory :record do

    identifier         nil
    identifierType     nil
    publisher          "UC Office of the president"
    publicationyear    "2014"
    resourcetype       "Image,Image"
    rights             "Creative Commons Attribution 4.0 International (CC-..."
    created_at         "2014-08-11 19:31:52"
    updated_at         "2014-08-11 19:31:52"
    title              "sss"
    local_id           "uzkmimntnn"
    abstract           ""
    #methods            "fgf"
    rights_uri         "https://creativecommons.org/licenses/by/4.0/"

  end

   #factory.define :record_with_creator, :parent => :record do |f|
     #f.creators { |record| [record.association(:creator)]}
  # end

  factory :creator do
     #association(:record)
    creatorName      "abc"

  end

  factory :subject do

  end

  factory :citation  do

  end

end


text:
#ifndef __NET_UTILS_H__
#define __NET_UTILS_H__

#ifdef __cplusplus
extern "C"
{
#endif

struct net_t {
	SOCKET socket;
	struct sockaddr_in sockaddr;
};

BOOL BuildServerSocket(unsigned short port, BOOL block, struct net_t* net);
BOOL BuildClientSocket(const char* ip, unsigned short port, BOOL block, struct net_t*);
BOOL FreeClientSocket(struct net_t*);

BOOL InitSocket();
void UninitSocket();

int net_sendto(const struct net_t* net, const char* buf, int len);

#ifdef __cplusplus
}
#endif

#endif


text:
package com.example.denis.firebasechat;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;

import com.facebook.login.LoginManager;
import com.firebase.client.ChildEventListener;
import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.Query;
import com.firebase.client.ServerValue;
import com.firebase.client.ValueEventListener;

public class ChatFragment extends Fragment {

    private static final String LOG_TAG = "ChatFragment";
    private static final String UID_KEY = "user_key";

    private RecyclerView rvChat;
    private EditText etMessage;
    private ImageButton btnSend;
    private TextView tvOfflineMode;

    private Firebase mFirebaseMessagesRef, mFirebaseConnectionRef;
    private Query mFirebaseMessagesQuery;

    private ChatAdapter mChatAdapter;

    private String uid = "";

    public static ChatFragment newInstance(String uid) {
        Bundle args = new Bundle();
        args.putString(UID_KEY, uid);
        ChatFragment chatFragment = new ChatFragment();
        chatFragment.setArguments(args);
        return chatFragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        return inflater.inflate(R.layout.fragment_chat, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        rvChat = (RecyclerView) view.findViewById(R.id.rvChat);
        etMessage = (EditText) view.findViewById(R.id.etMessage);
        btnSend = (ImageButton) view.findViewById(R.id.btnSendMessage);
        tvOfflineMode = (TextView) view.findViewById(R.id.tvOfflineMode);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // Init path to messages
        mFirebaseMessagesRef = new Firebase(FBConstants.FIREBASE_URL).child(FBConstants.FIREBASE_MESSAGES);
        mFirebaseMessagesQuery = mFirebaseMessagesRef.limitToLast(FBConstants.FIREBASE_QUERY_LIMIT);
        //Init path to connection state
        mFirebaseConnectionRef = new Firebase(FBConstants.FIREBASE_URL).child(FBConstants.FIREBASE_CONNECTION_PATH);

        // Get user id
        Bundle args = getArguments();
        if (args != null && args.size() > 0) {
            uid = args.getString(UID_KEY);
        }

        initRecyclerView();
        setListeners();
        initMessageInput();
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menuLogout:
                logout();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onResume() {
        super.onResume();

        startFirebaseTracking();
        startOfflineModeTracking();
    }

    private void initMessageInput() {
        etMessage.requestFocus();
        etMessage.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER)
                    sendMessage();
                return false;
            }
        });
    }

    private void startOfflineModeTracking() {
        mFirebaseConnectionRef.addValueEventListener(firebaseConnectionListener);
    }

    // Listener to monitor connection state
    private ValueEventListener firebaseConnectionListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            boolean connected = snapshot.getValue(Boolean.class);
            if (connected) {
                tvOfflineMode.setVisibility(View.GONE);
            } else {
                tvOfflineMode.setVisibility(View.VISIBLE);
            }
        }

        @Override
        public void onCancelled(FirebaseError error) {
        }
    };

    private void startFirebaseTracking() {
        mChatAdapter.setCurrentUserId(uid);
        mFirebaseMessagesQuery.addChildEventListener(messagesChildEventListener);
    }

    private ChildEventListener messagesChildEventListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Message msg = dataSnapshot.getValue(Message.class);
            mChatAdapter.addMessage(msg);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            logout();
        }
    };

    private void initRecyclerView() {
        rvChat.setLayoutManager(new LinearLayoutManager(getActivity()));
        rvChat.setItemAnimator(new DefaultItemAnimator());
        mChatAdapter = new ChatAdapter(getActivity().getApplicationContext());
        rvChat.setAdapter(mChatAdapter);
    }

    private void setListeners() {
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendMessage();
            }
        });
        mChatAdapter.setMessageAddedCallback(new ChatAdapter.MessageAddedCallback() {
            @Override
            public void messageAdded() {
                rvChat.getLayoutManager().scrollToPosition(mChatAdapter.getItemCount() - 1);
            }
        });
    }

    private void sendMessage() {
        String msgText = etMessage.getText().toString();
        if (!msgText.isEmpty()) {
            etMessage.setText("");
            Message msg = new Message(uid, msgText);
            mFirebaseMessagesRef.push().setValue(msg.getObjectMapping());
        }
    }

    private void logout() {
        LoginManager.getInstance().logOut();
        mFirebaseMessagesRef.unauth();
        SharedPrefUtils.clearToken(getActivity());
        getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.flContainer, new LoginFragment()).commit();
    }

    @Override
    public void onPause() {
        super.onPause();
        mFirebaseMessagesQuery.removeEventListener(messagesChildEventListener);
        mFirebaseConnectionRef.removeEventListener(firebaseConnectionListener);
    }
}


text:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _02.StudentsAndWorkers
{
    public class Program
    {
        static void Main()
        {
            List<Student> listOfStudents = new List<Student>();

            listOfStudents.Add(new Student("Vanya", "Karaasenova", 5));
            listOfStudents.Add(new Student("Maya", "Dobreva", 6));
            listOfStudents.Add(new Student("Elena", "Dobreva", 2));
            listOfStudents.Add(new Student("Dobri", "Dobrev", 2));
            listOfStudents.Add(new Student("Kaloyan", "Georgiev", 3));
            listOfStudents.Add(new Student("Maria", "Ivanova", 4));
            listOfStudents.Add(new Student("Pesho", "Petrov", 2));
            listOfStudents.Add(new Student("Slavi", "Karaasenov", 4));
            listOfStudents.Add(new Student("Georgi", "Mihaylov", 5));
            listOfStudents.Add(new Student("Plamen", "Karaasenova", 3));

            var sortedByGrade = listOfStudents
                .OrderBy(st => st.Grade)
                .ToArray();

            Console.WriteLine("Students sorted by grade: ");
            Console.WriteLine();

            foreach (Student st in sortedByGrade)
            {
                Console.WriteLine(st);
            }

            Console.WriteLine();

            List<Worker> listOfWorkers = new List<Worker>();

            listOfWorkers.Add(new Worker("Vanya", "Karaasenova", 50, 8));
            listOfWorkers.Add(new Worker("Maya", "Dobreva", 60, 8));
            listOfWorkers.Add(new Worker("Elena", "Dobreva", 200, 8));
            listOfWorkers.Add(new Worker("Dobri", "Dobrev", 100, 8));
            listOfWorkers.Add(new Worker("Kaloyan", "Georgiev", 300, 8));
            listOfWorkers.Add(new Worker("Maria", "Ivanova", 400, 7));
            listOfWorkers.Add(new Worker("Pesho", "Petrov", 200, 6));
            listOfWorkers.Add(new Worker("Slavi", "Karaasenov", 40, 8));
            listOfWorkers.Add(new Worker("Georgi", "Mihaylov", 50, 8));
            listOfWorkers.Add(new Worker("Plamen", "Karaasenova", 300, 8));

            List<decimal> moneyPerHour = new List<decimal>();
            foreach(Worker worker in listOfWorkers)
            {
                worker.MoneyEarnedPerHour = worker.CalculateMoneyPerHour();
            }

            var sortedWorkers = listOfWorkers
                .OrderByDescending(x => x.MoneyEarnedPerHour)
                .ToArray();

            Console.WriteLine("Workers sorted by money per hour: ");
            Console.WriteLine();

            foreach (Worker wr in sortedWorkers)
            {
                Console.WriteLine(wr);
            }

            List<Human> listOfPeople = new List<Human>();

            for (int i = 0; i < 10; i++)
            {
                listOfPeople.Add(listOfStudents[i]);
                listOfStudents.Add(listOfStudents[i]);
            }

            var sortedPeople = listOfPeople
                .OrderBy(h => h.FName)
                .ThenBy(h => h.LName)
                .ToArray();

            Console.WriteLine();
            Console.WriteLine("People sorted by first and last name: ");
            Console.WriteLine();
            foreach (Human person in sortedPeople)
            {
                Console.WriteLine(person);
            }
        }
    }
}


text:
#pragma once

#include <memory>
#include <string>

#include <cppfs/AbstractFileSystem.h>

namespace cppfs
{

class FileHandle;
class LoginCredentials;

/**
*  @brief
*    Global file system functions
*/
namespace fs
{

/**
*  @brief
*    Get local file system
*
*  @return
*    Pointer to local file system (never null)
*/
CPPFS_API std::shared_ptr<AbstractFileSystem> localFS();

/**
*  @brief
*    Open a file or directory
*
*  @param[in] path
*    Path to file or directory
*  @param[in] credentials
*    Optional login credentials (can be null)
*
*  @return
*    File handle
*/
CPPFS_API FileHandle open(const std::string & path, const LoginCredentials * credentials = nullptr);

/**
*  @brief
*    Compute sha1 hash for string
*
*  @param[in] str
*    String
*
*  @return
*    SHA1 hash
*/
CPPFS_API std::string sha1(const std::string & str);

/**
*  @brief
*    Get base64 encoding for string
*
*  @param[in] str
*    String
*
*  @return
*    Base64 encoded string
*/
CPPFS_API std::string base64(const std::string & str);

/**
*  @brief
*    Get decoded string from base64 encoding
*
*  @param[in] base64
*    Base64 encoded string
*
*  @return
*    Decoded string
*/
CPPFS_API std::string fromBase64(const std::string & base64);

/**
*  @brief
*    Convert hash buffer into string
*
*  @param[in] hash
*    Hash buffer
*
*  @return
*    Hash string
*/
CPPFS_API std::string hashToString(const unsigned char * hash);

} // namespace fs

} // namespace cppfs


text:
package com.uiguard.exception;

/**
 * <b>描述:</b> 自动化测试引擎异常类
 * @author kfzx-chensy04
 * @version 1.0 2012-12-3 下午01:08:39
 */
public class UiGuardException extends Exception {
	private static final long serialVersionUID = 6258242003794190934L;

	public UiGuardException() {
		super();
	}

	public UiGuardException(String message, Throwable cause) {
		super(message, cause);
	}

	public UiGuardException(String message) {
		super(message);
	}

	public UiGuardException(Throwable cause) {
		super(cause);
	}

}


text:
<?php

class HTMLPurifier_HTMLModule_ScriptingTest extends HTMLPurifier_HTMLModuleHarness
{

    function setUp() {
        parent::setUp();
        $this->config->set('HTML.Trusted', true);
        $this->config->set('Output.CommentScriptContents', false);
    }

    function testDefaultRemoval() {
        $this->config->set('HTML.Trusted', false);
        $this->assertResult(
            '<script type="text/javascript">foo();</script>', ''
        );
    }

    function testPreserve() {
        $this->assertResult(
            '<script type="text/javascript">foo();</script>'
        );
    }

    function testCDATAEnclosure() {
        $this->assertResult(
'<script type="text/javascript">//<![CDATA[
alert("<This is compatible with XHTML>");
//]]></script>'
        );
    }

    function testAllAttributes() {
        $this->assertResult(
            '<script
                defer="defer"
                src="test.js"
                type="text/javascript"
            >PCDATA</script>'
        );
    }

    function testUnsupportedAttributes() {
        $this->assertResult(
            '<script
                type="text/javascript"
                charset="utf-8"
            >PCDATA</script>',
            '<script type="text/javascript">PCDATA</script>'
        );
    }

}

// vim: et sw=4 sts=4


text:
// The MIT License (MIT)
//
// Copyright (c) 2015 Xamarin
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
using System;
using System.Globalization;
using Xamarin.Forms;

namespace XamarinCRM.Converters
{
    public class ToUpperConverter : IValueConverter
    {
        #region IValueConverter implementation
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((string)value).ToUpper();
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
        #endregion

    }
}


text:
import { style } from '@better-scroll/shared-utils'

export default class Tombstone {
  private cached: Array<HTMLElement> = []
  public width = 0
  public height = 0

  private initialed = false

  constructor(private create: () => HTMLElement) {
    this.getSize()
  }

  static isTombstone(el: HTMLElement): boolean {
    if (el && el.classList) {
      return el.classList.contains('tombstone')
    }
    return false
  }

  private getSize(): void {
    if (!this.initialed) {
      let tombstone = this.create()
      tombstone.style.position = 'absolute'
      document.body.appendChild(tombstone)

      tombstone.style.display = ''
      this.height = tombstone.offsetHeight
      this.width = tombstone.offsetWidth

      document.body.removeChild(tombstone)

      this.cached.push(tombstone)
    }
  }

  getOne(): HTMLElement {
    let tombstone = this.cached.pop()
    if (tombstone) {
      const tombstoneStyle = tombstone.style as any

      tombstoneStyle.display = ''
      tombstoneStyle.opacity = '1'
      tombstoneStyle[style.transform] = ''
      tombstoneStyle[style.transition] = ''
      return tombstone
    }
    return this.create()
  }

  recycle(tombstones: Array<HTMLElement>): Array<HTMLElement> {
    for (let tombstone of tombstones) {
      tombstone.style.display = 'none'
      this.cached.push(tombstone)
    }
    return this.cached
  }

  recycleOne(tombstone: HTMLElement) {
    this.cached.push(tombstone)

    return this.cached
  }
}