prebid-universal-creative 1.13.0 → 1.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.circleci/config.yml +3 -3
- package/.github/workflows/issue_tracker.yml +89 -0
- package/README.md +1 -1
- package/browsers.json +17 -33
- package/dist/creative.js +3 -3
- package/dist/creative.max.js +516 -420
- package/dist/native-render.js +3 -3
- package/dist/native-trk.js +3 -3
- package/dist/uid.js +2 -2
- package/package.json +12 -7
- package/src/messaging.js +43 -0
- package/src/nativeAssetManager.js +185 -77
- package/src/nativeORTBTrackerManager.js +32 -0
- package/src/nativeRenderManager.js +10 -12
- package/src/nativeTrackerManager.js +18 -7
- package/src/renderingManager.js +58 -38
- package/src/utils.js +3 -0
- package/test/helpers/mocks.js +7 -3
- package/test/spec/messaging_spec.js +64 -0
- package/test/spec/nativeAssetManager_spec.js +493 -347
- package/test/spec/nativeORTBTrackerManager_spec.js +76 -0
- package/test/spec/nativeRenderManager_spec.js +18 -1
- package/test/spec/renderingManager_spec.js +133 -43
package/dist/creative.max.js
CHANGED
@@ -60,7 +60,7 @@
|
|
60
60
|
/******/ __webpack_require__.p = "";
|
61
61
|
/******/
|
62
62
|
/******/ // Load entry module and return exports
|
63
|
-
/******/ return __webpack_require__(__webpack_require__.s =
|
63
|
+
/******/ return __webpack_require__(__webpack_require__.s = 2);
|
64
64
|
/******/ })
|
65
65
|
/************************************************************************/
|
66
66
|
/******/ ([
|
@@ -70,6 +70,289 @@
|
|
70
70
|
"use strict";
|
71
71
|
|
72
72
|
|
73
|
+
Object.defineProperty(exports, "__esModule", {
|
74
|
+
value: true
|
75
|
+
});
|
76
|
+
exports.triggerPixel = triggerPixel;
|
77
|
+
exports.createTrackPixelHtml = createTrackPixelHtml;
|
78
|
+
exports.writeAdUrl = writeAdUrl;
|
79
|
+
exports.writeAdHtml = writeAdHtml;
|
80
|
+
exports.sendRequest = sendRequest;
|
81
|
+
exports.getUUID = getUUID;
|
82
|
+
exports.loadScript = loadScript;
|
83
|
+
exports.getCreativeComment = getCreativeComment;
|
84
|
+
exports.getCreativeCommentMarkup = getCreativeCommentMarkup;
|
85
|
+
exports.transformAuctionTargetingData = transformAuctionTargetingData;
|
86
|
+
exports.parseUrl = parseUrl;
|
87
|
+
|
88
|
+
var domHelper = _interopRequireWildcard(__webpack_require__(1));
|
89
|
+
|
90
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
91
|
+
|
92
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
93
|
+
|
94
|
+
var postscribe = __webpack_require__(4);
|
95
|
+
|
96
|
+
/**
|
97
|
+
* Inserts an image pixel with the specified `url` for cookie sync
|
98
|
+
* @param {string} url URL string of the image pixel to load
|
99
|
+
* @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process
|
100
|
+
*/
|
101
|
+
function triggerPixel(url, done) {
|
102
|
+
var img = new Image();
|
103
|
+
|
104
|
+
if (done && typeof done === 'function') {
|
105
|
+
img.addEventListener('load', done);
|
106
|
+
img.addEventListener('error', done);
|
107
|
+
}
|
108
|
+
|
109
|
+
img.src = url;
|
110
|
+
}
|
111
|
+
|
112
|
+
function createTrackPixelHtml(url) {
|
113
|
+
if (!url) {
|
114
|
+
return '';
|
115
|
+
}
|
116
|
+
|
117
|
+
var escapedUrl = encodeURI(url);
|
118
|
+
var img = "<div style=\"position:absolute;left:0px;top:0px;visibility:hidden;\"><img src=\"".concat(escapedUrl, "\"></div>");
|
119
|
+
return img;
|
120
|
+
}
|
121
|
+
|
122
|
+
function writeAdUrl(adUrl, width, height) {
|
123
|
+
var iframe = domHelper.getEmptyIframe(height, width);
|
124
|
+
iframe.src = adUrl;
|
125
|
+
document.body.appendChild(iframe);
|
126
|
+
}
|
127
|
+
|
128
|
+
function writeAdHtml(markup) {
|
129
|
+
// remove <?xml> and <!doctype> tags
|
130
|
+
// https://github.com/prebid/prebid-universal-creative/issues/134
|
131
|
+
markup = markup.replace(/\<(\?xml|(\!DOCTYPE[^\>\[]+(\[[^\]]+)?))+[^>]+\>/g, '');
|
132
|
+
postscribe(document.body, markup, {
|
133
|
+
error: console.error
|
134
|
+
});
|
135
|
+
}
|
136
|
+
|
137
|
+
function sendRequest(url, callback) {
|
138
|
+
function reqListener() {
|
139
|
+
callback(oReq.responseText);
|
140
|
+
}
|
141
|
+
|
142
|
+
var oReq = new XMLHttpRequest();
|
143
|
+
oReq.addEventListener('load', reqListener);
|
144
|
+
oReq.open('GET', url);
|
145
|
+
oReq.send();
|
146
|
+
}
|
147
|
+
|
148
|
+
function getUUID() {
|
149
|
+
var d = new Date().getTime();
|
150
|
+
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
151
|
+
var r = (d + Math.random() * 16) % 16 | 0;
|
152
|
+
d = Math.floor(d / 16);
|
153
|
+
return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
|
154
|
+
});
|
155
|
+
return uuid;
|
156
|
+
}
|
157
|
+
|
158
|
+
;
|
159
|
+
|
160
|
+
function loadScript(currentWindow, tagSrc, successCallback, errorCallback) {
|
161
|
+
var doc = currentWindow.document;
|
162
|
+
var scriptTag = doc.createElement('script');
|
163
|
+
scriptTag.type = 'text/javascript'; // Execute success callback if necessary
|
164
|
+
|
165
|
+
if (successCallback && typeof successCallback === 'function') {
|
166
|
+
if (scriptTag.readyState) {
|
167
|
+
scriptTag.onreadystatechange = function () {
|
168
|
+
if (scriptTag.readyState === 'loaded' || scriptTag.readyState === 'complete') {
|
169
|
+
scriptTag.onreadystatechange = null;
|
170
|
+
successCallback();
|
171
|
+
}
|
172
|
+
};
|
173
|
+
} else {
|
174
|
+
scriptTag.onload = function () {
|
175
|
+
successCallback();
|
176
|
+
};
|
177
|
+
}
|
178
|
+
} // Execute error callback if necessary
|
179
|
+
|
180
|
+
|
181
|
+
if (errorCallback && typeof errorCallback === 'function') {
|
182
|
+
scriptTag.onerror = function () {
|
183
|
+
errorCallback();
|
184
|
+
};
|
185
|
+
}
|
186
|
+
|
187
|
+
scriptTag.src = tagSrc; //add the new script tag to the page
|
188
|
+
|
189
|
+
var elToAppend = doc.getElementsByTagName('head');
|
190
|
+
elToAppend = elToAppend.length ? elToAppend : doc.getElementsByTagName('body');
|
191
|
+
|
192
|
+
if (elToAppend.length) {
|
193
|
+
elToAppend = elToAppend[0];
|
194
|
+
elToAppend.insertBefore(scriptTag, elToAppend.firstChild);
|
195
|
+
}
|
196
|
+
|
197
|
+
return scriptTag;
|
198
|
+
}
|
199
|
+
|
200
|
+
;
|
201
|
+
/**
|
202
|
+
* Return comment element
|
203
|
+
* @param {*} bid
|
204
|
+
*/
|
205
|
+
|
206
|
+
function getCreativeComment(bid) {
|
207
|
+
return document.createComment("Creative ".concat(bid.crid, " served by Prebid.js Header Bidding"));
|
208
|
+
}
|
209
|
+
/**
|
210
|
+
* Returns comment element markup
|
211
|
+
* @param {*} bid
|
212
|
+
*/
|
213
|
+
|
214
|
+
|
215
|
+
function getCreativeCommentMarkup(bid) {
|
216
|
+
var creativeComment = exports.getCreativeComment(bid);
|
217
|
+
var wrapper = document.createElement('div');
|
218
|
+
wrapper.appendChild(creativeComment);
|
219
|
+
return wrapper.innerHTML;
|
220
|
+
}
|
221
|
+
|
222
|
+
function transformAuctionTargetingData(tagData) {
|
223
|
+
// this map object translates the Prebid.js auction keys to their equivalent Prebid Universal Creative keys
|
224
|
+
// when the publisher uses their adserver's generic macro that provides all targeting keys (ie tagData.targetingMap), we need to convert the keys
|
225
|
+
var auctionKeyMap = {
|
226
|
+
hb_adid: 'adId',
|
227
|
+
hb_cache_host: 'cacheHost',
|
228
|
+
hb_cache_path: 'cachePath',
|
229
|
+
hb_cache_id: 'uuid',
|
230
|
+
hb_format: 'mediaType',
|
231
|
+
hb_env: 'env',
|
232
|
+
hb_size: 'size',
|
233
|
+
hb_pb: 'hbPb'
|
234
|
+
};
|
235
|
+
/**
|
236
|
+
* Determine if the supplied property of the tagData object exists and is populated with its own values/properties according to its type
|
237
|
+
* @param {string} paramName name of the property to check (eg tagData.targetingMap)
|
238
|
+
* @returns true/false
|
239
|
+
*/
|
240
|
+
|
241
|
+
function isMacroPresent(paramName) {
|
242
|
+
return !!(tagData[paramName] && (isPlainObject(tagData[paramName]) && Object.keys(tagData[paramName]).length > 0 || isStr(tagData[paramName]) && tagData[paramName] !== ''));
|
243
|
+
}
|
244
|
+
/**
|
245
|
+
* Converts the specifically formatted object of keypairs to a more generalized structure
|
246
|
+
* It specifically extracts the keyvalue from an array and stores it as a normal string
|
247
|
+
* @param {object} tarMap object of keys with the keyvalue stored in an array; eg {"hb_adid":["26566ee8c7f251"], ...}
|
248
|
+
* @returns {object} result is an object map like the following: {"hb_cache_id":"123456", "other_key":"other_value", ...}
|
249
|
+
*/
|
250
|
+
|
251
|
+
|
252
|
+
function convertTargetingMapToNormalMap(tarMap) {
|
253
|
+
var newTarMap = {};
|
254
|
+
Object.keys(tarMap).forEach(function (key) {
|
255
|
+
if (Array.isArray(tarMap[key]) && tarMap[key].length > 0) {
|
256
|
+
newTarMap[key] = tarMap[key][0];
|
257
|
+
}
|
258
|
+
});
|
259
|
+
return newTarMap;
|
260
|
+
}
|
261
|
+
/**
|
262
|
+
* Converts a specifically formatted string of keypairs to a specifically formatted object map
|
263
|
+
* @param {String} keywordsStr string of keypairs; eg "hb_cache_id:123456,other_key:other_value"
|
264
|
+
* @returns {object} result is an object map like the following: {"hb_cache_id":"123456", "other_key":"other_value", ...}
|
265
|
+
*/
|
266
|
+
|
267
|
+
|
268
|
+
function convertKeyPairStringToMap(keywordsStr) {
|
269
|
+
var keywordsMap = {};
|
270
|
+
var keywordsArr = keywordsStr.split(',');
|
271
|
+
|
272
|
+
if (keywordsArr.length > 0) {
|
273
|
+
keywordsArr.forEach(function (keyPairStr) {
|
274
|
+
var keyPairArr = keyPairStr.split(':');
|
275
|
+
|
276
|
+
if (keyPairArr.length === 2) {
|
277
|
+
var k = keyPairArr[0];
|
278
|
+
var v = keyPairArr[1];
|
279
|
+
keywordsMap[k] = v;
|
280
|
+
}
|
281
|
+
});
|
282
|
+
}
|
283
|
+
|
284
|
+
return keywordsMap;
|
285
|
+
}
|
286
|
+
/**
|
287
|
+
* Rename key if it's part of the auctionKeyMap object; if not, leave key as is
|
288
|
+
* Store the resultant keypair in the auctionData object for later use in renderingManager.renderAd()
|
289
|
+
* @param {object} adServerKeyMap incoming object map of the auction keys from the UC tag; eg {'key1':'value1', 'key2':'value2', ...}
|
290
|
+
*/
|
291
|
+
|
292
|
+
|
293
|
+
function renameKnownAuctionKeys(adServerKeyMap) {
|
294
|
+
Object.keys(adServerKeyMap).forEach(function (key) {
|
295
|
+
var internalKey = auctionKeyMap[key] || key;
|
296
|
+
auctionData[internalKey] = adServerKeyMap[key];
|
297
|
+
});
|
298
|
+
}
|
299
|
+
|
300
|
+
var auctionData = {};
|
301
|
+
var formattedKeyMap = {};
|
302
|
+
|
303
|
+
if (isMacroPresent('targetingMap')) {
|
304
|
+
formattedKeyMap = convertTargetingMapToNormalMap(tagData.targetingMap);
|
305
|
+
} else if (isMacroPresent('targetingKeywords')) {
|
306
|
+
formattedKeyMap = convertKeyPairStringToMap(tagData.targetingKeywords);
|
307
|
+
}
|
308
|
+
|
309
|
+
renameKnownAuctionKeys(formattedKeyMap); // set keys not in defined map macros (eg targetingMap) and/or the keys setup within a non-DFP adserver
|
310
|
+
|
311
|
+
Object.keys(tagData).forEach(function (key) {
|
312
|
+
if (key !== 'targetingMap' && key !== 'targetingKeywords' && isStr(tagData[key]) && tagData[key] !== '') {
|
313
|
+
auctionData[key] = tagData[key];
|
314
|
+
}
|
315
|
+
});
|
316
|
+
return auctionData;
|
317
|
+
}
|
318
|
+
|
319
|
+
function parseUrl(url) {
|
320
|
+
var parsed = document.createElement('a');
|
321
|
+
parsed.href = decodeURIComponent(url);
|
322
|
+
return {
|
323
|
+
href: parsed.href,
|
324
|
+
protocol: (parsed.protocol || '').replace(/:$/, ''),
|
325
|
+
hostname: parsed.hostname,
|
326
|
+
port: +parsed.port,
|
327
|
+
pathname: parsed.pathname.replace(/^(?!\/)/, '/'),
|
328
|
+
hash: (parsed.hash || '').replace(/^#/, ''),
|
329
|
+
host: (parsed.host || window.location.host).replace(/:(443|80)$/, '')
|
330
|
+
};
|
331
|
+
}
|
332
|
+
|
333
|
+
function isA(object, _t) {
|
334
|
+
return Object.prototype.toString.call(object) === '[object ' + _t + ']';
|
335
|
+
}
|
336
|
+
|
337
|
+
;
|
338
|
+
|
339
|
+
function isPlainObject(object) {
|
340
|
+
return isA(object, 'Object');
|
341
|
+
}
|
342
|
+
|
343
|
+
function isStr(object) {
|
344
|
+
return isA(object, 'String');
|
345
|
+
}
|
346
|
+
|
347
|
+
;
|
348
|
+
|
349
|
+
/***/ }),
|
350
|
+
/* 1 */
|
351
|
+
/***/ (function(module, exports, __webpack_require__) {
|
352
|
+
|
353
|
+
"use strict";
|
354
|
+
|
355
|
+
|
73
356
|
Object.defineProperty(exports, "__esModule", {
|
74
357
|
value: true
|
75
358
|
});
|
@@ -128,15 +411,15 @@ function insertElement(elm, doc, target) {
|
|
128
411
|
}
|
129
412
|
|
130
413
|
/***/ }),
|
131
|
-
/*
|
414
|
+
/* 2 */
|
132
415
|
/***/ (function(module, exports, __webpack_require__) {
|
133
416
|
|
134
417
|
"use strict";
|
135
418
|
|
136
419
|
|
137
|
-
var _renderingManager = __webpack_require__(
|
420
|
+
var _renderingManager = __webpack_require__(3);
|
138
421
|
|
139
|
-
var _environment = __webpack_require__(
|
422
|
+
var _environment = __webpack_require__(6);
|
140
423
|
|
141
424
|
/**
|
142
425
|
* creative.js
|
@@ -154,7 +437,7 @@ var renderCreative = (0, _renderingManager.newRenderingManager)(window, environm
|
|
154
437
|
window.ucTag.renderAd = renderCreative.renderAd;
|
155
438
|
|
156
439
|
/***/ }),
|
157
|
-
/*
|
440
|
+
/* 3 */
|
158
441
|
/***/ (function(module, exports, __webpack_require__) {
|
159
442
|
|
160
443
|
"use strict";
|
@@ -165,9 +448,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
165
448
|
});
|
166
449
|
exports.newRenderingManager = newRenderingManager;
|
167
450
|
|
168
|
-
var utils = _interopRequireWildcard(__webpack_require__(
|
451
|
+
var utils = _interopRequireWildcard(__webpack_require__(0));
|
452
|
+
|
453
|
+
var domHelper = _interopRequireWildcard(__webpack_require__(1));
|
169
454
|
|
170
|
-
var
|
455
|
+
var _messaging = __webpack_require__(5);
|
171
456
|
|
172
457
|
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
173
458
|
|
@@ -247,10 +532,9 @@ function newRenderingManager(win, environment) {
|
|
247
532
|
var pubAdServerDomain = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
248
533
|
var pubUrl = arguments.length > 2 ? arguments[2] : undefined;
|
249
534
|
var windowLocation = win.location;
|
250
|
-
var parsedUrl = utils.parseUrl(pubUrl);
|
251
|
-
var publisherDomain = parsedUrl.protocol + '://' + parsedUrl.host;
|
252
535
|
var adServerDomain = pubAdServerDomain || win.location.hostname;
|
253
536
|
var fullAdServerDomain = windowLocation.protocol + '//' + adServerDomain;
|
537
|
+
var sendMessage = (0, _messaging.prebidMessenger)(pubUrl, win);
|
254
538
|
|
255
539
|
function renderAd(ev) {
|
256
540
|
var key = ev.message ? 'message' : 'data';
|
@@ -262,50 +546,82 @@ function newRenderingManager(win, environment) {
|
|
262
546
|
return;
|
263
547
|
}
|
264
548
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
549
|
+
if (adObject.message && adObject.message === 'Prebid Response' && adObject.adId === adId) {
|
550
|
+
try {
|
551
|
+
var body = win.document.body;
|
552
|
+
var ad = adObject.ad;
|
553
|
+
var url = adObject.adUrl;
|
554
|
+
var width = adObject.width;
|
555
|
+
var height = adObject.height;
|
556
|
+
|
557
|
+
if (adObject.mediaType === 'video') {
|
558
|
+
signalRenderResult(false, {
|
559
|
+
reason: 'preventWritingOnMainDocument',
|
560
|
+
message: "Cannot render video ad ".concat(adId)
|
561
|
+
});
|
562
|
+
console.log('Error trying to write ad.');
|
563
|
+
} else if (ad) {
|
564
|
+
var iframe = domHelper.getEmptyIframe(adObject.height, adObject.width);
|
565
|
+
body.appendChild(iframe);
|
566
|
+
iframe.contentDocument.open();
|
567
|
+
iframe.contentDocument.write(ad);
|
568
|
+
iframe.contentDocument.close();
|
569
|
+
signalRenderResult(true);
|
570
|
+
} else if (url) {
|
571
|
+
var _iframe = domHelper.getEmptyIframe(height, width);
|
572
|
+
|
573
|
+
_iframe.style.display = 'inline';
|
574
|
+
_iframe.style.overflow = 'hidden';
|
575
|
+
_iframe.src = url;
|
576
|
+
domHelper.insertElement(_iframe, document, 'body');
|
577
|
+
signalRenderResult(true);
|
578
|
+
} else {
|
579
|
+
signalRenderResult(false, {
|
580
|
+
reason: 'noAd',
|
581
|
+
message: "No ad for ".concat(adId)
|
582
|
+
});
|
583
|
+
console.log("Error trying to write ad. No ad markup or adUrl for ".concat(adId));
|
584
|
+
}
|
585
|
+
} catch (e) {
|
586
|
+
signalRenderResult(false, {
|
587
|
+
reason: "exception",
|
588
|
+
message: e.message
|
589
|
+
});
|
590
|
+
console.log("Error in rendering ad", e);
|
591
|
+
}
|
592
|
+
}
|
593
|
+
|
594
|
+
function signalRenderResult(success) {
|
595
|
+
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
596
|
+
reason = _ref.reason,
|
597
|
+
message = _ref.message;
|
598
|
+
|
599
|
+
var payload = {
|
600
|
+
message: 'Prebid Event',
|
601
|
+
adId: adId,
|
602
|
+
event: success ? 'adRenderSucceeded' : 'adRenderFailed'
|
603
|
+
};
|
604
|
+
|
605
|
+
if (!success) {
|
606
|
+
payload.info = {
|
607
|
+
reason: reason,
|
608
|
+
message: message
|
609
|
+
};
|
291
610
|
}
|
611
|
+
|
612
|
+
sendMessage(payload);
|
292
613
|
}
|
293
614
|
}
|
294
615
|
|
295
616
|
function requestAdFromPrebid() {
|
296
|
-
var message =
|
617
|
+
var message = {
|
297
618
|
message: 'Prebid Request',
|
298
619
|
adId: adId,
|
299
620
|
adServerDomain: fullAdServerDomain
|
300
|
-
}
|
301
|
-
|
302
|
-
}
|
303
|
-
|
304
|
-
function listenAdFromPrebid() {
|
305
|
-
win.addEventListener('message', renderAd, false);
|
621
|
+
};
|
622
|
+
sendMessage(message, renderAd);
|
306
623
|
}
|
307
624
|
|
308
|
-
listenAdFromPrebid();
|
309
625
|
requestAdFromPrebid();
|
310
626
|
}
|
311
627
|
/**
|
@@ -432,418 +748,138 @@ function newRenderingManager(win, environment) {
|
|
432
748
|
var commentElm = utils.getCreativeComment(bidObject);
|
433
749
|
domHelper.insertElement(commentElm, document, 'body');
|
434
750
|
utils.writeAdUrl(nurl, width, height);
|
435
|
-
}
|
436
|
-
}
|
437
|
-
};
|
438
|
-
}
|
439
|
-
|
440
|
-
;
|
441
|
-
/**
|
442
|
-
* Load response from localStorage. In case of MoPub, sdk caches response
|
443
|
-
* @param {string} cacheId
|
444
|
-
*/
|
445
|
-
|
446
|
-
function loadFromLocalCache(cacheId) {
|
447
|
-
var bid = win.localStorage.getItem(cacheId);
|
448
|
-
var displayFn = responseCallback(true);
|
449
|
-
displayFn(bid);
|
450
|
-
}
|
451
|
-
/**
|
452
|
-
* Parse response
|
453
|
-
* @param {string} response
|
454
|
-
* @returns {Object} bidObject parsed response
|
455
|
-
*/
|
456
|
-
|
457
|
-
|
458
|
-
function parseResponse(response) {
|
459
|
-
var bidObject;
|
460
|
-
|
461
|
-
try {
|
462
|
-
bidObject = JSON.parse(response);
|
463
|
-
} catch (error) {
|
464
|
-
console.log("Error parsing response from cache host: ".concat(error));
|
465
|
-
}
|
466
|
-
|
467
|
-
return bidObject;
|
468
|
-
}
|
469
|
-
/**
|
470
|
-
* Wrap mobile app creative in div
|
471
|
-
* @param {string} ad html for creative
|
472
|
-
* @param {Number} width width of creative
|
473
|
-
* @param {Number} height height of creative
|
474
|
-
* @returns {string} creative markup
|
475
|
-
*/
|
476
|
-
|
477
|
-
|
478
|
-
function constructMarkup(ad, width, height) {
|
479
|
-
var id = utils.getUUID();
|
480
|
-
return "<div id=\"".concat(id, "\" style=\"border-style: none; position: absolute; width:100%; height:100%;\">\n <div id=\"").concat(id, "_inner\" style=\"margin: 0 auto; width:").concat(width, "px; height:").concat(height, "px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">").concat(ad, "</div>\n </div>");
|
481
|
-
}
|
482
|
-
/**
|
483
|
-
* Resize container iframe
|
484
|
-
* @param {Number} width width of creative
|
485
|
-
* @param {Number} height height of creative
|
486
|
-
*/
|
487
|
-
|
488
|
-
|
489
|
-
function resizeIframe(width, height) {
|
490
|
-
if (environment.isSafeFrame()) {
|
491
|
-
var resize = function resize(status) {
|
492
|
-
var newWidth = width - iframeWidth;
|
493
|
-
var newHeight = height - iframeHeight;
|
494
|
-
win.$sf.ext.expand({
|
495
|
-
r: newWidth,
|
496
|
-
b: newHeight,
|
497
|
-
push: true
|
498
|
-
});
|
499
|
-
};
|
500
|
-
|
501
|
-
var iframeWidth = win.innerWidth;
|
502
|
-
var iframeHeight = win.innerHeight;
|
503
|
-
|
504
|
-
if (iframeWidth !== width || iframeHeight !== height) {
|
505
|
-
win.$sf.ext.register(width, height, resize); // we need to resize the DFP container as well
|
506
|
-
|
507
|
-
win.parent.postMessage({
|
508
|
-
sentinel: 'amp',
|
509
|
-
type: 'embed-size',
|
510
|
-
width: width,
|
511
|
-
height: height
|
512
|
-
}, '*');
|
513
|
-
}
|
514
|
-
}
|
515
|
-
}
|
516
|
-
|
517
|
-
function registerMRAIDViewableEvent(callback) {
|
518
|
-
function exposureChangeListener(exposure) {
|
519
|
-
if (exposure > 0) {
|
520
|
-
mraid.removeEventListener('exposureChange', exposureChangeListener);
|
521
|
-
callback();
|
522
|
-
}
|
523
|
-
}
|
524
|
-
|
525
|
-
function viewableChangeListener(viewable) {
|
526
|
-
if (viewable) {
|
527
|
-
mraid.removeEventListener('viewableChange', viewableChangeListener);
|
528
|
-
callback();
|
529
|
-
}
|
530
|
-
}
|
531
|
-
|
532
|
-
function registerViewableChecks() {
|
533
|
-
if (win.MRAID_ENV && parseFloat(win.MRAID_ENV.version) >= 3) {
|
534
|
-
mraid.addEventListener('exposureChange', exposureChangeListener);
|
535
|
-
} else if (win.MRAID_ENV && parseFloat(win.MRAID_ENV.version) < 3) {
|
536
|
-
if (mraid.isViewable()) {
|
537
|
-
callback();
|
538
|
-
} else {
|
539
|
-
mraid.addEventListener('viewableChange', viewableChangeListener);
|
540
|
-
}
|
541
|
-
}
|
542
|
-
}
|
543
|
-
|
544
|
-
function readyListener() {
|
545
|
-
mraid.removeEventListener('ready', readyListener);
|
546
|
-
registerViewableChecks();
|
547
|
-
}
|
548
|
-
|
549
|
-
if (win.mraid && win.MRAID_ENV) {
|
550
|
-
if (mraid.getState() == 'loading') {
|
551
|
-
mraid.addEventListener('ready', readyListener);
|
552
|
-
} else {
|
553
|
-
registerViewableChecks();
|
554
|
-
}
|
555
|
-
|
556
|
-
return true;
|
557
|
-
} else {
|
558
|
-
return false;
|
559
|
-
}
|
560
|
-
}
|
561
|
-
|
562
|
-
return {
|
563
|
-
renderAd: renderAd
|
564
|
-
};
|
565
|
-
}
|
566
|
-
|
567
|
-
/***/ }),
|
568
|
-
/* 3 */
|
569
|
-
/***/ (function(module, exports, __webpack_require__) {
|
570
|
-
|
571
|
-
"use strict";
|
572
|
-
|
573
|
-
|
574
|
-
Object.defineProperty(exports, "__esModule", {
|
575
|
-
value: true
|
576
|
-
});
|
577
|
-
exports.triggerPixel = triggerPixel;
|
578
|
-
exports.createTrackPixelHtml = createTrackPixelHtml;
|
579
|
-
exports.writeAdUrl = writeAdUrl;
|
580
|
-
exports.writeAdHtml = writeAdHtml;
|
581
|
-
exports.sendRequest = sendRequest;
|
582
|
-
exports.getUUID = getUUID;
|
583
|
-
exports.loadScript = loadScript;
|
584
|
-
exports.getCreativeComment = getCreativeComment;
|
585
|
-
exports.getCreativeCommentMarkup = getCreativeCommentMarkup;
|
586
|
-
exports.transformAuctionTargetingData = transformAuctionTargetingData;
|
587
|
-
exports.parseUrl = parseUrl;
|
588
|
-
|
589
|
-
var domHelper = _interopRequireWildcard(__webpack_require__(0));
|
590
|
-
|
591
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
592
|
-
|
593
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
594
|
-
|
595
|
-
var postscribe = __webpack_require__(4);
|
596
|
-
|
597
|
-
/**
|
598
|
-
* Inserts an image pixel with the specified `url` for cookie sync
|
599
|
-
* @param {string} url URL string of the image pixel to load
|
600
|
-
* @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process
|
601
|
-
*/
|
602
|
-
function triggerPixel(url, done) {
|
603
|
-
var img = new Image();
|
604
|
-
|
605
|
-
if (done && typeof done === 'function') {
|
606
|
-
img.addEventListener('load', done);
|
607
|
-
img.addEventListener('error', done);
|
608
|
-
}
|
609
|
-
|
610
|
-
img.src = url;
|
611
|
-
}
|
612
|
-
|
613
|
-
function createTrackPixelHtml(url) {
|
614
|
-
if (!url) {
|
615
|
-
return '';
|
616
|
-
}
|
617
|
-
|
618
|
-
var escapedUrl = encodeURI(url);
|
619
|
-
var img = "<div style=\"position:absolute;left:0px;top:0px;visibility:hidden;\"><img src=\"".concat(escapedUrl, "\"></div>");
|
620
|
-
return img;
|
621
|
-
}
|
622
|
-
|
623
|
-
function writeAdUrl(adUrl, width, height) {
|
624
|
-
var iframe = domHelper.getEmptyIframe(height, width);
|
625
|
-
iframe.src = adUrl;
|
626
|
-
document.body.appendChild(iframe);
|
627
|
-
}
|
628
|
-
|
629
|
-
function writeAdHtml(markup) {
|
630
|
-
postscribe(document.body, markup, {
|
631
|
-
error: console.error
|
632
|
-
});
|
633
|
-
}
|
634
|
-
|
635
|
-
function sendRequest(url, callback) {
|
636
|
-
function reqListener() {
|
637
|
-
callback(oReq.responseText);
|
638
|
-
}
|
639
|
-
|
640
|
-
var oReq = new XMLHttpRequest();
|
641
|
-
oReq.addEventListener('load', reqListener);
|
642
|
-
oReq.open('GET', url);
|
643
|
-
oReq.send();
|
644
|
-
}
|
645
|
-
|
646
|
-
function getUUID() {
|
647
|
-
var d = new Date().getTime();
|
648
|
-
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
649
|
-
var r = (d + Math.random() * 16) % 16 | 0;
|
650
|
-
d = Math.floor(d / 16);
|
651
|
-
return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
|
652
|
-
});
|
653
|
-
return uuid;
|
654
|
-
}
|
655
|
-
|
656
|
-
;
|
657
|
-
|
658
|
-
function loadScript(currentWindow, tagSrc, successCallback, errorCallback) {
|
659
|
-
var doc = currentWindow.document;
|
660
|
-
var scriptTag = doc.createElement('script');
|
661
|
-
scriptTag.type = 'text/javascript'; // Execute success callback if necessary
|
662
|
-
|
663
|
-
if (successCallback && typeof successCallback === 'function') {
|
664
|
-
if (scriptTag.readyState) {
|
665
|
-
scriptTag.onreadystatechange = function () {
|
666
|
-
if (scriptTag.readyState === 'loaded' || scriptTag.readyState === 'complete') {
|
667
|
-
scriptTag.onreadystatechange = null;
|
668
|
-
successCallback();
|
669
|
-
}
|
670
|
-
};
|
671
|
-
} else {
|
672
|
-
scriptTag.onload = function () {
|
673
|
-
successCallback();
|
674
|
-
};
|
675
|
-
}
|
676
|
-
} // Execute error callback if necessary
|
677
|
-
|
678
|
-
|
679
|
-
if (errorCallback && typeof errorCallback === 'function') {
|
680
|
-
scriptTag.onerror = function () {
|
681
|
-
errorCallback();
|
751
|
+
}
|
752
|
+
}
|
682
753
|
};
|
683
754
|
}
|
684
755
|
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
756
|
+
;
|
757
|
+
/**
|
758
|
+
* Load response from localStorage. In case of MoPub, sdk caches response
|
759
|
+
* @param {string} cacheId
|
760
|
+
*/
|
689
761
|
|
690
|
-
|
691
|
-
|
692
|
-
|
762
|
+
function loadFromLocalCache(cacheId) {
|
763
|
+
var bid = win.localStorage.getItem(cacheId);
|
764
|
+
var displayFn = responseCallback(true);
|
765
|
+
displayFn(bid);
|
693
766
|
}
|
694
|
-
|
695
|
-
|
696
|
-
}
|
697
|
-
|
698
|
-
|
699
|
-
/**
|
700
|
-
* Return comment element
|
701
|
-
* @param {*} bid
|
702
|
-
*/
|
703
|
-
|
704
|
-
function getCreativeComment(bid) {
|
705
|
-
return document.createComment("Creative ".concat(bid.crid, " served by Prebid.js Header Bidding"));
|
706
|
-
}
|
707
|
-
/**
|
708
|
-
* Returns comment element markup
|
709
|
-
* @param {*} bid
|
710
|
-
*/
|
767
|
+
/**
|
768
|
+
* Parse response
|
769
|
+
* @param {string} response
|
770
|
+
* @returns {Object} bidObject parsed response
|
771
|
+
*/
|
711
772
|
|
712
773
|
|
713
|
-
function
|
714
|
-
|
715
|
-
var wrapper = document.createElement('div');
|
716
|
-
wrapper.appendChild(creativeComment);
|
717
|
-
return wrapper.innerHTML;
|
718
|
-
}
|
774
|
+
function parseResponse(response) {
|
775
|
+
var bidObject;
|
719
776
|
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
hb_cache_host: 'cacheHost',
|
726
|
-
hb_cache_path: 'cachePath',
|
727
|
-
hb_cache_id: 'uuid',
|
728
|
-
hb_format: 'mediaType',
|
729
|
-
hb_env: 'env',
|
730
|
-
hb_size: 'size',
|
731
|
-
hb_pb: 'hbPb'
|
732
|
-
};
|
733
|
-
/**
|
734
|
-
* Determine if the supplied property of the tagData object exists and is populated with its own values/properties according to its type
|
735
|
-
* @param {string} paramName name of the property to check (eg tagData.targetingMap)
|
736
|
-
* @returns true/false
|
737
|
-
*/
|
777
|
+
try {
|
778
|
+
bidObject = JSON.parse(response);
|
779
|
+
} catch (error) {
|
780
|
+
console.log("Error parsing response from cache host: ".concat(error));
|
781
|
+
}
|
738
782
|
|
739
|
-
|
740
|
-
return !!(tagData[paramName] && (isPlainObject(tagData[paramName]) && Object.keys(tagData[paramName]).length > 0 || isStr(tagData[paramName]) && tagData[paramName] !== ''));
|
783
|
+
return bidObject;
|
741
784
|
}
|
742
785
|
/**
|
743
|
-
*
|
744
|
-
*
|
745
|
-
* @param {
|
746
|
-
* @
|
786
|
+
* Wrap mobile app creative in div
|
787
|
+
* @param {string} ad html for creative
|
788
|
+
* @param {Number} width width of creative
|
789
|
+
* @param {Number} height height of creative
|
790
|
+
* @returns {string} creative markup
|
747
791
|
*/
|
748
792
|
|
749
793
|
|
750
|
-
function
|
751
|
-
var
|
752
|
-
|
753
|
-
if (Array.isArray(tarMap[key]) && tarMap[key].length > 0) {
|
754
|
-
newTarMap[key] = tarMap[key][0];
|
755
|
-
}
|
756
|
-
});
|
757
|
-
return newTarMap;
|
794
|
+
function constructMarkup(ad, width, height) {
|
795
|
+
var id = utils.getUUID();
|
796
|
+
return "<div id=\"".concat(id, "\" style=\"border-style: none; position: absolute; width:100%; height:100%;\">\n <div id=\"").concat(id, "_inner\" style=\"margin: 0 auto; width:").concat(width, "px; height:").concat(height, "px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">").concat(ad, "</div>\n </div>");
|
758
797
|
}
|
759
798
|
/**
|
760
|
-
*
|
761
|
-
* @param {
|
762
|
-
* @
|
799
|
+
* Resize container iframe
|
800
|
+
* @param {Number} width width of creative
|
801
|
+
* @param {Number} height height of creative
|
763
802
|
*/
|
764
803
|
|
765
804
|
|
766
|
-
function
|
767
|
-
|
768
|
-
|
805
|
+
function resizeIframe(width, height) {
|
806
|
+
if (environment.isSafeFrame()) {
|
807
|
+
var resize = function resize(status) {
|
808
|
+
var newWidth = width - iframeWidth;
|
809
|
+
var newHeight = height - iframeHeight;
|
810
|
+
win.$sf.ext.expand({
|
811
|
+
r: newWidth,
|
812
|
+
b: newHeight,
|
813
|
+
push: true
|
814
|
+
});
|
815
|
+
};
|
769
816
|
|
770
|
-
|
771
|
-
|
772
|
-
var keyPairArr = keyPairStr.split(':');
|
817
|
+
var iframeWidth = win.innerWidth;
|
818
|
+
var iframeHeight = win.innerHeight;
|
773
819
|
|
774
|
-
|
775
|
-
|
776
|
-
var v = keyPairArr[1];
|
777
|
-
keywordsMap[k] = v;
|
778
|
-
}
|
779
|
-
});
|
780
|
-
}
|
820
|
+
if (iframeWidth !== width || iframeHeight !== height) {
|
821
|
+
win.$sf.ext.register(width, height, resize); // we need to resize the DFP container as well
|
781
822
|
|
782
|
-
|
823
|
+
win.parent.postMessage({
|
824
|
+
sentinel: 'amp',
|
825
|
+
type: 'embed-size',
|
826
|
+
width: width,
|
827
|
+
height: height
|
828
|
+
}, '*');
|
829
|
+
}
|
830
|
+
}
|
783
831
|
}
|
784
|
-
/**
|
785
|
-
* Rename key if it's part of the auctionKeyMap object; if not, leave key as is
|
786
|
-
* Store the resultant keypair in the auctionData object for later use in renderingManager.renderAd()
|
787
|
-
* @param {object} adServerKeyMap incoming object map of the auction keys from the UC tag; eg {'key1':'value1', 'key2':'value2', ...}
|
788
|
-
*/
|
789
832
|
|
833
|
+
function registerMRAIDViewableEvent(callback) {
|
834
|
+
function exposureChangeListener(exposure) {
|
835
|
+
if (exposure > 0) {
|
836
|
+
mraid.removeEventListener('exposureChange', exposureChangeListener);
|
837
|
+
callback();
|
838
|
+
}
|
839
|
+
}
|
790
840
|
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
841
|
+
function viewableChangeListener(viewable) {
|
842
|
+
if (viewable) {
|
843
|
+
mraid.removeEventListener('viewableChange', viewableChangeListener);
|
844
|
+
callback();
|
845
|
+
}
|
846
|
+
}
|
797
847
|
|
798
|
-
|
799
|
-
|
848
|
+
function registerViewableChecks() {
|
849
|
+
if (win.MRAID_ENV && parseFloat(win.MRAID_ENV.version) >= 3) {
|
850
|
+
mraid.addEventListener('exposureChange', exposureChangeListener);
|
851
|
+
} else if (win.MRAID_ENV && parseFloat(win.MRAID_ENV.version) < 3) {
|
852
|
+
if (mraid.isViewable()) {
|
853
|
+
callback();
|
854
|
+
} else {
|
855
|
+
mraid.addEventListener('viewableChange', viewableChangeListener);
|
856
|
+
}
|
857
|
+
}
|
858
|
+
}
|
800
859
|
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
}
|
860
|
+
function readyListener() {
|
861
|
+
mraid.removeEventListener('ready', readyListener);
|
862
|
+
registerViewableChecks();
|
863
|
+
}
|
806
864
|
|
807
|
-
|
865
|
+
if (win.mraid && win.MRAID_ENV) {
|
866
|
+
if (mraid.getState() == 'loading') {
|
867
|
+
mraid.addEventListener('ready', readyListener);
|
868
|
+
} else {
|
869
|
+
registerViewableChecks();
|
870
|
+
}
|
808
871
|
|
809
|
-
|
810
|
-
|
811
|
-
|
872
|
+
return true;
|
873
|
+
} else {
|
874
|
+
return false;
|
812
875
|
}
|
813
|
-
}
|
814
|
-
return auctionData;
|
815
|
-
}
|
876
|
+
}
|
816
877
|
|
817
|
-
function parseUrl(url) {
|
818
|
-
var parsed = document.createElement('a');
|
819
|
-
parsed.href = decodeURIComponent(url);
|
820
878
|
return {
|
821
|
-
|
822
|
-
protocol: (parsed.protocol || '').replace(/:$/, ''),
|
823
|
-
hostname: parsed.hostname,
|
824
|
-
port: +parsed.port,
|
825
|
-
pathname: parsed.pathname.replace(/^(?!\/)/, '/'),
|
826
|
-
hash: (parsed.hash || '').replace(/^#/, ''),
|
827
|
-
host: (parsed.host || window.location.host).replace(/:(443|80)$/, '')
|
879
|
+
renderAd: renderAd
|
828
880
|
};
|
829
881
|
}
|
830
882
|
|
831
|
-
function isA(object, _t) {
|
832
|
-
return Object.prototype.toString.call(object) === '[object ' + _t + ']';
|
833
|
-
}
|
834
|
-
|
835
|
-
;
|
836
|
-
|
837
|
-
function isPlainObject(object) {
|
838
|
-
return isA(object, 'Object');
|
839
|
-
}
|
840
|
-
|
841
|
-
function isStr(object) {
|
842
|
-
return isA(object, 'String');
|
843
|
-
}
|
844
|
-
|
845
|
-
;
|
846
|
-
|
847
883
|
/***/ }),
|
848
884
|
/* 4 */
|
849
885
|
/***/ (function(module, exports, __webpack_require__) {
|
@@ -2944,6 +2980,66 @@ return /******/ (function(modules) { // webpackBootstrap
|
|
2944
2980
|
"use strict";
|
2945
2981
|
|
2946
2982
|
|
2983
|
+
Object.defineProperty(exports, "__esModule", {
|
2984
|
+
value: true
|
2985
|
+
});
|
2986
|
+
exports.prebidMessenger = prebidMessenger;
|
2987
|
+
|
2988
|
+
var _utils = __webpack_require__(0);
|
2989
|
+
|
2990
|
+
function prebidMessenger(publisherURL) {
|
2991
|
+
var win = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window;
|
2992
|
+
|
2993
|
+
var prebidDomain = function () {
|
2994
|
+
if (publisherURL == null) {
|
2995
|
+
return null;
|
2996
|
+
}
|
2997
|
+
|
2998
|
+
var parsedUrl = (0, _utils.parseUrl)(publisherURL);
|
2999
|
+
return parsedUrl.protocol + '://' + parsedUrl.host;
|
3000
|
+
}();
|
3001
|
+
|
3002
|
+
return function sendMessage(message, onResponse) {
|
3003
|
+
if (prebidDomain == null) {
|
3004
|
+
throw new Error('Missing pubUrl');
|
3005
|
+
}
|
3006
|
+
|
3007
|
+
message = JSON.stringify(message);
|
3008
|
+
var messagePort;
|
3009
|
+
|
3010
|
+
if (onResponse == null) {
|
3011
|
+
win.parent.postMessage(message, prebidDomain);
|
3012
|
+
} else {
|
3013
|
+
var channel = new MessageChannel();
|
3014
|
+
messagePort = channel.port1;
|
3015
|
+
messagePort.onmessage = onResponse;
|
3016
|
+
win.addEventListener('message', windowListener);
|
3017
|
+
win.parent.postMessage(message, prebidDomain, [channel.port2]);
|
3018
|
+
}
|
3019
|
+
|
3020
|
+
return function stopListening() {
|
3021
|
+
if (messagePort != null) {
|
3022
|
+
win.removeEventListener('message', windowListener);
|
3023
|
+
messagePort.onmessage = null;
|
3024
|
+
messagePort = null;
|
3025
|
+
}
|
3026
|
+
};
|
3027
|
+
|
3028
|
+
function windowListener(ev) {
|
3029
|
+
if ((ev.origin || ev.originalEvent && ev.originalEvent.origin) === prebidDomain) {
|
3030
|
+
onResponse(ev);
|
3031
|
+
}
|
3032
|
+
}
|
3033
|
+
};
|
3034
|
+
}
|
3035
|
+
|
3036
|
+
/***/ }),
|
3037
|
+
/* 6 */
|
3038
|
+
/***/ (function(module, exports, __webpack_require__) {
|
3039
|
+
|
3040
|
+
"use strict";
|
3041
|
+
|
3042
|
+
|
2947
3043
|
Object.defineProperty(exports, "__esModule", {
|
2948
3044
|
value: true
|
2949
3045
|
});
|