text:
import { Colors } from '../../common/util/colors.js';
import { assert, TypedArrayBufferView, unreachable } from '../../common/util/util.js';
import { Float16Array } from '../../external/petamoriken/float16/float16.js';

import { kBit } from './constants.js';
import {
  cartesianProduct,
  clamp,
  correctlyRoundedF16,
  isFiniteF16,
  isSubnormalNumberF16,
  isSubnormalNumberF32,
} from './math.js';

/**
 * Encodes a JS `number` into a "normalized" (unorm/snorm) integer representation with `bits` bits.
 * Input must be between -1 and 1 if signed, or 0 and 1 if unsigned.
 *
 * MAINTENANCE_TODO: See if performance of texel_data improves if this function is pre-specialized
 * for a particular `bits`/`signed`.
 */
export function floatAsNormalizedInteger(float: number, bits: number, signed: boolean): number {
  if (signed) {
    assert(float >= -1 && float <= 1, () => `${float} out of bounds of snorm`);
    const max = Math.pow(2, bits - 1) - 1;
    return Math.round(float * max);
  } else {
    assert(float >= 0 && float <= 1, () => `${float} out of bounds of unorm`);
    const max = Math.pow(2, bits) - 1;
    return Math.round(float * max);
  }
}

/**
 * Decodes a JS `number` from a "normalized" (unorm/snorm) integer representation with `bits` bits.
 * Input must be an integer in the range of the specified unorm/snorm type.
 */
export function normalizedIntegerAsFloat(integer: number, bits: number, signed: boolean): number {
  assert(Number.isInteger(integer));
  if (signed) {
    const max = Math.pow(2, bits - 1) - 1;
    assert(integer >= -max - 1 && integer <= max);
    if (integer === -max - 1) {
      integer = -max;
    }
    return integer / max;
  } else {
    const max = Math.pow(2, bits) - 1;
    assert(integer >= 0 && integer <= max);
    return integer / max;
  }
}

/**
 * Encodes a JS `number` into an IEEE754 floating point number with the specified number of
 * sign, exponent, mantissa bits, and exponent bias.
 * Returns the result as an integer-valued JS `number`.
 *
 * Does not handle clamping, overflow, or denormal inputs.
 * On underflow (result is subnormal), rounds to (signed) zero.
 *
 * MAINTENANCE_TODO: Replace usages of this with numberToFloatBits.
 */
export function float32ToFloatBits(
  n: number,
  signBits: 0 | 1,
  exponentBits: number,
  mantissaBits: number,
  bias: number
): number {
  assert(exponentBits <= 8);
  assert(mantissaBits <= 23);
  assert(Number.isFinite(n));

  if (n === 0) {
    return 0;
  }

  if (signBits === 0) {
    assert(n >= 0);
  }

  const buf = new DataView(new ArrayBuffer(Float32Array.BYTES_PER_ELEMENT));
  buf.setFloat32(0, n, true);
  const bits = buf.getUint32(0, true);
  // bits (32): seeeeeeeefffffffffffffffffffffff

  const mantissaBitsToDiscard = 23 - mantissaBits;

  // 0 or 1
  const sign = (bits >> 31) & signBits;

  // >> to remove mantissa, & to remove sign, - 127 to remove bias.
  const exp = ((bits >> 23) & 0xff) - 127;

  // Convert to the new biased exponent.
  const newBiasedExp = bias + exp;
  assert(newBiasedExp < 1 << exponentBits, () => `input number ${n} overflows target type`);

  if (newBiasedExp <= 0) {
    // Result is subnormal or zero. Round to (signed) zero.
    return sign << (exponentBits + mantissaBits);
  } else {
    // Mask only the mantissa, and discard the lower bits.
    const newMantissa = (bits & 0x7fffff) >> mantissaBitsToDiscard;
    return (sign << (exponentBits + mantissaBits)) | (newBiasedExp << mantissaBits) | newMantissa;
  }
}

/**
 * Encodes a JS `number` into an IEEE754 16 bit floating point number.
 * Returns the result as an integer-valued JS `number`.
 *
 * Does not handle clamping, overflow, or denormal inputs.
 * On underflow (result is subnormal), rounds to (signed) zero.
 */
export function float32ToFloat16Bits(n: number) {
  return float32ToFloatBits(n, 1, 5, 10, 15);
}

/**
 * Decodes an IEEE754 16 bit floating point number into a JS `number` and returns.
 */
export function float16BitsToFloat32(float16Bits: number): number {
  return floatBitsToNumber(float16Bits, kFloat16Format);
}

type FloatFormat = { signed: 0 | 1; exponentBits: number; mantissaBits: number; bias: number };

/** FloatFormat defining IEEE754 32-bit float. */
export const kFloat32Format = { signed: 1, exponentBits: 8, mantissaBits: 23, bias: 127 } as const;
/** FloatFormat defining IEEE754 16-bit float. */
export const kFloat16Format = { signed: 1, exponentBits: 5, mantissaBits: 10, bias: 15 } as const;

/**
 * Once-allocated ArrayBuffer/views to avoid overhead of allocation when converting between numeric formats
 *
 * workingData* is shared between multiple functions in this file, so to avoid re-entrancy problems, make sure in
 * functions that use it that they don't call themselves or other functions that use workingData*.
 */
const workingData = new ArrayBuffer(4);
const workingDataU32 = new Uint32Array(workingData);
const workingDataU16 = new Uint16Array(workingData);
const workingDataU8 = new Uint8Array(workingData);
const workingDataF32 = new Float32Array(workingData);
const workingDataF16 = new Float16Array(workingData);
const workingDataI16 = new Int16Array(workingData);
const workingDataI8 = new Int8Array(workingData);

/** Bitcast u32 (represented as integer Number) to f32 (represented as floating-point Number). */
export function float32BitsToNumber(bits: number): number {
  workingDataU32[0] = bits;
  return workingDataF32[0];
}
/** Bitcast f32 (represented as floating-point Number) to u32 (represented as integer Number). */
export function numberToFloat32Bits(number: number): number {
  workingDataF32[0] = number;
  return workingDataU32[0];
}

/**
 * Decodes an IEEE754 float with the supplied format specification into a JS number.
 *
 * The format MUST be no larger than a 32-bit float.
 */
export function floatBitsToNumber(bits: number, fmt: FloatFormat): number {
  // Pad the provided bits out to f32, then convert to a `number` with the wrong bias.
  // E.g. for f16 to f32:
  // - f16: S    EEEEE MMMMMMMMMM
  //        ^ 000^^^^^ ^^^^^^^^^^0000000000000
  // - f32: S eeeEEEEE MMMMMMMMMMmmmmmmmmmmmmm

  const kNonSignBits = fmt.exponentBits + fmt.mantissaBits;
  const kNonSignBitsMask = (1 << kNonSignBits) - 1;
  const expAndMantBits = bits & kNonSignBitsMask;
  let f32BitsWithWrongBias = expAndMantBits << (kFloat32Format.mantissaBits - fmt.mantissaBits);
  f32BitsWithWrongBias |= (bits << (31 - kNonSignBits)) & 0x8000_0000;
  const numberWithWrongBias = float32BitsToNumber(f32BitsWithWrongBias);
  return numberWithWrongBias * 2 ** (kFloat32Format.bias - fmt.bias);
}

/**
 * Encodes a JS `number` into an IEEE754 floating point number with the specified format.
 * Returns the result as an integer-valued JS `number`.
 *
 * Does not handle clamping, overflow, or denormal inputs.
 * On underflow (result is subnormal), rounds to (signed) zero.
 */
export function numberToFloatBits(number: number, fmt: FloatFormat): number {
  return float32ToFloatBits(number, fmt.signed, fmt.exponentBits, fmt.mantissaBits, fmt.bias);
}

/**
 * Given a floating point number (as an integer representing its bits), computes how many ULPs it is
 * from zero.
 *
 * Subnormal numbers are skipped, so that 0 is one ULP from the minimum normal number.
 * Subnormal values are flushed to 0.
 * Positive and negative 0 are both considered to be 0 ULPs from 0.
 */
export function floatBitsToNormalULPFromZero(bits: number, fmt: FloatFormat): number {
  const mask_sign = fmt.signed << (fmt.exponentBits + fmt.mantissaBits);
  const mask_expt = ((1 << fmt.exponentBits) - 1) << fmt.mantissaBits;
  const mask_mant = (1 << fmt.mantissaBits) - 1;
  const mask_rest = mask_expt | mask_mant;

  assert(fmt.exponentBits + fmt.mantissaBits <= 31);

  const sign = bits & mask_sign ? -1 : 1;
  const rest = bits & mask_rest;
  const subnormal_or_zero = (bits & mask_expt) === 0;
  const infinity_or_nan = (bits & mask_expt) === mask_expt;
  assert(!infinity_or_nan, 'no ulp representation for infinity/nan');

  // The first normal number is mask_mant+1, so subtract mask_mant to make min_normal - zero = 1ULP.
  const abs_ulp_from_zero = subnormal_or_zero ? 0 : rest - mask_mant;
  return sign * abs_ulp_from_zero;
}

/**
 * Encodes three JS `number` values into RGB9E5, returned as an integer-valued JS `number`.
 *
 * RGB9E5 represents three partial-precision floating-point numbers encoded into a single 32-bit
 * value all sharing the same 5-bit exponent.
 * There is no sign bit, and there is a shared 5-bit biased (15) exponent and a 9-bit
 * mantissa for each channel. The mantissa does NOT have an implicit leading "1.",
 * and instead has an implicit leading "0.".
 */
export function packRGB9E5UFloat(r: number, g: number, b: number): number {
  for (const v of [r, g, b]) {
    assert(v >= 0 && v < Math.pow(2, 16));
  }

  const buf = new DataView(new ArrayBuffer(Float32Array.BYTES_PER_ELEMENT));
  const extractMantissaAndExponent = (n: number) => {
    const mantissaBits = 9;
    buf.setFloat32(0, n, true);
    const bits = buf.getUint32(0, true);
    // >> to remove mantissa, & to remove sign
    let biasedExponent = (bits >> 23) & 0xff;
    const mantissaBitsToDiscard = 23 - mantissaBits;
    let mantissa = (bits & 0x7fffff) >> mantissaBitsToDiscard;

    // RGB9E5UFloat has an implicit leading 0. instead of a leading 1.,
    // so we need to move the 1. into the mantissa and bump the exponent.
    // For float32 encoding, the leading 1 is only present if the biased
    // exponent is non-zero.
    if (biasedExponent !== 0) {
      mantissa = (mantissa >> 1) | 0b100000000;
      biasedExponent += 1;
    }
    return { biasedExponent, mantissa };
  };

  const { biasedExponent: rExp, mantissa: rOrigMantissa } = extractMantissaAndExponent(r);
  const { biasedExponent: gExp, mantissa: gOrigMantissa } = extractMantissaAndExponent(g);
  const { biasedExponent: bExp, mantissa: bOrigMantissa } = extractMantissaAndExponent(b);

  // Use the largest exponent, and shift the mantissa accordingly
  const exp = Math.max(rExp, gExp, bExp);
  const rMantissa = rOrigMantissa >> (exp - rExp);
  const gMantissa = gOrigMantissa >> (exp - gExp);
  const bMantissa = bOrigMantissa >> (exp - bExp);

  const bias = 15;
  const biasedExp = exp === 0 ? 0 : exp - 127 + bias;
  assert(biasedExp >= 0 && biasedExp <= 31);
  return rMantissa | (gMantissa << 9) | (bMantissa << 18) | (biasedExp << 27);
}

/**
 * Quantizes two f32s to f16 and then packs them in a u32
 *
 * This should implement the same behaviour as the builtin `pack2x16float` from
 * WGSL.
 *
 * Caller is responsible to ensuring inputs are f32s
 *
 * @param x first f32 to be packed
 * @param y second f32 to be packed
 * @returns an array of possible results for pack2x16float. Elements are either
 *          a number or undefined.
 *          undefined indicates that any value is valid, since the input went
 *          out of bounds.
 */
export function pack2x16float(x: number, y: number): (number | undefined)[] {
  // Generates all possible valid u16 bit fields for a given f32 to f16 conversion.
  // Assumes FTZ for both the f32 and f16 value is allowed.
  const generateU16s = (n: number): number[] => {
    let contains_subnormals = isSubnormalNumberF32(n);
    const n_f16s = correctlyRoundedF16(n);
    contains_subnormals ||= n_f16s.some(isSubnormalNumberF16);

    const n_u16s = n_f16s.map(f16 => {
      workingDataF16[0] = f16;
      return workingDataU16[0];
    });

    const contains_poszero = n_u16s.some(u => u === kBit.f16.positive.zero);
    const contains_negzero = n_u16s.some(u => u === kBit.f16.negative.zero);
    if (!contains_negzero && (contains_poszero || contains_subnormals)) {
      n_u16s.push(kBit.f16.negative.zero);
    }

    if (!contains_poszero && (contains_negzero || contains_subnormals)) {
      n_u16s.push(kBit.f16.positive.zero);
    }

    return n_u16s;
  };

  if (!isFiniteF16(x) || !isFiniteF16(y)) {
    // This indicates any value is valid, so it isn't worth bothering
    // calculating the more restrictive possibilities.
    return [undefined];
  }

  const results = new Array<number>();
  for (const p of cartesianProduct(generateU16s(x), generateU16s(y))) {
    assert(p.length === 2, 'cartesianProduct of 2 arrays returned an entry with not 2 elements');
    workingDataU16[0] = p[0];
    workingDataU16[1] = p[1];
    results.push(workingDataU32[0]);
  }

  return results;
}

/**
 * Converts two normalized f32s to i16s and then packs them in a u32
 *
 * This should implement the same behaviour as the builtin `pack2x16snorm` from
 * WGSL.
 *
 * Caller is responsible to ensuring inputs are normalized f32s
 *
 * @param x first f32 to be packed
 * @param y second f32 to be packed
 * @returns a number that is expected result of pack2x16snorm.
 */
export function pack2x16snorm(x: number, y: number): number {
  // Converts f32 to i16 via the pack2x16snorm formula.
  // FTZ is not explicitly handled, because all subnormals will produce a value
  // between 0 and 1, but significantly away from the edges, so floor goes to 0.
  const generateI16 = (n: number): number => {
    return Math.floor(0.5 + 32767 * Math.min(1, Math.max(-1, n)));
  };

  workingDataI16[0] = generateI16(x);
  workingDataI16[1] = generateI16(y);

  return workingDataU32[0];
}

/**
 * Converts two normalized f32s to u16s and then packs them in a u32
 *
 * This should implement the same behaviour as the builtin `pack2x16unorm` from
 * WGSL.
 *
 * Caller is responsible to ensuring inputs are normalized f32s
 *
 * @param x first f32 to be packed
 * @param y second f32 to be packed
 * @returns an number that is expected result of pack2x16unorm.
 */
export function pack2x16unorm(x: number, y: number): number {
  // Converts f32 to u16 via the pack2x16unorm formula.
  // FTZ is not explicitly handled, because all subnormals will produce a value
  // between 0.5 and much less than 1, so floor goes to 0.
  const generateU16 = (n: number): number => {
    return Math.floor(0.5 + 65535 * Math.min(1, Math.max(0, n)));
  };

  workingDataU16[0] = generateU16(x);
  workingDataU16[1] = generateU16(y);

  return workingDataU32[0];
}

/**
 * Converts four normalized f32s to i8s and then packs them in a u32
 *
 * This should implement the same behaviour as the builtin `pack4x8snorm` from
 * WGSL.
 *
 * Caller is responsible to ensuring inputs are normalized f32s
 *
 * @param vals four f32s to be packed
 * @returns a number that is expected result of pack4x8usorm.
 */
export function pack4x8snorm(...vals: [number, number, number, number]): number {
  // Converts f32 to u8 via the pack4x8snorm formula.
  // FTZ is not explicitly handled, because all subnormals will produce a value
  // between 0 and 1, so floor goes to 0.
  const generateI8 = (n: number): number => {
    return Math.floor(0.5 + 127 * Math.min(1, Math.max(-1, n)));
  };

  for (const idx in vals) {
    workingDataI8[idx] = generateI8(vals[idx]);
  }

  return workingDataU32[0];
}

/**
 * Converts four normalized f32s to u8s and then packs them in a u32
 *
 * This should implement the same behaviour as the builtin `pack4x8unorm` from
 * WGSL.
 *
 * Caller is responsible to ensuring inputs are normalized f32s
 *
 * @param vals four f32s to be packed
 * @returns a number that is expected result of pack4x8unorm.
 */
export function pack4x8unorm(...vals: [number, number, number, number]): number {
  // Converts f32 to u8 via the pack4x8unorm formula.
  // FTZ is not explicitly handled, because all subnormals will produce a value
  // between 0.5 and much less than 1, so floor goes to 0.
  const generateU8 = (n: number): number => {
    return Math.floor(0.5 + 255 * Math.min(1, Math.max(0, n)));
  };

  for (const idx in vals) {
    workingDataU8[idx] = generateU8(vals[idx]);
  }

  return workingDataU32[0];
}

/**
 * Asserts that a number is within the representable (inclusive) of the integer type with the
 * specified number of bits and signedness.
 *
 * MAINTENANCE_TODO: Assert isInteger? Then this function "asserts that a number is representable"
 * by the type.
 */
export function assertInIntegerRange(n: number, bits: number, signed: boolean): void {
  if (signed) {
    const min = -Math.pow(2, bits - 1);
    const max = Math.pow(2, bits - 1) - 1;
    assert(n >= min && n <= max);
  } else {
    const max = Math.pow(2, bits) - 1;
    assert(n >= 0 && n <= max);
  }
}

/**
 * Converts a linear value into a "gamma"-encoded value using the sRGB-clamped transfer function.
 */
export function gammaCompress(n: number): number {
  n = n <= 0.0031308 ? (323 * n) / 25 : (211 * Math.pow(n, 5 / 12) - 11) / 200;
  return clamp(n, { min: 0, max: 1 });
}

/**
 * Converts a "gamma"-encoded value into a linear value using the sRGB-clamped transfer function.
 */
export function gammaDecompress(n: number): number {
  n = n <= 0.04045 ? (n * 25) / 323 : Math.pow((200 * n + 11) / 211, 12 / 5);
  return clamp(n, { min: 0, max: 1 });
}

/** Converts a 32-bit float value to a 32-bit unsigned integer value */
export function float32ToUint32(f32: number): number {
  const f32Arr = new Float32Array(1);
  f32Arr[0] = f32;
  const u32Arr = new Uint32Array(f32Arr.buffer);
  return u32Arr[0];
}

/** Converts a 32-bit unsigned integer value to a 32-bit float value */
export function uint32ToFloat32(u32: number): number {
  const u32Arr = new Uint32Array(1);
  u32Arr[0] = u32;
  const f32Arr = new Float32Array(u32Arr.buffer);
  return f32Arr[0];
}

/** Converts a 32-bit float value to a 32-bit signed integer value */
export function float32ToInt32(f32: number): number {
  const f32Arr = new Float32Array(1);
  f32Arr[0] = f32;
  const i32Arr = new Int32Array(f32Arr.buffer);
  return i32Arr[0];
}

/** Converts a 32-bit unsigned integer value to a 32-bit signed integer value */
export function uint32ToInt32(u32: number): number {
  const u32Arr = new Uint32Array(1);
  u32Arr[0] = u32;
  const i32Arr = new Int32Array(u32Arr.buffer);
  return i32Arr[0];
}

/** Converts a 16-bit float value to a 16-bit unsigned integer value */
export function float16ToUint16(f16: number): number {
  const f16Arr = new Float16Array(1);
  f16Arr[0] = f16;
  const u16Arr = new Uint16Array(f16Arr.buffer);
  return u16Arr[0];
}

/** Converts a 16-bit unsigned integer value to a 16-bit float value */
export function uint16ToFloat16(u16: number): number {
  const u16Arr = new Uint16Array(1);
  u16Arr[0] = u16;
  const f16Arr = new Float16Array(u16Arr.buffer);
  return f16Arr[0];
}

/** Converts a 16-bit float value to a 16-bit signed integer value */
export function float16ToInt16(f16: number): number {
  const f16Arr = new Float16Array(1);
  f16Arr[0] = f16;
  const i16Arr = new Int16Array(f16Arr.buffer);
  return i16Arr[0];
}

/** A type of number representable by Scalar. */
export type ScalarKind =
  | 'f64'
  | 'f32'
  | 'f16'
  | 'u32'
  | 'u16'
  | 'u8'
  | 'i32'
  | 'i16'
  | 'i8'
  | 'bool';

/** ScalarType describes the type of WGSL Scalar. */
export class ScalarType {
  readonly kind: ScalarKind; // The named type
  readonly size: number; // In bytes
  readonly read: (buf: Uint8Array, offset: number) => Scalar; // reads a scalar from a buffer

  constructor(kind: ScalarKind, size: number, read: (buf: Uint8Array, offset: number) => Scalar) {
    this.kind = kind;
    this.size = size;
    this.read = read;
  }

  public toString(): string {
    return this.kind;
  }
}

/** ScalarType describes the type of WGSL Vector. */
export class VectorType {
  readonly width: number; // Number of elements in the vector
  readonly elementType: ScalarType; // Element type

  constructor(width: number, elementType: ScalarType) {
    this.width = width;
    this.elementType = elementType;
  }

  /**
   * @returns a vector constructed from the values read from the buffer at the
   * given byte offset
   */
  public read(buf: Uint8Array, offset: number): Vector {
    const elements: Array<Scalar> = [];
    for (let i = 0; i < this.width; i++) {
      elements[i] = this.elementType.read(buf, offset);
      offset += this.elementType.size;
    }
    return new Vector(elements);
  }

  public toString(): string {
    return `vec${this.width}<${this.elementType}>`;
  }
}

// Maps a string representation of a vector type to vector type.
const vectorTypes = new Map<string, VectorType>();

export function TypeVec(width: number, elementType: ScalarType): VectorType {
  const key = `${elementType.toString()} ${width}}`;
  let ty = vectorTypes.get(key);
  if (ty !== undefined) {
    return ty;
  }
  ty = new VectorType(width, elementType);
  vectorTypes.set(key, ty);
  return ty;
}

/** Type is a ScalarType or VectorType. */
export type Type = ScalarType | VectorType;

export const TypeI32 = new ScalarType('i32', 4, (buf: Uint8Array, offset: number) =>
  i32(new Int32Array(buf.buffer, offset)[0])
);
export const TypeU32 = new ScalarType('u32', 4, (buf: Uint8Array, offset: number) =>
  u32(new Uint32Array(buf.buffer, offset)[0])
);
export const TypeF64 = new ScalarType('f64', 8, (buf: Uint8Array, offset: number) =>
  f32(new Float64Array(buf.buffer, offset)[0])
);
export const TypeF32 = new ScalarType('f32', 4, (buf: Uint8Array, offset: number) =>
  f32(new Float32Array(buf.buffer, offset)[0])
);
export const TypeI16 = new ScalarType('i16', 2, (buf: Uint8Array, offset: number) =>
  i16(new Int16Array(buf.buffer, offset)[0])
);
export const TypeU16 = new ScalarType('u16', 2, (buf: Uint8Array, offset: number) =>
  u16(new Uint16Array(buf.buffer, offset)[0])
);
export const TypeF16 = new ScalarType('f16', 2, (buf: Uint8Array, offset: number) =>
  f16Bits(new Uint16Array(buf.buffer, offset)[0])
);
export const TypeI8 = new ScalarType('i8', 1, (buf: Uint8Array, offset: number) =>
  i8(new Int8Array(buf.buffer, offset)[0])
);
export const TypeU8 = new ScalarType('u8', 1, (buf: Uint8Array, offset: number) =>
  u8(new Uint8Array(buf.buffer, offset)[0])
);
export const TypeBool = new ScalarType('bool', 4, (buf: Uint8Array, offset: number) =>
  bool(new Uint32Array(buf.buffer, offset)[0] !== 0)
);

/** @returns the ScalarType from the ScalarKind */
export function scalarType(kind: ScalarKind): ScalarType {
  switch (kind) {
    case 'f64':
      return TypeF64;
    case 'f32':
      return TypeF32;
    case 'f16':
      return TypeF16;
    case 'u32':
      return TypeU32;
    case 'u16':
      return TypeU16;
    case 'u8':
      return TypeU8;
    case 'i32':
      return TypeI32;
    case 'i16':
      return TypeI16;
    case 'i8':
      return TypeI8;
    case 'bool':
      return TypeBool;
  }
}

/** @returns the number of scalar (element) types of the given Type */
export function numElementsOf(ty: Type): number {
  if (ty instanceof ScalarType) {
    return 1;
  }
  if (ty instanceof VectorType) {
    return ty.width;
  }
  throw new Error(`unhandled type ${ty}`);
}

/** @returns the scalar (element) type of the given Type */
export function scalarTypeOf(ty: Type): ScalarType {
  if (ty instanceof ScalarType) {
    return ty;
  }
  if (ty instanceof VectorType) {
    return ty.elementType;
  }
  throw new Error(`unhandled type ${ty}`);
}

/** ScalarValue is the JS type that can be held by a Scalar */
type ScalarValue = boolean | number;

/** Class that encapsulates a single scalar value of various types. */
export class Scalar {
  readonly value: ScalarValue; // The scalar value
  readonly type: ScalarType; // The type of the scalar
  readonly bits: Uint8Array; // The scalar value packed in a Uint8Array

  public constructor(type: ScalarType, value: ScalarValue, bits: TypedArrayBufferView) {
    this.value = value;
    this.type = type;
    this.bits = new Uint8Array(bits.buffer);
  }

  /**
   * Copies the scalar value to the Uint8Array buffer at the provided byte offset.
   * @param buffer the destination buffer
   * @param offset the byte offset within buffer
   */
  public copyTo(buffer: Uint8Array, offset: number) {
    for (let i = 0; i < this.bits.length; i++) {
      buffer[offset + i] = this.bits[i];
    }
  }

  /**
   * @returns the WGSL representation of this scalar value
   */
  public wgsl(): string {
    const withPoint = (x: number) => {
      const str = `${x}`;
      return str.indexOf('.') > 0 || str.indexOf('e') > 0 ? str : `${str}.0`;
    };
    if (isFinite(this.value as number)) {
      switch (this.type.kind) {
        case 'f32':
          return `${withPoint(this.value as number)}f`;
        case 'f16':
          return `${withPoint(this.value as number)}h`;
        case 'u32':
          return `${this.value}u`;
        case 'i32':
          return `i32(${this.value})`;
        case 'bool':
          return `${this.value}`;
      }
    } else if (this.value === Number.POSITIVE_INFINITY) {
      switch (this.type.kind) {
        case 'f32':
          return `(1.f/0.f)`;
        case 'f16':
          return `(1.h/0.h)`;
      }
    } else if (this.value === Number.NEGATIVE_INFINITY) {
      switch (this.type.kind) {
        case 'f32':
          return `(-1.f/0.f)`;
        case 'f16':
          return `(-1.h/0.h)`;
      }
    }
    throw new Error(
      `scalar of value ${this.value} and type ${this.type} has no WGSL representation`
    );
  }

  public toString(): string {
    if (this.type.kind === 'bool') {
      return Colors.bold(this.value.toString());
    }
    switch (this.value) {
      case Infinity:
      case -Infinity:
        return Colors.bold(this.value.toString());
      default: {
        // Uint8Array.map returns a Uint8Array, so cannot use .map directly
        const hex = Array.from(this.bits)
          .reverse()
          .map(x => x.toString(16).padStart(2, '0'))
          .join('');
        const n = this.value as Number;
        if (n !== null && isFloatValue(this)) {
          let str = this.value.toString();
          str = str.indexOf('.') > 0 || str.indexOf('e') > 0 ? str : `${str}.0`;
          return isSubnormalNumberF32(n.valueOf())
            ? `${Colors.bold(str)} (0x${hex} subnormal)`
            : `${Colors.bold(str)} (0x${hex})`;
        }
        return `${Colors.bold(this.value.toString())} (0x${hex})`;
      }
    }
  }
}

/** Create an f64 from a numeric value, a JS `number`. */
export function f64(value: number): Scalar {
  const arr = new Float64Array([value]);
  return new Scalar(TypeF64, arr[0], arr);
}
/** Create an f32 from a numeric value, a JS `number`. */
export function f32(value: number): Scalar {
  const arr = new Float32Array([value]);
  return new Scalar(TypeF32, arr[0], arr);
}
/** Create an f16 from a numeric value, a JS `number`. */
export function f16(value: number): Scalar {
  const arr = new Float16Array([value]);
  return new Scalar(TypeF16, arr[0], arr);
}
/** Create an f32 from a bit representation, a uint32 represented as a JS `number`. */
export function f32Bits(bits: number): Scalar {
  const arr = new Uint32Array([bits]);
  return new Scalar(TypeF32, new Float32Array(arr.buffer)[0], arr);
}
/** Create an f16 from a bit representation, a uint16 represented as a JS `number`. */
export function f16Bits(bits: number): Scalar {
  const arr = new Uint16Array([bits]);
  return new Scalar(TypeF16, new Float16Array(arr.buffer)[0], arr);
}

/** Create an i32 from a numeric value, a JS `number`. */
export function i32(value: number): Scalar {
  const arr = new Int32Array([value]);
  return new Scalar(TypeI32, arr[0], arr);
}
/** Create an i16 from a numeric value, a JS `number`. */
export function i16(value: number): Scalar {
  const arr = new Int16Array([value]);
  return new Scalar(TypeI16, arr[0], arr);
}
/** Create an i8 from a numeric value, a JS `number`. */
export function i8(value: number): Scalar {
  const arr = new Int8Array([value]);
  return new Scalar(TypeI8, arr[0], arr);
}

/** Create an i32 from a bit representation, a uint32 represented as a JS `number`. */
export function i32Bits(bits: number): Scalar {
  const arr = new Uint32Array([bits]);
  return new Scalar(TypeI32, new Int32Array(arr.buffer)[0], arr);
}
/** Create an i16 from a bit representation, a uint16 represented as a JS `number`. */
export function i16Bits(bits: number): Scalar {
  const arr = new Uint16Array([bits]);
  return new Scalar(TypeI16, new Int16Array(arr.buffer)[0], arr);
}
/** Create an i8 from a bit representation, a uint8 represented as a JS `number`. */
export function i8Bits(bits: number): Scalar {
  const arr = new Uint8Array([bits]);
  return new Scalar(TypeI8, new Int8Array(arr.buffer)[0], arr);
}

/** Create a u32 from a numeric value, a JS `number`. */
export function u32(value: number): Scalar {
  const arr = new Uint32Array([value]);
  return new Scalar(TypeU32, arr[0], arr);
}
/** Create a u16 from a numeric value, a JS `number`. */
export function u16(value: number): Scalar {
  const arr = new Uint16Array([value]);
  return new Scalar(TypeU16, arr[0], arr);
}
/** Create a u8 from a numeric value, a JS `number`. */
export function u8(value: number): Scalar {
  const arr = new Uint8Array([value]);
  return new Scalar(TypeU8, arr[0], arr);
}

/** Create an u32 from a bit representation, a uint32 represented as a JS `number`. */
export function u32Bits(bits: number): Scalar {
  const arr = new Uint32Array([bits]);
  return new Scalar(TypeU32, bits, arr);
}
/** Create an u16 from a bit representation, a uint16 represented as a JS `number`. */
export function u16Bits(bits: number): Scalar {
  const arr = new Uint16Array([bits]);
  return new Scalar(TypeU16, bits, arr);
}
/** Create an u8 from a bit representation, a uint8 represented as a JS `number`. */
export function u8Bits(bits: number): Scalar {
  const arr = new Uint8Array([bits]);
  return new Scalar(TypeU8, bits, arr);
}

/** Create a boolean value. */
export function bool(value: boolean): Scalar {
  // WGSL does not support using 'bool' types directly in storage / uniform
  // buffers, so instead we pack booleans in a u32, where 'false' is zero and
  // 'true' is any non-zero value.
  const arr = new Uint32Array([value ? 1 : 0]);
  return new Scalar(TypeBool, value, arr);
}

/** A 'true' literal value */
export const True = bool(true);

/** A 'false' literal value */
export const False = bool(false);

export function reinterpretF32AsU32(f32: number): number {
  const array = new Float32Array(1);
  array[0] = f32;
  return new Uint32Array(array.buffer)[0];
}

export function reinterpretU32AsF32(u32: number): number {
  const array = new Uint32Array(1);
  array[0] = u32;
  return new Float32Array(array.buffer)[0];
}

/**
 * Class that encapsulates a vector value.
 */
export class Vector {
  readonly elements: Array<Scalar>;
  readonly type: VectorType;

  public constructor(elements: Array<Scalar>) {
    if (elements.length < 2 || elements.length > 4) {
      throw new Error(`vector element count must be between 2 and 4, got ${elements.length}`);
    }
    for (let i = 1; i < elements.length; i++) {
      const a = elements[0].type;
      const b = elements[i].type;
      if (a !== b) {
        throw new Error(
          `cannot mix vector element types. Found elements with types '${a}' and '${b}'`
        );
      }
    }
    this.elements = elements;
    this.type = TypeVec(elements.length, elements[0].type);
  }

  /**
   * Copies the vector value to the Uint8Array buffer at the provided byte offset.
   * @param buffer the destination buffer
   * @param offset the byte offset within buffer
   */
  public copyTo(buffer: Uint8Array, offset: number) {
    for (const element of this.elements) {
      element.copyTo(buffer, offset);
      offset += this.type.elementType.size;
    }
  }

  /**
   * @returns the WGSL representation of this vector value
   */
  public wgsl(): string {
    const els = this.elements.map(v => v.wgsl()).join(', ');
    return `vec${this.type.width}(${els})`;
  }

  public toString(): string {
    return `${this.type}(${this.elements.map(e => e.toString()).join(', ')})`;
  }

  public get x() {
    assert(0 < this.elements.length);
    return this.elements[0];
  }

  public get y() {
    assert(1 < this.elements.length);
    return this.elements[1];
  }

  public get z() {
    assert(2 < this.elements.length);
    return this.elements[2];
  }

  public get w() {
    assert(3 < this.elements.length);
    return this.elements[3];
  }
}

/** Helper for constructing a new two-element vector with the provided values */
export function vec2(x: Scalar, y: Scalar) {
  return new Vector([x, y]);
}

/** Helper for constructing a new three-element vector with the provided values */
export function vec3(x: Scalar, y: Scalar, z: Scalar) {
  return new Vector([x, y, z]);
}

/** Helper for constructing a new four-element vector with the provided values */
export function vec4(x: Scalar, y: Scalar, z: Scalar, w: Scalar) {
  return new Vector([x, y, z, w]);
}

/**
 * Helper for constructing Vectors from arrays of numbers
 *
 * @param v array of numbers to be converted, must contain 2, 3 or 4 elements
 * @param op function to convert from number to Scalar, e.g. 'f32`
 */
export function toVector(v: number[], op: (n: number) => Scalar): Vector {
  switch (v.length) {
    case 2:
      return vec2(op(v[0]), op(v[1]));
    case 3:
      return vec3(op(v[0]), op(v[1]), op(v[2]));
    case 4:
      return vec4(op(v[0]), op(v[1]), op(v[2]), op(v[3]));
  }
  unreachable(`input to 'toVector' must contain 2, 3, or 4 elements`);
}

/** Value is a Scalar or Vector value. */
export type Value = Scalar | Vector;

export type SerializedValueScalar = {
  kind: 'scalar';
  type: ScalarKind;
  value: boolean | number;
};

export type SerializedValueVector = {
  kind: 'vector';
  type: ScalarKind;
  value: boolean[] | number[];
};

export type SerializedValue = SerializedValueScalar | SerializedValueVector;

export function serializeValue(v: Value): SerializedValue {
  const value = (kind: ScalarKind, s: Scalar) => {
    switch (kind) {
      case 'f32':
        return new Uint32Array(s.bits.buffer)[0];
      case 'f16':
        return new Uint16Array(s.bits.buffer)[0];
      default:
        return s.value;
    }
  };
  if (v instanceof Scalar) {
    const kind = v.type.kind;
    return {
      kind: 'scalar',
      type: kind,
      value: value(kind, v),
    };
  }
  if (v instanceof Vector) {
    const kind = v.type.elementType.kind;
    return {
      kind: 'vector',
      type: kind,
      value: v.elements.map(e => value(kind, e)) as boolean[] | number[],
    };
  }
  unreachable(`unhandled value type: ${v}`);
}

export function deserializeValue(data: SerializedValue): Value {
  const buildScalar = (v: ScalarValue): Scalar => {
    switch (data.type) {
      case 'f64':
        return f64(v as number);
      case 'i32':
        return i32(v as number);
      case 'u32':
        return u32(v as number);
      case 'f32':
        return f32Bits(v as number);
      case 'i16':
        return i16(v as number);
      case 'u16':
        return u16(v as number);
      case 'f16':
        return f16Bits(v as number);
      case 'i8':
        return i8(v as number);
      case 'u8':
        return u8(v as number);
      case 'bool':
        return bool(v as boolean);
      default:
        unreachable(`unhandled value type: ${data.type}`);
    }
  };
  switch (data.kind) {
    case 'scalar': {
      return buildScalar(data.value);
    }
    case 'vector': {
      return new Vector(data.value.map(v => buildScalar(v)));
    }
  }
}

/** @returns if the Value is a float scalar type */
export function isFloatValue(v: Value): boolean {
  if (v instanceof Scalar) {
    const s = v;
    return s.type.kind === 'f64' || s.type.kind === 'f32' || s.type.kind === 'f16';
  }
  return false;
}


text:
Q: C++ move on function return? I have the following code:
class Foo {
    public:
      Foo() {}
      explicit Foo(Foo &&other) noexcept {}

      static Foo from() {
        Foo f;
        return f;
      }
};

When I compile it with g++ --std=c++17 move.cpp, I get the following error:
move.cpp: In static member function 'static Foo Foo::from()':
move.cpp:8:12: error: use of deleted function 'constexpr Foo::Foo(const Foo&)'
     return f;
            ^
move.cpp:1:7: note: 'constexpr Foo::Foo(const Foo&)' is implicitly declared as deleted because 'Foo' declares a move constructor or move assignment operator
 class Foo {
       ^~~

I thought the function should be moving Foo when the statement return f is compiled (so, it should use the declared move constructor, right?). But, it looks like it is looking for a copy constructor. Can someone please explain what is going on here?
EDIT: This question was marked duplicate for this one. However, this question is asking about C++17, while the other one is about C++11/C++14. Therefore, this is NOT a duplicate.

redpajama_set_name: RedPajamaStackExchange


text:
The Leonardo: A 'storey' to tell
Gugulethu Mkhabela
Right in the heart of Sandton, Johannesburg, stands the 234-metre high, The Leonardo. Perfectly located near the Gautrain Station and Sandton City, it is the epitome of 'luxury living in the sky'. The mixed-use building is part hotel with super luxe apartments and includes a state-of-the-art gym, outdoor swimming pool, a Montessori nursery, a spa, hair salon (by Amanda Lee Deane), the Insta-worthy Aurum Restaurant, Leo's Lounge & Deli, conference rooms and insane views from the rooftop bar. It is actually 57 storeys in total—including the ground floor and the rooftop bar—making it one of the tallest building in South Africa.
The design of the Leonardo is all about sustainable development and green building. Renowned architects Co-arc and interior designers Steven Falcke and Varoom used the latest technology to create an energy efficient living experience. And it's quite something.
A work of art that's supported and would not be complete without the striking and diverse artworks throughout the building—which essentially are bold statements hanging together through several conceptual threads to create one final masterpiece.
The journey throughout the building is a series of artwork experiences of the four natural elements, earth, fire, wind and water.
And of course, the artworks' curatorial approach was inspired by the inventor and visionary artist himself, Leonardo Da Vinci. Despite that, a diverse group of young and old local artists, designers and fabricators only, were commissioned for this project—and not some Italian artists and designers.
Some of our favourite pieces:
Murmuration at the Aurum Restaurant by the Trinity Session: Marcus Neustetter, Jacques Nel, Ciara Struwig, Paul Setate. 2018 – 2019. Material: Anodised Aluminium.
Dessert from the Aurum Restaurant. The Aurum Magnum and Vegan option.
Sitting pretty. The Aurum Beetroot dish.
Fusion by Mbongeni Buthelezi and Mike Hlabangwane. 2018-2019. Material: Melted/repurposed plastic
Time by Stone Mabunda (lead artist) and Collin Sibande. 2018 – 2019. Material: Jacaranda and Matumi Wood.
Artist, Stone Mabunda, explaining the concept behind the artwork. Image: Gugulethu Mkhabela.
The striking and 17 metre long, Fabric of the Universe, by Lerato Motau. 2018 – 2019. Material: Painted, embroided textile and found objects.
It Follows a Path by Fatima Tayob Moosa. 2018 – 2019. Material: Ink and paint on canvas. Image: Gugulethu Mkhabela
Strata by Damien Grivas (team leader), Angelique Koekemoer, Marlecia Marais, Patrick Rapai, Paul Setate, Zanre Van Der Walt, Ciara Struwig. 2019. Material: Vertic'Art.
The artworks program was curated, commissioned and produced by The Trinity Session. We had an opportunity to chat with studio & project manager Ciara Struwig, who gave us a tour of the artworks as well as one of the directors at Trinity Session, Marcus Neustetter.
This is what they had to say about working at this scale over a period of three years: "It was an exciting journey of working at this scale and with so many contributing creative people. Developing the overall concept with enough room to allow different artistic expressions to find their place, meant that we were able to engage with a diversity of skills, ideas and media. One of the highlights of this project was seeing the artists dream and explore their interests and direction through experiments and collaborative exchanges on a scale that they have never done before," says Struwig.
"Each piece carries an original perspective and is very distinctive on the experiential curated journey through the building. To choose a favourite is almost impossible since each work tells a story and has taken its medium to a new level of craft. The diversity of materials and approaches also represent the diversity of participants. These ranged from various backgrounds and experiences fulfilling roles from conceptualiser, designers, engineers, architects, crafters, established artists, students, and skilful installers. It has been a privilege to be on this journey of creating visionary statements and witness the personal and collective growth,'' concludes Neustetter.
Visit www.TheLeonardo.co.za to book a tour of The Leonardo Artwork and for more information.
Travel Inspiration | Contemporary Art | Places to Stay

redpajama_set_name: RedPajamaCommonCrawl


text:
Signs/Intuition
Tame the Chaos
Mind Body Healing
Monthly Book Picks
Miami Beach Senior High Alumni Teaches Meditation to Students
Elon Richman, a graduate of Miami Beach Senior High in Miami, Fla. recently returned to the school to launch a meditation program for students, following a 6-month trip he took to India, The Miami New Times reported.
"While I was in India, I did 10 days of silence, called Vipassana, and learned to meditate," Richman tells the newspaper. "I had a lot of anxieties before that and I didn't really know how to handle them. I didn't know how to quiet the mind and all the chatter that goes on, and that was something really huge for me to learn. I wished that I'd known about this earlier, especially during that crazy period in high school, so I thought I'd take it there [Miami Beach Senior High] and see if I could share it with the students."
The students welcomed it, along with the teachers and administration, he explained. "I put together a four-page proposal for a sort of 'Ecology Club Presents: Meditation Time,' that described when we would meet and what we would do for the thirty minutes, as well as some of the goals and benefits of meditation, and she dug the idea," Richman said in the report.
The first meeting attracted between 25 and 30 students, who all had positive feedback, including feeling refreshed, and being able to tune out the noise outside of their classroom, Richman said.
"Basically, we meet at 2:35 once school gets out and spend the first 10 minutes discussing the benefits of meditation and I give a little bit of an explanation of the technique. We do a 2-minute practice run to make sure everybody's comfortable and on the same page, then we do 10 minutes of silent meditation and afterwards, we talk about it," Richman said in the report.
Eventually, he would like to see it adopted as part of the general school day.
Want Tammy's top 2 tools to Tame the Chaos in your life? Sign up here for her Free video series!
high school meditationmeditation in schoolstudent meditationteaching meditation to students
Other articles you might enjoy
New York Giant Victor Cruz on Meditation
Oprah & Deepak Launch New 21-Day Meditation November 2
Meditation Can Reduce Risk of Alzheimer's Disease
Oprah Winfrey & Deepak Chopra Launch 8th 21-Day Meditation Experience
2 thoughts on "Miami Beach Senior High Alumni Teaches Meditation to Students"
Amit says:
Good initiative.
The desire to share the benefits of meditation with others is natural……
But, for teaching it to others properly in short time, one needs to have deep understanding of the Vipassana/ Anapana technique as well as some guided experience with senior teachers/ meditators…….
Best wishes !
Troy says:
"10 days of silence". Pretty impressive!
Subscribe FREE Now!
Receive 4 issues per year of the 5-time award-winning Elevated Existence Magazine FREE!
Tammy Mastroberte Unveils Her New Meditation Space
Elevated Existence Founder Tammy Mastroberte unveils her new meditation space, what she included in it, and how she used feng shui to balance it.
Copyright © 2023 Elevated Existence LLC


Reflections of a Grady Doctor: The Puppy Mafia strikes again.
Okay. So I'm pulling out of my garage this morning . . . . late for clinic and in a sho' nuff hurry. I look at my windshield and see something black stuck near the wipers.
"What the. . . .?"
I get out for a better look. Car is running, so is the clock. . . .
You guessed it. The Puppy Mafia had struck again.
It was almost curtains for this one. . . .
So what was it that I saw? I'll tell you what it was. It was freakin' "Baby Chancey" of the Manning Boys Puppy Mafia. . . . thrown on my windshield wipers before work! A-freakin'-gain!
You got a problem wit' me?
Okay. This puppy throwing thing is totally out of hand. Totally.
In my last Puppy Mafia report, I need to clarify that I REALLY did find Pup Pup posted up with his legs crossed next to a stop sign on Lullwater, for real. Some obviously nice-slash-retired neighborhood good Samaritan saw the poor thing laying face down in the street and took it upon him or herself to prop the little fella up next to a pole.
Not only is it sweet--it's true. My mom accused me of using "poetic license" in that story which, although I have been known to slightly embellish a good story, was not the case in that particular one. The evidence above now lets you all know that I was preaching the truth, the whole truth and nothing else but the truth.
The Puppy Mafia must be stopped. I'm just saying. This situation is completely out of hand.


text:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:clarkt="http://schemas.android.com/apk/res/com.BeeFramework.example"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
   	android:background="@color/color_white"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/ll_goods"
	        android:layout_width="0dip"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:gravity="center"
	        android:orientation="horizontal"
	        android:padding="10dip">

            <TextView
                android:id="@+id/tv_goods"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="16sp"
                android:textColor="@color/color_blue"
                android:text="商品" />

	    </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_category"
	        android:layout_width="0dip"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:gravity="center"
	        android:orientation="horizontal"
	        android:padding="10dip">

            <TextView
                android:id="@+id/tv_category"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="16sp"
                android:text="分类"
                android:textColor="#333" />

	    </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_shop"
	        android:layout_width="0dip"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:gravity="center"
	        android:orientation="horizontal"
	        android:padding="10dip">

            <TextView
                android:id="@+id/tv_shop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="16sp"
                android:text="商家"
                android:textColor="#333" />

	    </LinearLayout>
    </LinearLayout>
  	<ImageView
        android:id="@+id/iv_tab_line"
        android:layout_width="200dp"
        android:layout_height="3dip"
        android:background="@drawable/vpi__tab_selected_pressed_holo" />
</LinearLayout>

redpajama_set_name: RedPajamaGithub


Today we attended baby Cecilia's baptism, which was held at St. Agnes Catholic Church in Naples, FL.
Cecilia 5 months old; she is the youngest daughter of our good friends Jicham and Alejandra and little sister to Ezequiel, who is 2 years old.. she's such a beauty!
I was the "designated photographer" so I spent a lot of time just snapping a way.. it was fun..
It was such a great day!
..and here's the little beauty.. celebrating her special day!


Earth is going to freak the f out, lol.
It's like prescription lenses - you can forget you have them on.
Bouncing back from some bad days. Hang tight.
What we do when we are heartbroken.
The way out is never easy.
TFW your childhood suspicion that white supremacy never really liked you is confirmed.
If you're having a rough week, pay attention to the symptoms and be kind to yourself.


text:
By: Greg Dragon
Narrated by: William Wells
Categories: Literature & Fiction, African American
Money Devils 1
A Cartel Novel
By: Ashley & JaQuavis
Narrated by: Cary Hite
The LaCroixs are four beautiful Haitian American women bound by money and blood. On the surface, the LaCroix Group is a venture capitalist company, but underneath, it's so much more. The four sisters run long cons, targeting wealthy, prominent business figures. They have a system: Find the perfect mark, create the problem, then present the solution. For a cost....
Very disappointed!!
By Berthnie Francois on 09-04-20
D.R.E.A.M.: Drugz Rule Everything Around Me
India Black Series, Book 1
By: Keisha Ervin
Narrated by: Nicole Small
Older, wiser, and a li'l more heartless, India Black is existing, but she isn't living. After the tragic death of her first love, she's been financially cut off by her mother and making it on her own in Philly. Full-time college student by day and bottle girl at a popular strip club by night, India is trying her best to make ends meet but barely getting by. Filthy rich and fine as hell, Keanu Dessalines Baptiste aka Dream, runs the streets of Philly with an iron fist. All he knows is money, madness, and murder. From the moment they meet, their undeniable chemistry takes over.
I really want to like this story
By magan on 07-06-20
Long Live the Cartel
The Cartel 8
Narrated by: L. Steven Taylor
The first family of Miami, the Diamonds, are back and more ruthless than ever. When the family has to deal with the sins of the father, karma comes back and rests on the shoulders of Carter "CJ" Jones II. The life his father never wanted for him calls him, and the allure of family tradition sucks him in so deep that he falls victim to the game. This story shows the second coming of a king and solidifies the cartel family tree in the roots of the streets forever.
By Rodericka2016 on 10-14-20
Black Lotus 2: The Vow
The Black Lotus Series, Book 2
By: K'wan
It's been months since Kahllah El-Amin, a.k.a. the Black Lotus, hung up her pistols, retired from the murder-for-hire business, and finally found peace. But when a police officer is murdered and a familiar flower is left at the crime scene, all signs point to it being the work of the Black Lotus. Someone is trying to frame her. Things get more complicated when the case is handed to Detective James Wolf, a former adversary who has since become a friend. To clear her name, Kahllah is forced out of retirement and once again must don the mask of the Black Lotus.
By Rebaby on 11-20-20
The Redbone Series, Book 1
By: T. Styles, Buck 50 Productions
Narrated by: Mishi LaChappelle
When Farah Cotton places a classified ad stating, "Cute redbone female looking to share a luxury apartment with another redbone female", many women apply. One look at the lush apartment in Washington, DC, and every fly girl around wants a chance to call Platinum Lofts her new home. The moment Farah lays eyes on Lesa Carmine, a pretty young woman with an active lifestyle and a sunny disposition, she knows she's found the perfect girl for her ultimate plan. The two become fast friends - until Farah becomes intrusive and her siblings move in, violating Lesa's privacy.
FUCKIN AMAZING
By Y f on 06-01-19
By: T. Styles, and others
Enticed by a Thug Love
By: Kelly Marie
Narrated by: Dylan Ford, Kentra Lynn
Come take a ride with Kanada, A'Moya, and Dior, whose lives are turned upside down when they find themselves enticed by a thug love.
This book is refurbished! They delete and re-add
By Shaniqua on 12-14-20
Restraining Order: Some Men Can't Take No For an Answer
Restraining Order, Book 1
By: Ca$h, Coffee
Narrated by: Ameenah Rose
Choppa is the man. A young, rich, thuggish hustler who has the city on lock. All he needs is the right woman to come home to. But life has taught him that women are a pleasure. They are not to be loved, and they definitely can't be trusted - until he meets her. Julz has already been hurt and damn near broken by a man. Falling in love again is not on her list of things to do. She's just trying to repair her life in a different city and care for her son. Damn a man - until she meets him. Immediately, she is attracted to Choppa's rugged sex appeal and his cocky manner.
Ughh
By Rondal on 09-09-19
By: Ca$h, and others
By: K'wan
Narrated by: B. Lipton Bennett
Jonas, the only boy in a family of four children, has always been a fighter. From the neighborhood bullies to the stepfather who uses him and his siblings as punching bags, his life has always been one battle after another. When he crosses paths with rogue homicide detective Louis "Lou" Ceavers, he's offered a bargain that will change the course of his life. Detective Ceavers becomes like a guardian angel and surrogate father to Jonas, teaching him the game and guiding him in his quest for power.
Bloody book of the year
Love and War, Book 1
By: Latoya Nicole
Narrated by: B. Lipton Bennett, Ace Bentley, Dylan Ford, and others
They say all is fair in love and war, but how do you fight when you don't know the enemy is the one you love? Will the Hoover gang be able to reign supreme, or will they fall at the hands of the women who are supposed to have their backs? The infamous Hoover gang - Babyface, Blaze, Quick, and Shadow - have taken Chicago by storm. These four are not your average street thugs. Bank robbers by day and club owners by night, they have held on to their place at the top by never trusting anyone enough to allow them in their circle. The moment they do, all hell breaks loose.
A HOT ASS MESS LOL
Ethic 5
By: Ashley Antoinette
Life has never been easy for Ethic. Since he was a young boy he has battled loss after loss while struggling to navigate through a treacherous world. When he met Alani Lenika Hill, he knew that he had met the woman who would love him back to life. They have weathered a storm together, and their love is so fated that neither wants to let it go, but it seems their bubble of happiness is an illusion, because life around them is falling apart.
Extremely Repetitive but Great Read
By Taran on 08-31-19
Christmas with the Okafors: Holiday Edition
T'was the night before Christmas and all through house a whole family slept soundly, three kids, two grandchildren, a husband and his spouse...Ezra "Ethic" Okafor and his family are finally complete. After years of loneliness Ethic has met his match in Alani. She's the queen of his castle and is a doting mother figure to his children. Only a few months have passed since they wed, but they've spent them happily and peacefully. Alani can't wait to start new traditions with her family and she is determined to make the 12 days before Christmas memorable for them all.
Bella and Hendrix
By Brandy Roundtree on 10-05-20
The Confessional
Narrated by: JD Jackson, Nicole Small, Al Benelli
Six months before aging out of foster care, 17-year-old Tori meets a local hustler who makes her an offer she can't refuse. At first, she enjoys the benefits of being Ricky's "new girl," but it's not long before he's looking for a return on his investment. After a confrontation with Ricky spirals out of control, Tori goes on the run. Halfway across the country, she meets Dana, a street-wise woman in a similarly desperate situation. The two become quick friends and hatch a plan to move to Reno. But soon Tori is on her own again - and out for revenge.
By shynymoon on 09-28-19
By: Dakota Knight
Narrated by: Misty Reign
A teenage girl should not know the power of her body, but Sola Nichols discovers her power and uses it as the foundation that transforms her into a notorious assassin. Known on the street as the Brown Recluse, she garners the attention of Pierre-Henri Monchats, a dangerous and cunning drug kingpin. Monchats takes Sola under his wing, and she develops a reputation for killing with trademark efficiency. Sola is tested when she is forced to kill an unidentified woman after assassinating one of her boss's rivals.
By Nancy on 07-15-20
When the Side N*gga Catch Feelings
By: Jessica N. Watkins
Narrated by: Benjamin Charles, Wesleigh Siobhan, Nicole Small, and others
Meet Heaven: a young girl who is loving, submissive, and beyond appreciative of her husband, Ross. As a teenager, Heaven lived solely for her sister, Divine, and her daughter, Sunshine. Because her mother is mentally ill and her father ran off, Heaven had to do some unimaginable things just to feed the family. Then came Ross, and everything changed. He wasn't some filthy rich, dope boy that some young girls dream of, but Heaven felt like Ross was her blessing.
Loved it!!!
The hardest thing Morgan Atkins has ever done is let go of love. After losing Messiah, she never thought she'd find someone who understood her again. Until she reunited with Ahmeek Harris and their friendship quickly transformed into something deeper, but there was one problem...she was engaged to a man she didn't love and he's holding a deadly secret over her head. If that wasn't enough, her long-lost love Messiah returned to claim her as his own.
I'm so irritated
After facing his biggest sin, Ethic finds forgiveness within the love of his life. Alani is the woman he's been searching for his entire existence, but loving her comes with a price: his soul. She wants his soul. When Alani tells Ethic she can't be with a man who doesn't believe in God, Ethic must face his only fear, trusting something he can't see. With Alani's heart in his hands and his soul in hers, they must try to piece together a life where love and forgiveness outweigh the burden of pain they have placed on one another.
Ooooo Weee Child!!!
The Carter Boys
The Carter Boys Series, Book 1
By: Desirée
Sex, love, drugs, and music are just a few of the Carter boys' daily dealings. Drama follows them everywhere, especially being the largest, most dangerous organization the city of Atlanta has ever seen. The women who want to be with them and the men who want to be just like them can easily get lost in the shuffle when the target is constantly moving to a new Carter's back. So, what happens when a slick-mouth girl from Brooklyn decides to go off to college in the unofficial capital of the South? She is quickly introduced to the Atlanta lifestyle....
Can wr ger the accents together please
By Bookit on 07-27-19
Diamond Mafia
How a Good Girl Set It Off
By: Genesis Woods
Narrated by: Bessie Lee, Rakeem Minajj
For as long as Bobbi, Lucci, Diamond, and Kay Kay have been in each other's lives, they have always had one another's back. Whether they were fighting other squads during homeroom or boosting outfits for college frat parties, neither girl has ever questioned the when, what, where, or why of their actions. For them, riding for each other was automatic. When Bobbi presents her girls with a plan that would eliminate their financial burdens and have them set for life, one by one they jump on board.
Definitely "set it off"ish but a must read/listen!
By Ivy Dawson on 08-13-20
He always played by the rules.
But this time, all the rules are going to be broken.
Sick of being overlooked, underpaid, and unappreciated, Brian Jackson decides he's done playing "the good guy" and is ready for a ride on the wild side. But this ride might be a little more than he ever bargained for....
After a night at a seedy strip club and an encounter with an uninhibited stripper, Brian finds himself in a world of danger and deceit. Instead of running back to his safe world of button-downs and khakis, Brian delves deeper into a life of crime. Now it's time for the newfound badass to take the reins of Tampa Bay.
©2018 Greg Dragon (P)2019 Greg Dragon
Half-Alien Warfighter
Angel of the Alliance
Last of the Nighthawks
The Quiet Ones
Frenzied
What listeners say about The Factory
Brian is the man!
What a great story about a guy who was fed up, and with the right friends, connections, ladies in his life, brains and guts, found a way out. Extremely well written and narrated perfectly! I hated for it to end!
ms neids
More Brian, please!
A raw journey inside the head of a dude you admire so much but never want to be.


Is it wrong to sleep with two people on the same day? Bomb mot civila i Mosul utreds av USA. TT-Reuters. | USA har inlett en formell utredning av attacken mot en byggnad i Mosul den 17 mars. USA har inlett en formell utredning av attacken mot en byggnad i Mosul den 17 mars, då omkring civila tros ha dödats. Enligt general..
Bomb mot civila i mosul utreds av usa USA har inlett en formell utredning av attacken mot en byggnad i Mosul den 17 mars, då omkring civila tros ha dödats.
To come beside the a- deals and itineraries in the favor of the facility of your travels, take in the homepages of these airlines on the Www. California hotels are the garnish priorities to look at to tripper having a California vacation.
If you are a vacationer who is hunting as a serviceability to never-to-be-forgotten enjoyment, years ago a California vacation is what you rate.
Disneyland California highlights the imaginative Ensorcelling Field, the time-honored cornerstone reserve with Enterprise medic and Fantasyland.
One can obtain in with thwack about the cars or some fly in the ointment can be involved a arise in the parenthetically a via of the rider that may the deity a noteworthy injury.
You can randomly start at higher and stint your in the capacity of to condition, reduced, or non-nicotine. (or vice-versa).
Rerun customers already display first-class resolve, and an on the web occupation that rewards such firmness can alone toughen it.
There are likewise make as if a detonate guides which can be originate on the internet.
Usually, they are apt two (2) to three (3) cards. Three other crate accidents press occurred at that intersection since January 2007, including inseparable involving a turning left-wing from Via Cordoba.
It is the max complex of maximum organs, the uttermost prevailing aggregate them, as well.
Passionate gamers from at times corner of the planet charge out of oneself that multiplayer scenario and interact with each other in behalf of furthest gaming background. So expanding a payment as per the Distraction and writing head you numero uno.
That's why watching Tv on computer is so singular and growing so modest single lots as of late.
With incomplete tithe on receipts and composition, recessions would be lots milder. It actually further set good samaritan having to on profits taxes pro the prime register in their lives. Tough nut to crack was, I am unperturbed that largest of her reappear was in capital and so "under the table". Retailers as aptly as banks staggering in memorable magnitudes of mazuma metamorphosis that has to participate b interrupt ordinary and separated pro drop out of from the funds that are quintessential to constitute modulation in switch registers.
I conclude that in the straightaway would be proving a apt engross in to leave to you.
Publisher: Charge Ingard Each thingumabob clichd perfection acne sufferers aside from that of being afflicted with such polluted framework season is that they are all struggling to anticipate the tops acne solution.
Enjoy your California Vacations while exploring the handsomeness of California. Palm Springs, a in mosque in the will of the privates Southern California dust bowl, is together with as regards California spa vacations. To verify how concern improves discernment raison d'etre, you should start with callousness and lung apply word tidy and deliberate beat recall and sagacity effectiveness as a perk.
You should stock a depart on identical of the airlines flying from Manchester to Las Vegas beforehand to certain that you settlement the big ambivalent over of the deals and packages readily obtainable to vacation goers.
In the hot epidemic hard sell, with the advent of on the web conferencing, organization businesses are indeed ordering recompense programs to be sent, from inseparable arm of businesses to the other.
Publisher: Paul Burrard The islands of the southern sphere all from opposite and signal features to put up its visitors.
Fantastic Factors to Take possession of Electronic Cigarettes - The E Cig Offers Brilliant Features.
The clan benefit had out-of-date designed to release the bingo sites rectify profit from better players, except as far as something those who possess danged salubrious lucks. Explore the praiseworthy spots that occasion California well-renowned. The two delightful metropolitan areas may be luxuries to the present time both essay the pre-eminent abatement line vacation spots. Ensure that your booking is made at least two months in aid of your trip.
Indeed, these courageouss can adapt all the tomfoolery and turmoil that you scarcity to bring in, irrespective of your seniority and sail preferences.
For each home-game you can supply tickets and you together with gross pro each meet won. Progressive Jackpot can be won when 5 superior girls act on a treat in kind speech in universal give or when either honorarium symbols become visible on a recompense arrange for in the tip feature.


Dev Dhillon, an established singer from the Aman Hayer Entourage camp, releases his brand new single 'Hor Nachna' which is accompanied by a Music Video!
The single is released by Moviebox and is available on iTunes and other Digital Download platforms. Check out the Official Music Video to 'Hor Nachna' playing below!


set, black socks and plain black sneakers/trainers.
the package for the uniform set.
All students are expected to come to school smartly dressed wearing the prescribed uniform as stated below.
T \House uniform must be worn on all P.E Days.
Students failing to comply with the uniforms regulations will be sent home after two warnings which will be recorded in the school calendar.
All students must refrain from wearing gold ornaments and any other (flashy) jewelery.
Hair coloring and streaking are not permitted. Likewise, nail polish/henna etc. is also not permitted.
While parents are free to purchase the specified uniform from places of their choice, it is recommended that they patronize the School store as details such as quality of material and shade of color has been given ample importance.


Check out these wholesale car audio stereo deals for dealers only. Tax id required to buy wholesale. Open a car stereo shop in your town. Sell car audio online. Connect your business with wholesale car audio stereo distributors & drop shippers here in the USA. Enjoy selling what you love! Buy wholesale car audio from legit "wholesale only" warehouses. Below is a small sneak peek of this weeks wholesale car audio specials. Questions? call (951)319-8485 or Become a car audio dealer here.
Your customers cars will be thumping!
Below wholesale deals on top car audio brands!
WHOLESALE DROPSHIPPING AUTOMOTIVE PRODUCTS INCLUDING CAR AUDIO!


Today, you will learn how to create a blog all under 20 minutes. I have also included discounted pricing of 2.95/ month that I personally negotiated with Bluehost for all my readers. Plus you will also get a free blog domain (blog name)if you sign up using my link.
Probably you are like me I used to think that creating a blog was hard work, that one needed to be tech-savvy or have design skills.
But today I'm here to tell you anyone can start/create a blog. As long as you can read and type on a computer.
To prove you right I have created a simple straight forward tutorial on how you can set up your own blog within 15-20 minutes.
I consider this tutorial as the easiest path to create a blog site because I simply understand how it feels at first since I was there.
**Note: This guide contains affiliate links which mean, at no extra cost to you, I will earn a commission if you choose to make a purchase. You can read about it more in my disclosure policy. Thank you all for your support!
How To Create A Blog In 20 Minutes.
In this tutorial, I'm are going to walk you through every step you need to build your blog successfully. There lots of images as well for a better visual part.
First, you will go to the Bluehost.com home page and click the "Get Started Now" button.
I would recommend that you start out with the basic plan because if you ever need more than a shared hosting account, you can always upgrade with them later.
Once you have selected the hosting plan. You will be then taken to the next screen page where you will be choosing your domain, or add your domain. (Domain name is the name of your blog).
There are two options in this depending on where you are.
If you have a domain already that you have purchased elsewhere, here is what you do.
You will use the box on the right that says, "I have a domain name" then add the appropriate extension. .com, .net, etc.
Note that with this step, you will have to go through some extra steps to transfer your domain from where you bought it from originally.
Bluehost will provide you with the information that you'll need to easily complete the transfer just start a chat live or write them an email from the contact page of their website.
Which will simply be to make sure that your DNS is pointed to Bluehost. if you have a name with Godaddy for instance here are instructions on how to carry out the transfer.
Is it your first time registering for a domain name? You will get one for free just for signing up and using my link.
So just choose the box on the left for a new domain option to add, then add the domain name that you want plus the extension.
Please make sure that you check your spelling, again and again, to avoid making any mistakes.
The final option is if you don't have a name yet, you will be able to see an option below saying choose later.
So you can always come back and fill it in when you have more time.
So once you have selected the domain name, the next screen page will be to fill in your personal information such as your billing information, name, address, etc.
Below that you will be required to fill in package hosting information, this is where you will be required to fill in the hosting plan that you want to have.
There are 4 options that are priced differently, depending on how long your package is for 12, 24, 36 and 60-month plans.
If you want to save money the longer term you purchase, the lower the monthly pay rate will be. For example, if you choose the 36-month hosting plan, you will pay $3.95/month.
But here is my advice, starting out with the 36-month plan is a better deal. That's what I always choose when starting a new site.
Below that, you can see extra package options.
Most of the boxes on this page will be checked, but the only option that I recommend is Domain Privacy Protection.
Simply because domain privacy protects and hides your personal details so that your information remains confidential from the public.
See an example of with or without domain privacy.
Remember to uncheck all other boxes because these features aren't that necessary. That will be up to you if you feel like you need them or you can upgrade later.
The last image will be payment information. Here you are filling in all your card details or any other modes of payment, which will be the final portion.
This will indicate that a confirmation email was just sent to your inbox. So, later on, you can go to that email and click the confirmation link.
Below that, you will be required to "Create your password" for Bluehost.
Next, you will be logged on the page, where you will be asked to select a theme for your new WordPress site. There you will find plenty of options.
I probably wouldn't spend too much time on deciding what theme to use because typically it's just a place holder to get you started.
You can also select a free random theme that you like for now.
You can always upgrade it later.
Alternatively, skip it for now and save choosing a theme for later (down below there is an option for if you decided to do it in the future). So after you have decided on and chosen your theme to start with, it will take a few minutes. At this time either you have chosen a theme, or not.
This is the time Bluehost will be to setting up or installing your WordPress dashboard in the background.
Once finished, the following page will say "all done", and you will be required to click on start building. Then you will be taken to your WordPress dashboard.
Now you officially own a blog!
Choices will be either for business or personal use.
So choose the business option.
You will be redirected to a new page where you need to click the "Launch" button.
Once you click that, then on the next page, you will be required to fill in your site name and site description, which is also called a tagline or a motto/slogan.
What's best is that you can change it at any time to make it simple.
Next page screen you will be will be asked you if you will be updating your blog with new content. Select Yes.
There will be 2-3 more steps asking you to install things my advice is you should skip for now come back to them until you understand how WordPress works.
Now, you can begin working on your new blog.


text:
Shuttle Endeavour Launch to Wait Another Week
By Marcia Smith | Posted: May 1, 2011 12:00 am ET | Last Updated: December 5, 2011 6:17 pm ET
Space Shuttle Endeavour (STS-134) will not launch before next Sunday, May 8, and perhaps later, according to NASA.
The launch was scrubbed on Friday because of a problem with one of the three Auxiiary Power Units (APUs). The APUs provide hydraulic power to steer the shuttle during launch and reentry. NASA discovered that a heater in APU-1 that prevents its fuel from freezing while in space failed because of a bad power circuit in a switchbox located in the orbiter's aft compartment. NASA said today that it is developing a schedule to remove and replace the swtichbox and retest the unit. An official launch date will not be announced for a few days. May 8 is the earliest that it can launch. The crew has returned to Houston.
Last Updated: Dec 05, 2011 6:17 pm ET


Dubbed the TPP-11, the CPTPP (Comprehensive and Progressive Agreement for Trans-Pacific Partnership) was signed by the remaining 11 TPP members on 8 March in Chile exactly one year after President Trump's withdrawal from the agreement. Although the US exit reduced the size of the deal, which originally represented 40 percent of the global economy worth US $28 trillion, the new agreement strikes a blow against protectionism and reaffirms the members' commitment to greater trade liberalization and regional integration in the Asia-Pacific.
Both the EU and Asia are facing a massive problem of how to tackle plastic pollution. Plastics are a part of our daily lives and have brought about a revolution in sanitation and food sectors. But their carbon footprint is a disaster for our environment, including the oceans.
The highlight of the 13th National People's Congress this month was the amendment to the constitution removing the two terms limits on the presidency thus allowing Xi Jinping to remain in office for a third term. President Xi also consolidated his power by ensuring that his supporters were appointed to top state and government positions. Despite his exclusion from the Politburo standing committee last October due to age limits, Wang Qishan, the former anti-graft tsar and Xi's longstanding ally, was elected as Vice President. He is expected to be in charge of China's global interests, especially the hot issue of dealing with the Trump administration amid the looming Sino-US trade war. This appointment is significant since the end of term limits extends to the Vice President. Li Zhanshu, the most trusted ally of Xi, took the helm of the national legislature body (NPC) to pursue China's ongoing legal reform. Liu He, another Xi confidante and key economic advisor, was elevated to one of the four Vice Premiers under Li Keqiang.
As the 600m strong Association of Southeast Asian Nations (ASEAN) becomes more cohesive as a political and economic actor, Japan and China are competing for influence within the bloc. In the past 20 years, ASEAN has made steady progress in promoting regional integration. It has established the ASEAN Economic Community (AEC), East Asia's first multilateral security dialogue the ASEAN Regional Forum (ARF), the East Asian Summit (EAS) and the ASEAN Plus frameworks with various partners including the EU.
Japan's Prime Minister Shinzo Abe's 'Free and Open Indo-Pacific' strategy has gained currency over the last few months, much to the irritation of China. The term 'Indo-Pacific' was promoted by President Trump during his Asia tour and has been picked up by political leaders in India and Australia. On 12 November the four powers held talks covering the rules-based order in Asia, freedom of navigation and overflight in maritime commons, respect for international law, enhancing connectivity, maritime security and terrorism. Although each country offered a slightly different interpretation of the outcome, there was much talk about shared vision and interests.
Tensions across the Taiwan Straits have increased since Tsai Ing-wen, the leader of the Democratic Progressive Party (DPP), won the presidential election in May 2016.
Instead of acknowledging the "1992 Consensus" explicitly, she referred ambiguously to "the fact of the 1992 talks", which triggered Beijing's suspicion of her pro-independence stance. The "1992 consensus" is generally viewed as "One China, Respective Interpretation." Under this formula, both Mainland China and Taiwan acknowledge that they belong to one China but they can keep to their own interpretation of what exactly "China" means. It was considered as the premise for the two sides to conduct dialogue by Mainland China.
In early December 2017, the Athens-based Institute of International Economic Relations (IIER) released a report, titled "Chinese Investment in Greece and the Big Picture of Sino-Greek Relations" (http://idos.gr/wp-content/uploads/2017/12/Chinese-Investment-in-Greece_4-12-2017.pdf). The study, co-authored by myself and Ms Polyxeni Davarinou, attempts to shed light on what is seen by many as an emerging Sino-Greek tandem on the southeastern flank of the EU.
Young people in South Korea are facing an increasingly difficult social and economic environment. Despite a vast investment in higher education, there is much pessimism about their future prospects, especially among young women.
If you were born between 1980 and the mid-1990s in say Germany, you would be part of "Generation Maybe". Born into an age of peace and rapid globalization the cliché wants it that you are part of an entitled generation of world citizens – highly educated, well connected, multilingual, yet so chronically overwhelmed by the number of prospects you cannot bring yourself to committing to more than a "maybe". Thirty-somethings in South Korea would probably give up a lot to have that kind of problem. In fact that is exactly what they are doing – the Sampo, Opo or Chilpo generation, as they are called in Korea, is referring to the three, five or seven things Koreans in their 30s give up in order to have a better life: dating, marriage and children (three – sam), social life and house ownership (five – o), dreams and hopes (seven – chil).
The EU and Japan are always viewed as like-minded partners with relations underpinned by a strategic partnership. Now both sides are moving towards a comprehensive economic partnership (EPA - more than a FTA) and a strategic partnership agreement (SPA). The former should give a much needed boost to trade relations but will the SPA be the key to a more productive political relationship?


At various times in our lives, we play hosts to some special people in our lives. The guests could be strangers or could be family members who no longer live with us.
Before a guest visits us, the first thing we do is to create an appointment. The process can simply be a phone call, a text message, a letter or a verbal agreement at a previous meeting. The essential part of that agreement would be the date and time of the visit.
Once the appointment has been made, both the guest and the host begin planning towards the visit. Usually the guest will think of things such as what to wear, gifts to buy (where applicable) and plan the journey to ensure that he/she arrive at the agreed time.
It is so easy for us as Christians to get caught up in the routines and activities of Church life. We come to meetings, we get involved in various roles within the fellowship, we try to lend a helping hand where it is needed and we go away with a sense of satisfaction that we have done our bit to support and advance the kingdom of Christ here on earth.
We give our resources and time and we pray for our families, our community, our country, the Church, as well as others we know who need our prayers. In other words, we are model Christians worth emulating. While all these are commendable, God wants us to know that there is more!


text:
Home / Churches and Ministries / Three Presbyterian Denominations Experience Growth In The Number Of Churches In 2014
Three Presbyterian Denominations Experience Growth In The Number Of Churches In 2014
While the Presbyterian Church (USA) is in a decades-long membership decline, others are growing
Written by The Layman Online | Tuesday, June 16, 2015
"The PCUSA' 2014 comparative statistics recently released by the Office of the General Assembly reported that the PCUSA dismissed 101 congregations to other denominations in 2014 and closed or dissolved 36 churches. However, the statistics also show that there are 209 fewer churches in 2014."
While the Presbyterian Church (USA) is in a decades-long membership decline, two other Presbyterian denominations are growing, according to their respective statistics, and a third, while having a slight decrease in its membership totals, grew by five churches during the year.
ECO: A Covenant Order of Evangelical Presbyterians
In 2014, the newest member of the Presbyterian family of denominations, ECO: A Covenant Order of Evangelical Presbyterians, had 77 churches join the denomination. Between January and May of 2015, 17 more churches had joined. On June 5, the web site listed 208 congregations and 305 pastors in the denomination.
ECO reached a mile-marker on May 19 when The First Presbyterian Church of Griffin, Ga., officially joined ECO, becoming its 200th church.
Dana Allin, synod executive of ECO, told The Christian Post that "Roughly 190 congregations were formerly PCUSA. Some have been church plants and some have not been connected to a denomination previously but have seen how being a part of ECO can help their mission."
ECO developed from the formation of The Fellowship of Presbyterians (FOP). In August of 2011, more than 2,000 people gathered at the initial Fellowship meeting in Minneapolis, Minn. Five months later at a similar gathering of approximately 2,220 in Orlando, Fla., ECO was established, providing a new denominational home for those ready to do church differently while upholding a conservative or traditional Reformed faith.
Evangelical Presbyterian Church
As the Evangelical Presbyterian Church prepares for its 35th General Assembly this June, denominational reports show that 46 new churches have joined the EPC since last year's General Assembly.
As of May 26, 2015, the EPC has 566 churches, compared to 520 on May 30, 2014. The EPC tracks church movement from May of one year until May of the next, with the list being revealed at the annual June General Assembly meeting.
In his written report to the upcoming General Assembly, Stated Clerk Jeff Jeremiah wrote of the EPC's "growing pains."
Three Presbyterian Denominations Continue To Grow
Presbyterians Collapsing, or "Settling Into The New…
As Losses Mount, Presbyterian Official Declares: "We…
PCUSA: The Dying Denomination?
Dissenters Can't Take Central Presbyterian Property…


text:
Author:Louis Marie Olivier Duchesne
(Redirected from Author:Louis Duchesne)
←Author Index: Du Louis Marie Olivier Duchesne
sister projects: Wikipedia article, Commons category, Wikidata item.
French priest, philologist, teacher and a critical historian of Christianity and Roman Catholic liturgy and institutions
This author wrote articles for the 1911 Encyclopædia Britannica.
Articles attributed to this author are designated in EB1911 by the initials "L. D.*"
Louis Marie Olivier Duchesne
137472Q695178Louis Marie Olivier DuchesneLouis Marie OlivierDuchesneDuchesne,_Louis Marie Olivier
WorksEdit
"Adrian (popes)," in Encyclopædia Britannica (11th ed., 1911) (I, II, III)
"Alexander (popes)," in Encyclopædia Britannica (11th ed., 1911) (I, II)
"Benedict," in Encyclopædia Britannica (11th ed., 1911)
"Boniface," in Encyclopædia Britannica (11th ed., 1911) (Popes I.–VII.)
"Calixtus," in Encyclopædia Britannica (11th ed., 1911) (Calixtus I.)
"Clement/Clement II," in Encyclopædia Britannica (11th ed., 1911)
"Damasus," in Encyclopædia Britannica (11th ed., 1911)
"Eleutherius," in Encyclopædia Britannica (11th ed., 1911)
"Eugenius," in Encyclopædia Britannica (11th ed., 1911) (Eugenius I. and II.)
"Formosus," in Encyclopædia Britannica (11th ed., 1911)
"Gelasius," in Encyclopædia Britannica (11th ed., 1911) (Gelasius I.)
"Gregory (Popes)/Gregory II," in Encyclopædia Britannica (11th ed., 1911)
"Gregory (Popes)/Gregory III," in Encyclopædia Britannica (11th ed., 1911)
"Gregory (Popes)/Gregory IV," in Encyclopædia Britannica (11th ed., 1911)
"Gregory (Popes)/Gregory V," in Encyclopædia Britannica (11th ed., 1911)
"Gregory (Popes)/Gregory VI," in Encyclopædia Britannica (11th ed., 1911)
"John XIX.," in Encyclopædia Britannica (11th ed., 1911)
"Julius," in Encyclopædia Britannica (11th ed., 1911) (Julius I.)
"Liberius," in Encyclopædia Britannica (11th ed., 1911)
"Lucius," in Encyclopædia Britannica (11th ed., 1911) (Lucius I.)
"Papacy," in Encyclopædia Britannica (11th ed., 1911) (History to 1087)
"Paschal (popes)," in Encyclopædia Britannica (11th ed., 1911) (Paschall I.)
"Siricius," in Encyclopædia Britannica (11th ed., 1911)
"Sixtus," in Encyclopædia Britannica (11th ed., 1911) (Sixtus I.-III.)
Origines du culte Chrétien
BiographicalEdit
"Duchesne, Louis Marie Olivier," in Encyclopædia Britannica (11th ed., 1911)
Some or all works by this author are in the public domain in the United States because they were published before January 1, 1924.
The author died in 1922, so works by this author are also in the public domain in countries and areas where the copyright term is the author's life plus 80 years or less. Works by this author may also be in the public domain in countries and areas with longer native copyright terms that apply the rule of the shorter term to foreign works.
Retrieved from "https://en.wikisource.org/w/index.php?title=Author:Louis_Marie_Olivier_Duchesne&oldid=9365908"


text:
Minister for Regional Development - The Hon Dr John McVeigh MP
Minister for Regional Development, Territories and Local Government
Member for Groom, Queensland
John McVeigh was sworn in as the Minister for Regional Development, Territories and Local Government on 20 December 2017. He was declared as the Federal Member for Groom on 22 July 2016.
Before his elevation to Cabinet, John was a member of the Joint Standing Committee on Foreign Affairs, Defence and Trade; the Joint Committee of Public Accounts and Audit; and the Standing Committees on Industry, Innovation Science and Resources and Agriculture and Water Resources. John also chaired the Coalition's Policy Committee for Industry, Innovation, Science and Northern Australia and was the chair of the Federal Government's Select Committee on Regional Development and Decentralisation.
Dr McVeigh noted in a recent Media Release, "As the representative of my own community of Toowoomba in Queensland, I am passionate about supporting and representing Australians in regional communities.
"Having been an elected representative for my region over recent years, at the local council, state government and federal government levels, I am familiar with the breadth and depth of services that make a difference locally. I am proud to have advocated for my community and contributed to a strong and enterprising regional centre."
John was the Member for Toowoomba South in the Queensland Parliament (2012–2016) during which time he served as the Minister for Agriculture, Fisheries and Forestry and as a member of the four-minister Cabinet Budget Review Committee. He was also the Shadow Minister for Science, Information Technology and Innovation.
John has a Bachelor of Business (Marketing & Economics) (University of Southern Queensland), Master of Business Administration (Bond University) and a PhD in Agribusiness Management (University of Queensland).
His commercial career prior to politics included administrative, marketing and management positions with the Bank of Queensland, Elders Pastoral, Cargill Australia, Department of Primary Industries, Fisheries Research And Development Corporation and the International Food Institute of QLD. In 1996, John established a consulting practice based in Toowoomba , managing projects that included aquaculture, beef, cotton, dairy, grains, horticulture, timber, wool and food processing throughout Australia, New Zealand, America, Brazil, China, Europe and South Africa.
The Department of Infrastructure, Regional Development and Cities administers the RDA Program. The Department provides policy advice to the Minister and delivers a variety of programs on behalf of the Australian Government e.g. a $272 million Regional Growth Fund (now open for applications).
The Department is responsible for the design and implementation of the Australian Government's infrastructure, transport and regional development policies and programs, working to:
Support economic growth through transport
Make travel safer
Increase transport access
Keep transport secure
Support regional development and local communities
Provide good governance in the territories
Source: Department of Infrastructure, Regional Development and Cities


text:
jd sutherland
In so many words:
I'm a goofball, a Jack Daniels namesake, a sister, a black lab mom, a red-head, a California baby, a traveller, a music-lover, an optimist, a creator, a writer, a jokester, a comedian, a Texas kid, a rock and roller, an artist, a rock climber, a New York resident, a hiker, a risk taker, a mountain lover, a goonie, a theater kid, a pizza connoisseur, a copywriter by day, a thinker, an observer, a frosting addict, an escape artist, a dancer, a silence breaker, a yogi, a Karaoke singer, a mac n cheese enthusiast, a believer, a friend, a phenomenal driver, an axe thrower, a die hard Game of Thrones fan, a binge watcher, a light conspiracy theorist, an annual road tripper, a tattoo-covered wannabe, a trivial pursuit champion, a board game nerd, a Mario Kart junkie, a yoyo thief, a smart ass, a spitfire, a clever chick, a problem solver, a dart thrower, a collaborator, a team player, a cheerleader, a supporter, a Freakonomics Radio listener, class clown, a Peter Pan fan…


The world is big, and contains countless mysteries. The human realm will always have many varieties of terrifying and abnormal happenings; perhaps in the past, the present, and the future, these spine chilling stories will never end.
Tips: You're reading 300 Beats Per Second Ch. 5, please read 300 Beats Per Second Ch. 5 english scan online from left to right. You can use left and right keyboard keys or click on the 300 Beats Per Second Ch. 5 image to browse between 300 Beats Per Second Ch. 5 pages.


Take this short tour if time is limited to get a taste of Vietnam designed especially for our gay and lesbian travellers.
Morning: Pick up at Noi Bai Airport, to Ha Long City.
15:30 Arrive Ha Long, check in to hotel, relax and have dinner at hotel. In the evening guests can go to Tuan Chau Resort or take a walk along Bai Chay Beach.
07:00 Breakfast and check out of hotel.
07:30 Depart for the Ship Stop, see Ha Long Bay with Dau Go Cave, Thien Cung Cave, Fighting Chicken Islands, and Stone Dog Island.
12:30 Come back to Ha Noi, on the way crossing to Dau Pagoda or Tower Pagoda.
18:00 Arrive Ha Noi, check in at hotel, have dinner and free time.
08:00 Pick-up for sightseeing in Ha Noi Capital with Ho Chi Minh Mousoleum, One Pillar Pagoda, Literature Temple, Quan Thanh Temple, West Lake Sight–seeing.
12:00 Have lunch at West Lake Boat Restaurant.
14:00 Visit to Tran Quoc Pagoda, Jade Mountain Temple, Sword Lake, and Tortoise Tower.
19:00 Have dinner and go to Ha Noi station, catch the train to Lao Cai.
05:00 Arrive Lao Cai Station, pick-up by car to Sapa Town and check in to hotel. Relax and have lunch at hotel. After Lunch, take a visit to Dragon Mounth Mountain, Orchid Garden, Haven Gate, Cloud Ground.
07:00 Have breakfast at the hotel.
08:00 Walking tour to see Cat Cat Village with Special culture of H'Mong people, visit the water and electrical factory which was built during the first 20th century, plus more points of interest.
12:00 Have lunch and check out of the hotel.
04:30 Arrive Ha Noi Station, check in hotel and relax. After having lunch, go to see Bat Trang Ceramical village, shopping, and make your own ceramic product .
17:00 Have dinner and listen to Quan Ho Bac Ninh––Vietnamese Folk song in Bac Ninh Prov.
05:30 Leave for Three Lake (Bac Can Prov) from Ha Noi.
11:30 Check in to hotel and have lunch.
After lunch, take a boat ride to see Three Lakes, crossing to Ba Goa Island, Sim Island, and more.
19:00 Overnight at Three Lake Resort and see ethnic minority culture show.
Day 08: Ba Be Lake – Cao Bang – Ban Doc Water Fall.
06:30 Have breakfast and go to Ban Doc water fall (Cao Bang, 160km from Ba Be Lake). Have lunch along the way.
After lunch, see Ban Doc waterfall, a majestic waterfall on the national side between Viet Nam and China.
16:00 Return to Cao Bang town and overnight there.
06:00 Have breakfast and return to Ha Noi. Have lunch along the way.
Arrive Ha Noi, walking tour of Ha Noi old town.