Updated Jules Jordan scraper.
|  | @ -1,21 +1,23 @@ | ||||||
| <template> | <template> | ||||||
|  | 	<iframe | ||||||
|  | 		v-if="campaign?.banner?.type === 'html'" | ||||||
|  | 		:width="campaign.banner.width" | ||||||
|  | 		:height="campaign.banner.height" | ||||||
|  | 		:src="getSource(campaign)" | ||||||
|  | 		scrolling="none" | ||||||
|  | 		marginwidth="0" | ||||||
|  | 		marginheight="0" | ||||||
|  | 		class="campaign frame" | ||||||
|  | 	/> | ||||||
|  | 
 | ||||||
| 	<a | 	<a | ||||||
| 		v-if="campaign" | 		v-else-if="campaign" | ||||||
| 		:href="campaign.url || campaign.affiliate?.url" | 		:href="campaign.url || campaign.affiliate?.url" | ||||||
| 		target="_blank" | 		target="_blank" | ||||||
| 		class="campaign" | 		class="campaign" | ||||||
| 	> | 	> | ||||||
| 		<img | 		<img | ||||||
| 			v-if="campaign.banner.entity.type === 'network' || !campaign.banner.entity.parent" | 			:src="getSource(campaign)" | ||||||
| 			:src="`/img/banners/${campaign.banner.entity.slug}/${campaign.banner.id}.${campaign.banner.type || 'jpg'}`" |  | ||||||
| 			:width="campaign.banner.width" |  | ||||||
| 			:height="campaign.banner.height" |  | ||||||
| 			class="campaign-banner" |  | ||||||
| 		> |  | ||||||
| 
 |  | ||||||
| 		<img |  | ||||||
| 			v-if="campaign.banner.entity.type === 'channel' && campaign.banner.entity.parent?.type === 'network'" |  | ||||||
| 			:src="`/img/banners/${campaign.banner.entity.parent.slug}/${campaign.banner.entity.slug}/${campaign.banner.id}.${campaign.banner.type || 'jpg'}`" |  | ||||||
| 			:width="campaign.banner.width" | 			:width="campaign.banner.width" | ||||||
| 			:height="campaign.banner.height" | 			:height="campaign.banner.height" | ||||||
| 			class="campaign-banner" | 			class="campaign-banner" | ||||||
|  | @ -37,6 +39,12 @@ function ratioFilter(banner) { | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if (banner.type === 'html' && banner.width > window.innerWidth) { | ||||||
|  | 		// usually non-scalable iframes | ||||||
|  | 		console.log('TOO WIDE'); | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if (this.minRatio && banner.ratio < this.minRatio) { | 	if (this.minRatio && banner.ratio < this.minRatio) { | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
|  | @ -48,6 +56,18 @@ function ratioFilter(banner) { | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | function getSource(campaign) { | ||||||
|  | 	if (campaign.banner.entity.type === 'network' || !campaign.banner.entity.parent) { | ||||||
|  | 		return `/banners/${campaign.banner.entity.slug}/${campaign.banner.id}.${campaign.banner.type || 'jpg'}`; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (campaign.banner.entity.type === 'channel' && campaign.banner.entity.parent?.type === 'network') { | ||||||
|  | 		return `/banners/${campaign.banner.entity.parent.slug}/${campaign.banner.entity.slug}/${campaign.banner.id}.${campaign.banner.type || 'jpg'}`; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return null; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| function entityCampaign() { | function entityCampaign() { | ||||||
| 	const bannerCampaigns = this.entity.campaigns | 	const bannerCampaigns = this.entity.campaigns | ||||||
| 		.concat(this.entity.children?.flatMap((child) => child.campaigns)) | 		.concat(this.entity.children?.flatMap((child) => child.campaigns)) | ||||||
|  | @ -106,7 +126,21 @@ async function genericCampaign() { | ||||||
| 	return randomCampaign; | 	return randomCampaign; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | async function specificCampaign(campaignId) { | ||||||
|  | 	const campaign = await this.$store.dispatch('fetchCampaign', campaignId); | ||||||
|  | 
 | ||||||
|  | 	this.campaign = campaign; | ||||||
|  | 	this.$emit('campaign', campaign); | ||||||
|  | 
 | ||||||
|  | 	return campaign; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| async function mounted() { | async function mounted() { | ||||||
|  | 	if (this.$route.query.campaign) { | ||||||
|  | 		await this.specificCampaign(this.$route.query.campaign); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if (this.entity) { | 	if (this.entity) { | ||||||
| 		await this.entityCampaign(); | 		await this.entityCampaign(); | ||||||
| 		return; | 		return; | ||||||
|  | @ -161,7 +195,9 @@ export default { | ||||||
| 	methods: { | 	methods: { | ||||||
| 		entityCampaign, | 		entityCampaign, | ||||||
| 		genericCampaign, | 		genericCampaign, | ||||||
|  | 		getSource, | ||||||
| 		ratioFilter, | 		ratioFilter, | ||||||
|  | 		specificCampaign, | ||||||
| 		tagCampaign, | 		tagCampaign, | ||||||
| 	}, | 	}, | ||||||
| }; | }; | ||||||
|  | @ -169,10 +205,10 @@ export default { | ||||||
| 
 | 
 | ||||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||||
| .campaign { | .campaign { | ||||||
| 	height: 100%; |  | ||||||
| 	display: inline-flex; | 	display: inline-flex; | ||||||
| 	align-items: center; | 	align-items: center; | ||||||
| 	justify-content: center; | 	justify-content: center; | ||||||
|  | 	border: none; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .campaign-banner { | .campaign-banner { | ||||||
|  |  | ||||||
|  | @ -49,11 +49,11 @@ import Campaign from '../campaigns/campaign.vue'; | ||||||
| 
 | 
 | ||||||
| function photos() { | function photos() { | ||||||
| 	if (this.tag.poster && this.$store.state.ui.sfw) { | 	if (this.tag.poster && this.$store.state.ui.sfw) { | ||||||
| 		return [this.tag.poster].concat(this.tag.photos).map(photo => photo.sfw); | 		return [this.tag.poster].concat(this.tag.photos).map((photo) => photo.sfw); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (this.$store.state.ui.sfw) { | 	if (this.$store.state.ui.sfw) { | ||||||
| 		return this.tag.photos.map(photo => photo.sfw); | 		return this.tag.photos.map((photo) => photo.sfw); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (this.tag.poster) { | 	if (this.tag.poster) { | ||||||
|  |  | ||||||
|  | @ -166,6 +166,47 @@ const movieFields = ` | ||||||
| 	} | 	} | ||||||
| `;
 | `;
 | ||||||
| 
 | 
 | ||||||
|  | const campaignFields = ` | ||||||
|  | 	id | ||||||
|  | 	url | ||||||
|  | 	affiliate { | ||||||
|  | 		id | ||||||
|  | 		url | ||||||
|  | 		parameters | ||||||
|  | 	} | ||||||
|  | 	banner { | ||||||
|  | 		id | ||||||
|  | 		type | ||||||
|  | 		width | ||||||
|  | 		height | ||||||
|  | 		ratio | ||||||
|  | 		entity { | ||||||
|  | 			id | ||||||
|  | 			type | ||||||
|  | 			name | ||||||
|  | 			slug | ||||||
|  | 			parent { | ||||||
|  | 				id | ||||||
|  | 				type | ||||||
|  | 				name | ||||||
|  | 				slug | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	entity { | ||||||
|  | 		id | ||||||
|  | 		type | ||||||
|  | 		name | ||||||
|  | 		slug | ||||||
|  | 		parent { | ||||||
|  | 			id | ||||||
|  | 			type | ||||||
|  | 			name | ||||||
|  | 			slug | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | `;
 | ||||||
|  | 
 | ||||||
| const campaignsFragment = ` | const campaignsFragment = ` | ||||||
| 	campaigns(filter: { | 	campaigns(filter: { | ||||||
| 		or: [ | 		or: [ | ||||||
|  | @ -187,44 +228,7 @@ const campaignsFragment = ` | ||||||
| 			} | 			} | ||||||
| 		] | 		] | ||||||
| 	}) { | 	}) { | ||||||
| 		id | 		${campaignFields} | ||||||
| 		url |  | ||||||
| 		affiliate { |  | ||||||
| 			id |  | ||||||
| 			url |  | ||||||
| 			parameters |  | ||||||
| 		} |  | ||||||
| 		banner { |  | ||||||
| 			id |  | ||||||
| 			type |  | ||||||
| 			width |  | ||||||
| 			height |  | ||||||
| 			ratio |  | ||||||
| 			entity { |  | ||||||
| 				id |  | ||||||
| 				type |  | ||||||
| 				name |  | ||||||
| 				slug |  | ||||||
| 				parent { |  | ||||||
| 					id |  | ||||||
| 					type |  | ||||||
| 					name |  | ||||||
| 					slug |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		entity { |  | ||||||
| 			id |  | ||||||
| 			type |  | ||||||
| 			name |  | ||||||
| 			slug |  | ||||||
| 			parent { |  | ||||||
| 				id |  | ||||||
| 				type |  | ||||||
| 				name |  | ||||||
| 				slug |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| `;
 | `;
 | ||||||
| 
 | 
 | ||||||
|  | @ -670,6 +674,7 @@ export { | ||||||
| 	actorFields, | 	actorFields, | ||||||
| 	actorStashesFields, | 	actorStashesFields, | ||||||
| 	batchFragment, | 	batchFragment, | ||||||
|  | 	campaignFields, | ||||||
| 	campaignsFragment, | 	campaignsFragment, | ||||||
| 	mediaFields, | 	mediaFields, | ||||||
| 	mediaFragment, | 	mediaFragment, | ||||||
|  |  | ||||||
|  | @ -1,5 +1,12 @@ | ||||||
| import { graphql, patch } from '../api'; | import { graphql, patch } from '../api'; | ||||||
| import { releaseFields, batchFragment, actorStashesFields } from '../fragments'; | 
 | ||||||
|  | import { | ||||||
|  | 	releaseFields, | ||||||
|  | 	batchFragment, | ||||||
|  | 	campaignFields, | ||||||
|  | 	actorStashesFields, | ||||||
|  | } from '../fragments'; | ||||||
|  | 
 | ||||||
| import { curateRelease, curateActor, curateNotification } from '../curate'; | import { curateRelease, curateActor, curateNotification } from '../curate'; | ||||||
| 
 | 
 | ||||||
| function initUiActions(store, _router) { | function initUiActions(store, _router) { | ||||||
|  | @ -240,29 +247,7 @@ function initUiActions(store, _router) { | ||||||
| 				$maxRatio: BigFloat | 				$maxRatio: BigFloat | ||||||
| 			) { | 			) { | ||||||
| 			  randomCampaign: getRandomCampaign(minRatio: $minRatio, maxRatio: $maxRatio) { | 			  randomCampaign: getRandomCampaign(minRatio: $minRatio, maxRatio: $maxRatio) { | ||||||
| 				url | 				  ${campaignFields} | ||||||
| 				affiliate { |  | ||||||
| 				  url |  | ||||||
| 				} |  | ||||||
| 				banner { |  | ||||||
| 				  id |  | ||||||
| 				  type |  | ||||||
| 				  ratio |  | ||||||
| 				  entity { |  | ||||||
| 					type |  | ||||||
| 					slug |  | ||||||
| 					parent { |  | ||||||
| 					  type |  | ||||||
| 					  slug |  | ||||||
| 					} |  | ||||||
| 				  } |  | ||||||
| 				} |  | ||||||
| 				entity { |  | ||||||
| 				  slug |  | ||||||
| 				} |  | ||||||
| 				parent { |  | ||||||
| 				  slug |  | ||||||
| 				} |  | ||||||
| 			  } | 			  } | ||||||
| 			} | 			} | ||||||
| 		`, {
 | 		`, {
 | ||||||
|  | @ -273,6 +258,23 @@ function initUiActions(store, _router) { | ||||||
| 		return randomCampaign; | 		return randomCampaign; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	async function fetchCampaign(context, campaignId) { | ||||||
|  | 		console.log(campaignId); | ||||||
|  | 		const { campaign } = await graphql(` | ||||||
|  | 			query Campaign( | ||||||
|  | 				$campaignId: Int! | ||||||
|  | 			) { | ||||||
|  | 			  campaign(id: $campaignId) { | ||||||
|  | 				  ${campaignFields} | ||||||
|  | 			  } | ||||||
|  | 			} | ||||||
|  | 		`, {
 | ||||||
|  | 			campaignId: Number(campaignId), | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		return campaign; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	async function fetchStats() { | 	async function fetchStats() { | ||||||
| 		const { | 		const { | ||||||
| 			scenes, | 			scenes, | ||||||
|  | @ -312,6 +314,7 @@ function initUiActions(store, _router) { | ||||||
| 		setBatch, | 		setBatch, | ||||||
| 		setSfw, | 		setSfw, | ||||||
| 		setTheme, | 		setTheme, | ||||||
|  | 		fetchCampaign, | ||||||
| 		fetchRandomCampaign, | 		fetchRandomCampaign, | ||||||
| 		fetchNotifications, | 		fetchNotifications, | ||||||
| 		fetchStats, | 		fetchStats, | ||||||
|  |  | ||||||
|  | @ -1552,6 +1552,11 @@ exports.up = (knex) => Promise.resolve() | ||||||
| 			.defaultTo(knex.fn.now()); | 			.defaultTo(knex.fn.now()); | ||||||
| 	})) | 	})) | ||||||
| 	.then(() => knex.schema.createTable('random_campaign', (table) => { | 	.then(() => knex.schema.createTable('random_campaign', (table) => { | ||||||
|  | 		table.integer('id') | ||||||
|  | 			.notNullable() | ||||||
|  | 			.references('id') | ||||||
|  | 			.inTable('campaigns'); | ||||||
|  | 
 | ||||||
| 		table.text('banner_id') | 		table.text('banner_id') | ||||||
| 			.references('id') | 			.references('id') | ||||||
| 			.inTable('banners'); | 			.inTable('banners'); | ||||||
|  | @ -1903,7 +1908,7 @@ exports.up = (knex) => Promise.resolve() | ||||||
| 			CREATE FUNCTION get_random_campaign(min_ratio decimal default 0, max_ratio decimal default 1000.0) RETURNS random_campaign AS $$ | 			CREATE FUNCTION get_random_campaign(min_ratio decimal default 0, max_ratio decimal default 1000.0) RETURNS random_campaign AS $$ | ||||||
| 				SELECT * FROM ( | 				SELECT * FROM ( | ||||||
| 					SELECT DISTINCT ON (CASE WHEN parent_id IS NOT NULL THEN parent_id ELSE entity_id END) | 					SELECT DISTINCT ON (CASE WHEN parent_id IS NOT NULL THEN parent_id ELSE entity_id END) | ||||||
| 						banner_id, url, entity_id, affiliate_id, parent_id | 						id, banner_id, url, entity_id, affiliate_id, parent_id | ||||||
| 					FROM ( | 					FROM ( | ||||||
| 						SELECT | 						SELECT | ||||||
| 							campaigns.*, entities.parent_id as parent_id | 							campaigns.*, entities.parent_id as parent_id | ||||||
|  |  | ||||||
|  | @ -0,0 +1,58 @@ | ||||||
|  | exports.up = async (knex) => { | ||||||
|  | 	await knex.schema.alterTable('random_campaign', (table) => { | ||||||
|  | 		table.integer('id') | ||||||
|  | 			.notNullable() | ||||||
|  | 			.references('id') | ||||||
|  | 			.inTable('campaigns'); | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | 	await knex.raw(` | ||||||
|  | 		CREATE OR REPLACE FUNCTION get_random_campaign(min_ratio decimal default 0, max_ratio decimal default 1000.0) RETURNS random_campaign AS $$ | ||||||
|  | 			SELECT * FROM ( | ||||||
|  | 				SELECT DISTINCT ON (CASE WHEN parent_id IS NOT NULL THEN parent_id ELSE entity_id END) | ||||||
|  | 					banner_id, url, entity_id, affiliate_id, parent_id, id | ||||||
|  | 				FROM ( | ||||||
|  | 					SELECT | ||||||
|  | 						campaigns.*, entities.parent_id as parent_id | ||||||
|  | 					FROM campaigns | ||||||
|  | 					LEFT JOIN entities ON entities.id = campaigns.entity_id | ||||||
|  | 					LEFT JOIN banners ON banners.id = campaigns.banner_id | ||||||
|  | 					WHERE banner_id IS NOT NULL | ||||||
|  | 					AND ratio >= min_ratio | ||||||
|  | 					AND ratio <= max_ratio | ||||||
|  | 					ORDER BY RANDOM() | ||||||
|  | 				) random_campaigns | ||||||
|  | 			) random_banners | ||||||
|  | 			ORDER BY RANDOM() | ||||||
|  | 			LIMIT 1; | ||||||
|  | 		$$ LANGUAGE SQL STABLE; | ||||||
|  | 	`);
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | exports.down = async (knex) => { | ||||||
|  | 	await knex.schema.alterTable('random_campaign', (table) => { | ||||||
|  | 		table.dropColumn('campaign_id'); | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | 	await knex.raw(` | ||||||
|  | 		CREATE OR REPLACE FUNCTION get_random_campaign(min_ratio decimal default 0, max_ratio decimal default 1000.0) RETURNS random_campaign AS $$ | ||||||
|  | 			SELECT * FROM ( | ||||||
|  | 				SELECT DISTINCT ON (CASE WHEN parent_id IS NOT NULL THEN parent_id ELSE entity_id END) | ||||||
|  | 					banner_id, url, entity_id, affiliate_id, parent_id | ||||||
|  | 				FROM ( | ||||||
|  | 					SELECT | ||||||
|  | 						campaigns.*, entities.parent_id as parent_id | ||||||
|  | 					FROM campaigns | ||||||
|  | 					LEFT JOIN entities ON entities.id = campaigns.entity_id | ||||||
|  | 					LEFT JOIN banners ON banners.id = campaigns.banner_id | ||||||
|  | 					WHERE banner_id IS NOT NULL | ||||||
|  | 					AND ratio >= min_ratio | ||||||
|  | 					AND ratio <= max_ratio | ||||||
|  | 					ORDER BY RANDOM() | ||||||
|  | 				) random_campaigns | ||||||
|  | 			) random_banners | ||||||
|  | 			ORDER BY RANDOM() | ||||||
|  | 			LIMIT 1; | ||||||
|  | 		$$ LANGUAGE SQL STABLE; | ||||||
|  | 	`);
 | ||||||
|  | }; | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | exports.up = async (knex) => { | ||||||
|  | 	await knex.schema.alterTable('banners', (table) => { | ||||||
|  | 		table.text('html'); | ||||||
|  | 	}); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | exports.down = async (knex) => { | ||||||
|  | 	await knex.schema.alterTable('banners', (table) => { | ||||||
|  | 		table.dropColumn('html'); | ||||||
|  | 	}); | ||||||
|  | }; | ||||||
| Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB | 
| Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 105 KiB | 
| Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB | 
| Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB | 
| Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB | 
| Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB | 
| Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB | 
| Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB | 
| Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB | 
| Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB | 
| Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB | 
| Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB | 
| Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB | 
| Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB | 
| Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB | 
| Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 85 KiB | 
| Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 190 KiB | 
| Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB | 
| Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB | 
| Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB | 
| Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB | 
| Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 88 KiB | 
| Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB | 
| Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 85 KiB | 
| Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB | 
| Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB | 
| Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB | 
| Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 90 KiB | 
| Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB | 
| Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB | 
| Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB | 
| Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB | 
| Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 146 KiB | 
| Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB | 
| Before Width: | Height: | Size: 498 KiB After Width: | Height: | Size: 498 KiB | 
| Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 145 KiB | 
| Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB | 
| Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB | 
| Before Width: | Height: | Size: 191 KiB After Width: | Height: | Size: 191 KiB | 
| Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB | 
| Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB | 
| Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB | 
| Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB | 
|  | @ -0,0 +1 @@ | ||||||
|  | <iframe style="background-color: white;" width="300" height="100" scrolling="no" frameborder="0" allowtransparency="true" marginheight="0" marginwidth="0" name="spot_id_10002480" src="//a.adtng.com/get/10002480?ata=DebaucheryLibrarian"></iframe> | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | <iframe style="background-color: white;" width="300" height="250" scrolling="no" frameborder="0" allowtransparency="true" marginheight="0" marginwidth="0" name="spot_id_10001807" src="//a.adtng.com/get/10001807?ata=DebaucheryLibrarian"></iframe> | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | <iframe style="background-color: white;" width="315" height="300" scrolling="no" frameborder="0" allowtransparency="true" marginheight="0" marginwidth="0" name="spot_id_10002484" src="//a.adtng.com/get/10002484?ata=DebaucheryLibrarian"></iframe> | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | <iframe style="background-color: white;" width="728" height="90" scrolling="no" frameborder="0" allowtransparency="true" marginheight="0" marginwidth="0" name="spot_id_10002466" src="//a.adtng.com/get/10002466?ata=DebaucheryLibrarian"></iframe> | ||||||
| Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB | 
| Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB | 
| Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB | 
| Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB | 
| Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB | 
| Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB | 
| Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB | 
| Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB | 
| Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 80 KiB | 
| Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB | 
| Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB | 
| Before Width: | Height: | Size: 676 KiB After Width: | Height: | Size: 676 KiB | 
| Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB | 
| Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB | 
| Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB | 
| Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB | 
| Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB | 
| Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB | 
| Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB | 
| Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB | 
| Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB | 
| Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB | 
| Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB | 
| Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 99 KiB | 
| Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB | 
| Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB | 
| Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB | 
| Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 104 KiB | 
| Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 114 KiB | 
| Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 105 KiB | 
| Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB | 
| Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB | 
| Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB | 
| Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB | 
| Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 109 KiB | 
| Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB | 
| Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 105 KiB | 
| Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 104 KiB | 
| Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB | 
| Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB | 
| Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB | 
| Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB | 
| Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB | 
| Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB | 
| Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |