text:
Q: adjust the rows dynamically in paginator of primefaces datatable I am using the primefaces datatable paginator. I have fixed the to no of rows to 15. This correctly matches the my system resolution. But users are using monitors with different(bigger) resolutions. The no of rows in this case will be less and space will be displayed at the bottom.
Any way i can increase these rows dynamically based on screen resolution.
Below is the code I am using.
<p:dataTable var="order" value="#{orderdetails.orderDetailsList}" scrollable="true" styleClass="ui-dynamic-height"
sortMode="multiple"  emptyMessage="" frozenColumns="1" resizableColumns="true" widgetVar="orderstatustable"
liveResize="true" paginator="true" rows="15" paginatorPosition="top" paginatorAlwaysVisible="false">

Any suggestion on this.

A: 1.Define two JSF inputHidden Fields say screenHeight, and screenWidth in your xhtml files
2.Calculate the computedHeight and computedWidth using javascript when page loads and store it into the hidden fields.
3.Automatically the value will be binded to the managedbean varaibles.
4.Write a method to return no of rows based on the screenHeight and screen width
5.Call that method via Expression Language in you JSF datatable rows attribute
Sample XHTML file follows

 <h:head>

   <script type="text/javascript">

     function setResolution(){

  //Calculated the computedHeight and computedWidth from javascript
   document.getElementById('myForm:screenHeight').value = computedHeight;
          document.getElementById('myForm:screenWidth') .value=computedWidth;
    }

</script>
</h:head>

<h:body onload="setResolution();">

<h:form id="myForm">
<h:inputHidden id="screenHeight" value="#{managedBean.screenHeight}" />
<h:inputHidden id="screenWidth" value="#{managedBean.screenWidth}" />

   // call rows="#{managedBean.calculatedRows}"
<p:dataTable var="order" value="#{orderdetails.orderDetailsList}" scrollable="true" styleClass="ui-dynamic-height" sortMode="multiple"  emptyMessage="" frozenColumns="1" resizableColumns="true" widgetVar="orderstatustable" liveResize="true" paginator="true" rows="#{managedBean.calculatedRows}" paginatorPosition="top" paginatorAlwaysVisible="false">
</p:dataTable>
</h:form>

</h:body>

Sample Managed Bean for your reference

@ManagedBean
public class ManagedBean implements serilizable{

private float screenHeight;
private float screenWidth;
//gets and setters

private int calculatedRows(){
//Your business logic to return no of rows based on
//screenHeight and screenWidth(resolution)
}

}


text:
'use strict';

angular.module('mol.inventory', [
  'ui.router',
  'ui-leaflet',
  'angular-loading-bar',
  'angular.filter',
  'ngResource',
  'ngSanitize',
  'ngAnimate',
  'ui.bootstrap',
  'mol.loading-indicator',
  'mol.inventory-controllers'
])
.config(['cfpLoadingBarProvider', function(cfpLoadingBarProvider) {
    cfpLoadingBarProvider.includeSpinner = false;
    cfpLoadingBarProvider.includeBar = false;
    //cfpLoadingBarProvider.includeBar = false;
    cfpLoadingBarProvider.latencyThreshold = 500;
  }])
.config(['$httpProvider', '$locationProvider', '$sceDelegateProvider', '$urlRouterProvider', '$stateProvider',
            function($httpProvider, $locationProvider, $sceDelegateProvider, $urlRouterProvider, $stateProvider) {
  $httpProvider.defaults.withCredentials = true;
  $locationProvider.html5Mode(true);
  $sceDelegateProvider.resourceUrlWhitelist([
    'self',
    'http*://localhost**',
    'http*://*mol.org/**',
    'http*://api.mol.org/0.x/inventory/**',
  ]);
  //$urlRouterProvider.otherwise("/");
  $stateProvider
    .state(
      'inventory',
      {
         abstract: true,
         templateUrl: 'static/views/layout.html',
         controller: 'inventoryCtrl',
      }
    )
    .state(
      'inventory.main',
      {
        title: "Dataset Inventory Map",
        views: {
          "" : {templateUrl: "static/views/main.html"}
        },
        url: '/'
      }
    )
    .state(
      'inventory.map',
      {
        title: "Dataset Inventory Map",
        views: {
          "" : {templateUrl: "static/views/map/main.html"}
        },
        url: '/map'
      }
    )
    .state(
      'inventory.table',
      {
        title: "Dataset Inventory Table",
        views: {
          "" : {templateUrl: "static/views/table/main.html"}
        },
        url: '/table'
      }
    );
      $locationProvider.html5Mode(true);
}]).factory('MOLApi', ['$http', function($http) {
		return function(service, params, method, canceller, loading) {
			loading = (typeof loading === undefined) ? false : loading;
			return $http({
				method: method || 'GET',
        url: 'https://api.mol.org/0.x/{0}'.format(service),
				//url: 'http://dev.api-0-x.map-of-life.appspot.com//0.x/{0}'.format(service),
				params: params,
				withCredentials: false,
				cache: true,
				timeout: canceller ? canceller.promise : undefined,
				ignoreLoadingBar: loading
			});
		};
	}
]);

redpajama_set_name: RedPajamaGithub


text:
Alec's Story
Alec Flores Youth Sports Scholarships
Alec Flores was an 8th grader at Franklin Elementary School in Yuba City. He was walking west along Franklin Road on his way to school the morning of October 7, 2019 when he was struck by a vehicle.
The driver of the vehicle did not remain at the scene, but several passersby witnessed the accident and stopped to assist Alec. His injuries were severe.
After being transported to Rideout Hospital, he was life-flighted to UC Davis Medical Center. He suffered from significant brain trauma and was taken off life support around 11 p.m. that evening.
Alec's parents worked with UC Davis Medical Center to identify viable organs for donation; ultimately his kidneys and retinas were donated.
See Alec's obituary at Legacy.com.
Contact us: rememberalecflores@gmail.com

redpajama_set_name: RedPajamaCommonCrawl


text:
The First Job, The Polling Place, The Community Space: How McDonald's Became 'The Closest Thing To Home' For Black Communities
Historian Marcia Chatelain talked with "To the Best of Our Knowledge" producer Shannon Henry Kleiber about the intersection of fast food, race and capitalism in the United States.
How Black Farmers Lost 14 Million Acres of Farmland — And How They're Taking It Back
Leah Penniman is the co-founder and project manager of Soul Fire Farm in upstate New York, an organic farm that incorporates ancestral growing techniques into its farming practice. It's also a teaching farm that's training a new generation of people of color to become activist-farmers.
More Than 50 Wisconsin Fairs Have Been Canceled This Summer, But The Brown County Fair Is Underway
This week the Wisconsin State Fair announced it sold more than 200,000 cream puffs at its drive thru event after the full fair was canceled over COVID-19 concerns. Only about a dozen fairs will take place in Wisconsin this year, including the Brown County Fair, which is underway.
'Is The Digital Age Making Us Stupid?:' How Technology Has Changed How We Feel, Express Ourselves And Live Our Lives Over Two Centuries
There are a lot of worries surrounding technology these days ranging from concerns that social media is shrinking our attention spans and increasing our self-obsession, to Google enabling us to the point of stupidity. We talk to the authors of a book that digs into Americans' attitudes and concerns with...
New Mural Project Aims To Help Artists In Central Wisconsin Impacted By COVID-19
CREATE Portage County has started a new grant program that will employ artists impacted by the COVID-19 economic downturn to paint murals in central Wisconsin. We'll talk to the head of that organization to learn more.
Recipe Developer Has Ideas About How To Use All Those Tomatoes
For whatever tomato bounty you haul inside, online writer Deb Melian has plenty of ideas for how to use them.
Top-Seeded Milwaukee Bucks Begin Playoff Run Tuesday
Despite a lackluster start in the NBA bubble, the Bucks are considered favorites to win the Eastern Conference and contend for a title. But players say it'll be different doing it away from the Fiserv Forum.
Rosemary Beef Skewers
Cut the skirt steak into 2-inch by 1-inch rectangles.
New Mural Project In Central Wisconsin Will Offer Grants To Artists Affected By COVID-19
A new grant program in central Wisconsin will employ artists to paint murals in rural parts of Portage County. Organizers say it's inspired by New Deal-era employment programs.
Kenosha Baseball Bubble Brings Slice of 'Normal' Back To Summer
The Kenosha Kingfish and the K-Town Bobbers are playing at 26-game series this summer. "You can kind of feel some normal back to your life when you're playing," Justice Bigbie of the Bobbers said.
The History Of Moms In Movements
A group of women calling themselves the "Wall of Moms" locked arms and created a human barrier between police and protestors in Portland, Oregon during Black Lives Matter demonstrations. We discuss the history of moms in movements and explore why fronting the identity is effective. We also examine societal contradictions of valorizing mothers.
The History Of Who Gets Diabetes
We discuss some of the racial and ethnic factors in the cultural history of diabetes with the author of a new book on the topic.
Pickleball Is Catching Fire, Says National Champion From Madison
Pickleball has gained international attention in recent years, becoming one of the fastest growing sports because of its ease of accessibility, cheap equipment and its appeal to people of all ages.
Latinx Voters Are On The Rise. What Does That Mean For Wisconsin Elections?
A political scientist and Latino advocacy group leader discuss challenges and opportunities for getting Latin Americans in Wisconsin engaged in voting.
Exhibit Celebrates Wisconsin's Place In Comic Strip History
A new exhibit in West Bend and Milwaukee showcases over 200 works by Wisconsin cartoonists and comic strip creators. We talk with the exhibit's curator about our state's influence on comics and what we can learn by looking at comic strips as works of art.


Presently as soon as the offered as gatekeepers. To start Here's What to with, exhibitions caucuses helped be sure a opinion applicant surfaced. Sadly, Congress has abdicated obligation a part of presidency (we easily rightly heap scorn Republicans Devin Nunes being a Trump toady an upswing of 24-7 news "leisure" programming, Rosenstein ever would've been put it. However this way from an best world. A number of people Rosenstein are looking around coming to a related line: Within their brains, are the last.
prevue hendryx deluxe small animal cage .


text:
<!DOCTYPE html>

  <meta charset="utf-8">
  <base data-ice="baseUrl" href="../../../../">
  <title data-ice="title">src/middle_level/loader/ModelConverter.js | glboost</title>
  <link type="text/css" rel="stylesheet" href="css/style.css">
  <link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">

<meta name="description" content="A New WebGL Rendering Library for 3D Graphics Geeks"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="glboost"><meta property="twitter:description" content="A New WebGL Rendering Library for 3D Graphics Geeks">

  Home

  Reference
  Source

    <input class="search-input">

auxiliariesCAnimationPlayer

low_level/auxiliaries/camera_controllersCL_CameraController

CL_WalkThroughCameraController

low_level/componentsCAnimationComponent

CSceneGraphComponent

CTransformComponent

low_level/coreCComponent

CComponentRepository

CEntity

CEntityRepository

CGLBoostLowContext

CGLBoostObject

CGLBoostSystem

CGLContext

CGLExtensionsManager

CL_GLBoostMonitor

CMemoryManager

low_level/elementsCL_Element

low_level/elements/camerasCL_AbstractCamera

CL_FrustumCamera

CL_OrthoCamera

CL_PerspectiveCamera

low_level/geometriesCBlendShapeGeometry

CGeometry

low_level/implCGLContextImpl

CGLContextWebGL1Impl

CGLContextWebGL2Impl

low_level/materialsCClassicMaterial

CL_AbstractMaterial

CPBRMetallicRoughnessMaterial

low_level/mathCAABB

CMathClassUtil

CMathUtil

CMatrix33

CMatrix44

CQuaternion

CVector2

CVector3

CVector4

low_level/miscCAnimationUtil

CArrayUtil

CDataUtil

CHash

CInputUtil

CMiscUtil

CTypedArrayWrapper

VIsUtil

low_level/primitivesCArrow

CAxis

CCube

CCubeAbsolute

CGrid

CJointPrimitive

CLine

CParticle

CPlane

CScreen

CSphere

low_level/shadersCShader

low_level/texturesCAbstractTexture

CCubeTexture

CInternalDataTexture

CMutableTexture

CPhinaTexture

CTexture

middle_levelCRenderer

middle_level/coreCGLBoostMiddleContext

CM_GLBoostMonitor

middle_level/draw_kickersCDrawKickerWorld

middle_level/elementsCM_Element

CM_Group

CM_Scene

middle_level/elements/camerasCM_AbstractCamera

CM_FrustumCamera

CM_OrthoCamera

CM_PerspectiveCamera

middle_level/elements/gizmosCM_AABBGizmo

CM_AxisGizmo

CM_DirectionalLightGizmo

CM_Gizmo

CM_GridGizmo

CM_HeightLineGizmo

CM_JointGizmo

CM_OutlineGizmo

CM_PointLightGizmo

middle_level/elements/lightsCM_AbstractLight

CM_AmbientLight

CM_DirectionalLight

CM_PointLight

CM_SpotLight

middle_level/elements/meshesCM_Mesh

CM_ScreenMesh

CM_SkeletalMesh

middle_level/elements/skeletonsCJointGizmoUpdater

CM_Joint

middle_level/expressionsCExpression

CRenderPass

middle_level/geometriesCM_SkeletalGeometry

middle_level/loaderCGLBoostGLTFLoaderExtension

CGLTF2Exporter

CGLTF2Loader

CGLTFLoader

CModelConverter

CObjLoader

FformatDetector

middle_level/pluginsCEffekseerElement

middle_level/shadersCBlendShapeShaderSource

CBlinnPhongShader

CBlinnPhongShaderSource

CDecalShader

CDecalShaderSource

CDepthDisplayShader

CDepthDisplayShaderSource

CEnvironmentMapShader

CEnvironmentMapShaderSource

CFragmentSimpleShader

CFragmentSimpleShaderSource

CFreeShader

CHalfLambertAndWrapLightingShader

CHalfLambertAndWrapLightingShaderSource

CHalfLambertShader

CHalfLambertShaderSource

CLambertShader

CLambertShaderSource

CPBRPrincipledShader

CPBRPrincipledShaderSource

CParticleShaderSource

CPassThroughShader

CPassThroughShaderSource

CPhongShader

CPhongShaderSource

CSkeletalShaderSource

CVertexWorldShaderSource

CVertexWorldShadowShaderSource

CWireframeShader

CWireframeShaderSource

src/middle_level/loader/ModelConverter.js

import GLBoost from '../../globals';
import DataUtil from '../../low_level/misc/DataUtil';
import Vector3 from '../../low_level/math/Vector3';
import Vector2 from '../../low_level/math/Vector2';
import Vector4 from '../../low_level/math/Vector4';
import Matrix44 from '../../low_level/math/Matrix44';
import Quaternion from '../../low_level/math/Quaternion';
import ArrayUtil from '../../low_level/misc/ArrayUtil';
import M_SkeletalMesh from '../elements/meshes/M_SkeletalMesh';
import M_Mesh from '../elements/meshes/M_Mesh';
import PBRMetallicRoughnessMaterial from '../../low_level/materials/PBRMetallicRoughnessMaterial';

let singleton = Symbol();
let singletonEnforcer = Symbol();

/**
 *
 */
export default class ModelConverter {

  /**
   * The constructor of GLTFLoader class. But you cannot use this constructor directly because of this class is a singleton class. Use getInstance() static method.
   * @param enforcer a Symbol to forbid calling this constructor directly
   */
  constructor(enforcer: Symbol) {
    if (enforcer !== singletonEnforcer) {
      throw new Error("This is a Singleton class. get the instance using 'getInstance' static method.");
    }
  }

  /**
   * The static method to get singleton instance of this class.
   * @return The singleton instance of GLTFLoader class
   */
  static getInstance(): GLTFLoader {
    if (!this[singleton]) {
      this[singleton] = new ModelConverter(singletonEnforcer);
    }
    return this[singleton];
  }

  _getDefaultShader(options) {
    let defaultShader = null;

    if (options && typeof options.defaultShaderClass !== "undefined") {
      if (typeof options.defaultShaderClass === "string") {
        defaultShader = GLBoost[options.defaultShaderClass];
      } else {
        defaultShader = options.defaultShaderClass;
      }
    }

    return defaultShader;
  }

  convertToGLBoostModel(glBoostContext, gltfModel) {

    // load binary data
    for (let accessor of gltfModel.accessors) {
      this._accessBinaryWithAccessor(accessor);
    }

    // Mesh data
    let glboostMeshes = this._setupMesh(glBoostContext, gltfModel);

    let groups = [];
    for (let node of gltfModel.nodes) {
      let group = glBoostContext.createGroup();
      group.userFlavorName = node.name;
      groups.push(group);
    }

    // Transfrom
    this._setupTransform(gltfModel, groups);

    // Skeleton
    this._setupSkeleton(glBoostContext, gltfModel, groups, glboostMeshes);

    // Hierarchy
    this._setupHierarchy(glBoostContext, gltfModel, groups, glboostMeshes);

    // Animation
    this._setupAnimation(gltfModel, groups);

    // Root Group
    let rootGroup = glBoostContext.createGroup();
    rootGroup.userFlavorName = 'FileRoot';
    if (gltfModel.scenes[0].nodesIndices) {
      for (let nodesIndex of gltfModel.scenes[0].nodesIndices) {
        rootGroup.addChild(groups[nodesIndex], true);
      }
    }

    // Post Skeletal Proccess
    for (let glboostMesh of glboostMeshes) {
      if (glboostMesh instanceof M_SkeletalMesh) {
        if (!glboostMesh.jointsHierarchy) {
          glboostMesh.jointsHierarchy = rootGroup;
        }
      }
    }

    let options = gltfModel.asset.extras.glboostOptions;
    if (options.loaderExtension && options.loaderExtension.setAssetPropertiesToRootGroup) {
      options.loaderExtension.setAssetPropertiesToRootGroup(rootGroup, gltfModel.asset);
    }
    if (options && options.loaderExtension && options.loaderExtension.loadExtensionInfoAndSetToRootGroup) {
      options.loaderExtension.loadExtensionInfoAndSetToRootGroup(rootGroup, json, glBoostContext);
    }

    rootGroup.allMeshes = rootGroup.searchElementsByType(M_Mesh);

    return rootGroup;
  }

  _setupTransform(gltfModel, groups) {
    for (let node_i in gltfModel.nodes) {
      let group = groups[node_i];
      let nodeJson = gltfModel.nodes[node_i];

      if (nodeJson.translation) {
        group.translate = new Vector3(nodeJson.translation[0], nodeJson.translation[1], nodeJson.translation[2]);
      }
      if (nodeJson.scale) {
        group.scale = new Vector3(nodeJson.scale[0], nodeJson.scale[1], nodeJson.scale[2]);
      }
      if (nodeJson.rotation) {
        group.quaternion = new Quaternion(nodeJson.rotation[0], nodeJson.rotation[1], nodeJson.rotation[2], nodeJson.rotation[3]);
      }
      if (nodeJson.matrix) {
        group.matrix = new Matrix44(nodeJson.matrix, true);
      }
    }
  }

  _setupHierarchy(glBoostContext, gltfModel, groups, glboostMeshes) {

    for (let node_i in gltfModel.nodes) {
      let node = gltfModel.nodes[parseInt(node_i)];
      let parentGroup = groups[node_i];
      if (node.mesh) {
        parentGroup.addChild(glboostMeshes[node.meshIndex], true);
      }
      if (node.childrenIndices) {
        for (let childNode_i of node.childrenIndices) {
          let childGroup = groups[childNode_i];
          parentGroup.addChild(childGroup, true);
        }
      }
    }

  }

  _setupAnimation(gltfModel, groups) {
    if (gltfModel.animations) {
      for (let animation of gltfModel.animations) {

        for (let channel of animation.channels) {
          let animInputArray = channel.sampler.input.extras.vertexAttributeArray;

          let animOutputArray = channel.sampler.output.extras.vertexAttributeArray;;

          let animationAttributeName = '';
          if (channel.target.path === 'translation') {
            animationAttributeName = 'translate';
          } else if (channel.target.path === 'rotation') {
            animationAttributeName = 'quaternion';
          } else {
            animationAttributeName = channel.target.path;
          }

          let group = groups[channel.target.nodeIndex];
          if (group) {
            group.setAnimationAtLine('time', animationAttributeName, animInputArray, animOutputArray);
            group.setActiveAnimationLine('time');
          }
        }
      }
    }
  }

  _setupSkeleton(glBoostContext, gltfModel, groups, glboostMeshes) {
    for (let node_i in gltfModel.nodes) {
      let node = gltfModel.nodes[node_i];
      let group = groups[node_i];
      if (node.skin && node.skin.skeleton) {
        group._isRootJointGroup = true;
        if (node.mesh) {
          let glboostMesh = glboostMeshes[node.meshIndex];
          glboostMesh.jointsHierarchy = groups[node.skin.skeletonIndex];
        }
      }

      if (node.skin && node.skin.joints) {
        for (let joint_i of node.skin.jointsIndices) {
          let joint = node.skin.joints[joint_i];
          let options = gltfModel.asset.extras.glboostOptions;
          let glboostJoint = glBoostContext.createJoint(options.isExistJointGizmo);
          glboostJoint._glTFJointIndex = joint_i;
          let group = groups[joint_i];
          group.addChild(glboostJoint, true);
        }
      }
    }
  }

  _setupMesh(glBoostContext, gltfModel) {
    let glboostMeshes = [];
    for (let mesh of gltfModel.meshes) {
      let geometry = null;
      let glboostMesh = null;
      if (mesh.extras && mesh.extras._skin && mesh.extras._skin.inverseBindMatrices) {
        geometry = glBoostContext.createSkeletalGeometry();
        glboostMesh = glBoostContext.createSkeletalMesh(geometry, null);
        glboostMesh.gltfJointIndices = mesh.extras._skin.jointsIndices;
        glboostMesh.inverseBindMatrices = mesh.extras._skin.inverseBindMatrices.extras.vertexAttributeArray;
      } else {
        geometry = glBoostContext.createGeometry();
        glboostMesh = glBoostContext.createMesh(geometry);
      }
      glboostMeshes.push(glboostMesh);

      let options = gltfModel.asset.extras.glboostOptions;
      if (options.isMeshTransparentAsDefault) {
        glboostMeshes.isTransparent = true;
      }

      let _indicesArray = [];
      let _positions = [];
      let _normals = [];
      let vertexData = {
        position: _positions,
        normal: _normals,
        components: {},
        componentBytes: {},
        componentType: {}
      };
      let additional = {
        'joint': [],
        'weight': [],
        'texcoord': [],
        'color': []
      };

      let dataViewMethodDic = {};
      let materials = [];
      let indicesAccumulatedLength = 0;

      let primitiveMode = 4;

      for (let i in mesh.primitives) {
        let primitive = mesh.primitives[i];
        if (primitive.mode != null) {
          primitiveMode = primitive.mode;
        }

        {
          let accessor = primitive.attributes.POSITION;
          _positions[i] = accessor.extras.vertexAttributeArray;
          vertexData.components.position = accessor.extras.componentN;
          vertexData.componentBytes.position = accessor.extras.componentBytes;
          vertexData.componentType.position = accessor.componentType;
          dataViewMethodDic.position = accessor.extras.dataViewMethod;
        }

        let indices = null;
        if (typeof primitive.indices !== 'undefined') {
          primitive.indices.indices = gltfModel.accessors[primitive.indicesIndex];
          indices = primitive.indices.indices.extras.vertexAttributeArray;
          for (let j=0; j<indices.length; j++) {
            indices[j] = indicesAccumulatedLength + indices[j];
          }
          _indicesArray[i] = indices;
          indicesAccumulatedLength += _positions[i].length /  vertexData.components.position;
        }

        {
          let accessor = primitive.attributes.NORMAL;
          if (accessor) {
            _normals[i] = accessor.extras.vertexAttributeArray;
            vertexData.components.normal = accessor.extras.componentN;
            vertexData.componentBytes.normal = accessor.extras.componentBytes;
            vertexData.componentType.normal = accessor.componentType;
            dataViewMethodDic.normal = accessor.extras.dataViewMethod;
          }

          accessor = primitive.attributes.COLOR_0;
          if (accessor) {
            additional['color'][i] = accessor.extras.vertexAttributeArray;
            vertexData.components.color = accessor.extras.componentN;
            vertexData.componentBytes.color = accessor.extras.componentBytes;
            vertexData.componentType.color = accessor.componentType;
            dataViewMethodDic.color = accessor.extras.dataViewMethod;
          }
        }

        {
          let accessor = primitive.attributes.JOINTS_0;
          if (accessor) {
            additional['joint'][i] = accessor.extras.vertexAttributeArray;
            vertexData.components.joint = accessor.extras.componentN;
            vertexData.componentBytes.joint = accessor.extras.componentBytes;
            vertexData.componentType.joint = accessor.componentType;
            dataViewMethodDic.joint = accessor.extras.dataViewMethod;
          }
          accessor = primitive.attributes.WEIGHTS_0;
          if (accessor) {
            additional['weight'][i] = accessor.extras.vertexAttributeArray;
            vertexData.components.weight = accessor.extras.componentN;
            vertexData.componentBytes.weight = accessor.extras.componentBytes;
            vertexData.componentType.weight = accessor.componentType;
            dataViewMethodDic.weight = accessor.extras.dataViewMethod;
          }
        }

        if (primitive.material) {
          var texcoords = null;

          let material = primitive.material;

          let glboostMaterial = glBoostContext.createPBRMetallicRoughnessMaterial();
          if (options.isNeededToMultiplyAlphaToColorOfPixelOutput) {
            glboostMaterial.shaderParameters.isNeededToMultiplyAlphaToColorOfPixelOutput = options.isNeededToMultiplyAlphaToColorOfPixelOutput;
          }
          //this._materials.push(glboostMaterial);

          let accessor = primitive.attributes.TEXCOORD_0;

          texcoords = this._setupMaterial(glBoostContext, gltfModel, glboostMaterial, material, accessor, additional, vertexData, dataViewMethodDic, _positions, indices, geometry, i);

          materials.push(glboostMaterial);
        } else {
          let glboostMaterial = null;
          if (options.loaderExtension && options.loaderExtension.createClassicMaterial) {
            glboostMaterial = options.loaderExtension.createClassicMaterial(glBoostContext);
          } else {
            glboostMaterial = glBoostContext.createClassicMaterial();
          }

          const defaultShader = this._getDefaultShader(options);
          if (defaultShader) {
            glboostMaterial.shaderClass = defaultShader;
          } else {
            glboostMaterial.baseColor = new Vector4(0.5, 0.5, 0.5, 1);
          }
          materials.push(glboostMaterial);
        }
      }

      if (mesh.primitives.length > 1) {
        let lengthDic = {index: 0, position: 0, normal: 0, joint: 0, weight: 0, texcoord: 0, color: 0};
        for (let i = 0; i < mesh.primitives.length; i++) {
          //lengthDic.index += _indicesArray[i].length;
          lengthDic.position += _positions[i].length;
          if (_normals[i]) {
            lengthDic.normal += _normals[i].length;
          }
          if (typeof additional['joint'][i] !== 'undefined') {
            lengthDic.joint += additional['joint'][i].length;
          }
          if (typeof additional['weight'][i] !== 'undefined') {
            lengthDic.weight += additional['weight'][i].length;
          }
          if (typeof additional['texcoord'][i] !== 'undefined') {
            lengthDic.texcoord += additional['texcoord'][i].length;
          }
          if (typeof additional['color'][i] !== 'undefined') {
            lengthDic.color += additional['color'][i].length;
          }
        }

        function getTypedArray(dataViewMethod, length) {
          let vertexAttributeArray = null;
          if (dataViewMethod === 'getInt8') {
            vertexAttributeArray = new Int8Array(length);
          } else if (dataViewMethod === 'getUint8') {
            vertexAttributeArray = new Uint8Array(length);
          } else if (dataViewMethod === 'getInt16') {
            vertexAttributeArray = new Int16Array(length);
          } else if (dataViewMethod === 'getUint16') {
            vertexAttributeArray = new Uint16Array(length);
          } else if (dataViewMethod === 'getInt32') {
            vertexAttributeArray = new Int32Array(length);
          } else if (dataViewMethod === 'getUint32') {
            vertexAttributeArray = new Uint32Array(length);
          } else if (dataViewMethod === 'getFloat32') {
            vertexAttributeArray = new Float32Array(length);
          }

          return vertexAttributeArray;
        }

        for (let attribName in dataViewMethodDic) {
          let newTypedArray = getTypedArray(dataViewMethodDic[attribName], lengthDic[attribName]);
          let offset = 0;
          for (let i = 0; i < mesh.primitives.length; i++) {

            let array = null;

            if (attribName === 'position') {
              array = _positions[i];
            } else if (attribName === 'normal') {
              array = _normals[i];
            } else if (attribName === 'joint') {
              array = additional['joint'][i];
            } else if (attribName === 'weight') {
              array = additional['weight'][i];
            } else if (attribName === 'texcoord') {
              array = additional['texcoord'][i];
            } else if (attribName === 'color') {
              array = additional['color'][i];
            }

            if (array) {
              newTypedArray.set(array, offset);
              offset += array.length;
            }
          }

          if (attribName === 'position') {
            vertexData.position = newTypedArray;
          } else if (attribName === 'normal') {
            vertexData.normal = newTypedArray;
          } else if (attribName === 'joint') {
            additional['joint'] = newTypedArray;
          } else if (attribName === 'weight') {
            additional['weight'] = newTypedArray;
          } else if (attribName === 'texcoord') {
            additional['texcoord'] = newTypedArray;
          } else if (attribName === 'color') {
            additional['color'] = newTypedArray;
          }
        }

      } else {
        vertexData.position = _positions[0];
        vertexData.normal = _normals[0];
        additional['joint'] = additional['joint'][0];
        additional['weight'] = additional['weight'][0];
        additional['texcoord'] = additional['texcoord'][0];
        additional['color'] = additional['color'][0];
      }

      if (typeof vertexData.normal === 'undefined' || vertexData.normal.length === 0) {
        delete vertexData.normal;
      }
      if (typeof additional['joint'] === 'undefined' || additional['joint'].length === 0) {
        delete additional['joint'];
      }
      if (typeof additional['weight'] === 'undefined' || additional['weight'].length === 0) {
        delete additional['weight'];
      }
      if (typeof additional['texcoord'] === 'undefined' || additional['texcoord'].length === 0) {
        delete additional['texcoord'];
      }
      if (typeof additional['color'] === 'undefined' || additional['color'].length === 0) {
        delete additional['color'];
      }

      if (_indicesArray.length === 0) {
        _indicesArray = null;
      }

      geometry.setVerticesData(ArrayUtil.merge(vertexData, additional), _indicesArray, primitiveMode);
      geometry.materials = materials;
    }

    return glboostMeshes;
  }

  _setupMaterial(glBoostContext, gltfModel, gltfMaterial, materialJson, accessor, additional, vertexData, dataViewMethodDic, _positions, indices, geometry, i) {
    let options = gltfModel.asset.extras.glboostOptions;

    if (accessor) {
      additional['texcoord'][i] =  accessor.extras.vertexAttributeArray;
      vertexData.components.texcoord = accessor.extras.componentN;
      vertexData.componentBytes.texcoord = accessor.extras.componentBytes;
      vertexData.componentType.texcoord = accessor.componentType;
      dataViewMethodDic.texcoord = accessor.extras.dataViewMethod;

      let setTextures = (materialJson)=> {
        if (materialJson.pbrMetallicRoughness) {
          let baseColorTexture = materialJson.pbrMetallicRoughness.baseColorTexture;
          if (baseColorTexture) {
            let sampler = baseColorTexture.texture.sampler;

            let isNeededToMultiplyAlphaToColorOfTexture = false;

            if (options.isNeededToMultiplyAlphaToColorOfPixelOutput) {
              if (options.isTextureImageToLoadPreMultipliedAlphaAsDefault) {
                // Nothing to do because premultipling alpha is already done.
              } else {
                isNeededToMultiplyAlphaToColorOfTexture = true;
              }
            } else { // if is NOT Needed To Multiply AlphaToColor Of PixelOutput
              if (options.isTextureImageToLoadPreMultipliedAlphaAsDefault) {
                // TODO: Implement to Make Texture Straight.
              } else {
                // Nothing to do because the texture is straight.
              }
            }

            if (options && options.statesOfElements) {
              for (let statesInfo of options.statesOfElements) {
                if (statesInfo.targets) {
                  for (let target of statesInfo.targets) {
                    let isMatch = false;
                    let specifyMethod = statesInfo.specifyMethod !== void 0 ? statesInfo.specifyMethod : GLBoost.QUERY_TYPE_USER_FLAVOR_NAME;
                    switch (specifyMethod) {
                      case GLBoost.QUERY_TYPE_USER_FLAVOR_NAME:
                        isMatch = group.userFlavorName === target; break;
                      case GLBoost.QUERY_TYPE_INSTANCE_NAME:
                        isMatch = group.instanceName === target; break;
                      case GLBoost.QUERY_TYPE_INSTANCE_NAME_WITH_USER_FLAVOR:
                        isMatch = group.instanceNameWithUserFlavor === target; break;
                    }

                    if (isMatch) {
                      if (options.isNeededToMultiplyAlphaToColorOfPixelOutput) {
                        if (statesInfo.isTextureImageToLoadPreMultipliedAlpha) {
                          // Nothing to do because premultipling alpha is already done.
                        } else {
                          isNeededToMultiplyAlphaToColorOfTexture = true;
                        }
                      } else { // if is NOT Needed To Multiply AlphaToColor Of PixelOutput
                        if (statesInfo.isTextureImageToLoadPreMultipliedAlpha) {
                          // TODO: Implement to Make Texture Straight.
                        } else {
                          // Nothing to do because the texture is straight.
                        }
                      }
                    }

                    //texture.setParameter('UNPACK_PREMULTIPLY_ALPHA_WEBGL', isNeededToMultiplyAlphaToColorOfTexture);
//                    texture.loadWebGLTexture();
                  }
                }
              }
            }

            let texture = glBoostContext.createTexture(baseColorTexture.texture.image.image, '', {
              'TEXTURE_MAG_FILTER': sampler === void 0 ? GLBoost.LINEAR : sampler.magFilter,
              'TEXTURE_MIN_FILTER': sampler === void 0 ? GLBoost.LINEAR_MIPMAP_LINEAR : sampler.minFilter,
              'TEXTURE_WRAP_S': sampler === void 0 ? GLBoost.REPEAT : sampler.wrapS,
              'TEXTURE_WRAP_T': sampler === void 0 ? GLBoost.REPEAT : sampler.wrapT,
              'UNPACK_PREMULTIPLY_ALPHA_WEBGL': isNeededToMultiplyAlphaToColorOfTexture
            });
            texture.userFlavorName = `Texture_Diffuse_index_${baseColorTexture.index}_of_${gltfMaterial.instanceNameWithUserFlavor}`;
            gltfMaterial.setTexture(texture, GLBoost.TEXTURE_PURPOSE_DIFFUSE);
          }

          let metallicRoughnessTexture = materialJson.pbrMetallicRoughness.metallicRoughnessTexture;
          if (metallicRoughnessTexture) {
            let sampler = metallicRoughnessTexture.texture.sampler;
            let texture = glBoostContext.createTexture(metallicRoughnessTexture.texture.image.image, '', {
              'TEXTURE_MAG_FILTER': sampler === void 0 ? GLBoost.LINEAR : sampler.magFilter,
              'TEXTURE_MIN_FILTER': sampler === void 0 ? GLBoost.LINEAR_MIPMAP_LINEAR : sampler.minFilter,
              'TEXTURE_WRAP_S': sampler === void 0 ? GLBoost.REPEAT : sampler.wrapS,
              'TEXTURE_WRAP_T': sampler === void 0 ? GLBoost.REPEAT : sampler.wrapT
            });
            texture.userFlavorName = `Texture_MetallicRoughness_index_${metallicRoughnessTexture.index}_of_${gltfMaterial.instanceNameWithUserFlavor}`;
            gltfMaterial.setTexture(texture, GLBoost.TEXTURE_PURPOSE_METALLIC_ROUGHNESS);
          }

          const normalTexture = materialJson.normalTexture;
          if (normalTexture) {
            const sampler = normalTexture.texture.sampler;
            const texture = glBoostContext.createTexture(normalTexture.texture.image.image, '', {
              'TEXTURE_MAG_FILTER': sampler === void 0 ? GLBoost.LINEAR : sampler.magFilter,
              'TEXTURE_MIN_FILTER': sampler === void 0 ? GLBoost.LINEAR_MIPMAP_LINEAR : sampler.minFilter,
              'TEXTURE_WRAP_S': sampler === void 0 ? GLBoost.REPEAT : sampler.wrapS,
              'TEXTURE_WRAP_T': sampler === void 0 ? GLBoost.REPEAT : sampler.wrapT
            });
            texture.userFlavorName = `Texture_MetallicRoughness_index_${normalTexture.index}_of_${gltfMaterial.instanceNameWithUserFlavor}`;
            gltfMaterial.setTexture(texture, GLBoost.TEXTURE_PURPOSE_NORMAL);
          }

          const occlusionTexture = materialJson.occlusionTexture;
          if (occlusionTexture) {
            const sampler = occlusionTexture.texture.sampler;
            const texture = glBoostContext.createTexture(occlusionTexture.texture.image.image, '', {
              'TEXTURE_MAG_FILTER': sampler === void 0 ? GLBoost.LINEAR : sampler.magFilter,
              'TEXTURE_MIN_FILTER': sampler === void 0 ? GLBoost.LINEAR_MIPMAP_LINEAR : sampler.minFilter,
              'TEXTURE_WRAP_S': sampler === void 0 ? GLBoost.REPEAT : sampler.wrapS,
              'TEXTURE_WRAP_T': sampler === void 0 ? GLBoost.REPEAT : sampler.wrapT
            });
            texture.userFlavorName = `Texture_Occlusion_index_${occlusionTexture.index}_of_${gltfMaterial.instanceNameWithUserFlavor}`;
            gltfMaterial.setTexture(texture, GLBoost.TEXTURE_PURPOSE_OCCLUSION);
          }

          const emissiveTexture = materialJson.emissiveTexture;
          if (emissiveTexture) {
            const sampler = normalTexture.texture.sampler;
            const texture = glBoostContext.createTexture(emissiveTexture.texture.image.image, '', {
              'TEXTURE_MAG_FILTER': sampler === void 0 ? GLBoost.LINEAR : sampler.magFilter,
              'TEXTURE_MIN_FILTER': sampler === void 0 ? GLBoost.LINEAR_MIPMAP_LINEAR : sampler.minFilter,
              'TEXTURE_WRAP_S': sampler === void 0 ? GLBoost.REPEAT : sampler.wrapS,
              'TEXTURE_WRAP_T': sampler === void 0 ? GLBoost.REPEAT : sampler.wrapT
            });
            texture.userFlavorName = `Texture_Emissive_index_${emissiveTexture.index}_of_${gltfMaterial.instanceNameWithUserFlavor}`;
            gltfMaterial.setTexture(texture, GLBoost.TEXTURE_PURPOSE_EMISSIVE);
          }

          const alphaMode = materialJson.alphaMode;
          if (alphaMode === 'MASK') {
            // doalpha test in fragment shader
            gltfMaterial.isAlphaTest = true;
            gltfMaterial.alphaCutoff = materialJson.alphaCutoff;
          }

          let enables = [];
          if (options.isBlend || alphaMode === 'BLEND') {
            enables.push(3042);
          }
          if (options.isDepthTest) {
            enables.push(2929);
          }
          gltfMaterial.states.enable = enables; // It means, [gl.BLEND];
          if (options.isBlend && options.isNeededToMultiplyAlphaToColorOfPixelOutput) {
            gltfMaterial.states.functions.blendFuncSeparate = [1, 771, 1, 771];
          }
          gltfMaterial.globalStatesUsage = GLBoost.GLOBAL_STATES_USAGE_IGNORE;
        }
      };
      setTextures(materialJson);

    } else {
      if (typeof vertexData.components.texcoord !== 'undefined') {
        // If texture coordinates existed even once in the previous loop
        let emptyTexcoords = [];
        let componentN = vertexData.components.position;
        let length = _positions[i].length / componentN;
        for (let k = 0; k < length; k++) {
          emptyTexcoords.push(0);
          emptyTexcoords.push(0);
        }
        additional['texcoord'][i] = new Float32Array(emptyTexcoords);
        vertexData.components.texcoord = 2;
        vertexData.componentBytes.texcoord = 4;
        dataViewMethodDic.texcoord = 'getFloat32';
      }
    }

    const pmr = materialJson.pbrMetallicRoughness;
    if (pmr != null) {
      if (pmr.baseColorFactor) {
        gltfMaterial.baseColor = new Vector4(pmr.baseColorFactor);
      }
      if (pmr.metallicFactor) {
        gltfMaterial.metallic = pmr.metallicFactor;
      }
      if (pmr.roughnessFactor) {
        gltfMaterial.roughness = pmr.roughnessFactor;
      }
      if (materialJson.emissiveFactor) {
        gltfMaterial.emissive = new Vector3(materialJson.emissiveFactor);
      }
    }

    if (indices !== null) {
      gltfMaterial.setVertexN(geometry, indices.length);
    }

    const defaultShader = this._getDefaultShader(options);
    if (defaultShader) {
      gltfMaterial.shaderClass = defaultShader;
    }
  }

  _adjustByteAlign(typedArrayClass, arrayBuffer, alignSize, byteOffset, length) {
    if (( byteOffset % alignSize ) != 0) {
      return new typedArrayClass(arrayBuffer.slice(byteOffset), 0, length);
    } else {
      return new typedArrayClass(arrayBuffer, byteOffset, length);
    }
  }

  _checkBytesPerComponent(accessor) {

    var bytesPerComponent = 0;
    switch (accessor.componentType) {
      case 5120: // gl.BYTE
        bytesPerComponent = 1;
        break;
      case 5121: // gl.UNSIGNED_BYTE
        bytesPerComponent = 1;
        break;
      case 5122: // gl.SHORT
        bytesPerComponent = 2;
        break;
      case 5123: // gl.UNSIGNED_SHORT
        bytesPerComponent = 2;
        break;
      case 5124: // gl.INT
        bytesPerComponent = 4;
        break;
      case 5125: // gl.UNSIGNED_INT
        bytesPerComponent = 4;
        break;
      case 5126: // gl.FLOAT
        bytesPerComponent = 4;
        break;
      default:
        break;
    }
    return bytesPerComponent;
  }

  _checkComponentNumber(accessor) {

    var componentN = 0;
    switch (accessor.type) {
      case 'SCALAR':
        componentN = 1;
        break;
      case 'VEC2':
        componentN = 2;
        break;
      case 'VEC3':
        componentN = 3;
        break;
      case 'VEC4':
        componentN = 4;
        break;
      case 'MAT4':
        componentN = 16;
        break;
    }

    return componentN;
  }

  _checkDataViewMethod(accessor) {
    var dataViewMethod = '';
    switch (accessor.componentType) {
      case 5120: // gl.BYTE
        dataViewMethod = 'getInt8';
        break;
      case 5121: // gl.UNSIGNED_BYTE
        dataViewMethod = 'getUint8';
        break;
      case 5122: // gl.SHORT
        dataViewMethod = 'getInt16';
        break;
      case 5123: // gl.UNSIGNED_SHORT
        dataViewMethod = 'getUint16';
        break;
      case 5124: // gl.INT
        dataViewMethod = 'getInt32';
        break;
      case 5125: // gl.UNSIGNED_INT
        dataViewMethod = 'getUint32';
        break;
      case 5126: // gl.FLOAT
        dataViewMethod = 'getFloat32';
        break;
      default:
        break;
    }
    return dataViewMethod;
  }

  static _isSystemLittleEndian() {
    return !!(new Uint8Array((new Uint16Array([0x00ff])).buffer))[0];
  }

  _accessBinaryWithAccessor(accessor) {
    var bufferView = accessor.bufferView;
    const byteOffset = bufferView.byteOffset + (accessor.byteOffset !== void 0 ? accessor.byteOffset : 0);
    var buffer = bufferView.buffer;
    var arrayBuffer = buffer.buffer;

    let componentN = this._checkComponentNumber(accessor);
    let componentBytes = this._checkBytesPerComponent(accessor);
    let dataViewMethod = this._checkDataViewMethod(accessor);
    if (accessor.extras === void 0) {
      accessor.extras = {};
    }

    accessor.extras.componentN = componentN;
    accessor.extras.componentBytes = componentBytes;
    accessor.extras.dataViewMethod = dataViewMethod;

    var byteLength = componentBytes * componentN * accessor.count;

    var vertexAttributeArray = [];

    if (accessor.extras && accessor.extras.toGetAsTypedArray) {
      if (ModelConverter._isSystemLittleEndian()) {
        if (dataViewMethod === 'getFloat32') {
          vertexAttributeArray = this._adjustByteAlign(Float32Array, arrayBuffer, 4, byteOffset, byteLength / componentBytes);
        } else if (dataViewMethod === 'getInt8') {
          vertexAttributeArray = new Int8Array(arrayBuffer, byteOffset, byteLength / componentBytes);
        } else if (dataViewMethod === 'getUint8') {
          vertexAttributeArray = new Uint8Array(arrayBuffer, byteOffset, byteLength / componentBytes);
        } else if (dataViewMethod === 'getInt16') {
          vertexAttributeArray = this._adjustByteAlign(Int16Array, arrayBuffer, 2, byteOffset, byteLength / componentBytes);
        } else if (dataViewMethod === 'getUint16') {
          vertexAttributeArray = this._adjustByteAlign(Uint16Array, arrayBuffer, 2, byteOffset, byteLength / componentBytes);
        } else if (dataViewMethod === 'getInt32') {
          vertexAttributeArray = this._adjustByteAlign(Int32Array, arrayBuffer, 4, byteOffset, byteLength / componentBytes);
        } else if (dataViewMethod === 'getUint32') {
          vertexAttributeArray = this._adjustByteAlign(Uint32Array, arrayBuffer, 4, byteOffset, byteLength / componentBytes);
        }

      } else {
        let dataView = new DataView(arrayBuffer, byteOffset, byteLength);
        let byteDelta = componentBytes * componentN;
        let littleEndian = true;
        for (let pos = 0; pos < byteLength; pos += byteDelta) {
          switch (accessor.type) {
            case 'SCALAR':
              vertexAttributeArray.push(dataView[dataViewMethod](pos, littleEndian));
              break;
            case 'VEC2':
              vertexAttributeArray.push(dataView[dataViewMethod](pos, littleEndian));
              vertexAttributeArray.push(dataView[dataViewMethod](pos + componentBytes, littleEndian));
              break;
            case 'VEC3':
              vertexAttributeArray.push(dataView[dataViewMethod](pos, littleEndian));
              vertexAttributeArray.push(dataView[dataViewMethod](pos + componentBytes, littleEndian));
              vertexAttributeArray.push(dataView[dataViewMethod](pos + componentBytes * 2, littleEndian));
              break;
            case 'VEC4':
              vertexAttributeArray.push(dataView[dataViewMethod](pos, littleEndian));
              vertexAttributeArray.push(dataView[dataViewMethod](pos + componentBytes, littleEndian));
              vertexAttributeArray.push(dataView[dataViewMethod](pos + componentBytes * 2, littleEndian));
              vertexAttributeArray.push(dataView[dataViewMethod](pos + componentBytes * 3, littleEndian));
              break;
          }
        }
        if (dataViewMethod === 'getInt8') {
          vertexAttributeArray = new Int8Array(vertexAttributeArray);
        } else if (dataViewMethod === 'getUint8') {
          vertexAttributeArray = new Uint8Array(vertexAttributeArray);
        } else if (dataViewMethod === 'getInt16') {
          vertexAttributeArray = new Int16Array(vertexAttributeArray);
        } else if (dataViewMethod === 'getUint16') {
          vertexAttributeArray = new Uint16Array(vertexAttributeArray);
        } else if (dataViewMethod === 'getInt32') {
          vertexAttributeArray = new Int32Array(vertexAttributeArray);
        } else if (dataViewMethod === 'getUint32') {
          vertexAttributeArray = new Uint32Array(vertexAttributeArray);
        } else if (dataViewMethod === 'getFloat32') {
          vertexAttributeArray = new Float32Array(vertexAttributeArray);
        }
      }
    } else {
      let dataView = new DataView(arrayBuffer, byteOffset, byteLength);
      let byteDelta = componentBytes * componentN;
      let littleEndian = true;
      for (let pos = 0; pos < byteLength; pos += byteDelta) {

        switch (accessor.type) {
          case 'SCALAR':
            vertexAttributeArray.push(dataView[dataViewMethod](pos, littleEndian));
            break;
          case 'VEC2':
            vertexAttributeArray.push(new Vector2(
              dataView[dataViewMethod](pos, littleEndian),
              dataView[dataViewMethod](pos+componentBytes, littleEndian)
            ));
            break;
          case 'VEC3':
            vertexAttributeArray.push(new Vector3(
              dataView[dataViewMethod](pos, littleEndian),
              dataView[dataViewMethod](pos+componentBytes, littleEndian),
              dataView[dataViewMethod](pos+componentBytes*2, littleEndian)
            ));
            break;
          case 'VEC4':
            if (accessor.extras && accessor.extras.quaternionIfVec4) {
              vertexAttributeArray.push(new Quaternion(
                dataView[dataViewMethod](pos, littleEndian),
                dataView[dataViewMethod](pos+componentBytes, littleEndian),
                dataView[dataViewMethod](pos+componentBytes*2, littleEndian),
                dataView[dataViewMethod](pos+componentBytes*3, littleEndian)
              ));
            } else {
              vertexAttributeArray.push(new Vector4(
                dataView[dataViewMethod](pos, littleEndian),
                dataView[dataViewMethod](pos+componentBytes, littleEndian),
                dataView[dataViewMethod](pos+componentBytes*2, littleEndian),
                dataView[dataViewMethod](pos+componentBytes*3, littleEndian)
              ));
            }
            break;
          case 'MAT4':
            let matrixComponents = [];
            for (let i=0; i<16; i++) {
              matrixComponents[i] = dataView[dataViewMethod](pos+componentBytes*i, littleEndian);
            }
            vertexAttributeArray.push(new Matrix44(matrixComponents, true));
            break;
        }

      }
    }

    accessor.extras.vertexAttributeArray = vertexAttributeArray;

    return vertexAttributeArray;
  }
}

GLBoost["ModelConverter"] = ModelConverter;

  Generated by ESDoc(1.1.0)


With Christmas around the corner, it's time to get those Christmas lists off to the North pole… If you're anything like us then you'll have put some sort of "temporary modular structure" as top priority on that list, and we're not talking about Meccano!
That's exactly what Thorpe St. Andrew wanted, and on this occasion, we were there to supply the goods; erecting a stage for their big Christmas lights turn on for the second year running!
Thorpe St. Andrew has around 13 thousand residents, across almost 7 thousand dwellings, including the Dussindale housing development. We were delighted to serve as the platform for their light turn on (no pun intended!) to help raise the festive spirit & bring the area to life this holiday season.


Softspikes®, the world's best-selling golf cleat brand and the No.1 Cleat on Tour, has announced the results from a traction study on cleated golf shoes v. non-cleated golf shoes.
The study, which was conducted at the Softspikes Advanced Research Center (ARC), highlights the vast benefits of shoes featuring replaceable golf cleats v. cleatless shoes in both wet and dry conditions.
Softspikes conducted the study to provide golfers, and golf retailers alike, with a baseline for evaluating the best golf shoes on the market for traction by comparing today's new cleatless shoe models versus traditional replaceable cleated golf shoes.
Among the most telling facts resulting from the study, the Softspikes ARC determined that in wet conditions, new, out-of-the-box cleated shoes provided up to 70% more traction then new, out-of-the-box cleatless shoes, while holding traction up to 32% longer.
Additionally, under dry test conditions, new, out-of-the-box shoes with replaceable cleats provided up to 51% more traction then new, out-of-the box cleatless shoes, while holding traction up to 34% longer.
Additionally, after 20 rounds of golf, shoes featuring replaceable cleats (with a fresh set of plastic cleats) maintained 100% of their original out-of-the-box traction in wet conditions, and 94% of their original traction in dry conditions. In contrast, cleatless shoes lost 26-28% of their original out-of-the-box traction in both dry and wet conditions.
With acres of natural surface testing along with the extensive testing lab, the Softspikes ARC is the only facility of its kind developed by a golf cleat manufacturer.
It was established to conduct in-depth product development, research, testing and design of golf cleats, field sports cleats, outsoles, tees and other golf and sports footwear innovations.
As part of the management of the new facility, Softspikes works closely with leading OEM footwear partners in both the golf and sporting goods industries who utilise the facility to develop next-generation, game improvement equipment.
"We recognise that consumers are considering cleatless golf shoes as a possible option for their golf footwear needs, so it was important to utilise the ARC's capabilities in measuring traction performance and durability to measure the significant drop off in performance of cleatless shoes." said Burt.
PrideSports was formed in January 2003 following Pride Manufacturing Company's purchase of Softspikes, Inc., and its sister company Trisport, Ltd. of England. This acquisition essentially formed the world's premier golf accessories company, as Pride and Softspikes are the world's leading golf tee and golf cleat lines, respectively.
Today, PrideSports is the world leader in the design and manufacture of cleats and receptacles for the entire golf footwear industry.


The laws of the Sinai Covenant applied to Israel once they arrived in Canaan. They are still valid for anyone who wishes to live in the Promised Land, become a "son of the covenant" (a physical Israelite) through circumcision, and tithe to support temple worship when it is revived. The Law is not done away or abolished; it simply is not a requirement for salvation. Salvation is the inheritance of spiritual Israel.
When the Sinai Covenant was given, the LORD did not intend for the tribes to wander for forty years in the wilderness. He had originally planned immediate conquest and habitation of the cities of the dispossessed Canaanites and Amorites. But Israel rebelled in sin.
In the Bible the desert wilderness is symbolically a purifying environment. There is an absence of evil, for there is an absence of any tempting abundance, which so readily nourishes a forgetfulness of God and righteousness. The relative abundance of food and other good things of material life is one reason why the Israelites forgot God in Egypt. Many were reluctant to leave Egypt before Passover, and several times afterwards, the hardships of the desert inspired a popular desire to return to Egypt.
In fact throughout her history Israel got many of the idols that ensnared her from Egypt. In the desert there were fewer idols. There certainly was no great abundance or increase. The wandering tribes lived from day to day, manna fall to manna fall, as God provided their sustenance. All that would change, and did change, once they entered the Promised Land. In Canaan there would be false gods, idols, and multiple places of worship and sacrifice. And there would be increase and abundance.
But you shall seek the LORD at the place which the LORD your God shall choose from all your tribes, to establish His name therefore His dwelling, and there you shall come. And there you shall bring your burnt offerings, your sacrifices, your tithes, the contribution of your hand, your votive offerings, your free will offerings, and the first-born of your herd and your flock.
You are not allowed to eat within your gates the tithe of your grain, or new wine, or oil, or the first-born of your herd or flock, or any of your votive offerings which you vow or your freewill offerings, or the contribution of your hand.
But you shall eat them before the LORD your God in the place which the LORD your God will choose, you and your son and daughter, and your male and female servants, and the Levite who is within your gates; and you shall rejoice before the LORD your God in all your undertakings.
The payment of tithes and the gift of offerings to the Levitical priesthood was an act of faithful worship towards God. One thing that is often overlooked in all the discussion about tithes and offerings is the fact that the giver, the Israelite paying the tithe or bringing the offering, took an active part in its consumption. He ate it together with his whole household, which included more people than we think of making up a household today. It was a community household that included the Levite, the widow, orphan and stranger.
Most unsacrificed meat was killed in hunting. These statutes provided a practical solution for those who wished to eat meat but who did not live close to the central Temple. In any case, the tithe or obligatory offerings were not to be eaten at home.
In Deuteronomy 14 tithing is summarized and special provisions are made for its use in the third year. This is the chapter most ministers quote when they wish to teach more than one tithe. The idea is that the first tithe is for the Levite (read the preacher), the second tithe is for observing God's Holy Days (split between the preacher and the worshiper), the third tithe is for the stranger, widow and orphan and is only collected every third year (the short end of the deal).
How then, did some come to think that there were three tithes? This idea was based on a very narrow resolution of variant scriptural instructions about the tithe. In other words, the big picture was overlooked as words and sentences were compared.
The doctrine of three tithes is a product of narrow, exclusivist thinking without the balance of also considering a broader, more inclusive approach in trying to resolve apparent scriptural contradictions. The conclusion of whether there was, or is, more than one tithe seems to be linked to the potential tithe recipients' attitude towards their economic need. Let's look at the scriptures.
In Numbers 18 the right to the tithe is presented clearly as the substitute for landed inheritance.
The tribe of Levi is taken in the place of the firstborn sons of every tribe. The tithe is the compensation for the Levitical priesthood. Just as the other tribes were given the rights to land that had to be worked, Levi was given the right to a tithe of the land's production for wages. As the Israelite worked his fields, so the Levite worked at the tabernacle or temple. In both cases, the rights to an inheritance did not mean a free ride. Those inheritances had to be worked to produce food.
The other dispossessed, the widow, orphan, poor and alien, are not mentioned because they are not substituted for the first born. Furthermore, they are only temporarily without an inheritance due to their temporary inability to work it. They do no service to God for the tribes of Israel to justify receiving wages from them.
Misfortune does not give to its sufferers an eternal right to the tithe, the Levites' promised inheritance, because they are only temporarily experiencing a lack of access to a fair share of the rightful inheritance, but suffering did warrant the consideration of a merciful Lawgiver. The poor were allowed to share in the collective inheritance of all Israel through eating some of the tithe.
God promised all Israel an inheritance. Widows and orphans could not fully benefit from their land since they could not work it. God then took the role of husband and father to them. He took from His work and supported them out of the wages of His first born, the Levites.
As a result, the Levite may not have had all of the use of his income, but he was never without and he did not share or give up any of the right to the tithe. It is wrong to conclude that there was more than one tithe simply because it served more than one purpose.
Tithing in ancient Israel was an act of continuing trust in God as the guarantor of their inheritance. This obligatory act of worship also overlapped with the observance of independently sanctified feast days. Israel's worship was only legal through the mediation of the Aaronic priesthood which the Levites and all the tribes supported with their offerings. As a symbolic type of the ultimate mediator between God and man, only the high priest could enter the Holy of Holies or consult God by the Urim and Thummim.
It was not possible to actively worship God apart from the central tabernacle or temple and its priesthood under the Sinai Covenant. That's what priestly mediation is all about.
Therefore, tithing directly supported temple worship and indirectly the priests through the Levites' offering (determined by a "tithe of the tithe"). Sharing the inheritance with the poor was an act of worship, too. This principle is reflected in the letter by Jesus' half brother, James. James was the leading elder of the Jerusalem church, which observed all of the Sinai Covenant in addition to the New Testament.
Righteousness starts a cycle of ever increasing goodness and material prosperity grounded on spiritual faith and obedience. Disobedience, which derives from a lack of faith, leads to poverty. First the Israelites would suffer, then there would be less for the Levites, and finally there would be more poor with whom increasing scarcity had to be split. With scarcity there comes human inequality and strife, and eventually, the humility that can lead to repentance.
Scarcity finds its origin in abundance where human greed multiplies in the pride of the power of wealth. It is a never ending human cycle due to the changeableness of each man's willingness to love in the face of God's unchanging eternal purpose of making love a part of every man's being.
The same ministers who teach that there is more than one tithe rely on Deuteronomy 14 for proof. To them verses 22-27 refer to the second tithe or festival tithe which the Israelite hypothetically used to celebrate by feasting at (or, keeping the) festival holy days of God listed in Leviticus 23.
For some, the Bible supposedly talks of a third tithe in verse 28 because of its different treatment every three years (the third and sixth years of the seven year cycle).
You shall surely tithe all the produce from what you sow, which comes out of the field every year. And you shall eat in the presence of the LORD your God, at the place where He chooses to establish His name, the tithe of your grain, your new wine, your oil, and the firstborn of your herd and your flock, in order that you may learn to fear the LORD your God always.
And if the distance is so great for you that you are not able to bring the tithe, since the place where the LORD your God chooses to set His name is too far away from you when the LORD your God blesses you, then you shall exchange it for money, and bind the money in your hand and go to the place which the LORD your God chooses.
Note that the Levite is mentioned in the provision or description of this second tithe.If the Levites received the entire first tithe, their inheritance, as the proponents of three tithes contend they did, then why the mention of not forsaking and neglecting the Levite who is in your town because he has no inheritance?
Should he have more than his fair share? A double inheritance? (The one tenth they got is already more than a one twelfth or thirteenth share of the Promised Land due them based on an equal division of the land.) Simply read, this must be same tithe and responsibility is mentioned in Deuteronomy 12:12, 19.
Clearly, the context shows that the individual Israelite substantially determined how he used God's tithe. That is how it should be if the spiritual purpose for tithing is to build righteous character.
How each person determined his increase and portioned out his tithe was a test of his heart, an exercise in obedience that both teaches love and comes from love. God was concerned first with the heart of the individual Israelite and after that with the material welfare of the Levite, so freedom of choice played a role in administering the tithe.
God could take care of His Levites. The question for them was whether they shared His concern for the welfare of the people. Jesus' parables and condemnation of the religious hypocrites of His day demonstrates this divine concern as well as Ezekiel 34.
In actuality then, a careful reading of these scriptures shows that God planned to accomplish all of His religious services with the one tithe in addition to the various, previously mentioned sacrifices. The one tithe supplied one need: food in general to the unlanded Levite and poor and food for feasting in celebration of the fulfillment of God's promise.
The threefold mention of the Levites in each of the three supposed tithes is a strong indication that there was only one tithe. The other landless people were not mentioned in Numbers 18 because the Levites were the only ones granted the inheritance rights to the tithe. They were the God ordained landless tribe taken in place of the first born of all Israel. For that reason, they were the primary beneficiaries of the tithe.
If there really were three different tithes, God would have more clearly differentiated the purposes for each of those tithes by specifically categorizing who received which one - just as the ministers who today preach multiple tithes spell out how each is to be spent. The Old Testament is full of rather specific statutes and ordinances - many of which are expressed and/or repeated for the sake of clarity.
If God had spiritually blessed him through the Levite, then surely the Levite would have been materially blessed in return by the Israelite. The variable was not· God's will but the will of the men involved, both Levite and Israelite.
God's overriding moral objection was to develop a right spiritual attitude in both the giver and the receiver. The right attitude was important, whether it was a Levite or an Israelite. Both had to learn by sharing and giving.It was a behavioral method of training right character into the hearts or psyche of the people. It was an exercise with the objective of conforming a nation of diverse and conflicting human wills and ideas about what is right and wrong to God's one will and definition of righteous love.
This is why the choice was always in the hand of the giver. He had to choose to obey and how fully he would obey. Beyond obedience, lies the need to grown into generosity and genuine concern for his neighbor who was defined as anyone in need: the Levite, poor, widow, orphan and alien.
And he said, "All these things I have kept from my youth."
and any additional tithing of the land's increase was considered by God to be oppressive as stated in relation to the King's Second Tithe covered next.
God's promised economic support of His work and the poor could be accomplished on a single tithe of ten per cent; therefore, the LORD commanded only one tithe. As there was only one inheritance, so there was only one tithe. God provided for the poor directly from the inheritance by commanding that the comers of the fields be left, and indirectly through additional support from the Levites' inheritance - the tithe.
Thus, there was no First Tithe only for the Levite. There was no Festival or Second Tithe for the feast goer and the poor, and there was no Third Tithe for the widow, orphan, stranger, and disadvantaged collected every three years. There was only one tithe for all three purposes.
What functionally happened was a change in how the one tithe was distributed during the third year to emphasize the need to support the Levite, alien, widow and orphan. It was a check on human greed, and it was an exercise in faith and generosity. It was insurance that adequate support would be available for those God had committed to support.
This third year of tithing is why Amos 4:4 refers to the tithes being brought in every third day or year. Deuteronomy 26:3-15 also records a statement the Israelite was to make when paying his tithe.
In this declaration the payment of the entire tithe in the third (and sixth) year made it "the year of tithing" because this was the only year that the entire tithe left the Israelite's household. During these two years of the seven year cycle, an Israelite did not have any legal discretion over how the tithe was spent.
The rest of the time the Israelite and his household consumed a fair portion of the tithe at seasonal feasts. The head of a household had at his discretion how much of his family's tithe was to be used by the household at the feasts and how much was to be given to the neighboring Levite and the needy in his community. Often the poor lived on the fringes of the more prosperous households and farming villages. The book of Ruth records some of these customs as they were practiced.
A final note to those who may have at one time been confused about the number of tithes God commanded in the Bible. It is incorrect to assume that the English word "tithes" indicates more than one category of ten per cent, or decimation, because it ends in an "s" and seems to be plural. Any plurality can only be read into the scriptural content because the Hebrew word used for "tithe" or "tenth" is singular in every case.
Check any analytical concordance. The Hebrew word ma'aser is translated into English as "tithes." The Hebrew can be properly rendered in either the singular or plural based on the translator's discretion of what would be the best English usage, but it means one ten percent portion: If more than one tithe has been meant, it probably would have been written in the original Hebrew as "ma'aserim" instead.
The Bible never quotes God discussing, "My Three Tithes." There was only one tithe of ten percent, but that one tithe was taken from several different sources: grain, herds, flocks, fruit, wine and other agricultural products.
This is the only way in which a single tithe could be considered plural: because the tithes were one ten per cent each of several different sources of animal and plant agricultural production. The tithe was single donor family's collection of multiple one tenths from varied categories or agricultural areas of production.
There is no reference to tithing on monetary income from trade, mining, professional skills or investment in real estate, which was separated from the tribal inheritances and allowed in cities but not on the family farms. In fact, city property was not subject to the land Sabbath, debt forgiveness or Jubilee restoration.


That's right! Queens do not wear anything but the best. Our shirts are NEVER thin. We only use high quality Bella & Canvas Ringspun tees to print our shirts.
Bella & Canvas t-shirts are known to be soft because they are 100% combed and ringspun. This simply means the fibers are treated with an extra step to ensure that the cotton is softer, stronger, and smoother.
Your shirts will definitely last! We ship and print in the United States.
This is a unisex t-shirt and fits true to size.
Enjoy this word of encouragement right on a t-shirt.


text:
Search For "shang chi"
Trailer of 'Shang-Chi and the Legend of the Ten Rings', featuring
Updated : 9 months ago IST
Washington [US], April 19 (ANI): Makers of Marvel's 'Shang-Chi and the Legend of the Ten Rings' dropped the first intriguing trailer of the much-awaited movie on Monday, introducing Simu Liu as their franchise's first Asian superhero.
New India release dates for Marvel movies announced
Updated : 1 year, 10 months ago IST
New Delhi [India], Mar 5 (ANI): Marvel Cinematic Universe on Thursday announced new release dates for their upcoming movies in India.
Marvel's 'Shang Chi' star Simu Liu campaigned for superhero role v
Washington D.C. [USA], July 22 (ANI): Actor Simu Liu, who will play the lead role in Marvel's very first Asian superhero film 'Shang Chi', quite literally campaigned himself into the cinematic universe.
Marvel announces first Asian superhero film 'Shang-Chi and the Leg
Washington D.C. [USA], July 21 (ANI): For all the Asian Marvel fans, there is now a reason to cheer. During the Comic-con panel on Saturday, Marvel studios announced their upcoming feature 'Shang-Chi and the Legend of the Ten Rings' which will witness the first superhero of Asian descent.


CELINA - A Celina man was sentenced to 25 days in jail and restitution after stealing 12 military medallions and 13 rods from grave markers in St. Marys Catholic Cemetery in Celina. Kevin R. Owens, 46, 519 Cron St., Celina, ple . . .


With nearly four million square feet of office, retail and industrial property under management, there is a constant need to build-out tenant spaces. We assemble sophisticated construction management teams capable of handling both the fast pace and essential details. We aim to build projects that adhere to budget and scheduling guidelines and, most importantly, display outstanding quality.
Our team includes engineers, construction managers and consultants with the depth of experience and the necessary diligence to complete projects on time and within budget. By implementing state-of-the-art project management practices and superior on-site supervision, we assure a smooth transition from pre-construction into post-construction occupancy.


I'm so lucky because my husband LOVES making homemade yogurt.
Several years ago, I bought him a yogurt maker for Christmas. He told me once that he used to make his own yogurt when he was in college, so I thought he would enjoy trying it again.
Homemade yogurt has become a staple in our diet, and it is so superior to store-bought brands, I can't even describe it. You need to eat some to understand.
Anyone who loves yogurt should try making it at home. It's easy to do with either an inexpensive yogurt maker or a crock pot. Fat-free, low-fat or whole milk can be used, depending on your preference. A small container of inexpensive plain yogurt makes a great starter.
Cheaper brand yogurts are filled with thickening agents and sweeteners. Read the labels next time you're out shopping.
Protein. Yogurt is a great source of protein, supplying roughly 12 grams of protein per 1 cup serving.
Calcium. As I've posted about before, it's better to get calcium through the foods we eat rather than rely on supplements. 1 cup of yogurt gives a whopping 450 mg of this mineral!
Vitamin D. If your homemade yogurt is made from vitamin D fortified, milk, you get the added bonus of this vitamin, which increases absorption of calcium. Most store brand yogurts do not have added vitamin D.
Potassium. Another useful mineral is potassium. Usually bananas are recommended as the best source, but 1 cup of yogurt provides about 575 mg.
Digestion. In general, yogurt is great for your digestion. Because the milk sugar, lactose, is eaten by the bacteria during the fermentation process, yogurt is a good source of dairy for the lactose intolerant. The probiotic bacteria in yogurt work to help maintain a healthy balance of intestinal bacteria, which can prevent both constipation and diarrhea.
The nutritional values here are just an estimate. The numbers will vary depending on the milk you use. Reading the label on the milk carton should give you a pretty good estimate of the nutritional value of your homemade yogurt.
As I said at the top of the post, you can make yogurt in a yogurt maker or a crock pot (slow cooker). There are also recipes online for using just a saucepan on the stove top, but because the milk and culture needs to be kept at a low heat for several hours, I think it's easiest to use one of the other two methods.
The yogurt maker I bought for my husband years ago is still working great, even though we use it several times a week. HOWEVER, for some reason that yogurt maker now costs an insane $135 on Amazon rather than $25. I have no idea why.
At the bottom of the page, I've included an Amazon link to a yogurt maker that is very similar to the one we use, and it is reasonably priced.
If you prefer the consistency of Greek yogurt, which is thicker, it's easy to get. Simply strain the yogurt with a fine mesh strainer or cheesecloth over a bowl. Excess whey will drain out (we throw it away, but some people drink it or use it elsewhere).
The longer you strain, the thicker the yogurt will become. Sometimes we leave it to drain overnight and then have a product very much like cream cheese. It's great on a toasted bagel, and much lower in fat.
You don't need a special strainer to make Greek yogurt, but I've included a link to one of these, as well, so you can see what they're like.
Several yogurt makers use small individual-serving cups rather than one large quart-sized container. I don't like these because it's more fussy and requires more clean up. Enough said.
Yogurt makers will come with instructions and recipes.
For the yogurt starter, buy a good quality, single-serving plain yogurt. Make sure the label says "Contains active live cultures." My husband likes Fage plain Greek yogurt.
A few months ago, he introduced his brother and sister-in-law to the deliciousness of homemade yogurt. Since then, my sister-in-law has become a yogurt-making virtuoso! She makes several quarts at a time in her crock pot, and shares it with friends and neighbors.
Pour the milk into the crock pot, cover, and heat on low for approximately 3 hours. The milk needs to reach 180°F. Use a digital thermometer to check periodically.
Once the milk reaches the desired temperature, turn off the crock pot, unplug it, and allow the milk to cool for another 3 hours. The milk needs to cool to about 110°F, so use the thermometer again to check periodically.
Remove 1 cup of the cooled milk and add the starter yogurt. Mix well.
Pour the mixture back into the crock pot and stir to mix.
Cover and wrap the crock pot in a thick towel. The towel provides insulation so the crock pot stays consistently warm while the culture does its thing.
Let sit for 8-12 hours (overnight).
In the morning, transfer the yogurt to containers and refrigerate. Strain for a thicker yogurt.
Put aside 1/2 cup of yogurt to be used as a starter in your next batch.
It's a time-consuming process, which is why it's such a good idea to make large batches. Also, different sizes and brands of crock pots will heat and cool down at different speeds. A little bit of trial and error is necessary the first time or two, but homemade yogurt is definitely worth it! Just write down the heating, cooling and cooking times that work best for your crock pot.
I'd love to hear from anyone who makes their own yogurt. What method do you use? What tips/tricks can you share? What other recipes do you use with the yogurt?


text:
A helper Chrome extension that hides identifiable info from Facebook. Helpful for screenshotters. Made at hackharvard2017

Awarded for Most Intrinsically Motivated


Whatever your big date, our latest Concept is designed to have you prepped for party season. Prepare to look stunning with a great selection of party ready pieces for men and women, whether it's for grad, prom, bridal and more until May 31st!
Until May 31st, CONCEPT 0.5 is here to make all your party prep dreams come true! From getting ready to party to finding a custom gift for the ones you love, CONCEPT has it all.
Celebrity nail artist Bernadette Thompson will make her first ever Canadian appearance at CONCEPT on April 30th, 2018. The New York-based nail artist is a driving force in the fashion and beauty scene. Bernadette Thompson has created trend-setting nail art for the world's premier fashion houses and has been featured in virtually every fashion magazine in circulation.
She will be offering manicures, pedicures, massages, tanning and waxing services. To book your appointment, click here. To view a full list of services, click here.
Fun, flirty and feminine, the Art of Marina is a series of watercolour original art and the highest quality giclée reproductions by Marina Billinghurst. Inspired by women, botanicals, wildlife, fruits + foods of the world, and all things bright and beautiful!
Discover beautiful hand painted home decor pieces, the latest fashion trends, accessories and tech gear.
Beautiful shades for any occasion, these handcrafted lipsticks are made with ingredients that you can actually pronounce!
Get your beauty fix with Shari Gold. Offering full set classic lash extensions, half set lash extensions, lash lifts, tints, and 5 min complementary skin consultations.


text:
November 2014 • Volume 102 • Number 11 • Page 518
Thank you for viewing this Illinois Bar Journal article. Please join the ISBA to access all of our IBJ articles and archives.
Stronger workplace rights for pregnant women and new moms
A new Illinois law, one of the most protective nationwide, requires employers to provide a range of reasonable accommodations to pregnant woman and new mothers.
Last August, Illinois Governor Pat Quinn signed Public Act 98-1050 into law. The Act, effective January 1 and referred to as the Pregnancy Fairness law, represents a major change in protections for pregnant workers seeking employment or already in the workplace.
The Act amends the Illinois Human Rights Act to include pregnancy as a protected class. "Pregnancy" is defined as "pregnancy, childbirth, or medical or common conditions related to pregnancy or childbirth." 775 ILCS 5/1-103(L-5). As a result, the Act covers not only pregnancy and childbirth but also applies after the child is born.
The Act broadly prohibits discrimination in hiring and employment for pregnant workers and those affected by a medical or common condition related to pregnancy or childbirth. 775 ILCS 5/2-102(I). The Act also requires employers to provide a broad range of accommodations to pregnant employees where appropriate ("more frequent or longer bathroom breaks," "assistance with manual labor," etc.). An employer can refuse an accommodation if it can demonstrate that the accommodation presents an undue hardship on the ordinary operation of its business. 775 ILCS 5/2-102(J).
Job descriptions are important
Chicago-based labor law attorney Alisa B. Arnoff represents employers in her regular practice. She is a partner at Scalambrino & Arnoff, LLP, and is a past chair of the ISBA's Labor & Employment Law Section Council. She notes that the Act codifies practices that "good employers have been doing anyway."
The Act requires that employers obtain and post notices regarding the Act and employees' rights under it. Arnoff questions whether simply hanging a poster in the break room is adequate to comply with the Act.
She suggests that employers review their employee handbooks to make sure that they are updated to include notice about the Act's coverage. The notice should state that pregnancy is a protected class under the Act, specifically disclose that pregnant workers are entitled to reasonable accommodations, and state that those accommodations may vary by individual and from job to job.
The flexible nature of those accommodations are another reason why employers should have job descriptions in place for all positions, Arnoff says. A good job description will "define the essential and non-essential functions" of each position.
The Act has significant interplay with other employee rights, Arnoff notes. For example, under the Act, a reasonable accommodation for a pregnant employee may be to allow more than the required 12 weeks of leave under the Family Medical Leave Act. This represents a "radical departure" from the status quo, reaffirming "that 12 weeks is the floor, not the ceiling" for FMLA leave. Arnoff also mentions that under the Act, pregnancy-related health issues like gestational diabetes can trigger additional employer obligations under the Americans with Disabilities Act.
When a pregnant employee requests, and is offered, an accommodation by her employer, she is not required to accept it. If that happens, employers would be wise to get the employee's refusal in writing and document the entire exchange between the employer and the employee, Arnoff says. The Act does not create any explicit protections for employers when an employee refuses an accommodation.
Applicable to small employers
Chicago-based labor law attorney Lori Ecker represents employees in her regular practice. She agrees with Arnoff that the reasonable accommodation provisions of the Act are a "huge change."
The Act bridges a gap in coverage for Illinois workers because, for example, the FMLA only covers employers with 50 or more employees, says Ecker. Many small businesses in Illinois have been exempt from federal labor protection laws due to their size. The Act provides no such exception for smaller employers. Ecker expects to see litigation on this aspect of the Act in the future because it is a "big jolt" to the responsibilities of small and mid-size employers in Illinois.
This broad coverage is necessary to protect the interests of pregnant workers, Ecker says. In the past, employers were able to "decide that they know best for an employee," forcing women to take a leave of absence because they were unable to perform minor job tasks. The Act "tells employers that [the accommodation requirement] is an interactive process - not one that is forced on employees," says Ecker. She recognizes the need for an open process where employees and employers alike can discuss and assess occupational risks for a pregnant worker.
As for the Act's notice provisions, Ecker says that, in addition to posting notices for employees to read, employers should "regularly audit handbooks via outside labor counsel and make changes as needed." Providing adequate notice also fosters the interactive process required under the Act, she says.
Ecker wishes that the new law had included family leave rights for new fathers. She believes that doing so meets the Act's stated goal of keeping pregnant women employed, as stated in its preamble.
Matthew Hector is a senior associate at Sulaiman Law Group, Ltd.
November 2014 LawPulse
Legislative fine-tuning makes the small-estate affidavit more useful
Your client got a Getty Images demand letter? Here's what to do
Federal minimum wage and overtime protection extended to home care workers


text:
Ribena Hair Dye Anyone?
| Original Story from the University of Leeds.
Complete the form below and we will email you a PDF version of "Ribena Hair Dye Anyone?"
Natural dyes extracted from blackcurrant waste created during Ribena manufacture have for the first time been used in an effective new hair dyeing technology, developed at the University of Leeds.
The global hair coloration industry is worth more than $10 billion a year, with the number of people colouring their hair in professional salons and at home on the increase.
But some of the ingredients found in commonly-used synthetic hair dyes, which are derived from petrochemicals, are known irritants and can trigger severe allergic reactions. There is also much debate about whether these ingredients also cause cancer.
Those used in permanent dyes and to achieve darker shades are of particular concern, although many colorants used in semi-permanent ones also carry risks.
Dyes that some may consider 'natural' – such as those including henna – usually escape scrutiny when it comes to health concerns, but the main natural colorant in henna is lawsone, which the EU Scientific Committee on Consumer Safety states is toxic.
What is more, it is thought up to 95% of all dyes end up washed down the drain; their effect on the environment is unknown.
Colour chemist Dr Richard Blackburn and organic chemist Professor Chris Rayner, both from the University of Leeds, worked together to identify and isolate naturally-occurring alternatives – as well as a sustainable process to produce them.
Dr Blackburn, who heads the Sustainable Materials Research Group in the School of Design, said: "Because of issues and concerns around conventional dyes, we wanted to develop biodegradable alternatives that minimise potential risks to health and offer consumers a different option."
Professor Rayner, from Leeds' School of Chemistry, said: "We've made it possible to have great hair colour, and to get it from nature in the most sustainable way possible."
With Leeds colleagues, they have published a paper in the Journal of Agricultural and Food Chemistry describing how they combined expertise in extraction technology, hair science, coloration, and natural products chemistry to develop a new technology to extract anthocyanins from blackcurrant fruit waste for use in renewable dyes.
"Anthocyanins are pigments that provide colour to most berries, flowers, and many other fruits and vegetables," Dr Blackburn explained. "They are non-toxic, water-soluble and responsible for pink, red, purple, violet, and blue colours and are widely used as natural food colorants all over the world.
"We knew they bound strongly with proteins – hair is a protein – so we thought if we could find an appropriate source of these natural colours, we might be able to dye hair."
All but ten per cent of British blackcurrants are used in the production of Ribena; the berries are harvested in late summer and pressed for juice.
Professor Rayner said: "After being pressed, the skins remain as a waste product. They have very high concentrations of anthocyanins, and represent a sustainable supply of raw material because of how much blackcurrant cordial we drink.
"The extraction technology is based on sustainable concepts – the colour is extracted using a water-based process and special filters collect the anthocyanins that we want. We believe that if we are extracting natural and food-grade products, we should not use any toxic or hazardous chemicals to get them."
In a second, forthcoming paper, the researchers analyse the extract in detail and identify all of its natural compounds.
"We wanted to identify all of the natural compounds present to improve our technology and to ensure safety, which cannot be said of most 'natural' cosmetic brands, where there is little understanding of what is in 'natural extracts'," said Professor Rayner. "'Natural' does not necessarily equal safe."
The researchers tried grapes as well as blackcurrants, but the smaller berries were found to yield much more of the vital colourant.
They developed a patented hair dyeing technology that provides intense reds, purples and blues on hair that, when combined with a natural yellow, could provide a wide range of colours – including browns. The colours produced were stable for at least 12 washes – comparable with conventional semi-permanent dyes.
Now, the researchers are commercialising their patented technology through a University of Leeds spinout company, Keracol Limited under the brand Dr Craft. The blackcurrant-based dyes should be on sale this summer.
"We've also just made the first natural purple shampoo," Dr Blackburn added. "The blackcurrant extract is used in our Natural Purple Berry Brightening Serum to counteract brassy tones in blonde and grey hair. The anthocyanins work just as well as the synthetic dyes they are replacing."
Keracol has previously harnessed nature's chemistry with a sustainable skincare range made using the waste skins from the production of Marks & Spencer wines.
This article has been republished from materials provided by the University of Leeds. Note: material may have been edited for length and content. For further information, please contact the cited source.
Application of Anthocyanins from Blackcurrant (Ribes nigrum L.) Fruit Waste as Renewable Hair Dyes. Paul M. Rose, Victoria Cantrill, Meryem Benohoud, Alenka Tidder, Christopher M. Rayner, and Richard S. Blackburn. J. Agric. Food Chem., DOI: 10.1021/acs.jafc.8b01044.
Related Topic Pages
The Refractometer, How It Works and Role in the Food Industry
Analytical Solutions for Gene Therapeutic Development and QC


American sportswear giant Nike was originally founded in 1964 under the handle Blue Ribbon Sports by Bill Bowerman and Phil Knight, later taking on the Nike appellation in 1971. Named after the Greek goddess of victory, Nike's signature swoosh logo is considered to be one of the most iconic, adorned across the label's clothing, footwear and accessories. These Hyper Dry training sweatpants from Nike feature an elasticated waistband, side seam pockets and a skinny fit.


That's what parents of adults with autism around the country are saying about an inspirational new documentary that recently finished screening in select cities around the country.
"Programming Hope" features an inside look at the nonPareil Institute - a Texas-based nonprofit technology company that's providing technical training and jobs in video game design for individuals who have been diagnosed to be on the autism spectrum.
Jack Creamer, the director of "Programming Hope", says, "There is an employment crisis facing adults with autism, 90% are unemployed or underemployed - without a career they'll need to be supported by family the rest of their lives. nonPareil (NPI) is doing something to address that problem."
nonPareil is the creation of former professional race-car driver turned technologist, Dan Selec. When his youngest son was diagnosed with autism, he was inspired to put his technology skills to work in a personal way - to help create a future for his son. The company he started in his kitchen with just a few students has now grown to a crew of almost 200 - learning and working at locations in Dallas and Houston.
Dan Selec was inspired by his son to create nonPareil Institute.
Creamer says, "Nonpareil means 'unparalleled, without match, or unequaled', and that's what these students and employees are. They're creating amazing apps that are being sold in iTunes and Google Play stores." They currently have development deals with the likes of Sony and Nintendo not to mention a slew of eBooks, mobile apps, PC games, and VR content which are all proudly branded with nonPareil's slogan - #PoweredByAutism.
One of nonPareil's games designed for smartphones and tablets.
Screenings of the film have drawn large audiences around the country interested in the film's uplifting story. Diane Thomas has an adult son on the autism spectrum. She and her husband drove almost 4 hours from Indianapolis to see the film in Columbus, Ohio. "This film is a must-see for others to understand the hope that we have been looking for. It gives an honest glimpse into the struggles and victories these adults and families like ours face every day," says Thomas.
Creamer says, "These are gifted and intelligent people who face often misunderstood communication difficulties or other issues related to living with autism. When those differences are recognized and accepted - it makes all the difference in the world. And that's what this film depicts."
As far as his personal take on nonPareil and documenting their journey, Creamer sums it up simply - "This place is truly changing people's lives - and that's a great story to tell."
"Programming Hope" is now available to stream on iTunes, Google Play, Amazon Video, YouTube Movies, and Vimeo On Demand.


Crafted around a core of Syrah and Grenache, our Canvasback blend is rich and refined, balancing elegant tannins with excellent structure and acidity.
This wine has beautiful blueberry, creamy milk chocolate and lavender aromas with subtler notes of nutmeg, dried cranberry and wild game. On the entry, it is soft and rounded with enticing floral elements, as well as hints of cinnamon and clove from French oak aging. Elegantly textured tannins and rich notes of black plum add to a long, satisfying finish.