/**
 * @name ContextProvider
 * @constructor
 * @extends Component
 * @param {object} props
 * @param {object} context
 */
function ContextProvider (props, context) {
	Component.call(this, props, context)
}
ContextProvider[SharedSitePrototype] = ObjectCreate(Component[SharedSitePrototype], {
	/**
	 * @alias ContextProvider#getInitialState
	 * @memberof ContextProvider
	 * @type {function}
	 * @this {Component}
	 * @param {object} props
	 * @param {object} state
	 * @param {object} context
	 * @return {object}
	 */
	getInitialState: {
		value: function (props, state, context) {
			return this[SymbolForElement].cache = {provider: this, consumers: new List()}
		}
	},
	/**
	 * @alias ContextProvider#render
	 * @memberof ContextProvider
	 * @type {function}
	 * @param {object} props
	 * @return {any}
	 */
	render: {
		value: function (props) {
			return props.children
		}
	},
	/**
	 * @alias ContextProvider#componentDidUpdate
	 * @memberof ContextProvider
	 * @type {function}
	 * @this {Component}
	 * @param {object} props
	 * @param {object}
	 */
	componentDidUpdate: {
		value: function (props) {
			!is(this.props.value, props.value) && this.state.consumers.forEach(this.componentChildUpdate)
		}
	},
	/**
	 * @alias ContextProvider#componentChildUpdate
	 * @memberof ContextProvider
	 * @type {function}
	 * @param {Component} consumer
	 */
	componentChildUpdate: {
		value: function (consumer) {
			consumer.didUpdate = consumer.didUpdate ? false : !!consumer[SharedSiteForceUpdate]()
		}
	}
})

/**
 * @name ContextConsumer
 * @constructor
 * @extends Component
 * @param {object} props
 * @param {object} context
 */
function ContextConsumer (props, context) {
	Component.call(this, props, context)
}
ContextConsumer[SharedSitePrototype] = ObjectCreate(Component[SharedSitePrototype], {
	/**
	 * @alias ContextConsumer#getInitialState
	 * @memberof ContextConsumer
	 * @type {function}
	 * @this {Component}
	 * @param {object} props
	 * @return {object}
	 */
	getInitialState: {
		value: function (props) {
			return this[SymbolForContext] || {provider: this}
		}
	},
	/**
	 * @alias ContextConsumer#render
	 * @memberof ContextConsumer
	 * @type {function}
	 * @param {object} props
	 * @param {object} state
	 * @return {any}
	 */
	render: {
		value: function (props, state) {
			return props.children(state.provider.props.value)
		}
	},
	/**
	 * @alias ContextConsumer#componentWillReceiveProps
	 * @memberof ContextConsumer
	 * @type {function}
	 * @this {Component}
	 */
	componentWillReceiveProps: {
		value: function () {
			this.didUpdate = true
		}
	},
	/**
	 * @alias ContextConsumer#componentDidMount
	 * @memberof ContextConsumer
	 * @type {function}
	 * @this {Component}
	 */
	componentDidMount: {
		value: function () {
			this.state.consumers && this.state.consumers.insert(this, this.state.consumers)
		}
	},
	/**
	 * @alias ContextConsumer#componentWillUnmount
	 * @memberof ContextConsumer
	 * @type {function}
	 * @this {Component}
	 */
	componentWillUnmount: {
		value: function () {
			this.state.consumers && this.state.consumers.remove(this)
		}
	}
})

/**
 * @param {object} value
 * @return {{Provider, Consumer}}
 */
function createContextComponent (value) {
	return {
		/**
		 * @param {object} props
		 * @return {Element}
		 */
		Provider: function Provider (props) {
			return createElement(ContextProvider, assign({}, value, props))
		},
		/**
		 * @param {object} props
		 * @return {Element}
		 */
		Consumer: function Consumer (props) {
			return createElement(ContextConsumer, assign({}, value, props))
		}
	}
}

/**
 * @param {any} value
 * @return {{Provider, Consumer}}
 * @public
 */
function createContext (value) {
	return createContextComponent({value: value, children: noop})
}

@@ -748,32 +748,54 @@
 type %7Bfunction%7D%0A
+%09 * @this %7BComponent%7D%0A
 %09 * @param %7Bobje
@@ -2184,32 +2184,54 @@
 type %7Bfunction%7D%0A
+%09 * @this %7BComponent%7D%0A
 %09 * @param %7Bobje
@@ -3148,22 +3148,19 @@
 @param %7B
-object
+any
 %7D value%0A
@@ -3193,16 +3193,27 @@
 sumer%7D%7D%0A
+ * @public%0A
  */%0Afunc
@@ -3230,25 +3230,16 @@
 eContext
-Component
  (value)
@@ -3267,488 +3267,165 @@
  * @
-param %7Bobject%7D props%0A%09%09 * @return %7BElement%7D%0A%09%09 */%0A%09%09Provider: function Provider (props) %7B%0A%09%09%09return createElement(ContextProvider, assign(%7B%7D, value, props))%0A%09%09%7D,%0A%09%09/**%0A%09%09 * @param %7Bobject%7D props%0A%09%09 * @return %7BElement%7D%0A%09%09 */%0A%09%09Consumer: function Consumer (props) %7B%0A%09%09%09return createElement(ContextConsumer, assign(%7B%7D, value, props))%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A/**%0A * @param %7Bany%7D value%0A * @return %7B%7BProvider, Consumer%7D%7D%0A * @public%0A */%0Afunction createContext (value) %7B%0A%09return createContextComponent(
+type %7BElement%7D%0A%09%09 */%0A%09%09Provider: createElement(ContextProvider, %7Bvalue: value%7D),%0A%09%09/**%0A%09%09 * @type %7BElement%7D%0A%09%09 */%0A%09%09Consumer: createElement(ContextConsumer, 
 %7Bval
@@ -3452,10 +3452,13 @@
  noop%7D)%0A
+%09%7D%0A
 %7D%0A

Improve Context