text: 
  
  
  
  
  CKEDITOR.dtd = ( function() {
  	'use strict';
  
  	var X = CKEDITOR.tools.extend,
  		// Subtraction rest of sets, from the first set.
  		Y = function( source, removed ) {
  			var substracted = CKEDITOR.tools.clone( source );
  			for ( var i = 1; i < arguments.length; i++ ) {
  				removed = arguments[ i ];
  				for ( var name in removed )
  					delete substracted[ name ];
  			}
  			return substracted;
  		};
  
  	// Phrasing elements.
  	// P = { a: 1, em: 1, strong: 1, small: 1, abbr: 1, dfn: 1, i: 1, b: 1, s: 1,
  	//		u: 1, code: 1, 'var': 1, samp: 1, kbd: 1, sup: 1, sub: 1, q: 1, cite: 1,
  	//		span: 1, bdo: 1, bdi: 1, br: 1, wbr: 1, ins: 1, del: 1, img: 1, embed: 1,
  	//		object: 1, iframe: 1, map: 1, area: 1, script: 1, noscript: 1, ruby: 1,
  	//		video: 1, audio: 1, input: 1, textarea: 1, select: 1, button: 1, label: 1,
  	//		output: 1, keygen: 1, progress: 1, command: 1, canvas: 1, time: 1,
  	//		meter: 1, detalist: 1 },
  
  	// Flow elements.
  	// F = { a: 1, p: 1, hr: 1, pre: 1, ul: 1, ol: 1, dl: 1, div: 1, h1: 1, h2: 1,
  	//		h3: 1, h4: 1, h5: 1, h6: 1, hgroup: 1, address: 1, blockquote: 1, ins: 1,
  	//		del: 1, object: 1, map: 1, noscript: 1, section: 1, nav: 1, article: 1,
  	//		aside: 1, header: 1, footer: 1, video: 1, audio: 1, figure: 1, table: 1,
  	//		form: 1, fieldset: 1, menu: 1, canvas: 1, details:1 },
  
  	// Text can be everywhere.
  	// X( P, T );
  	// Flow elements set consists of phrasing elements set.
  	// X( F, P );
  
  	var P = {}, F = {},
  		// Intersection of flow elements set and phrasing elements set.
  		PF = {
  			a: 1, abbr: 1, area: 1, audio: 1, b: 1, bdi: 1, bdo: 1, br: 1, button: 1, canvas: 1, cite: 1,
  			code: 1, command: 1, datalist: 1, del: 1, dfn: 1, em: 1, embed: 1, i: 1, iframe: 1, img: 1,
  			input: 1, ins: 1, kbd: 1, keygen: 1, label: 1, map: 1, mark: 1, meter: 1, noscript: 1, object: 1,
  			output: 1, progress: 1, q: 1, ruby: 1, s: 1, samp: 1, script: 1, select: 1, small: 1, span: 1,
  			strong: 1, sub: 1, sup: 1, textarea: 1, time: 1, u: 1, 'var': 1, video: 1, wbr: 1
  		},
  		// F - PF (Flow Only).
  		FO = {
  			address: 1, article: 1, aside: 1, blockquote: 1, details: 1, div: 1, dl: 1, fieldset: 1,
  			figure: 1, footer: 1, form: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1, header: 1, hgroup: 1,
  			hr: 1, main: 1, menu: 1, nav: 1, ol: 1, p: 1, pre: 1, section: 1, table: 1, ul: 1
  		},
  		// Metadata elements.
  		M = { command: 1, link: 1, meta: 1, noscript: 1, script: 1, style: 1 },
  		// Empty.
  		E = {},
  		// Text.
  		T = { '#': 1 },
  
  		// Deprecated phrasing elements.
  		DP = { acronym: 1, applet: 1, basefont: 1, big: 1, font: 1, isindex: 1, strike: 1, style: 1, tt: 1 }, // TODO remove "style".
  		// Deprecated flow only elements.
  		DFO = { center: 1, dir: 1, noframes: 1 };
  
  	// Phrasing elements := PF + T + DP
  	X( P, PF, T, DP );
  	// Flow elements := FO + P + DFO
  	X( F, FO, P, DFO );
  
  	var dtd = {
  		a: Y( P, { a: 1, button: 1 } ), // Treat as normal inline element (not a transparent one).
  		abbr: P,
  		address: F,
  		area: E,
  		article: F,
  		aside: F,
  		audio: X( { source: 1, track: 1 }, F ),
  		b: P,
  		base: E,
  		bdi: P,
  		bdo: P,
  		blockquote: F,
  		body: F,
  		br: E,
  		button: Y( P, { a: 1, button: 1 } ),
  		canvas: P, // Treat as normal inline element (not a transparent one).
  		caption: F,
  		cite: P,
  		code: P,
  		col: E,
  		colgroup: { col: 1 },
  		command: E,
  		datalist: X( { option: 1 }, P ),
  		dd: F,
  		del: P, // Treat as normal inline element (not a transparent one).
  		details: X( { summary: 1 }, F ),
  		dfn: P,
  		div: F,
  		dl: { dt: 1, dd: 1 },
  		dt: F,
  		em: P,
  		embed: E,
  		fieldset: X( { legend: 1 }, F ),
  		figcaption: F,
  		figure: X( { figcaption: 1 }, F ),
  		footer: F,
  		form: F,
  		h1: P,
  		h2: P,
  		h3: P,
  		h4: P,
  		h5: P,
  		h6: P,
  		head: X( { title: 1, base: 1 }, M ),
  		header: F,
  		hgroup: { h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1 },
  		hr: E,
  		html: X( { head: 1, body: 1 }, F, M ), // Head and body are optional...
  		i: P,
  		iframe: T,
  		img: E,
  		input: E,
  		ins: P, // Treat as normal inline element (not a transparent one).
  		kbd: P,
  		keygen: E,
  		label: P,
  		legend: P,
  		li: F,
  		link: E,
  		// Can't be a descendant of article, aside, footer, header, nav, but we don't need this
  		// complication. As well as checking if it's used only once.
  		main: F,
  		map: F,
  		mark: P, // Treat as normal inline element (not a transparent one).
  		menu: X( { li: 1 }, F ),
  		meta: E,
  		meter: Y( P, { meter: 1 } ),
  		nav: F,
  		noscript: X( { link: 1, meta: 1, style: 1 }, P ), // Treat as normal inline element (not a transparent one).
  		object: X( { param: 1 }, P ), // Treat as normal inline element (not a transparent one).
  		ol: { li: 1 },
  		optgroup: { option: 1 },
  		option: T,
  		output: P,
  		p: P,
  		param: E,
  		pre: P,
  		progress: Y( P, { progress: 1 } ),
  		q: P,
  		rp: P,
  		rt: P,
  		ruby: X( { rp: 1, rt: 1 }, P ),
  		s: P,
  		samp: P,
  		script: T,
  		section: F,
  		select: { optgroup: 1, option: 1 },
  		small: P,
  		source: E,
  		span: P,
  		strong: P,
  		style: T,
  		sub: P,
  		summary: X( { h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1 }, P ),
  		sup: P,
  		table: { caption: 1, colgroup: 1, thead: 1, tfoot: 1, tbody: 1, tr: 1 },
  		tbody: { tr: 1 },
  		td: F,
  		textarea: T,
  		tfoot: { tr: 1 },
  		th: F,
  		thead: { tr: 1 },
  		time: Y( P, { time: 1 } ),
  		title: T,
  		tr: { th: 1, td: 1 },
  		track: E,
  		u: P,
  		ul: { li: 1 },
  		'var': P,
  		video: X( { source: 1, track: 1 }, F ),
  		wbr: E,
  
  		// Deprecated tags.
  		acronym: P,
  		applet: X( { param: 1 }, F ),
  		basefont: E,
  		big: P,
  		center: F,
  		dialog: E,
  		dir: { li: 1 },
  		font: P,
  		isindex: E,
  		noframes: F,
  		strike: P,
  		tt: P
  	};
  
  	X( dtd, {
  		
  		$block: X( { audio: 1, dd: 1, dt: 1, figcaption: 1, li: 1, video: 1 }, FO, DFO ),
  
  		
  		$blockLimit: {
  			article: 1, aside: 1, audio: 1, body: 1, caption: 1, details: 1, dir: 1, div: 1, dl: 1,
  			fieldset: 1, figcaption: 1, figure: 1, footer: 1, form: 1, header: 1, hgroup: 1, main: 1, menu: 1, nav: 1,
  			ol: 1, section: 1, table: 1, td: 1, th: 1, tr: 1, ul: 1, video: 1
  		},
  
  		
  		$cdata: { script: 1, style: 1 },
  
  		
  		$editable: {
  			address: 1, article: 1, aside: 1, blockquote: 1, body: 1, details: 1, div: 1, fieldset: 1,
  			figcaption: 1, footer: 1, form: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1, header: 1, hgroup: 1,
  			main: 1, nav: 1, p: 1, pre: 1, section: 1
  		},
  
  		
  		$empty: {
  			area: 1, base: 1, basefont: 1, br: 1, col: 1, command: 1, dialog: 1, embed: 1, hr: 1, img: 1,
  			input: 1, isindex: 1, keygen: 1, link: 1, meta: 1, param: 1, source: 1, track: 1, wbr: 1
  		},
  
  		
  		$inline: P,
  
  		
  		$list: { dl: 1, ol: 1, ul: 1 },
  
  		
  		$listItem: { dd: 1, dt: 1, li: 1 },
  
  		
  		$nonBodyContent: X( { body: 1, head: 1, html: 1 }, dtd.head ),
  
  		
  		$nonEditable: {
  			applet: 1, audio: 1, button: 1, embed: 1, iframe: 1, map: 1, object: 1, option: 1,
  			param: 1, script: 1, textarea: 1, video: 1
  		},
  
  		
  		$object: {
  			applet: 1, audio: 1, button: 1, hr: 1, iframe: 1, img: 1, input: 1, object: 1, select: 1,
  			table: 1, textarea: 1, video: 1
  		},
  
  		
  		$removeEmpty: {
  			abbr: 1, acronym: 1, b: 1, bdi: 1, bdo: 1, big: 1, cite: 1, code: 1, del: 1, dfn: 1,
  			em: 1, font: 1, i: 1, ins: 1, label: 1, kbd: 1, mark: 1, meter: 1, output: 1, q: 1, ruby: 1, s: 1,
  			samp: 1, small: 1, span: 1, strike: 1, strong: 1, sub: 1, sup: 1, time: 1, tt: 1, u: 1, 'var': 1
  		},
  
  		
  		$tabIndex: { a: 1, area: 1, button: 1, input: 1, object: 1, select: 1, textarea: 1 },
  
  		
  		$tableContent: { caption: 1, col: 1, colgroup: 1, tbody: 1, td: 1, tfoot: 1, th: 1, thead: 1, tr: 1 },
  
  		
  		$transparent: { a: 1, audio: 1, canvas: 1, del: 1, ins: 1, map: 1, noscript: 1, object: 1, video: 1 },
  
  		
  		$intermediate: {
  			caption: 1, colgroup: 1, dd: 1, dt: 1, figcaption: 1, legend: 1, li: 1, optgroup: 1,
  			option: 1, rp: 1, rt: 1, summary: 1, tbody: 1, td: 1, tfoot: 1, th: 1, thead: 1, tr: 1
  		}
  	} );
  
  	return dtd;
  } )();
  
  // PACKAGER_RENAME( CKEDITOR.dtd )
  