text:
(function(window){
// var createClass = function(className,methods) {
//     var ClassObj = function() {
//         this.initialize.apply(this, arguments);
//     };
//     for (var property in methods) {
//        ClassObj.prototype[property] = methods[property];
//     };

//     ClassObj.prototype._class = className;

//     if (!ClassObj.prototype.initialize) ClassObj.prototype.initialize = function(){};

//     return ClassObj;
// };
//(function(){

var createClass = function(className,methods) {

    var str = 'var ' + className + ' = function(){this.initialize.apply(this,arguments);};';
    eval(str);
    for (var property in methods) {
       eval(className).prototype[property] = methods[property];
    }

    eval(className).prototype._class = className;

    if (!eval(className).prototype.initialize) eval(className).prototype.initialize = function(){};

    return eval(className);
};
var Commodity = createClass('Commodity', {
  initialize: function(data){
    // todo
    this.name = data.name;
    this.size = data.size;

  }

});
var Inventory = createClass('Inventory', {

  initialize: function(commodities){
    this.stuff = commodities.stuff;
    this.maxSize = commodities.maxSize;
    // commodities.forEach(function(commodity){
    //   this.stuff[commodity.name] = {
    //     ideal: commodity.ideal,
    //     size: commodity.size,
    //     amount: commodity.start
    //   }
    // },this);

  },
  list: function(){
    var arr = [];
    for ( var commodity in this.stuff ){
      arr.push(commodity);
    }
    return arr;
  },
  getAmountOf: function(commodity){
    if (this.getItem(commodity) !== undefined){
      return this.getItem(commodity).amount;
    } else { return 0; }
  },
  getItem: function(commodity){
    return this.stuff[commodity];
  },
  getSpaceUsed: function(){
    var spaceUsed = 0;
    for (var item in this.stuff){
      spaceUsed += this.stuff[item].size;
    }
    return spaceUsed;
  },
  getSpaceEmpty: function(){
    return this.maxSize - this.getSpaceUsed();
  },
  surplus: function(commodity){
    var com = this.stuff[commodity];
    if ( com.amount > com.ideal ) {
      return ( com.amount - com.ideal );
    }
    return 0;
  },
  shortage: function(commodity){
    var com = this.stuff[commodity];
    if ( com.amount < com.ideal ) {
      return ( com.ideal - com.amount );
    }
    return 0;
  }

});
var Offer = createClass('Offer', {
  initialize: function(agentId,commodity,amount,price){
    this.agentId = agentId;
    this.commodity = commodity;
    this.amount = amount;
    this.pricePerUnit = price;
  },
  toString: function(){
    return '('+this.agentId+'): '+this.commodity+' x ' +this.amount+' @ '+this.pricePerUnit;
  }
});

var LogicAction = createClass('LogicAction',{
  initialize: function(data){
    this.action = '';
    this.targets = [];
    this.amounts = [];
    this.chances = [];
    this.efficiency = [];
    this.results = [];
    this.data = data;

    for (var str in data) {
      var lstr = str.toLowerCase();
      switch(lstr) {
        case 'produce':
          this.action = 'produce';
          this.targets = data.produce;
          break;
        case 'consume':
          this.action = 'consume';
          this.targets = data.consume;
          break;
        case 'transform':
          this.action = 'transform';
          this.targets = data.transform;
          break;
        case 'amount':
          this.amounts = [];
          var list_amounts = data[str]
          for (val in list_amounts) {
            if (typeof(val) === 'string' && val == 'all') {
              this.amounts.push(-1);      //-1 means 'all', negative values are strictly reserved for this
                            //sign is already implied by 'produce/consume/transform' etc
            }else {
              this.amounts.push(list_amounts[val]);
            }
          }
          break;
        case 'chance':
          this.chances = data[str];
          break;
        case 'efficiency':
          this.efficiency = data[str];
          break;
        case 'into':
          this.results = data[str];
          break;
      }
    }

    if (this.amounts == null) { this.amounts = [];}
    if (this.chances == null) { this.chances = [];}

    if(this.action == 'transform'){
      if (this.efficiency == null) { this.efficiency = []; }
    }

    for (var i = 0; i < this.targets.length; i++) {
      if (i > this.amounts.length - 1) {
        this.amounts.push(1);      //if item is specified but amount is not, amount is 1
      }
      if (i > this.chances.length - 1) {
        this.chances.push(1);      //if item is specified but chance is not, chance is 1
      }
      if(this.action == 'transform'){
        if (i > this.efficiency.length - 1) {
          this.efficiency.push(1);     //if item is specified but efficiency is not, efficiency is 1
        }
      }
    }

  }
});

var LogicCondition = createClass('LogicCondition',{
	initialize: function(str) {
		this.negated = false;
		if (str.substr(0,1) === '!') {
			this.negated = true;
			str = str.substr(1, str.length - 1);
		};
		this.condition = str;
	}
});

var LogicResult = createClass('LogicResult', {
	initialize: function(){

	}
});

var LogicNode = createClass('LogicNode',{
  initialize: function(data) {
    this.isLeaf = false; //if it's a leaf node, it should only have actions
               //if it's a branch node, it should only have conditions/params

    this.params = null;
    this.nodeTrue = null;
    this.nodeFalse = null;
    this.actions = null;

    if ( data !== null ) {
      if (data.hasOwnProperty('condition')) {
        this.isLeaf = false;

        var listConditions = data.condition;
        this.conditions = [];
        for (var condition in listConditions){
          this.conditions.push(new LogicCondition(listConditions[condition]));
        }
        this.params = data.param;
        if (data.hasOwnProperty('if_true')){
          this.nodeTrue = new LogicNode(data.if_true);
        }
        if (data.hasOwnProperty('if_false')){
          this.nodeFalse = new LogicNode(data.if_false);
        }
      } else {
        this.isLeaf = true;
        var listActions = data.action;
        this.actions = [];
        for (var action in listActions) {
          this.actions.push(new LogicAction(listActions[action]));
        }
      }
    }
  }
});

var Logic = createClass('Logic',{
  initialize: function(data){
    this.src = JSON.stringify(data);
    this.root = new LogicNode(data);
  },

  getProduction: function(commodity,currentNode){
    if ( currentNode === null ) {
      return this.getProduction(commodity,root);
    } else {
      if ( !currentNode.isLeaf ) {
        var a = this.getProduction(commodity,currentNode.nodeTrue);
        var b = this.getProduction(commodity,currentNode.nodeFalse);
        return a + b;
      } else {
        var amount = 0;
        currentNode.actions.forEach(function(act){
          for (var i = 0; i < act.targets.length; i++) {
            switch(act.action) {
              case 'produce':
                if (act.targets[i] === commodity ) {
                  amount += act.chances[i] * act.amounts[i];
                }
                break;
              case 'transform':
                var amt = act.amounts[i];
                if ( amt === -1 ) { amt = 1; } //wtf??
                if ( act.results[i] === commodity ) {
                  amount += act.chances[i] * amt * act.efficiency[i];
                }
                break;
            }
          }
        });
        return amount;
      }
    }
    return 0;
  },

  perform: function(agent,currentNode) {
    if ( !currentNode.isLeaf ) {
      if (this.evaluate(agent,currentNode)) {
        if (currentNode.nodeTrue !== null) {
          this.perform(agent,currentNode.nodeTrue);
        }
      } else {
        if (currentNode.nodeFalse !== null) {
          this.perform(agent,currentNode.nodeFalse);
        }
      }
    } else {
      currentNode.actions.forEach(function(act){
        for ( var i = 0; i < act.targets.length; i++ ) {
          var amount = act.amounts[i];
          var target = act.targets[i];
          var chance = act.chances[i];

          //Roll to see if this happens
          if ( chance >= 1.0 || Math.random() < chance ) {
            var amt = agent.inventory.stuff[target].amount;

            if ( amount === -1) { //-1 means 'match my total value'
              amount = amt;
            }

            switch(act.action) {
              case 'produce':
                agent.inventory.stuff[target].amount += amount;
                break;
              case 'consume':
                agent.inventory.stuff[target].amount -= amount;
                break;
              case 'transform':
                var amountTarget = amount;
                //exchange rate between A -> B
                var amountProduct = amount * act.efficiency[i];
                var result = act.results[i]

                agent.inventory.stuff[target].amount -= amountTarget;  //consume this much of A
                agent.inventory.stuff[result].amount += amountProduct; //produce this much of B
                break;
            }
          }
        }
      });
    }
  },

  evaluate: function(agent,currentNode) {
    currentNode.conditions.forEach(function(c){
      switch(c.condition) {
        case 'has': //Do you have something?
          var str,
            has = false;
          currentNode.params.forEach(function(commodity){
            var amount = agent.inventory.getAmountOf(commodity);
            if ( amount > 0 ) {
              has = true;
            }
            if (c.negated) {
              if (has) {return false;}
            } else {
              if (!has) {return false;}
            }
          }, agent);
          break;
      }
    }, (agent,currentNode));
    return true;
  }
});

var Role = createClass('Role',{
	initialize: function(data){
		function parseData(){

		}

		this.id = data.id;
		this.inventory = (function(data){
			var inv = {
				stuff: {},
				maxSize: data.inventory.max_size
			};
			for (var com in data.inventory.start){
				inv.stuff[com] = {};
				inv.stuff[com].amount = data.inventory.start[com];
			};
			for (var comm in data.inventory.ideal){
				inv.stuff[comm].ideal = data.inventory.ideal[comm];
			};
			return inv;
		}(data));

		this.money = data.money;
		this.logic = new Logic(data.logic);
	},
	getStartInventory: function(){
		var i = new Inventory(this.inventory);
		return i;

	}
});

var Agent = createClass('Agent',{

  initialize: function(data,market) {

    this.id = market.agents.length + 1;
    this.role = new Role(data);
    this.cash = this.role.money;
    this._cash = 0;
    this.destroyed = false;

    // add only own commodities to inventory
    // function getInventory(){
    //   var inv = {};
    //   for (var need in data.needs){
    //     inv[need] = {
    //       amount: 0,
    //       size: market.getCommodity(need).size,
    //       ideal: data.needs[need]
    //     };

    //   }
    //   for (var product in data.produce){
    //     inv[product] = {
    //       amount: 0,
    //       size: market.getCommodity(product).size,
    //       ideal: data.produce[product]
    //     };
    //   }
    //   return new Inventory(inv);
    // }

    this.inventory = this.role.getStartInventory(); // new Inventory(commodities)
    this.priceBeliefs = {
      // "commodity": {x:price * 0.5,y:price * 1.5}
    };
    this.observedTradingRange = {
      // "commodity": [price,price,price etc..]
    };
    // set init values to 0
    for (var commodity in this.inventory.stuff){
      this.inventory.stuff[commodity].size = parseInt(market.getCommodity(commodity).size);
      this.priceBeliefs[commodity] = {
        x:1,
        y:10
      };
      this.observedTradingRange[commodity] = [4];
    }
  },
  generateOffers: function(market, commodity) {
    var offer,
      surplus = this.inventory.surplus(commodity);

    if ( surplus >=1 ) {
      offer = this.createAsk(commodity, 1 /* <-why is this here? */);
      if ( offer !== null ) {
        market.ask(offer);
      }
    } else {
      var shortage = this.inventory.shortage(commodity),
        space =  this.inventory.getSpaceEmpty(),
        unit_size = this.inventory.getItem(commodity).size;

      if ( shortage > 0 && space >= unit_size ) {
        var limit = 0;
        if ( (shortage * unit_size) <= space ) { //enough space for ideal order
          limit = shortage;
        } else {                                // not enough space
          limit = Math.floor( space / shortage );
        }

        if ( limit > 0 ) {
          offer = this.createBid(commodity, limit);
          if ( offer !== null ){
            market.bid(offer);
          }
        }
      }
    }
  },
  updatePriceModel: function(market, act, commodity, success, unitPrice) {
    var // Statics
      SIGNIFICANT = 0.25,
      SIG_IMBALANCE = 0.33,
      LOW_INVENTORY = 0.1,
      HIGH_INVENTORY = 2.0,
      MIN_PRICE = 0.01;

    var observedTrades = this.observedTradingRange[commodity],
      publicMeanPrice = market.getAvgPrice(commodity),
      belief = this.priceBeliefs[commodity],
      mean = (belief.x + belief.y) / 2,
      wobble = 0.05,
      deltaToMean = mean - publicMeanPrice;

    if ( success ) {
      observedTrades.push(unitPrice);
      if ( act == 'buy' && deltaToMean > SIGNIFICANT ) {  //overpaid
        belief.x -= deltaToMean / 2;                      // SHIFT towards mean
        belief.y -= deltaToMean / 2;
      } else if ( act == 'sell' && deltaToMean < -SIGNIFICANT ) { //undersold
        belief.x -= deltaToMean / 2;                      // SHIFT towards mean
        belief.y -= deltaToMean / 2;
      }

      belief.x += wobble * mean; //increase the belief's certainty
      belief.y -= wobble * mean;
    } else {
      belief.x -= deltaToMean / 2;
      belief.y -= deltaToMean / 2;

      var specialCase = false,
        stocks = this.inventory.stuff[commodity].amount,
        ideal = this.inventory.stuff[commodity].ideal;

      if ( act == 'buy' && stocks < LOW_INVENTORY * ideal ) {
        //very low on inventory AND can't buy
        wobble *= 2;
        specialCase = true;
      } else if ( act == 'sell' && stocks > HIGH_INVENTORY * ideal ) {
        //very high stock of commodity AND can't sell
        wobble *= 2;
        specialCase = true;
      }

      if ( !specialCase ) {
        var asks = market.history.asks[commodity].slice(-1)[0],
          bids = market.history.bids[commodity].slice(-1)[0],
          supplyVSdemand = (asks - bids) / (asks + bids);

        if ( supplyVSdemand > SIG_IMBALANCE || supplyVSdemand < -SIG_IMBALANCE ) {
          //too much supply: lower price
          //too much demand: raise price

          var newMean = publicMeanPrice * (1 - supplyVSdemand);
          deltaToMean = mean - newMean;

          belief.x -= deltaToMean / 2;
          belief.y -= deltaToMean / 2;
        }
      }

      belief.x -= wobble * mean; //decrease the belief's certainty
      belief.y += wobble * mean;
    }

    if ( belief.x < MIN_PRICE ) {
      belief.x = MIN_PRICE;
    } else if ( belief.y < MIN_PRICE ) {
      belief.y = MIN_PRICE;
    }

  },
  getTradePoint: function(commodity){
    var arr = this.observedTradingRange[commodity],
      point = {
        x : Math.min.apply(Math,arr),
        y : Math.max.apply(Math,arr)
      };
    return point;
  },
  determinePrice: function(commodity){
    var belief = this.priceBeliefs[commodity];
    return Math.random() * (belief.y-belief.x) + belief.x;
  },
  positionInRange: function(val, min, max, clamp){
    val -= min;
    max -= min;
    min = 0;
    val = (val / (max-min));
    if (clamp) {
      if ( val < 0 ) { val = 0; }
      if ( val > 1 ) { val = 1; }
    }
    return val;
  },
  determinePurchaseQty: function(commodity) {
    // 1. mean -> historical mean price of commodity
    // 2. favorability -> *max price* position of mean within observed trading range
    // 3. amount to sell -> favorability * available inventory space
    // 4. return amount to sell
    var mean = market.getAvgPrice(commodity),
      tradingRange = this.getTradePoint(commodity);

    if ( tradingRange !== null ) {
      var favorability = this.positionInRange(mean, tradingRange.x,tradingRange.y,true);
      favorability = 1 - favorability;
      //do 1 - favorability to see how close we are to the low end

      var amountToBuy = Math.round(favorability * this.inventory.shortage(commodity));
      if (amountToBuy < 1) {
        amountToBuy = 1;
      }
      return amountToBuy;
    }
    return 0;
  },
  determineSaleQty: function(commodity) {
     var mean = market.getAvgPrice(commodity),
      tradingRange = this.getTradePoint(commodity);

    if ( tradingRange !== null ) {
      var favorability = this.positionInRange(mean, tradingRange.x,tradingRange.y,true);

      var amountToSell = Math.round(favorability * this.inventory.surplus(commodity));
      if ( amountToSell < 1 ) {
        amountToSell = 1;
      }
      return amountToSell;
    }
    return 0;
  },
  createBid: function(commodity,limit) {
    // Bid to purchase a _limit_ of _commodity_        --#page 4
    var price = this.determinePrice(commodity),
      ideal = this.determinePurchaseQty(commodity),
      qtyToBuy = (function(){
        if (ideal > limit){
          return limit;
        } else {
          return ideal;
        }
      })();
    if (qtyToBuy > 0){
      return new Offer(this.id,commodity,qtyToBuy,price);
    }
    return null;
  },
  createAsk: function(commodity, limit) {
    // Ask to sell at least _limit_ of _commodity_     --#page 4
    var price = this.determinePrice(commodity),
      ideal = this.determineSaleQty(commodity),
      qtyToSell = (function(){
        if (ideal < limit){
          return limit;
        } else {
          return ideal;
        }
      })();

    if ( qtyToSell > 0 ) {
      return new Offer(this.id, commodity, qtyToSell, price);
    }

    return null;
  },
  produce: function(commodity){

  },
  updatePriceBelief: function(commodity){
      var price = market.getAvgPrice(commodity);
      this.priceBeliefs[commodity] = {
        x:price * 0.5,
        y: price * 1.5
      };
  }
});
var Economia = createClass('Economia', {
  initialize: function(data){
    this.books = {
      asks: {},
      bids: {}
    };
    this.history = {
      price: {},
      asks: {},
      bids: {},
      trades: {},
      profitability: {}
    };
    this.commodities = Array();
    for (var _commodity in data.commodities){
      var commodity = data.commodities[_commodity];
      this.addCommodity(commodity);
    }
    this.agents = Array();

    this.roles = {};
    data.roles.map(function(role){
      this.roles[role.id] = {
        id: role.id,
        inventory: role.inventory,
        logic: role.logic,
        money:role.money
      };
      this.history.profitability[role.id] = [];
    }, this);

    for (var role in data.start_conditions.agents){
      var amount = data.start_conditions.agents[role];
      for (var i = 0; i<= amount;i++){
        this.agents.push(new Agent(this.roles[role],this));
      }
    };

  },
  shuffle: function(collection){
    for (var i=0;i<collection.length;i++){
      var ii = (collection.length - 1) - i;
      if (ii > 1) {
        var j = Math.floor(Math.random() * (ii - 1));
        var temp = collection[j];
        collection[j] = collection[ii];
        collection[ii]= temp;
      }
    }
    return collection;
  },
  sortHighestPrice: function(collection){

  },
  getAgent: function(agentId){
    var result = this.agents.filter(function(el){
      return el.id == agentId;
    });
    if ( result.length == 1 ) return result[0];
  },
  addCommodity: function(commodity){
    this.commodities.push(new Commodity(commodity));
    this.books.asks[commodity.name] = Array();
    this.books.bids[commodity.name] = Array();
    this.history.price[commodity.name] = Array(1,1.2,1.3); //dummy float to avoid division by zero
    this.history.asks[commodity.name] = Array();
    this.history.bids[commodity.name] = Array();
    this.history.trades[commodity.name] = Array();
  },
  getCommodity: function(commodity){
    var result = this.commodities.filter(function(el){
      return el.name == commodity;
    });
    if (result.length == 1) return result[0];
  },
  getAvgPrice: function(commodity){
    var arr = this.history.price[commodity],
      sum = 0,
      avg;
    for (var i =0; i < arr.length;i++){
      sum += arr[i];
    }
    if (sum !==0){
      avg = sum/arr.length;
    } else {
      avg = 0;
    }
    return avg;
  },
  bid: function(offer){
    this.books.bids[offer.commodity].push(offer);
  },
  ask: function(offer){
    this.books.asks[offer.commodity].push(offer);
  },
  resolveOffers: function(commodity){
    var bids = this.books.bids[commodity],
      asks = this.books.asks[commodity];

    this.shuffle(bids);
    this.shuffle(asks);

    bids.sort(function(a,b){ // Highest PPU to lowest
      if (a.pricePerUnit < b.pricePerUnit) return 1;
      if (a.pricePerUnit > b.pricePerUnit) return -1;
      return 0;
    });
    asks.sort(function(a,b){ // Lowest PPU to highest
      if (a.pricePerUnit > b.pricePerUnit) return 1;
      if (a.pricePerUnit < b.pricePerUnit) return -1;
      return 0;
    });

    var stats = {
      successfulTrades: 0,
      moneyTraded: 0,
      unitsTraded: 0,
      avgPrice: 0,
      numAsks: 0,
      numBids: 0
    };

    var failsafe = 0;

    bids.forEach(function(bid){
      stats.numBids += bid.amount;
    });
    asks.forEach(function(ask){
      stats.numAsks += ask.amount;
    });

    while (bids.length > 0 && asks.length > 0){
      var buyer = bids[0],
        seller = asks[0],
        qtyTraded = Math.min(seller.amount,buyer.amount),
        clearingPrice = (seller.pricePerUnit + buyer.pricePerUnit) / 2;

      if (qtyTraded > 0) {
        seller.amount -= qtyTraded;
        buyer.amount -= qtyTraded;

        this.transferCommodity(commodity, qtyTraded, seller.agentId, buyer.agentId);
        this.transferMoney(qtyTraded * clearingPrice, seller.agentId, buyer.agentId);

        var buyerAgent = this.getAgent(buyer.agentId),
         sellerAgent = this.getAgent(seller.agentId);

        buyerAgent.updatePriceModel(this, 'buy', commodity, true, clearingPrice);
        sellerAgent.updatePriceModel(this, 'sell', commodity, true, clearingPrice);

        //log statistics

        stats.moneyTraded += (qtyTraded * clearingPrice);
        stats.unitsTraded += qtyTraded;
        stats.successfulTrades ++;

      }

      if ( seller.amount === 0) { //seller is out of offered good
        asks.splice(0,1);        //remove offer
        failsafe = 0;
      }
      if ( buyer.amount === 0) { //buyer has bought all he needs
        bids.splice(0,1);       //remove offer
        failsafe = 0;
      }

      failsafe ++;

      if (failsafe > 1000) {
        console.log('something went wrong');
      }
    }

    //reject remaining offers and update price beliefs

    while(bids.length > 0) {
      var buyer = bids[0],
        buyerAgent = this.getAgent(buyer.agentId);

      buyerAgent.updatePriceModel(this,'buy',commodity,false);
      bids.splice(0,1);
    }
    while(asks.length > 0) {
      var seller = asks[0],
        sellerAgent = this.getAgent(seller.agentId);

      sellerAgent.updatePriceModel(this,'sell',commodity,false);
      asks.splice(0,1);
    }

    //update history

    this.history.bids[commodity].push(stats.numBids);
    this.history.asks[commodity].push(stats.numAsks);
    this.history.trades[commodity].push(stats.unitsTraded);

    if ( stats.unitsTraded > 0 ) {
      stats.avgPrice = stats.moneyTraded / stats.unitsTraded;
      this.history.price[commodity].push(stats.avgPrice);
    } else {
      //special case: none were traded this round, use last round's avg price
      var arr = this.history.price[commodity];
      stats.avgPrice = arr[arr.length - 1];
      this.history.price[commodity].push(stats.avgPrice);
    }

  },
  getHistoryAvg: function(mode, commodity, range){
    var arr = this.history[mode][commodity],
      newArr = arr.slice(arr.length-(range-1)),
      sum = 0,
      avg;
    for (var i =0; i < newArr.length;i++){
      sum += newArr[i];
    }
    if (sum !==0){
      avg = sum/newArr.length;
    } else {
      avg = 0;
    }
    return avg;
  },
  getHistoryProfitAvg: function(role,range){
    var arr = this.history.profitability[role],
      newArr = arr.slice(arr.length-(range-1)),
      sum = 0,
      avg;
    for (var i=0; i< newArr.length; i++){
      sum += newArr[i];
    }
    if (sum !== 0){
      avg = sum/newArr.length;
    } else {
      avg = 0;
    }
    return avg;
  },
  getBestMarketOpportunity: function(){
    var bestMarket = '',
      bestRatio = -999999,
      minimum = 1.5;
    this.commodities.forEach(function(commodity){
      var asks = this.getHistoryAvg('asks',commodity.name,10),
        bids = this.getHistoryAvg('bids',commodity.name,10),
        ratio = 0;

      if ( asks === 0 && bids > 0){
        ratio = 999999999999;
      } else {
        ratio = bids / asks ;
      }

      console.log(commodity.name, ratio);

      if ( ratio > minimum && ratio > bestRatio) {
        bestRatio = ratio;
        bestMarket = commodity.name;
      }

    },this);

    return bestMarket;
  },
  getMostProfitableRole: function(){
    var list,
      best = -99999,
      bestRole = '';
    for (var role in this.roles){
      var val = this.getHistoryProfitAvg(role,10);
      if (val > best) {
        bestRole = role;
        best = val;
      }
    }
    return bestRole;
  },
  getRoleThatMakesMostOf: function(commodity){
    var bestAmount = 0,
      bestRole = '';

    for (var role in this.roles){
      var arr = this.agents.filter(function(agent){
        return agent.role.id == role;
      }, role);
      var logic = arr[0].role.logic;
      console.log(logic); //return the first agent to match;
      var amount = logic.getProduction(commodity, logic.root);
      if (amount > bestAmount){
        bestAmount = amount;
        bestRole = role;
      }
    }

    return bestRole;
  },
  replaceAgent: function(agent){
    var bestRole = this.getMostProfitableRole();
    //Special case to deal with very high demand-to-supply ratios
    //This will make them favor entering an underserved market over
    //Just picking the most profitable class

    var bestOpportunity = this.getBestMarketOpportunity();
    if ( bestOpportunity !== '' ) {
      var bestOpportunityRole = this.getRoleThatMakesMostOf(bestOpportunity);
      if ( bestOpportunityRole !== '' ) {
        bestRole = bestOpportunityRole;
      };
    };

    var newAgent = new Agent(this.roles[bestRole],this);
    this.agents.pop(agent);
    newAgent.id = agent.id;
    console.log('Agent '+ agent.id + ' (a '+agent.role.id+') went bankrupt. He was replaced by a ' + bestRole) //bankrupt
    this.agents.push(newAgent);

  },
  transferCommodity: function(commodity,amount, sellerId, buyerId){
    var seller = this.getAgent(sellerId),
      buyer = this.getAgent(buyerId);

    seller.inventory.stuff[commodity].amount -= amount;
    buyer.inventory.stuff[commodity].amount += amount;
  },
  transferMoney: function(amount,sellerId,buyerId){
    var seller = this.getAgent(sellerId),
      buyer = this.getAgent(buyerId);

    seller.cash += amount;
    buyer.cash -= amount;
  },
  tick: function(render){
    this.agents.forEach(function(agent){
      var inventory = agent.inventory.list();
      agent._cash = agent.cash;

      agent.role.logic.perform(agent, agent.role.logic.root);

      inventory.forEach(function(commodity){
        agent.generateOffers(this,commodity);
      }, this);
    }, this);

    this.commodities.forEach(function(commodity){
      this.resolveOffers(commodity.name);
    }, this);

    this.agents.forEach(function(agent){
      if (agent.cash <= 0){
        this.replaceAgent(agent);
      }
    }, this);

  },
  test: function(commodity){
    this.getAgent(1).inventory.stuff[commodity].amount = 5;
    this.getAgent(1).generateOffers(this,commodity);
    this.getAgent(2).generateOffers(this,commodity);
    this.resolveOffers(commodity);
  }
});

window.Economia = Economia;
 })(window)

redpajama_set_name: RedPajamaGithub


September 21, 2017, AkzoNobel's Specialty Chemicals business is studying plans to build a world-class plant for its Bermocoll® business, which supplies essential ingredients for the paint and buildings and construction industries.
The study - expected to be completed by the end of 2017 - is focused on creating a new facility to increase production capacity for EHEC cellulosic ethers to help meet growing global demand.
A number of locations are being considered for the new EHEC plant, including options to expand operations at the company's existing production sites.


Opened in 1828 La Villette covers little more than 2-and-a-half acres.
Swiss sculptor Auguste Heng (1891-1968) created a modern version of la Pleureuse or Mourner for his own tomb; and Signaler Maurice-Paul-Jean Thiery (1895-1917, bust).
After exiting the Metro make your way to rue d'Hautpoul. Walk up about two blocks to the cemetery entrance on your left.


Kathy Tyler of MET. Inc. tells me that over 60 people participated in today's audio web session to learn about the USDA Section 502 loan program for low income families. That is very good good news.
The next step is a training in Dallas, March 24-26 to teach nonprofits how to use the program. Thanks to TDHCA there is travel and lodging reimbursement for select organizations interested in helping low income Texas families apply for and use these loans. Here is the application form.
The USDA 502 direct loan program is the gold standard for affordable, high quality loans for low-income families. Interest rates are as low as 1 percent. It is a shame that Texas dramatically underutilized the program in recent years and sent most of our state's allocation back to Washington unused where it was quickly snapped up to make loans in other states.
A TxLIHIS report a few months ago, researched and written by Kevin Jewell blew the whistle on this problem. People read the report and got to work to solve the problem. Now thanks to a cooperative arrangement of a number of Texas housers, especially MET, Inc., the Housing Assistance Council, the Texas Department of Housing and Community Affairs and USDA, Texas is making real efforts to put these funds to work providing affordable homes to low income Texans.
This entry was posted in State issues and tagged 502 Direct, USDA. Bookmark the permalink.
I am hoping to be one of the lucky ones to secure a loan through the 502 Direct Loan program this month. I am very low income and am submitting my application this week to the office in Fredericksberg, Texas. I am wondering how long it takes to get approved and am on SSD. I am also hoping to find a home in Medina County before the first time homebuyer credit is gone..


Tokyo–A current area of intense interest in nanotechnology is van der Waals heterostructures, which are assemblies of atomically thin two-dimensional (2D) crystalline materials that display attractive conduction properties for use in advanced electronic devices.
"The robot can find, collect, and assemble 2D crystals in a glove box," study first author Satoru Masubuchi says. "It can detect 400 graphene flakes an hour, which is much faster than the rate achieved by manual operations."
The article "Autonomous robotic searching and assembly of two-dimensional crystals to build van der Waals superlattices" was published in Nature Communications at DOI: 10.1038/s41467-018-03723-w.


Or at least she did until Tuesday when, after meeting with Pelosi and accepting a new subcommittee chair on voting rights, the Ohio Democrat announced that she would drop her challenge — and support the once and future Speaker. Which proved Pelosi's leadership skills, if nothing else.
So if Pelosi is a very good leader, then why do they need a new one? The hollow sound of Fudge's critique echoes in the remarks of her fellow complainants. They say that Democratic leadership needs "new blood" or "new leadership." They note their pledges to constituents to oppose Pelosi, although the reason behind those pledges has never been made clear either. Is it because Republicans keep smearing her?
It is remarkable that in this hour of constitutional confrontation, fomented by a president who violates his oath and endangers national security every day, a rump group of House Democrats insists its most important mission is to overthrow the woman who returned them to power. It is astonishing that this group plans to carry the grudge onto the House floor come Jan. 3, even knowing that it will lose a vote within the caucus by an overwhelming majority. (So far the group has 16 votes out of roughly 235, depending on how a few lingering races are resolved.) And it is disturbing that they would ignore their duty to hinder Trump's depredations, instead of rupturing the only institution with the will and authority to oppose him.


text:
Tag Archives: Harbourfront Centre
Snow day! Photos of some downtown construction sites after a light morning snowfall dusts Toronto
The vast construction zone for the new West Don Lands Community is seen in this image taken by a Waterfront Toronto webcam this afternoon. The 80-acre site was blanketed with light snow this morning, less than 24 hours after Waterfront Toronto and Infrastructure Ontario announced that long-awaited construction is finally commencing on the new mixed-use residential community a short distance east of the downtown business district. The highrise under construction at upper left is the 40-storey Clear Spirit condo tower in the nearby Distillery District.
Construction progress on the 75-storey Aura at College Park condo tower is seen in this image captured from a webcam on the Aura website.
Excavation activity at the Nicholas Residences condo site near Yonge & Bloor
Shoring work continues on the FIVE Condos site at Yonge & St Joseph Streets
Snow-covered steel I-beams and construction equipment on the FIVE Condos site
A worker directs traffic past the ETFO office building site on Isabella Street
Another view of progress on the 4-storey ETFO office headquarters
Overlooking the long, rectangular excavation for the 49-storey X2 Condos tower under construction at the southwest corner of Jarvis & Charles Streets
Crews have nearly completed digging the deep excavaton for the X2 Condos tower. The construction crane is expected to be installed soon
Interior demolition work continues on the eight-storey office building at 45 Charles Street East, future site of the Chaz.Yorkville condo tower.
Despite the light snow cover, a drilling rig (rear right) was busy jackhammering a concrete pad at the northwest corner of the Chaz.Yorkville site
Two major construction projects at the southwest corner of Bay & Grosvenor Streets: Burano Condos, left, and the Women's College Hospital redevelopment.
The new Women's College Hospital building has risen five floors so far on what was formerly the site of the hospital's multi-level parking garage
The soaring glass atrium on the north (Grosvenor Street) side of Burano Condos
A view of the atrium from the north side of Grosvenor Street
A publicly-accessible piazza, designed by landscape architects Janet Rosenberg + Associates, will be constructed next to the atrium
The sharply angled glass panels of the atrium provide a striking contrast to the condo tower that soars 50 storeys straight up above it
A Harbourfront Centre webcam image of progress on the new underground parking garage for York Quay Centre. Concrete floor slabs have been poured for the 3 below-grade levels, and work will start soon on the ground-level roof over the structure. New outdoor public spaces will be created on top.
This entry was posted in Architecture & Construction, Aura condos, Bay Street, Bloor-Jarvis neighbourhood, Burano condos, Central downtown, Chaz Yorkville, City Scenes: random snapshots of Toronto, ETFO, FIVE Condos, Hospitals and health care institutions, Nicholas Residences, Office buildings, Toronto condos, Women's College Hospital, X2 condos and tagged Burano condos, Chaz Yorkville, Clear Spirit Condos, Distillery District, ETFO, Five Condos, Harbourfront Centre, Janet Rosenberg & Associates, Nicholas Residences, Waterfront Toronto, West Don Lands, Women's College Hospital, X2 Condos, York Quay Centre on January 13, 2012 by TOblogeditor.
Construction of underground parking facility will create new public spaces for Harbourfront Centre
From the Centre's website, this artistic illustration suggests how the revitalized Harbourfront Centre will look with new public parks and amenities on the space formerly occupied by a large above-ground parking lot
April 21 2011: Excavation of the existing above-ground parking lot is underway to build a new below-ground parking facility
Site transformation: You can't walk very far in downtown Toronto without encountering a "revitalization" project of some kind. Whether it's public spaces like Nathan Phillips Square or the "mink mile" on Bloor Street, retail complexes like the Toronto Eaton Centre, transportation facilities like the Union subway station, or office towers like First Canadian Place, massive renovation and reconstruction projects are either underway, close to completion, or just getting started. Harbourfront Centre is no exception. The 10-acre cultural landmark is getting a major makeover that will create significant new public spaces at one of the city's most popular waterfront attractions. The most visible work at the moment is excavation of the Centre's large above-ground parking lot, which will be rebuilt — underground. That move will free up a tremendous amount of space to create new park and public amenity areas around the Harbourfront Centre facilities, which draw more than 12 million visitors annually. Although the parking lot is now a large, closed-off construction zone, it's business as usual at the various Harbourfront Centre buildings, including Queen's Quay Terminal, York Quay Centre, The Power Plant and the Enwave Theatre. Completion of the new underground parking lot is scheduled for next spring. Below are some recent photos of the revitalization activity underway at Harbourfront Centre.
November 9 2011: The former parking lot for Harbourfront Centre has been cordoned off with fencing and hoarding as the revitalization project gets underway
November 9 2011: Construction hoarding around the former parking site
A billboard on hoarding around the Harbourfront Centre construction site
Another billboard at the Harbourfront Centre construction site
A diagram showing how the Harbourfront Centre site will be transformed
April 21 2011: Construction site hoarding along Queens Quay Boulevard
April 21 2011: Looking from Queen's Quay Boulevard toward excavation activity at the northeast corner of the site
April 21 2011: Excavation activity at the northeast corner of the property
April 21 2011: Excavation activity along the eastern perimeter of the property, next to the Queen's Quay Terminal building
April 21 2011: Construction of the new underground parking facility is expected to finish at around this time in 2012
May 8 2011: Looking northwest at the Harbourfront Centre construction site from the driveway next to the Queen's Quay Terminal building
May 8 2011: Landscape reconstruction activity north of the lakeside amphitheatre
May 8 2011: Another view of landscaping activity behind the amphitheatre
This entry was posted in Architecture & Construction, arts and culture venues, city icons and landmarks, Harbourfront Centre, Harbourfront Centre, Public parks and squares, tourist attractions and tagged Harbourfront Centre, waterfront on May 23, 2011 by TOblogeditor.

redpajama_set_name: RedPajamaCommonCrawl


text:
Library Browse REDEEMING BROTHER MU...
Redeeming Brother Murrihy: The River to Hiruharama
By Antony Millen
(4/5) 5 4 3 2 1 Clear
Conrad Murrihy's mother is dying and she has one final wish: to see her eldest son Francis who has not contacted home in two years.
In a race to find him and return home to his mother, Conrad travels far from his native Nova Scotia, Canada and through the heart of rural North Island, New Zealand following leads to Taumarunui, Auckland, Whanganui, Ratana and, finally, on an epic journey up the Whanganui River.
Along the way, Conrad discovers his brother has been living multiple lives - as a Catholic brother, a spoken-word poet, a suspected criminal and a new kind of poropiti for iwi Maori.
Conrad's search forces him to confront issues in his own life - issues of commitment, family loyalties, reconciliation with the past and openness to future possibilities - brought on by his encounters with the people, places and spirits of New Zealand.
In this, his first novel, Antony Millen explores the complex spiritual fabric of New Zealand while still telling a simple story of a man trying to mend his family.
Conrad Murrihy's mother is dying and she has one final wish: to see her eldest son Francis who has not contacted home in two years. In a race to find him and return home to his
Adults / General
Reading Options
Web browser / App
Retrieving...
Get the ePlatform app for iOS or Android. The quickest and easiest way to borrow and read eBooks and Audioboooks.
Maple Koru Publishing
Adults / General (20-99)
NBS Text
ONIX Text
NZNB
New Zealand & Related
All Adult Titles
Fiction (Adult)
Antony Millen is a Canadian living and writing in New Zealand. Originally from Pictou County, Nova Scotia, Canada, he moved to New Zealand with his wife and two children in 1997. He has lived in Taumarunui since then, working at St Patrick's Catholic Primary School and, more recently, as the head of the English department at Taumarunui High School. During his early years in New Zealand, he wrote sporadically, but with a dream to write novels as a major part of his life-style if not as a career. In 2013, he launched his first novel, Redeeming Brother Murrihy. Rather than satisfying his urge to write, releasing the book only made him hungrier to pursue his dream more enthusiastically. Te Kauhanga: A Tale of Space(s) is his second novel.


text:
package com.example.myappweixin;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;

public class Appstart extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.appstart);

		new Handler().postDelayed(new Runnable() {

			@Override
			public void run() {
				Intent intent = new Intent(Appstart.this,Welcome.class);
				startActivity(intent);
				Appstart.this.finish();
			}
		}, 1000);
	}

}


text:
SpaceX CRS-26 — 26-я миссия снабжения для беспилотного грузового корабля Dragon 2 компании SpaceX к Международной космической станции в рамках второй фазы контракта Commercial Resupply Services (CRS) с NASA.

Запуск
Запуск корабля ракетой-носителем Falcon 9 со стартового комплекса LC-39A Космического центра Кеннеди произведён 26 ноября 2022 в 19:20 UTC.

Сближение и стыковка
Стыковка с зенитным переходником модуля «Гармония» состоялась 27 ноября 2022, 12:39 UTC в автоматическом режиме под контролем астронавтов NASA Николь Манн и Джоша Кассады.

Полезная нагрузка
Корабль доставил на МКС 3528 кг, включая:
 1196 кг — две солнечные батареи (iROSA)
 1062 кг — припасы для экипажа;
 937 кг — оборудование для научных исследований;
 296 кг — оборудование для станции;
 25 кг — оборудование для выхода в открытый космос;
 12 кг — компьютерное оборудование.

Отстыковка и возвращение

Фотогалерея

Примечания

Dragon 2
НАСА
Миссии доставки к МКС
2022 год в космонавтике

redpajama_set_name: RedPajamaWikipedia


Did you ever say, when I become a parent I won't make my kids eat brussle sprouts, and now you make your kids eat brussle sprouts?
Did you ever say, when I have kids they won't have a bedtime, and now that you are a parent your kids have a bedtime?
I know I told my parents plenty of all the things I would not make my kids do and have found myself making them do it.
I said I would never make my kids eat foods they didn't like, and since I became a parent my kids have to take at least a small spoonful of everything that has been fixed even if they ate it the day before. I guess I figured out that maybe if a kid tries a food long enough they may eventually like it. I eventually came to like green beans, which for all of my childhood and even a good chunk of my adulthood I would gag just at the thought of eating them.
I told them I would never make my kids do homework if they didn't want to. Now I have a set time and place for my kids to do it.
I said my kids could stay up as late as they wanted. Now that I'm a parent, my kids have a set bedtime.
I said that my kids didn't have to bathe if they didn't want to. Now my kids take showers or baths at least every other day.
I think the part that gets to me the most, is not so much that I ended up making my kids do all the things I said I would never make them do, but I sound just like my parents while I'm making them do it. I catch myself every now and then and say OMG when did I turn into my mother?
All of the above! I just smile now when my kids tell me that they will never make their kids take out the garbage, clean up dog poop, go to bed early or stay home from a party!
I will say the one thing I said I would never do and don't is say " because I said so ". I absolutely hated that and I don't tell my kids that. Although most of the time they don't agree with the reason I give them anyway!
I totally agree! I told my Mom "When I have teenagers, I'm going to be FRIENDS with them".
The absolute last thing my kids need right now is me as a friend instead of a mom!
I always swore, id NEVER NEVER NEVER lick/spit on something and use it to wipe my kids face. Well, that didnt last long. Now mine swear they will NEVER NEVER NEVER do it to their kids....ya, right.
I swore Id never embarass my kids. But, I do...on a daily basis. Most of the time unintentionally!!
Ooh the good ol' spit/lick trick. It's so good for so many things. I don't just wipe their faces, I also stick down their hair, and get smuges off of clothing, a time or two I think I even did it to clean behind one of my kid's ears.
I hear that!! I don't remember ever telling my mom that I was going to be "friends" with my kids. I think it was mainly because my mom did try and be my friend to much of the time when I was a teen.
True. I think a little bit of each is good. Be a parent, but be friend they feel they can confide in or joke with, as well.
LOL...my Mom and I had this conversation the other day!
We were all there the day my sister told her daughter...Because I said so!! We all laughed and cheered. We knew is was just a matter of time.
She reminded me of the time I called her and accused her of being in my home. Cuz I swear that was her voice coming out of my mouth when I was gettin after my son.
No brussel sprouts tho....that's just wrong...lol.
I had one son that I always asked that and his explanations usually made sense and I understood why he did it. Children think and reason different than adults and I use to find it fascinating to hear his explanations and understood after hearing him.


text:
Home » Celebrities » 'Didn't want a reaction' Les Dennis delayed Covid booster amid performance concern
'Didn't want a reaction' Les Dennis delayed Covid booster amid performance concern
Les Dennis reveals Family Fortunes 'paid me well'
Les Dennis, 68, is much loved for his long career on stage and screen, and he'll soon be returning to star in a new musical. In an exclusive chat with Express.co.uk, the star opened up about his thoughts on rising Covid numbers as well as his own health.
Speaking back in December, Les explained how he had just finished appearing in his first opera.
He starred in HMS Pinafore at the English National Opera at the end of 2021.
As a result, he admitted he hadn't yet booked in his Covid booster jab as he didn't want it to impact his performance schedule.
However, Les went on to unveil his plans to get it done before the festive season.
He said at the time: "I'm double jabbed, I haven't had my booster yet because I was on stage in the show.
"I didn't want to get a reaction and not have to be able to finish the run at the ENO.
"So I'm looking to that now and I will definitely get my booster before Christmas."
Les went on to admit he's managed to avoid catching Covid so far, and he knows theatres are doing everything they can to be safe.
He added: "I've been very lucky, I haven't had COVID.
"I've been in shows where people around me, even in the opera we had a couple of cast members that went down with it towards the end.
"I seem to have managed, touch wood, to miss it so far.
"But, you know, we'll just hope that people feel safe enough.
"And they should because the theatres are going to all lengths to make sure that people are safe in the theatre.
"And if you wear your mask in the auditorium, you should be fine."
Les was speaking ahead of returning to the stage for a new production of Fat Friends: The Musical.
The show will be touring around the country from this month, heading to regional theatres.
It is based on Kay Mellor's series of the same name, which was originally broadcast from 2000 until 2005.
Viewers will remember it starred Gavin and Stacey stars James Corden, Ruth Jones and Alison Steadman.
The new version sees Les star alongside Sherrie Hewson, Jessica Ellis and Lee Mead.
In Simple As Water, Syrian Families Dispersed By Horror Of War Share Their Struggles To Stay Connected Contenders Documentary
Joe Lycett 'stands to make £1.5m' from Hugo Boss name change
Bindi Irwin Announces She's Taking a Break From Social Media and the Public Eye
Matt Baker replacement: Who will replace Matt Baker? All the rumours
Caroline Flack's ex Andrew Brady shares tribute to late star after funeral
The Book of Boba Fett Recap: Training Day — Plus, Twin Threats Surface
Arthritis: The colour on your skin which can indicate the condition – do you have it?


Thank you for your ideas, Kal!
Over the past two months, more than 1000 locals, business owners, visitors and investors told us how they'd like to see our city centre transform.
We're busy preparing a new vision and plan for the city centre's future, which we'll present for feedback to make sure we're heading down the right track. Once we've heard from you, we'll adapt our proposals and develop detailed plans and visuals to illustrate how we can all bring life back to our main streets and public spaces.


Young Children Need These ACTIVE Music Activities!
Includes 2 unique, upbeat and engaging active music activities you can easily adapt to your classroom or music program!
"Criss-cross applesauce." "Fold your legs like a pretzel." "Hold a bubble in your mouth." If you're like most teachers of young children you have various tricks and techniques like these to get your class to settle down and be quiet. I do myself. But do you ever wonder why we need these little tricks? It's because sitting down and being quiet is not a natural or comfortable state for young children. It's as if a director or principal began a staff meeting by asking everyone to stand on their heads!
Young children are movers. They're runners and talkers and climbers and builders and jumpers and dancers and pretenders. They're not very good at sitting still, but they're excellent at playing.
Albert Einstein once said, "Play is the highest form of research." When young children play, they have no agenda except a burning need to learn and grow. They learn about themselves, their bodies, their environment, the people around them, and the larger culture they live in. Realizing that play is how children learn has two implications for what we do in the classroom.
First of all, play is an active process which involves children's minds and bodies.
Secondly, play is child-centered and child-led. Of course, this isn't always practical or even possible, but we can and should try to give children opportunities to initiate and lead activities whenever we can.
In my music enrichment classes, whenever I announce that it's time to play instruments, the group erupts into an anticipatory chorus of "Yay!"s, applause, and bouncing up and down. Every time! It took me a long time to figure out why young children responded so enthusiastically to the instruments, but after twenty years or so, I have a couple of hunches. First, rhythm instruments are toys – at least in the eyes of young children. And they're the best kind of toys, completely open-ended. Not only is there no one "right way" to play a rhythm instrument, there is a virtually infinite number of ways to play them. This excites children's curiosity and promotes problem-solving – it's like a puzzle to think of new ways to make music with each instrument.
Children are not only curious about the instruments themselves, but about what they can do with the instruments. Secondly, young children love to pretend with the instruments. Where you and I see a tambourine, they see a hat, a bowl to eat from, a steering wheel, a cake, a planet, and countless other things. Some teachers may see this instinctive pretending as a distraction from learning about music, but I have long been convinced that it's absolutely vital to acknowledge and respect children's imaginations. Encouraging invention and creativity may be one of the most important things we can do as teachers.
Moving to music is another uniquely effective way to inspire young children's curiosity and creativity. As they move, they investigate the capabilities of their growing bodies. "How high can I stretch?" "How many ways can I move my wrists, my knees, my fingers?" "What shapes can I make with my arms?" They are curious about movement concepts, which they can explore freely through moving to different styles of music. Take the concept of heavy/light. They can learn about it through our words; they can understand more when they pick up heavy and light objects; but when they actually move like light snowflakes or heavy elephants, that understanding becomes solidly fixed in their muscle memory. Children are also curious about exploring the space around them and how they can move through it.
Here are a couple of music activities you may want to try with your class.
Young children really enjoy this funny activity, which gets them moving in some very silly ways!
Oh, make big eyes like an owl today, and turn yourself around!
Oh, flap your wings like a chicken today, and turn yourself around!
Oh, hop up and down like a bunny today, and turn yourself around!
Even when the children get mixed up (or you do!) this leads to a lot of fun and giggles.
"Manos" is pronounced "mah- noce" and means "hands" in Spanish. In this activity children not only learn a new Spanish word, they think of different ways to keep the beat with their hands.
Remember, music activities aren't about singing in tune or doing all the movements "perfectly" – they're about creativity, expressiveness and FUN! So bring more music activities into your daily classroom routine and watch children become more involved, energetic, and engaged learners.
This entry was posted in Articles, Music and Movement, Rhythm Instruments, Songs and tagged action songs, early childhod music, movement songs, preschool music, rhythm instruments. Bookmark the permalink.


text:
@interface SendMsgToWeChatViewController ()<WXApiManagerDelegate,UITextViewDelegate>{
    UILabel *tips;
    UIImage *thumbImage;
    UIImage *testImage;
    NSData *gifImageData,*pdfData;
    NSString *title,*subtitle,*describe;
    NSString *pictureUrl,*musicUrl,*videoUrl,*webUrl;
}
@property (nonatomic) enum WXScene currentScene;
@property (nonatomic, strong) NSString *appId;
@property (nonatomic, strong) UIScrollView *footView;
@end
@implementation SendMsgToWeChatViewController
@synthesize currentScene = _currentScene;
@synthesize appId = _appId;
#pragma mark - View Lifecycle
- (void)viewDidLoad {
    [super viewDidLoad];
    title = @"这是消息的标题title";
    subtitle = @"这是消息的副标题描述内容subscribe";
    describe = @"这是纯文本内容的消息主体content";
    pictureUrl = @"http://pic.yesky.com/uploadImages/2015/174/53/6NSGL7M9J7C3.jpg";
    webUrl = @"http://tech.qq.com/a/20160529/007832.htm";
    videoUrl = @"http://www.iqiyi.com/yinyue/20120919/5c688b84912a8198.html";//少女时代
    musicUrl = @"http://stream20.qqmusic.qq.com/32464723.mp3";
    thumbImage = [UIImage imageNamed:@"thumb"];
    testImage = [UIImage imageNamed:@"test.jpg"];
    [self setupHeadView];
    [self setupSceneView];
    [self setupFootView];
    [WXApiManager sharedManager].delegate = self;
}
#pragma mark - User Actions
- (void)onSelectSessionScene {
    _currentScene = WXSceneSession;
    tips.text = @"分享场景:会话";
}

- (void)onSelectTimelineScene {
    _currentScene = WXSceneTimeline;
    tips.text = @"分享场景:朋友圈";
}

- (void)onSelectFavoriteScene {
    _currentScene = WXSceneFavorite;
    tips.text = @"分享场景:收藏";
}

- (void)sendTextContent {
    [WXApiRequestHandler sendText:title InScene:_currentScene];
}
- (void)sendImageContent {
    [WXApiRequestHandler sendImageData:UIImageJPEGRepresentation(testImage, 1.0)
                               TagName:@"WECHAT_TAG_JUMP_APP"
                            MessageExt:describe
                                Action:@"<action>dotaliTest</action>"
                            ThumbImage:thumbImage
                               InScene:_currentScene];
}

- (void)sendLinkContent {
    [WXApiRequestHandler sendLinkURL:webUrl
                             TagName:describe
                               Title:title
                         Description:subtitle
                          ThumbImage:thumbImage
                             InScene:_currentScene];
}

- (void)sendMusicContent {
    [WXApiRequestHandler sendMusicURL:musicUrl
                              dataURL:musicUrl
                                Title:title
                          Description:subtitle
                           ThumbImage:thumbImage
                              InScene:_currentScene];
}

- (void)sendVideoContent {
    [WXApiRequestHandler sendVideoURL:videoUrl
                                Title:title
                          Description:subtitle
                           ThumbImage:thumbImage
                              InScene:_currentScene];
}

- (void)sendAppContent {
    Byte* pBuffer = (Byte *)malloc(1024 * 100);
    memset(pBuffer, 0, 1024 * 100);
    NSData* data = [NSData dataWithBytes:pBuffer length:1024 * 100];
    free(pBuffer);
    [WXApiRequestHandler sendAppContentData:data
                                    ExtInfo:@"<xml>extend info</xml>"
                                     ExtURL:webUrl
                                      Title:title
                                Description:subtitle
                                 MessageExt:describe
                              MessageAction:@"<action>dotaliTest</action>"
                                 ThumbImage:thumbImage
                                    InScene:_currentScene];
}

- (void)sendNonGifContent {
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"jpg"];
    NSData *emoticonData = [NSData dataWithContentsOfFile:filePath];
    UIImage *thumbImage = [UIImage imageNamed:@"thumb.png"];
    [WXApiRequestHandler sendEmotionData:emoticonData
                              ThumbImage:thumbImage
                                 InScene:_currentScene];
}

- (void)sendGifContent {
    [WXApiRequestHandler sendEmotionData:gifImageData
                              ThumbImage:thumbImage
                                 InScene:_currentScene];
}

- (void)sendAuthRequest {
    [WXApiRequestHandler sendAuthRequestScope:@"snsapi_message,snsapi_userinfo,snsapi_friend,snsapi_contact"
                                        State:@"xxx"
                                       OpenID:@"0c806938e2413ce73eef92cc3"
                             InViewController:self];
}

- (void)sendFileContent {
    [WXApiRequestHandler sendFileData:pdfData
                        fileExtension:describe
                                Title:title
                          Description:subtitle
                           ThumbImage:thumbImage
                              InScene:_currentScene];
}

- (void)addCardToWXCardPackage {
    WXCardItem* cardItem = [[WXCardItem alloc] init];
    cardItem.cardId = @"pDF3iY9tv9zCGCj4jTXFOo1DxHdo";
    cardItem.extMsg = @"{\"code\": \"\", \"openid\": \"\", \"timestamp\": \"1418301401\", \"signature\":\"f54dae85e7807cc9525ccc127b4796e021f05b33\"}";
    [WXApiRequestHandler addCardsToCardPackage:[NSArray arrayWithObject:cardItem]];
}

- (void)batchAddCardToWXCardPackage {
    WXCardItem* cardItem = [[WXCardItem alloc] init];
    cardItem.cardId = @"pDF3iY9tv9zCGCj4jTXFOo1DxHdo";
    cardItem.extMsg = @"{\"code\": \"\", \"openid\": \"\", \"timestamp\": \"1418301401\", \"signature\":\"f54dae85e7807cc9525ccc127b4796e021f05b33\"}";
    [WXApiRequestHandler addCardsToCardPackage:[NSArray arrayWithObjects:cardItem,cardItem, nil]];
}
- (void)bizPay {
    NSString *res = [WXApiRequestHandler jumpToBizPay];
    if( ![@"" isEqual:res] ){
        NSLog(@"支付失败");
    }
}
#pragma mark - WXApiManagerDelegate
- (void)managerDidRecvGetMessageReq:(GetMessageFromWXReq *)req {
    // 微信请求App提供内容, 需要app提供内容后使用sendRsp返回
    NSString *strTitle = [NSString stringWithFormat:@"微信请求App提供内容"];
    NSString *strMsg = [NSString stringWithFormat:@"openID: %@", req.openID];

    UIAlertController *acVC = [UIAlertController alertControllerWithTitle:strTitle message:strMsg preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *destructive = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        RespForWeChatViewController* controller = [RespForWeChatViewController alloc];
        [self presentViewController:controller animated:YES completion:nil];
    }];
    [acVC addAction:destructive];
    [self presentViewController:acVC animated:YES completion:nil];
}

- (void)managerDidRecvShowMessageReq:(ShowMessageFromWXReq *)req {
    WXMediaMessage *msg = req.message;
    //显示微信传过来的内容
    WXAppExtendObject *obj = msg.mediaObject;
    NSString *strTitle = [NSString stringWithFormat:@"微信请求App显示内容"];
    NSString *strMsg = [NSString stringWithFormat:@"openID: %@, 标题:%@ \n内容:%@ \n附带信息:%@ \n缩略图:%lu bytes\n附加消息:%@\n", req.openID, msg.title, msg.description, obj.extInfo, (unsigned long)msg.thumbData.length, msg.messageExt];
    NSLog(@"%@===%@",strTitle,strMsg);
}

- (void)managerDidRecvLaunchFromWXReq:(LaunchFromWXReq *)req {
    WXMediaMessage *msg = req.message;

    //从微信启动App
    NSString *strTitle = [NSString stringWithFormat:@"从微信启动"];
    NSString *strMsg = [NSString stringWithFormat:@"openID: %@, messageExt:%@", req.openID, msg.messageExt];
    NSLog(@"%@===%@",strTitle,strMsg);
}

- (void)managerDidRecvMessageResponse:(SendMessageToWXResp *)response {
    NSString *strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];
    NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", response.errCode];
    NSLog(@"%@===%@",strTitle,strMsg);
}

- (void)managerDidRecvAddCardResponse:(AddCardToWXCardPackageResp *)response {
        NSMutableString* cardStr = [[NSMutableString alloc] init];
    for (WXCardItem* cardItem in response.cardAry) {
        [cardStr appendString:[NSString stringWithFormat:@"cardid:%@ cardext:%@ cardstate:%u\n",cardItem.cardId,cardItem.extMsg,(unsigned int)cardItem.cardState]];
    }
    NSLog(@"%@===%@",@"add card resp",cardStr);
}

- (void)managerDidRecvAuthResponse:(SendAuthResp *)response {
    NSString *strTitle = [NSString stringWithFormat:@"Auth结果"];
    NSString *strMsg = [NSString stringWithFormat:@"code:%@,state:%@,errcode:%d", response.code, response.state, response.errCode];
    NSLog(@"%@===%@",strTitle,strMsg);
}

#pragma mark - Private Methods
- (void)setupHeadView {
    UIView *headView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
    [headView setBackgroundColor:[UIColor greenColor]];
    UIImage *image = [UIImage imageNamed:@"micro_messenger.png"];
    NSInteger tlx = (headView.frame.size.width -  image.size.width) / 2;
    NSInteger tly = 20;

    UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(tlx, tly, image.size.width, image.size.height)];
    [imageView setImage:image];
    [headView addSubview:imageView];

    [self.view addSubview:headView];
}

- (void)setupSceneView {
    UIView *sceceView = [[UIView alloc] initWithFrame:CGRectMake(0, 135 + 2, 100, 100)];
    [sceceView setBackgroundColor:[UIColor greenColor]];

    tips = [[UILabel alloc]init];
    tips.text = @"分享场景:会话";
    tips.textColor = [UIColor blackColor];
    tips.backgroundColor = [UIColor clearColor];
    tips.textAlignment = NSTextAlignmentLeft;
    tips.frame = CGRectMake(10, 5, 200, 40);
    [sceceView addSubview:tips];

    UIButton *btn_x = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn_x setTitle:@"会话" forState:UIControlStateNormal];
    btn_x.titleLabel.font = [UIFont systemFontOfSize:15];
    [btn_x setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn_x setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
    [btn_x setFrame:CGRectMake(20, 50, 80, 40)];
    [btn_x addTarget:self action:@selector(onSelectSessionScene) forControlEvents:UIControlEventTouchUpInside];
    [sceceView addSubview:btn_x];

    UIButton *btn_y = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn_y setTitle:@"朋友圈" forState:UIControlStateNormal];
    btn_y.titleLabel.font = [UIFont systemFontOfSize:15];
    [btn_y setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn_y setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
    [btn_y setFrame:CGRectMake(120, 50, 80, 40)];
    [btn_y addTarget:self action:@selector(onSelectTimelineScene) forControlEvents:UIControlEventTouchUpInside];
    [sceceView addSubview:btn_y];

    UIButton *btn_z = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn_z setTitle:@"收藏" forState:UIControlStateNormal];
    btn_z.titleLabel.font = [UIFont systemFontOfSize:15];
    [btn_z setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn_z setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
    [btn_z setFrame:CGRectMake(220, 50, 80, 40)];
    [btn_z addTarget:self action:@selector(onSelectFavoriteScene) forControlEvents:UIControlEventTouchUpInside];
    [sceceView addSubview:btn_z];

    [self.view addSubview:sceceView];
}

#define LEFTMARGIN			12
#define TOPMARGIN			15
#define BTNWIDTH			140
#define BTNHEIGHT			40
#define ADDBUTTON_AUTORELEASE(idx, title, sel) [self addBtn:idx tit:title selector:sel]
-(UIButton*) addBtn:(int)idx tit:(NSString*)title selector:(SEL)sel{
    CGRect rect;
    if(idx % 2 == 1) {
        rect = CGRectMake(LEFTMARGIN, 25*(idx/2) + TOPMARGIN*(idx/2+1), BTNWIDTH, BTNHEIGHT - 4);
    } else {
        rect = CGRectMake(LEFTMARGIN*2 + BTNWIDTH, 25*(idx/2-1) + TOPMARGIN*(idx/2), BTNWIDTH, BTNHEIGHT - 4);
    }
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = rect;
    btn.tag = idx;
    [btn setTitle:title forState:UIControlStateNormal];
    btn.titleLabel.font = [UIFont systemFontOfSize:14.0];
    [btn addTarget:self action:sel forControlEvents:UIControlEventTouchUpInside];
    [self.footView addSubview:btn];
    return btn;
}

- (void)setupFootView {
    self.footView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 135 + 2 + 100 + 2, [UIScreen mainScreen].bounds.size.width,[UIScreen mainScreen].bounds.size.height - 135 - 2 - 100 - 2)];
    [self.footView setBackgroundColor:[UIColor greenColor]];
    self.footView.contentSize = [UIScreen mainScreen].bounds.size;
    [self.view addSubview:self.footView];

    int index = 1;
    ADDBUTTON_AUTORELEASE(index++, @"发送Text消息给微信", @selector(sendTextContent));
    ADDBUTTON_AUTORELEASE(index++, @"发送Photo消息给微信", @selector(sendImageContent));
    ADDBUTTON_AUTORELEASE(index++, @"发送Link消息给微信", @selector(sendLinkContent));
    ADDBUTTON_AUTORELEASE(index++, @"发送Music消息给微信", @selector(sendMusicContent));
    ADDBUTTON_AUTORELEASE(index++, @"发送Video消息给微信", @selector(sendVideoContent));
    ADDBUTTON_AUTORELEASE(index++, @"发送App消息给微信", @selector(sendAppContent));
    ADDBUTTON_AUTORELEASE(index++, @"发送非gif表情给微信", @selector(sendNonGifContent));
    ADDBUTTON_AUTORELEASE(index++, @"发送gif表情给微信", @selector(sendGifContent));
    ADDBUTTON_AUTORELEASE(index++, @"微信授权登录", @selector(sendAuthRequest));
    ADDBUTTON_AUTORELEASE(index++, @"发送文件消息给微信", @selector(sendFileContent));
    ADDBUTTON_AUTORELEASE(index++, @"添加单张卡券至卡包", @selector(addCardToWXCardPackage));
    ADDBUTTON_AUTORELEASE(index++, @"添加多张卡券至卡包", @selector(batchAddCardToWXCardPackage));
    ADDBUTTON_AUTORELEASE(index++, @"发起微信支付", @selector(bizPay));
}

@end


Reply With Quote 12-30-2006,23:00 #5 Karl View Profile View Forum Posts View Articles Member Member Join Date Dec 2006 Posts 7 Re: M2TW: "Unspecified Error" First off, my apologies to the If you want to get involved, click one of these buttons! A man may fight for many things. GameFAQs Answers Boards Community Contribute Games What's New PCStrategyReal-TimeGeneralMedieval II: Total WarFAQsAnswersBoardMoreHomeSummaryRelease DataGame CreditsAlso PlayingCollection StatsFAQsCheatsReviewsReader ReviewsCritic ReviewsImagesVideosAnswersBoard The message you selected is no longer available for viewing.
I've tried to restart the saved game but as soon as the loading screen appears the error message pops up again. VICTORY! Well, I don't think that my problem stems from the New World as my campaign crashes at turn 20! Autoplay When autoplay is enabled, a suggested video will automatically play next.
I am that response." ― Kent Mansley (in "Iron Giant") For most general problems, for which you have no idea of the culprit, your first port of call should be: https://help.sega.com/home Reply With Quote 12-31-2006,00:17 #7 Karl View Profile View Forum Posts View Articles Member Member Join Date Dec 2006 Posts 7 Re: M2TW: "Unspecified Error" Fat Buddha, if I understand you VICTORY! Moved to Total War Eras Tech Support. [PORTABLE-ID]dionysiusthemighty[/PORTABLE-ID] "Every position must be held to the last man: there must be no retirement.
However I have the expansion now and I wiped my computer completely the other day (because it was horribly clogged up). normally it happens to me, when the AI is making its moves at the end of turn. The game will now exit" Still not playing here... Sign in to make your opinion count.
The Musickman Gamer 21,865 views 13:04 Exploit Guide - Medieval II: Total War - Duration: 21:13. Step 6: That's it!, if you get the error message again then you have not followed the instructions properly, if you don't get the error then well done! It looks like you're new here. It looks like you're new here.
Al ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Every so often things happen that can't be rationalized in a conventional way. Over there you can get answers from its creators.Math is a well known liberal biasUser Info: kevindrosario2kevindrosario2 6 years ago#3Just skimming through the first few threads on the board there I I can't see that my PC is at fault as I don't have any problems with other applications or games. Flag Spam Abuse Report 0 · Like Dionysius the Mighty Senior Member Posts: 3,194Registered Users January 2011 edited January 2011 This isn't the Tech Support board.
You Say - 1 2 3 4 5 6 7 8 9 10 Ratings closed. anyway a great mod!! Warhammer, the Warhammer logo, GW, Games Workshop, The Game of Fantasy Battles, the twin-tailed comet logo, and all associated logos, illustrations, images, names, creatures, races, vehicles, locations, weapons, characters, and the A theory I can't justify as I've only run the game with the patch.
Battle for the Empire Total War (Former "Call of Warhammer") Every Chaos god now has a Champion, who want to unite the North and march to the South and conquer it. All rights reserved. I've started a new HRE campaign and so far everything seams to be OK. If you have technical problems with the game, please start a thread here: http://forums.totalwar.com/forumdisplay.php/19-Total-War-Eras-Support-Forum And read this first: http://forums.totalwar.com/showthread.php/109-Read-before-posting!
All rights reserved. just after the loading battle progress bar finishes loading. not even an idea?! or its affiliates.


text:
Q: What was the 100th Stack Exchange site? I just noticed that according to the main SE site, there's 110 SE sites. Which one was the 100th site?

A: First of all, let's see how many closed sites we can add to the list. There are 6 well known closes that happened some time ago. Smugmug was also closed, started Feb 8, 2012. Artificial Intelligence was probably the first closure. Also closed early on is Gadgets. There was a few other briefly lived ones as well, but I'm going to try to not count ones that never left private beta. All in all, I count 10 known (To me, with searching) site closures. That means the real 100th site was up a bit, that'd put it at Genealogy & Family History.

A: taking all currently listed sites, sorted from oldest (https://stackexchange.com/sites#oldest),  taking the 100th element ($(".lv-item")[99]), yields the answer:
100th .. 103rd oldest currently existing sites (excluding private betas and area51) are these sites with the same age:

*

*Blender

*Freelancing

*Network Engineering

*Open Data
http://area51.stackexchange.com/?tab=beta (thanks @PearsonArtPhoto for the link) gives their age in greater precision and disambiguates this site as the oldest of these four, and thus the 100th oldest currently existing site:
Network Engineering

redpajama_set_name: RedPajamaStackExchange


text:
Membership, profiles and listings – a guide
Strategic Members
Terms and Conditions of Membership
Fees, Sign Up & Categories
Young Professionals' Chapter
Women's Chapter
SACC & EO Statement
South African Chamber of Commerce
South African Chamber of Commerce in UK welcomes Theresa May's latest statement.
Photo Credit: Roger Bosh/Reuters
The South African Chamber of Commerce in the UK welcomes the statement made by the British Prime Minister, Theresa May, on her visit to South Africa this week. The Chamber aims to play a significant role as a 'partner for opportunity' in strengthening post Brexit trade with Britain by facilitating substantive trade agreements.
Following May's announcement that the British government would invest £4 billion (R73bn) in African economies, the Chamber will support successful delivery of this investment, highlighting South Africa as a gateway for trade in Sub-Saharan Africa. This is in line with May's announcement that Britain will carry over the EU's current Economic Partnership Agreements with Botswana, Lesotho, Namibia, Swaziland, Mozambique and South Africa.
Chantelé Carrington, COO of PwC Africa Business Group and Director of the Chamber, said: "The UK Prime Minister has stated that small businesses are the backbone of the UK; and that post Brexit, there will be new opportunities for UK SMEs to open up new ventures and trading links in South Africa. This will be mutually beneficial as it will enable sustainable jobs and therefore play a key role in the growth of both economies."
The Chamber is uniquely positioned to facilitate SMEs in the building of export links with South Africa, unpacking the regulatory framework and offering strategic operational support.
The SA Chamber of Commerce business model will tailor the best solutions for companies looking to trade with or invest in SA. This will ensure a positive UK company experience by facilitating a faster turnaround time and ensuring a more sustainable and profitable entry to market.
In doing so, the Chamber is committed to furthering the Prime Minister's goal of the UK becoming the G7's leading investor in Africa by 2022 whilst simultaneously supporting the delivery of more jobs for South Africans and further promoting the growth of one of Africa's largest economies.
"The Chamber has recently initiated conversations with the two respective heads of state to facilitate sharing of ideas, solutions and support", said Mike Miller, a founding member and Director of the SA Chamber of Commerce in the UK.
The Chamber is already planning two seminars; one on oil and gas the other on mining, as they are two of the largest value import markets for South Africa. These events will take place in London later this year. Admittance will be by invitation but the Chamber welcomes requests from companies in these sectors for further information.
Dennis Zietsman, Chairman of the South African company, Servest, in the UK, sums up the reciprocal value of the long trading relationship between the two countries, "Both countries have a lot to offer each other from a business point of view as SA is amongst some of the world leaders in its governance framework and UK businesses have the experience in operating in a highly competitive environment."
The SA Chamber will support opportunities for South African SME's to access the export market to the UK. Sharon Constançon, chairman of the SA Chamber, said: "The export flow of trade is critical to South Africa's sustainable growth, job creation and current account equilibrium." Growing bilateral trade will substantially benefit both nations.
Interested corporates or SME's in the UK or SA should make contact with the SA Chamber on [email protected] or click here.
Previous articleTheresa May visit to Africa marks key shift in British Foreign Policy – John Battersby
Next articleSouth African Companies showcase their goods at the Commonwealth Fair 2018
Andrew Williamson Obituary
Christmas Message from Chamber Chairman, Sharon Constançon
Life is Wonderful
Scotland Chapter hosted Networking
Thu 21st Jan, 2021
Wellness Seminar
Global trade into African regions - the business case for the Western Cape
Wed 10th Feb, 2021
Thu 11th Feb, 2021
Global Supply Chain: Africa's Opportunities post COVID-19
Africa Investment Conference
Wed 20th Jan, 2021
SA Chamber Newsletter
Click below to open past issues:
Our Partners in South Africa
The SA Chamber of Commerce is an umbrella organisation and conduit for trade, community and investment into and out of South Africa. The SACC aims to bring under one concerted effort, a forum and meeting point for businesses who have an interest in both the UK and South Africa in an attempt to facilitate the development of business opportunities.
© South African Chamber of Commerce (UK) 2020


Do you want to have more Instagram followers to build your audience and develop your social proof? The amount of followers you have on Instagram represents how many people are interested in you as a person or business. If you buy Instagram Followers, your profile looks more succesful and it is more likely that other people will join in after the existing ones. There is no shame, even brands, celebrities and online influencers have been known to give their social media stats an extra boost by adding more followers.
It doesn't matter if you have zero followers or thousands, our team is here to help you! We can help you to grow your Instagram by buying Instagram Followers. We will give you the followers you deserve and help you grow your social presence. Give your Instagram profile a boost and increase your followers.
Many people judge an Instagram account by it's numbers. More Instagram followers gives you a better look, so you will looking more succesful.
Also the number of followers is something that many people look at when sizing up an account to follow and it's a common metric that brands use to measure their own Instagram efforts.
Your profile will be found faster. You will get more visible as soon as your profile has more followers.
If an Instagram account has a lot of followers, it's usual to have a lot of likes. If you have a lot of followers, but less likes, it makes your engagement looks bad. Minimal 10 percent of your followers should like your pictures. If that sounds like you, that's great! But if that's not the case, we recommend you to also buy Instagram likes to make your profile look more realistic.
HOW QUALITATIVE ARE MY FOLLOWERS?
When we deliver your order, we guarantee only the utmost quality. Many say that quality comes before quantity. Here at StreamKO, you can rest assured knowing that the followers are top-notch, no matter how many you order! In our case – quality comes along with quantity.
After the payment you will receive your Instagram followers within 2 hours!
CAN MY ACCOUNT GET BANNED FOR BUYING INSTAGRAM FOLLOWERS?


This dress by Sophia Curvy is a work-wear essential. Made from soft stretch jersey, it's cut in a flattering O-line silhouette that skims over your curves. An elegant empire line seam and draped pleats give the piece an ultra-feminine feel.


$ ssh-keygen -t rsa -C "对应的邮箱地址"
Your identification has been saved in /home/schacon/.ssh/id_github_rsa.
Your public key has been saved in /home/schacon/.ssh/id_github_rsa.pub.
Your identification has been saved in /home/schacon/.ssh/id_gitlab_rsa.
Your public key has been saved in /home/schacon/.ssh/id_gitlab_rsa.pub.


text:
Wall Street bankers enjoy a £104bn pay bonanza
Shell chief blasts Dutch ruling on climate change as 'a body blow'
Kia's £41,000 electric EV6 is What Car?'s Car of the Year 2022
Minister defends Government cancer record despite treatment delays and spiralling diagnostic waits
Fauci says Pfizer vaccine could soon receive authorization for kids under the age of 5
'Brain fog' caused by Covid could be a result of how the virus affects a person's spinal fluid
The fight against poverty continues as supplies and funding increase
New molecules uncovered in small training lab
The magical effects of solo travel
US taxpayers will have to submit a video selfie to access their IRS accounts
Doomsday clock remains at 100 seconds to midnight for the third year in a row
Serbia revokes Australian company's mining licences – days after Novak Djokovic was deported
Ministers brace to live with Covid amid push for five-day isolation
Boris hails 'great progress' against Omicron and government is 'looking at' cutting isolation to FIVE days as ministers say UK is 'moving towards living with Covid' – but PM warns the NHS is STILL under pressure and free tests stay for now
Ministers say the country is 'moving to a situation' where 'we can live with Covid' but 'we are not there yet'
Scientists facing growing pressure to sign off cutting Covid isolation period to five days despite high cases
Boris Johnson could lay out a new strategy for the transition away from coronavirus restrictions by March
By James Tapsfield, Political Editor For Mailonline
(function (src, d, tag){ var s = d.createElement(tag), prev = d.getElementsByTagName(tag)[0]; s.src = src; prev.parentNode.insertBefore(s, prev); }("https://www.dailymail.co.uk/static/gunther/1.17.0/async_bundle–.js", document, "script"));
<!– DM.loadCSS("https://www.dailymail.co.uk/static/gunther/gunther-2159/video_bundle–.css");
Boris Johnson today hailed 'great progress' against Omicron and said the government is 'looking at' cutting the self-isolation period again as ministers insisted Britain is on a path to 'living with Covid'.
The PM argued that efforts to 'see off' the latest variant were working – but warned that the NHS is still under significant pressure and urged people to get booster jabs.
On a visit to a vaccination clinic in Uxbridge, he poured cold water on rumours that lateral flow tests could stop being free soon, saying they will stay 'as long as necessary'.
And he tempered his optimism by stressing that ministers will follow the 'science' on whether quarantine can be cut again from seven days without causing another deadly spike in infections.
The government and NHS leaders appear increasingly confident that the Omicron wave will not overwhelm services.
In a round of interviews earlier, Housing Secretary Michael Gove said the UK is 'moving to a situation' where it is 'possible to say that we can live with Covid and that the pressure on the NHS and on vital public services is abating'.
However, he stressed that 'we are not there yet' and dismissed complaints that dire warnings about the possibility of huge numbers of deaths had been 'scaremongering'.
Mr Johnson is said to be drawing up a new strategy for the transition away from restrictions, which would be implemented by March.
There is speculation it could see lateral flow tests withdrawn for non-high risk situations as well as shorter isolation.
But asked whether free LFDs will be abandoned soon, Mr Johnson said: 'I think that we will use them as long as they are very important. There's a similar argument to be had about the quarantine period…. The thing to do is look at the science.
'We're looking at that and we will act according to the science as we always have.
Mr Johnson insisted 'Omicron is still out there, it is incredibly contagious'.
'We've got to make sure that we see off Omicron, we are making great progress,' he said.
'The number of people who have been boosted is 36 million, 90% of over-50s have been done but there are still millions who need to do it.
'Loads of people have had two jabs but they haven't yet come forward for their boost and I say to everybody: join the movement.'
Amid a growing clamour for a further tweak to isolation rules, Education Secretary Nadhim Zahawi suggested yesterday that a reduction would ease staffing issues, and Chancellor Rishi Sunak is believed to be in favour of the move.
On a visit to a vaccination clinic in Uxbridge, Boris Johnson poured cold water on rumours that lateral flow tests could stop being free soon, saying they will stay 'as long as necessary'
Boris Johnson is said to be drawing up a new strategy for the transition away from restrictions, which would be implemented by March
In a round of interviews this morning, Housing Secretary Michael Gove said the UK is 'moving to a situation' where it is 'possible to say that we can live with Covid and that the pressure on the NHS and on vital public services is abating'
Gove jokes he has 'levelled up' after being stuck in a lift for 30 mins during interview round
Michael Gove managed to see the funny side today after spending more than half an hour stuck in a lift at the BBC during a round of interviews.
The Levelling Up Secretary joked that many people wanted him 'incarcerated' for longer after finally being freed at the corporation's studios.
Mr Gove was due to appear on the key 8.10 am slot on Radio 4's Today programme, but the presenters revealed he had been held up by the equipment failure.
BBC staff tweeted photographs of the unfortunate situation and likened it to a scene out of sitcom W1A.
'After more than half an hour in the lift you have successfully levelled me up,' Mr Gove quipped when he eventually made it on air.
Tory former chief whip Mark Harper, an influential lockdown-sceptic, urged the PM to declare an end to coronavirus restrictions.
Mr Harper warned Mr Johnson he could suffer an even greater rebellion than when he introduced his Plan B measures if he tries to extend them later this month.
Mr Johnson is unlikely to set out further plans while cases rates remain so high and the NHS strains under significant pressures.
Another 141,472 lab-confirmed cases were announced yesterday, but the figure fell for the fifth day in a row. It is common to have lower numbers at weekends.
Mr Gove said this morning: 'We are moving to a situation – we're not there yet – but we are moving to a situation where it is possible to say that we can live with Covid and that the pressure on the NHS and on vital public services is abating.
'But it's absolutely vital to recognise that we are not there yet and as the Health Secretary has reminded us, there will be some difficult weeks ahead and that is why we all need to continue to test, continue – if we are positive – to isolate and continue broadly to support the NHS as it goes through a challenging period.
'But one in which the frontline professionals are doing an amazing job.'
Mr Gove told Sky News it would be for Mr Johnson and Health Secretary Sajid Javid to decide whether to cut the period of Covid isolation to five days from seven.
But he said: 'We always keep things under review because we're always guided by the facts, by the science, and by changing circumstances.
'So I think it's striking to note that in the United Kingdom overall, particularly in England, we have one of the most open regimes, one of the essentially… one of the most liberal approaches of any country in Europe, but we also need to balance that with a determination to ensure that we are not overwhelming the NHS.'
Mr Gove said the NHS was likely to face pressure for the next two-three weeks, and potentially longer.
He told BBC Radio 4's Today programme: 'Our first responsibility at the moment must be to support the NHS, but you quite rightly legitimately ask if we get through – and at the moment I hope and pray that we will get through this difficult period – then there will be better times ahead.
'And I think one of the things that we do need to think about is how we live with Covid, how we live with this particular type of coronavirus. There are other coronaviruses which are endemic and with which we live, viruses tend to develop in a way whereby they become less harmful but more widespread.
'So, guided by the science, we can look to the progressive lifting of restrictions, and I think for all of us the sooner the better. But we've got to keep the NHS safe.'
Mr Gove admitted that he personally had been at the 'more cautious end' in the discussions over restrictions, before Christmas but the PM's judgement had been 'vindicated'.
'We always keep that under review but his judgment has been vindicated,' he said.
The Cabinet minister said it was 'impossible to predict' how long lateral flow tests will remain free.
But he said: 'But it is the case that in this country lateral flow tests are free, unlike in many other jurisdictions, they're a vital tool in making sure that we can curb the spread of the infection and also that people who are needed to isolate do so.'
Prof Graham Medley, who heads the SPI-M modelling subgroup of SAGE, said the country is transitioning away from 'emergency' – but warned it will be a process rather than a moment.
'I think that that transition is absolutely true. It can't be an emergency forever,' he told the BBC.
'So at some point it will have to stop being an emergency but that is likely to be a phase out rather than an active point in time where somebody can declare the epidemic over. It's going to fade out and disappear much more slowly than that, I think.'
Clive Watson, chairman of the City Pub Group, questioned the continuing work-from-home guidance and said the review of measures due by January 26 is a 'very good opportunity' to change them.
He told BBC Radio 4's Today programme things had been 'really, really tough for the hospitality industry'.
Ahead of the next review of measures which are currently in place in England under Plan B, he said: 'I think that's a very good opportunity to modify those. I mean, for instance, why do people who work in hospitals or work in retail go to work, but office workers are exempted from going to work?
'So I think we need to look at that very closely and start to withdraw those restrictions.'
Mr Harper, the chair of the lockdown-sceptic Covid Recovery Group, warned the rebellion if the Prime Minister tries to extend Plan B beyond January 26 could be even larger than the 100 Conservatives who defied him over their introduction last month.
'I think there will be even more people against it,' he said in an interview with the Financial Times. 'I think the intellectual argument now is even weaker.'
King's College London scientists today suggested that cases in the capital also appeared to be peaking. They said they had dropped by a third within a week, raising hopes that the worst of the outbreak may be over. The figures rely on weekly reports from three quarters of a million people nationally to estimate the prevalence of the virus
Asked when Mr Johnson should formally declare an end to the restrictions, the MP said: 'If that's not now, when is it?'
Mr Zahawi insisted yesterday that lateral flow tests will remain free for the time being after the Sunday Times reported their provision could be massively reduced.
He said the UK Health Security Agency will investigate whether the isolation period can be reduced to five days, telling Sky's Trevor Phillips on Sunday: 'It would certainly help mitigate some of the pressures on schools, on critical workforce and others.
'But I would absolutely be driven by advice from the experts, the scientists, on whether we should move to five days from seven days. What you don't want is to create the wrong outcome by higher levels of infection.'
Dr Clive Dix, former chairman of Britain's vaccine taskforce, said mass testing and vaccination should end for all but the most vulnerable after the booster campaign is over.
'It's pointless trying to stop infection with it, which is sort of what mass vaccination is all about, because it's not doing it. We're seeing a lot of infection,' he told Channel 4 News.
Dr Dix added: 'I think that's a little bit controversial but let's look at a couple of months' time, we shouldn't be mass testing. I think mass testing doesn't help anybody.
'I think we need to get to the point where if we have a young person who gets Covid, having been vaccinated, we know they've got levels of protection, but just like if they've got very bad cold or flu, they stay at home… and when they get better they go back to work.'
Previous Elsa Hosk shows off her trim waist and long legs as she models a skimpy hot pink bikini
Next Get used to a 'Sunday-style timetable' on the trains 'until further notice'


Except in cases of clerical error, no instructor may change a grade that he or she has submitted to Student Academic Services. A student may not do additional work after the quarter ends in order to improve their final grade. Grade changes may be made only in the quarter following the course.
The quality of a student's performance in a course is recognized by a letter mark or grade, which is counted in points. Grade points (or quality points) are the numerical equivalent of letter grades and are assigned for each credit earned according to the scale below.
For example, a student receiving a grade of A (worth 4.0 points) in a 5-credit course would earn 20 grade points. These points express the quality of a student's performance in terms of numbers for the purpose of determining scholastic achievement and individual and graduation honors.
A student must be making satisfactory progress in the course at the time of the request for an "I" grade. The instructor is under no obligation to grant the request for an "I" grade. However, if the instructor chooses to issue an "I" grade, the instructor and student must formulate a plan for the student's completion of the course requirements. The student may not attend a future class in which he or she is not registered as a means of working toward completion of an "I" grade.
A timeline for course completion will be determined by the instructor, and may be shorter than one year. However, in all cases the student must submit final coursework to the instructor within one calendar year or the "I" becomes an "E." A student who has an "I" grade that has not yet been converted to a final, regular grade may not enroll in a course with the same subject code and course number.
The student must initiate the removal of the "I" grade once coursework has been completed. A student cannot carry more than 20 credits of incomplete grades without prior approval from the university registrar.
With instructor permission, most regular, on-campus SPU undergraduate courses may be audited. Students pay regular tuition to audit a course. Students do not receive credit for an audited course.
Students must register to audit a course in person in Student Academic Services in Demaray Hall 151 before 4:30 p.m. on the fifth day of the quarter, as published in the University Academic Calendar.
If a course carries the P/NC option, students may register for that option in person in Student Academic Service, Demaray Hall 151, by completing a P/NC form no later than 4:30 p.m. on the tenth day of the quarter.
Courses in which a student earns a Pass or No Credit grade do not count in a student's grade-point average calculation.
However, college-level credits (numbered 1000–4999) earned with a pass grade do count toward elective credits in a bachelor's degree.
A "repeatable course" is designed to allow students to enroll in the course multiple times for credit, up to a designated credit limit or number of repetitions. The course description for such a course indicates that the course is repeatable for credit. Within stated limits, credits and grades for these repeatable courses will count toward graduation requirements and the SPU GPA.
Most courses are "non-repeatable" for credit, meaning a student may earn credit and grade points for the course only once. However, a student may enroll in a previously completed "non-repeatable" SPU course (or a course noted as its "equivalent") for the purpose of earning a higher grade. With the exception of UCOR, UFDN, and WRI courses, a course may be repeated only once.


with Flash Decompiler Trillix by Eltima!
Flash Decompiler Trillix allows to get the source code out of SWF for its further editing. You are supposed to extract the source FLA out of the SWF to make changes. As our SWF to FLA Converter is extremely user-friendly this process can be completed in several steps.
You need to navigate to "File explorer"
To get the source code the SWF file should be added to "My tasks list"
That's It! Thank you for trying the SWF to FLA Converter by Eltima!