Skip to content

Commit

Permalink
Various Bid Adapters: point tmax at request object (prebid#9770)
Browse files Browse the repository at this point in the history
* Removed 'CreateEidsArray' import statements, as well as references to it within corresponding functions. Added references to 'userIdAsEids' property as an alternative

* Revert "Removed 'CreateEidsArray' import statements, as well as references to it within corresponding functions. Added references to 'userIdAsEids' property as an alternative"

This reverts commit f654a5b.

* passed all tests

* passed tests with bluebillywigAdapter

* Impactify bid adapter passed tests

* Mediakeys bid adapter passing tests

* Sharethrough bid adapter passed tests

* Connectad bid adapter passed tests

* Added tests back to expectedEids object, and adjusted userIdAsEids array to reflect changes

* Yieldmo bid adapter passed tests

* Smartadserver bid adapter passed tests

* Removed unnecessary reassignment of bidUserId to eids

* Removed unnecessary reassignment of bidUserId to eids

* Improveddigital bid adapter passed tests

* Yieldmo bid adapter passed tests

* Sovrn bid adapter passed tests

* Ttd bid adapter passed tests

* Refactored adapters to draw tmax values from bidderRequest object and ensured they were passing tests

* Update nexx360BidAdapter.js

* Deleted unrelated ttsBidAdapter file from PR

* Deleted unrelated ttdBidAdapter_spec file from PR

* add back ttd adapter

* add ttd spec flle back

* add new line

---------

Co-authored-by: Patrick McCann <pmccann@cafemedia.com>
Co-authored-by: Chris Huie <phoenixtechnerd@gmail.com>
  • Loading branch information
3 people authored and jorgeluisrocha committed May 18, 2023
1 parent 2dce95a commit 33a337d
Show file tree
Hide file tree
Showing 50 changed files with 61 additions and 102 deletions.
2 changes: 1 addition & 1 deletion modules/acuityAdsBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ export const spec = {
coppa: config.getConfig('coppa') === true ? 1 : 0,
ccpa: bidderRequest.uspConsent || undefined,
gdpr: bidderRequest.gdprConsent || undefined,
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};

const len = validBidRequests.length;
Expand Down
2 changes: 1 addition & 1 deletion modules/amxBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ export const spec = {
m: createBidMap(bidRequests),
cpp: config.getConfig('coppa') ? 1 : 0,
fpd2: bidderRequest.ortb2,
tmax: config.getConfig('bidderTimeout'),
tmax: bidderRequest.timeout,
amp: refInfo(bidderRequest, 'isAmp', null),
ri: buildReferrerInfo(bidderRequest),
sync: getSyncSettings(),
Expand Down
2 changes: 1 addition & 1 deletion modules/appushBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ export const spec = {
coppa: config.getConfig('coppa') === true ? 1 : 0,
ccpa: bidderRequest.uspConsent || undefined,
gdpr: bidderRequest.gdprConsent || undefined,
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};

const len = validBidRequests.length;
Expand Down
2 changes: 1 addition & 1 deletion modules/beyondmediaBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ export const spec = {
coppa: config.getConfig('coppa') === true ? 1 : 0,
ccpa: bidderRequest.uspConsent || undefined,
gdpr: bidderRequest.gdprConsent || undefined,
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};

const len = validBidRequests.length;
Expand Down
2 changes: 1 addition & 1 deletion modules/braveBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export const spec = {
domain: parseUrl(page).hostname,
page: page,
},
tmax: bidderRequest.timeout || config.getConfig('bidderTimeout') || 500,
tmax: bidderRequest.timeout,
imp
};

Expand Down
2 changes: 1 addition & 1 deletion modules/brightcomBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ function buildRequests(bidReqs, bidderRequest) {
w: screen.width,
h: screen.height
},
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest?.timeout
};

if (bidderRequest && bidderRequest.gdprConsent) {
Expand Down
2 changes: 1 addition & 1 deletion modules/brightcomSSPBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ function buildRequests(bidReqs, bidderRequest) {
w: screen.width,
h: screen.height
},
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest?.timeout
};

if (bidderRequest?.gdprConsent) {
Expand Down
3 changes: 1 addition & 2 deletions modules/coinzillaBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { parseSizesInput } from '../src/utils.js';
import {config} from '../src/config.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';

const BIDDER_CODE = 'coinzilla';
Expand Down Expand Up @@ -78,7 +77,7 @@ export const spec = {
dealId: dealId,
currency: currency,
netRevenue: netRevenue,
ttl: config.getConfig('_bidderTimeout'),
ttl: bidRequest.timeout,
referrer: referrer,
ad: response.ad,
mediaType: response.mediaType,
Expand Down
2 changes: 1 addition & 1 deletion modules/compassBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export const spec = {
coppa: config.getConfig('coppa') === true ? 1 : 0,
ccpa: bidderRequest.uspConsent || undefined,
gdpr: bidderRequest.gdprConsent || undefined,
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};

const len = validBidRequests.length;
Expand Down
2 changes: 1 addition & 1 deletion modules/contentexchangeBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ export const spec = {
coppa: config.getConfig('coppa') === true ? 1 : 0,
ccpa: bidderRequest.uspConsent || undefined,
gdpr: bidderRequest.gdprConsent || undefined,
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};

const len = validBidRequests.length;
Expand Down
3 changes: 1 addition & 2 deletions modules/glimpseBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { config } from '../src/config.js';
import { BANNER } from '../src/mediaTypes.js';
import { getStorageManager } from '../src/storageManager.js';
import {
Expand Down Expand Up @@ -99,7 +98,7 @@ function getReferer(bidderRequest) {
function buildQuery(bidderRequest) {
let url = appendQueryParam(ENDPOINT, 'ver', '$prebid.version$');

const timeout = config.getConfig('bidderTimeout');
const timeout = bidderRequest.timeout;
url = appendQueryParam(url, 'tmax', timeout);

if (gdprApplies(bidderRequest)) {
Expand Down
2 changes: 1 addition & 1 deletion modules/globalsunBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export const spec = {
coppa: config.getConfig('coppa') === true ? 1 : 0,
ccpa: bidderRequest.uspConsent || undefined,
gdpr: bidderRequest.gdprConsent || undefined,
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};

const len = validBidRequests.length;
Expand Down
2 changes: 1 addition & 1 deletion modules/gridBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ export const spec = {
let {bidderRequestId, auctionId, gdprConsent, uspConsent, timeout, refererInfo, gppConsent} = bidderRequest || {};

const referer = refererInfo ? encodeURIComponent(refererInfo.page) : '';
const tmax = timeout || config.getConfig('bidderTimeout');
const tmax = timeout;
const imp = [];
const bidsMap = {};
const requests = [];
Expand Down
2 changes: 1 addition & 1 deletion modules/gridNMBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ export const spec = {
reqSource.ext.schain = schain;
}

const bidderTimeout = config.getConfig('bidderTimeout') || timeout;
const bidderTimeout = timeout;
const tmax = timeout ? Math.min(bidderTimeout, timeout) : bidderTimeout;

const request = {
Expand Down
2 changes: 1 addition & 1 deletion modules/gumgumBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ function buildRequests(validBidRequests, bidderRequest) {
const gdprConsent = bidderRequest && bidderRequest.gdprConsent;
const uspConsent = bidderRequest && bidderRequest.uspConsent;
const gppConsent = bidderRequest && bidderRequest.gppConsent;
const timeout = config.getConfig('bidderTimeout');
const timeout = bidderRequest && bidderRequest.timeout
const coppa = config.getConfig('coppa') === true ? 1 : 0;
const topWindowUrl = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.page;
_each(validBidRequests, bidRequest => {
Expand Down
2 changes: 1 addition & 1 deletion modules/iqzoneBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ export const spec = {
coppa: config.getConfig('coppa') === true ? 1 : 0,
ccpa: bidderRequest.uspConsent || undefined,
gdpr: bidderRequest.gdprConsent || undefined,
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};

const len = validBidRequests.length;
Expand Down
3 changes: 1 addition & 2 deletions modules/koblerBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ const BIDDER_ENDPOINT = 'https://bid.essrtb.com/bid/prebid_rtb_call';
const DEV_BIDDER_ENDPOINT = 'https://bid-service.dev.essrtb.com/bid/prebid_rtb_call';
const TIMEOUT_NOTIFICATION_ENDPOINT = 'https://bid.essrtb.com/notify/prebid_timeout';
const SUPPORTED_CURRENCY = 'USD';
const DEFAULT_TIMEOUT = 1000;
const TIME_TO_LIVE_IN_SECONDS = 10 * 60;

export const isBidRequestValid = function (bid) {
Expand Down Expand Up @@ -124,7 +123,7 @@ function getPageUrlFromRefererInfo() {

function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) {
const imps = validBidRequests.map(buildOpenRtbImpObject);
const timeout = bidderRequest.timeout || config.getConfig('bidderTimeout') || DEFAULT_TIMEOUT;
const timeout = bidderRequest.timeout;
const pageUrl = getPageUrlFromRequest(validBidRequests[0], bidderRequest)
const request = {
id: bidderRequest.auctionId,
Expand Down
2 changes: 1 addition & 1 deletion modules/kueezBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ function generateSharedParams(sharedParams, bidderRequest) {
const generalBidParams = getBidIdParameter('params', sharedParams);
const userIds = getBidIdParameter('userId', sharedParams);
const ortb2Metadata = bidderRequest.ortb2 || {};
const timeout = config.getConfig('bidderTimeout');
const timeout = bidderRequest.timeout;

const params = {
adapter_version: VERSION,
Expand Down
2 changes: 1 addition & 1 deletion modules/luponmediaBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ function newOrtbBidRequest(bidRequest, bidderRequest, currentImps) {
source: {
tid: bidRequest.transactionId
},
tmax: config.getConfig('timeout') || 1500,
tmax: bidderRequest.timeout,
imp: currentImps.concat([{
id: bidRequest.bidId,
secure: 1,
Expand Down
2 changes: 1 addition & 1 deletion modules/mathildeadsBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export const spec = {
coppa: config.getConfig('coppa') === true ? 1 : 0,
ccpa: bidderRequest.uspConsent || undefined,
gdpr: bidderRequest.gdprConsent || undefined,
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};

const len = validBidRequests.length;
Expand Down
2 changes: 1 addition & 1 deletion modules/medianetBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ function generatePayload(bidRequests, bidderRequests) {
id: bidRequests[0].auctionId,
imp: bidRequests.map(request => slotParams(request)),
ortb2: bidderRequests.ortb2,
tmax: bidderRequests.timeout || config.getConfig('bidderTimeout')
tmax: bidderRequests.timeout
}
}

Expand Down
2 changes: 1 addition & 1 deletion modules/minutemediaBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ function generateGeneralParams(generalObject, bidderRequest) {
const {syncEnabled, filterSettings} = config.getConfig('userSync') || {};
const {bidderCode} = bidderRequest;
const generalBidParams = generalObject.params;
const timeout = config.getConfig('bidderTimeout');
const timeout = bidderRequest.timeout;

// these params are snake_case instead of camelCase to allow backwards compatability on the server.
// in the future, these will be converted to camelCase to match our convention.
Expand Down
3 changes: 1 addition & 2 deletions modules/onomagicBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import {
} from '../src/utils.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {BANNER} from '../src/mediaTypes.js';
import {config} from '../src/config.js';

const BIDDER_CODE = 'onomagic';
const URL = 'https://bidder.onomagic.com/hb';
Expand Down Expand Up @@ -80,7 +79,7 @@ function buildRequests(bidReqs, bidderRequest) {
w: screen.width,
h: screen.height
},
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest?.timeout
};

return {
Expand Down
2 changes: 1 addition & 1 deletion modules/operaadsBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ function buildOpenRtbBidRequest(bidRequest, bidderRequest) {
// build OpenRTB request body
const payload = {
id: bidderRequest.auctionId,
tmax: bidderRequest.timeout || config.getConfig('bidderTimeout'),
tmax: bidderRequest.timeout,
test: config.getConfig('debug') ? 1 : 0,
imp: createImp(bidRequest),
device: getDevice(),
Expand Down
2 changes: 1 addition & 1 deletion modules/pubmaticBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -1211,7 +1211,7 @@ export const spec = {
// bidderRequest has timeout property if publisher sets during calling requestBids function from page
// if not bidderRequest contains global value set by Prebid
if (bidderRequest?.timeout) {
payload.tmax = bidderRequest.timeout || config.getConfig('bidderTimeout');
payload.tmax = bidderRequest.timeout;
} else {
payload.tmax = window?.PWT?.versionDetails?.timeout;
}
Expand Down
2 changes: 1 addition & 1 deletion modules/riseBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ function generateGeneralParams(generalObject, bidderRequest) {
const {syncEnabled, filterSettings} = config.getConfig('userSync') || {};
const {bidderCode} = bidderRequest;
const generalBidParams = generalObject.params;
const timeout = config.getConfig('bidderTimeout');
const timeout = bidderRequest.timeout;

// these params are snake_case instead of camelCase to allow backwards compatability on the server.
// in the future, these will be converted to camelCase to match our convention.
Expand Down
2 changes: 1 addition & 1 deletion modules/sharethroughBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export const sharethroughAdapterSpec = {
isBidRequestValid: bid => !!bid.params.pkey && bid.bidder === BIDDER_CODE,

buildRequests: (bidRequests, bidderRequest) => {
const timeout = config.getConfig('bidderTimeout');
const timeout = bidderRequest.timeout;
const firstPartyData = bidderRequest.ortb2 || {};

const nonHttp = sharethroughInternal.getProtocol().indexOf('http') < 0;
Expand Down
2 changes: 1 addition & 1 deletion modules/shinezBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ function generateGeneralParams(generalObject, bidderRequest) {
const {syncEnabled, filterSettings} = config.getConfig('userSync') || {};
const {bidderCode} = bidderRequest;
const generalBidParams = generalObject.params;
const timeout = config.getConfig('bidderTimeout');
const timeout = bidderRequest.timeout;

// these params are snake_case instead of camelCase to allow backwards compatability on the server.
// in the future, these will be converted to camelCase to match our convention.
Expand Down
2 changes: 1 addition & 1 deletion modules/smarthubBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ function buildRequestParams(bidderRequest = {}, placements = []) {
coppa: config.getConfig('coppa') === true ? 1 : 0,
ccpa: bidderRequest.uspConsent || undefined,
gdpr: bidderRequest.gdprConsent || undefined,
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};
}

Expand Down
4 changes: 1 addition & 3 deletions modules/synacormediaBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,7 @@ export const spec = {
imp: []
};

const callbackTimeout = bidderRequest.timeout;
const globalTimeout = config.getConfig('bidderTimeout');
const tmax = globalTimeout ? Math.min(globalTimeout, callbackTimeout) : callbackTimeout;
const tmax = bidderRequest.timeout;
if (tmax) {
openRtbBidRequest.tmax = tmax;
}
Expand Down
3 changes: 1 addition & 2 deletions modules/truereachBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { deepAccess, getUniqueIdentifierStr } from '../src/utils.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { config } from '../src/config.js';
import { BANNER } from '../src/mediaTypes.js';

const SUPPORTED_AD_TYPES = [BANNER];
Expand Down Expand Up @@ -140,7 +139,7 @@ function buildCommonQueryParamsFromBids(validBidRequests, bidderRequest) {
device: {
ua: window.navigator.userAgent
},
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};

return defaultParams;
Expand Down
2 changes: 1 addition & 1 deletion modules/videoheroesBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export const spec = {
domain: parseUrl(page).hostname,
page: page,
},
tmax: bidderRequest.timeout || config.getConfig('bidderTimeout') || 500,
tmax: bidderRequest.timeout,
imp
};

Expand Down
2 changes: 1 addition & 1 deletion modules/visiblemeasuresBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export const spec = {
coppa: config.getConfig('coppa') === true ? 1 : 0,
ccpa: bidderRequest.uspConsent || undefined,
gdpr: bidderRequest.gdprConsent || undefined,
tmax: config.getConfig('bidderTimeout')
tmax: bidderRequest.timeout
};

const len = validBidRequests.length;
Expand Down
2 changes: 1 addition & 1 deletion modules/vrtcalBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export const spec = {
coppa = 1;
}

tmax = config.getConfig('bidderTimeout');
tmax = bid.timeout;

const params = {
prebidJS: 1,
Expand Down
2 changes: 1 addition & 1 deletion modules/yieldoneBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export const spec = {
const bidId = bidRequest.bidId;
const transactionId = bidRequest.transactionId;
const unitCode = bidRequest.adUnitCode;
const timeout = config.getConfig('bidderTimeout');
const timeout = bidderRequest.timeout;
const language = window.navigator.language;
const screenSize = window.screen.width + 'x' + window.screen.height;
const payload = {
Expand Down
3 changes: 2 additions & 1 deletion test/spec/modules/acuityAdsBidAdapter_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ describe('AcuityAdsBidAdapter', function () {
gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
refererInfo: {
referer: 'https://test.com'
}
},
timeout: 500
};

describe('isBidRequestValid', function () {
Expand Down
3 changes: 2 additions & 1 deletion test/spec/modules/appushBidAdapter_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ describe('AppushBidAdapter', function () {
gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
refererInfo: {
referer: 'https://test.com'
}
},
timeout: 500
};

describe('isBidRequestValid', function () {
Expand Down
3 changes: 2 additions & 1 deletion test/spec/modules/beyondmediaBidAdapter_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ describe('AndBeyondMediaBidAdapter', function () {
gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
refererInfo: {
referer: 'https://test.com'
}
},
timeout: 500
};

describe('isBidRequestValid', function () {
Expand Down
3 changes: 2 additions & 1 deletion test/spec/modules/compassBidAdapter_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ describe('CompassBidAdapter', function () {
gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
refererInfo: {
referer: 'https://test.com'
}
},
timeout: 500
};

describe('isBidRequestValid', function () {
Expand Down
Loading

0 comments on commit 33a337d

Please sign in to comment.